大模型微調(PEFT)

大模型微調(PEFT)

  • PEFT(Parameter-Efficient Fine-Tuning)
    • 一、PEFT 核心方法
      • 1. LoRA(Low-Rank Adaptation)
      • 2. Adapter
      • 3. Prefix Tuning
      • 4. Prompt Tuning
      • 5. QLoRA(Quantized LoRA)
    • 二、PEFT vs 全參數微調
    • 三、微調大模型示例代碼
    • 四、加載微調后的大模型
      • 1. Lora
      • 2. prefix tuning

大模型微調方法描述

PEFT(Parameter-Efficient Fine-Tuning)

PEFT(參數高效微調)是一類用于大幅降低大模型微調成本的技術,核心思想是僅微調少量參數,而非整個模型。以下是系統化的解析:

一、PEFT 核心方法

1. LoRA(Low-Rank Adaptation)

  • 原理
    • 在原始權重旁添加低秩矩陣(W = W? + BA),僅訓練BA
  • 適用場景:文本生成、對話系統
  • 代碼示例
    • r(秩)通常為4~64,參數量減少90%+
    from peft import LoraConfig, get_peft_modelconfig = LoraConfig(r=8,                      # 秩lora_alpha=32,            # 縮放系數target_modules=["q_proj", "v_proj"],  # 作用模塊lora_dropout=0.05,bias="none",
    )
    model = get_peft_model(model, config)  # 原始模型+LoRA
    

2. Adapter

  • 原理
    • 在Transformer層間插入小型全連接網絡,僅訓練Adapter層。
    • 參數量占比約0.5%~5%
  • 適用場景:多任務學習
  • 結構示例
    Transformer Layer → Adapter(Down→ReLU→Up) → Residual→ LayerNorm
    

3. Prefix Tuning

  • 原理

    • 在輸入前添加可學習的“虛擬token”(prefix),引導模型生成。
    • 完全不修改原始參數
  • 適用場景:生成任務(如GPT)

  • 結構示例

    import torch
    import torch.nn as nn
    from transformers import AutoModelForCausalLM, AutoTokenizer# 加載預訓練模型和分詞器
    model_name = "gpt2"  # 可替換為你想要使用的模型名稱
    model = AutoModelForCausalLM.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)# 定義Prefix Tuning模塊
    class PrefixTuning(nn.Module):def __init__(self, num_virtual_tokens, hidden_size):super(PrefixTuning, self).__init__()self.prefix_embeddings = nn.Embedding(num_virtual_tokens, hidden_size)nn.init.normal_(self.prefix_embeddings.weight, mean=0, std=0.02)def forward(self, input_ids, attention_mask):batch_size = input_ids.shape[0]prefix = self.prefix_embeddings.weight.unsqueeze(0).repeat(batch_size, 1, 1)new_input_ids = torch.cat([torch.full((batch_size, prefix.shape[1]), tokenizer.pad_token_id).to(input_ids.device), input_ids], dim=1)new_attention_mask = torch.cat([torch.ones((batch_size, prefix.shape[1])).to(attention_mask.device), attention_mask], dim=1)return new_input_ids, new_attention_mask
    

4. Prompt Tuning

  • 原理

    • 在輸入層加入prompt tokens。
    • 完全不修改原始參數,簡化版的Prefix Tuning,無需MLP調整,隨著模型規模增大,效果接近full fine-tuning。
  • 結構示例

    prompt = "請回答以下問題:"
    prompt_ids = tokenizer.encode(prompt, return_tensors="pt").to(input_ids.device)
    new_input_ids = torch.cat([prompt_ids.repeat(batch_size, 1), input_ids], dim=1)
    

5. QLoRA(Quantized LoRA)

  • 原理
    4-bit量化基礎模型 + LoRA微調,顯存需求降低70%
  • 代碼示例
    from transformers import BitsAndBytesConfigbnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype=torch.bfloat16
    )
    model = AutoModel.from_pretrained("Llama-3-8B", quantization_config=bnb_config)
    

二、PEFT vs 全參數微調

指標PEFT全參數微調
顯存占用極低(可單卡微調70B)極高(需多卡)
訓練速度快(僅更新少量參數)
效果接近全參數微調最優但差異<5%
部署便利性需合并適配器直接部署

三、微調大模型示例代碼

注意:使用model.save_pretrained("fine_tuned_internvl_3") 保存經過 PEFT(如 LoRA 或其他 Adapter 微調)后的模型時,保存的權重通常不包含基礎模型(base_model)的原始權重,僅保存微調過程中可訓練的部分。

import math
import pandas as pd
import numpy as np
import torch
import torchvision.transforms as T
from decord import VideoReader, cpu
from PIL import Image
from torchvision.transforms.functional import InterpolationMode
from transformers import AutoModel, AutoTokenizer, AutoConfig, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
import os# 模型加載
path = 'InternVL3'
device_map = split_model(path)
model = AutoModel.from_pretrained(path,torch_dtype=torch.bfloat16,load_in_8bit=True,low_cpu_mem_usage=True,use_flash_attn=True,trust_remote_code=True,device_map=device_map).eval()
tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False)# 配置LoRA
lora_config = LoraConfig(r=8,lora_alpha=16,target_modules=["q_proj", "v_proj"],lora_dropout=0.1,bias="none",task_type="CAUSAL_LM"
)model = get_peft_model(model, lora_config)
model.print_trainable_parameters()# 讀取數據集
data_path = 'data'
df = pd.read_parquet(data_path)
dataset = CustomDataset(df, tokenizer)# 訓練參數設置
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=4,gradient_accumulation_steps=4,save_steps=10_000,save_total_limit=2,evaluation_strategy="no",logging_steps=10,fp16=True
)# 創建Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=dataset
)# 開始訓練
trainer.train()# 保存微調后的模型
model.save_pretrained("fine_tuned_internvl3")    

四、加載微調后的大模型

1. Lora

  • 示例代碼:
    from transformers import AutoModel
    from peft import PeftModel# 加載基礎的預訓練模型
    base_model_path = "base_model_path"  # 替換為基礎預訓練模型的路徑
    base_model = AutoModel.from_pretrained(base_model_path)# 加載微調后的適配器
    adapter_path = "fine_tuned_adapter_path"  # 替換為微調后適配器的保存路徑
    model = PeftModel.from_pretrained(base_model, adapter_path)
    

2. prefix tuning

  • 示例代碼:
    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    import torch.nn as nn# 定義 Prefix Tuning 模塊
    class PrefixTuning(nn.Module):def __init__(self, num_virtual_tokens, hidden_size):super(PrefixTuning, self).__init__()self.prefix_embeddings = nn.Embedding(num_virtual_tokens, hidden_size)def forward(self, input_ids, attention_mask):batch_size = input_ids.shape[0]prefix = self.prefix_embeddings.weight.unsqueeze(0).repeat(batch_size, 1, 1)new_input_ids = torch.cat([torch.full((batch_size, prefix.shape[1]), tokenizer.pad_token_id).to(input_ids.device),input_ids], dim=1)new_attention_mask = torch.cat([torch.ones((batch_size, prefix.shape[1])).to(attention_mask.device),attention_mask], dim=1)return new_input_ids, new_attention_mask# 加載基礎的預訓練模型和分詞器
    model_name = "gpt2"  # 可替換為實際的模型名稱
    model = AutoModelForCausalLM.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)# 初始化 Prefix Tuning 模塊
    num_virtual_tokens = 10  # 替換為實際的虛擬 token 數量
    hidden_size = model.config.hidden_size
    prefix_tuning = PrefixTuning(num_virtual_tokens, hidden_size)# 加載 Prefix Tuning 的參數
    try:prefix_tuning.load_state_dict(torch.load("path/to/prefix_tuning_weights.pth"))
    except FileNotFoundError:print("錯誤:未找到 Prefix Tuning 參數文件,請檢查路徑。")exit(1)# 將模型和 Prefix Tuning 模塊移動到 GPU(如果可用)
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)
    prefix_tuning.to(device)# 輸入文本
    input_text = "Once upon a time"
    input_ids = tokenizer.encode(input_text, return_tensors='pt').to(device)
    attention_mask = torch.ones_like(input_ids).to(device)# 使用 Prefix Tuning 處理輸入
    new_input_ids, new_attention_mask = prefix_tuning(input_ids, attention_mask)# 進行推理
    with torch.no_grad():outputs = model(new_input_ids, attention_mask=new_attention_mask)logits = outputs.logits# 生成文本
    generated_ids = torch.argmax(logits, dim=-1)
    generated_text = tokenizer.decode(generated_ids[0], skip_special_tokens=True
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78970.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flutter 打包mac程序 dmg教程

? 前提條件 ? 你已經在 macOS 上安裝了 Android Studio Flutter SDK。 ? Flutter 支持 macOS 構建。 運行下面命令確認是否支持&#xff1a; Plain Text bash 復制編輯 flutter doctor ---## &#x1f9f1; 第一步&#xff1a;啟用 macOS 支持如果是新項目&#xff0c;…

鴻蒙開發-動畫

1. 動畫-動畫特效 // 定義接口 (每個列表項的數據結構) interface ImageCount {url: stringcount: number }// 需求1: 遮罩層顯隱 透明度opacity 0-1 層級zIndex -1~99 // 需求2: 圖片縮放 縮放scale 0-1Entry Component struct Index {// 基于接口, 準備數據State images…

js:循環查詢數組對象中的某一項的值是否為空

循環檢查 selinfo 數組中的每一個對象&#xff0c;判斷其中的 po_qty 和 price 是否為空&#xff08;null、undefined 或空字符串 ""&#xff09;&#xff0c;可以使用以下幾種方法&#xff1a; 方法1&#xff1a;使用 forEach 循環檢查每一項 const selinfo this.…

x-cmd install | jellex - 用 Python 語法在終端里玩轉 JSON 數據!

目錄 核心功能與特點安裝優勢亮點適用場景 還在為命令行下處理 JSON 數據煩惱嗎&#xff1f;jellex 來了&#xff01;它是一款基于終端的交互式 JSON 和 JSON Lines 數據處理工具&#xff0c;讓你用熟悉的 Python 語法&#xff0c;輕松過濾、轉換和探索 JSON 數據。 核心功能與…

4月份到9月份看6本書第二天【ERP與企業管理】

ERP與企業管理 1-11章全面介紹了ERP的基本原理、物料管理功能、計劃功能、生產和采購管理功能、效益以及實施和應用ERP為企業帶來的深層次的變化。 第12章討論了軟件系統的選型。 第13章介紹了ERP實施和運行管理的方法 第14章介紹了國際上廣泛使用的ERP實施應用的評估方法。…

Opencv計算機視覺編程攻略-第十三節 跟蹤視頻中的物品

這是opencv系列的最后一節&#xff0c;主要學習視頻序列&#xff0c;上一節介紹了讀取、處理和存儲視頻的工具&#xff0c;本文將介紹幾種跟蹤圖像序列中運動物體的算法。可見運動或表觀運動&#xff0c;是物體以不同的速度在不同的方向上移動&#xff0c;或者是因為相機在移動…

001 藍橋杯嵌入式賽道備賽——基礎

個人筆記&#xff0c;不扭扭捏捏&#xff0c;一口氣到位。方便自己也方便大家 00 時鐘線 cubeMX已經完成了大多數工作 01 LED&#xff08;GPIO輸出&#xff09; 在使用LED的時候先把SN74HC573鎖存器PD2置高電平&#xff0c;然后寫入LED所要的高低電平&#xff0c;然后置PD2低…

案例-索引對于并發Insert性能優化測試

前言 最近因業務并發量上升,開發反饋對訂單表Insert性能降低。應開發要求對涉及Insert的表進行分析并提供優化方案。 ??一般對Insert 影響基本都在索引,涉及表已按創建日期做了分區表,索引全部為普通索引未做分區索引。 優化建議: 1、將UNIQUE改為HASH(64) GLOBAL IND…

【技術文章的標準結構與內容指南】

技術文章的標準結構與內容指南 技術文章是傳遞專業知識、分享實踐經驗的重要媒介。一篇高質量的技術文章不僅能夠幫助讀者解決問題&#xff0c;還能促進技術交流與創新。以下是技術文章通常包含的核心內容與結構指南。 1. 標題 一個好的技術文章標題應當&#xff1a; 簡潔明…

豪越消防一體化安全管控平臺:構建消防“一張圖”新生態

在城市化進程加速、建筑規模與功能日益復雜的當下&#xff0c;消防救援工作面臨著諸多嚴峻挑戰。火災隱患如同隱藏在暗處的“定時炸彈”&#xff0c;廣泛分布于城市的各個角落&#xff0c;想要快速、精準定位絕非易事。信息傳遞的不順暢更是雪上加霜&#xff0c;導致救援效率大…

重學Redis:Redis常用數據類型+存儲結構(源碼篇)

一、SDS 1&#xff0c;SDS源碼解讀 sds (Simple Dynamic String)&#xff0c;Simple的意思是簡單&#xff0c;Dynamic即動態&#xff0c;意味著其具有動態增加空間的能力&#xff0c;擴容不需要使用者關心。String是字符串的意思。說白了就是用C語言自己封裝了一個字符串類型&a…

抖音IP屬地可以隨便選擇地址嗎?深度解析

在當今社交媒體盛行的時代&#xff0c;抖音作為受歡迎的短視頻平臺之一&#xff0c;其IP屬地顯示功能引發了廣泛關注。許多用戶好奇&#xff1a;抖音的IP屬地是否可以隨意更改&#xff1f;是否存在方法可以“偽裝”自己的位置&#xff1f;?本文將深入探討這一話題。 一、抖音I…

SOLID原則詳解:提升軟件設計質量的關鍵

前言 關于設計原則SOLID具體指的是什么&#xff0c;怎么理解這些設計原則&#xff0c;我覺得有必要記錄一筆&#xff0c;畢竟這個設計原則確實經常在關鍵技術文檔中提及&#xff0c;在編程思想中提及&#xff0c;在日常的開發中使用&#xff0c;但是對我來說&#xff0c;似乎知…

如何使用 ONLYOFFICE 恢復之前的文件版本?

如何使用 ONLYOFFICE 恢復之前的文件版本&#xff1f; https://www.onlyoffice.com/blog/zh-hans/2023/04/how-to-use-version-history

簡簡單單實現一個Python+Selenium的自動化測試框架

什么是Selenium&#xff1f; Selenium是一個基于瀏覽器的自動化測試工具&#xff0c;它提供了一種跨平臺、跨瀏覽器的端到端的web自動化解決方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefox的…

Java設計模式之中介者模式:從入門到架構級實踐

一、什么是中介者模式&#xff1f; 中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是通過引入一個中介對象來封裝多個對象之間的交互關系。這種模式將原本復雜的網狀通信結構轉換為星型結構&#xff0c;類似于現實生活中的機…

Trinity三位一體開源程序是可解釋的 AI 分析工具和 3D 可視化

一、軟件介紹 文末提供源碼和程序下載學習 Trinity三位一體開源程序是可解釋的 AI 分析工具和 3D 可視化。Trinity 提供性能分析和 XAI 工具&#xff0c;非常適合深度學習系統或其他執行復雜分類或解碼的模型。 二、軟件作用和特征 Trinity 通過結合具有超維感知能力的不同交…

LeetCode 熱題 100_單詞拆分(86_139_中等_C++)(動態規劃)

LeetCode 熱題 100_單詞拆分&#xff08;86_139&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;動態規劃&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;動態規劃&#xff09;&a…

VM虛擬機安裝及Ubuntu安裝配置

VM虛擬機安裝及Ubuntu安裝配置 1、VM虛擬機安裝2、創建虛擬機3、Ubuntu系統安裝4、編譯環境配置4.1 、Ubuntu和 Windows文件互傳 文件互傳4.1.1、 開啟Ubunt下的FTP服務 4.2、 Ubuntu下NFS和SSH服務開啟4.2.1、 NFS服務開啟4.2.2、 SSH服務開啟 4.3、 交叉編譯器安裝4.3.1 安裝…

【KWDB 創作者計劃】_產品技術解讀_1

【KWDB 創作者計劃】_產品技術解讀_1 一、存儲引擎:高性能混合存儲架構1. 存儲模型設計2. 存儲壓縮與編碼3. 持久化策略二、KWDB 組件源碼解析1. 核心模塊分層架構2. 關鍵組件源碼剖析三、KWDB 特性代碼通讀1. 實時分析能力(Real-Time OLAP)2. 混合負載隔離(HTAP)3. 智能索…