一:
LoRA(Low-Rank Adaptation,低秩適應)是一種高效的大模型參數微調技術,由Meta在2021年提出。它通過凍結預訓練模型參數,僅訓練少量新增的低秩矩陣,大幅減少了需要訓練的參數量,同時保持接近全參數微調的效果。
為什么需要LoRA?
傳統的全參數微調(Fine-tuning)需要更新大型語言模型的所有參數(如GPT-3有1750億參數),這帶來兩個核心問題:
- 計算資源需求極高:需要大量GPU內存和長時間訓練。
- 容易過擬合:對于小數據集,全參數微調可能導致模型忘記預訓練知識(災難性遺忘)。
而LoRA通過只訓練少量新增參數,解決了這些問題。
LoRA的核心原理
LoRA的核心思想是:用兩個低秩矩陣的乘積代替傳統的權重更新矩陣。
對于預訓練模型中的權重矩陣 W 0 W_0 W0?(通常維度很高,如768×768),LoRA不直接更新它,而是添加一個可訓練的分解矩陣:
W = W 0 + Δ W = W 0 + B ? A W = W_0 + \Delta W = W_0 + B \cdot A W=W0?+ΔW=W0?+B?A
其中:
- B B B 和 A A A 是兩個低秩矩陣,秩為 r r r(通常 r ? 維度 r \ll \text{維度} r?維度,如 r = 8 r=8 r=8 或 r = 16 r=16 r=16)。
- A A A 是隨機初始化的矩陣, B B B 初始化為零矩陣。
- 只有 B B B 和 A A A 需要訓練, W 0 W_0 W0? 保持凍結。
LoRA的優勢
-
參數量顯著減少:
- 對于13B參數的CodeLlama模型,全參數微調需要訓練130億參數;
- 而LoRA只需要訓練約0.5%的參數(例如 r = 8 r=8 r=8 時,僅需約650萬參數)。
-
內存和計算效率提升:
- 訓練時GPU內存需求降低,可使用更小的GPU訓練大模型。
- 推理時不需要額外內存,因為LoRA權重可以與原始權重合并。
-
訓練速度加快:
- 由于需要計算梯度的參數大幅減少,訓練速度顯著提升。
-
可并行訓練多個任務:
- 可以為不同任務保存不同的LoRA權重,共享同一個預訓練模型。
在你的代碼中的應用
在你提供的代碼中,LoRA的配置如下:
train_args = {"finetuning_type": "lora", # 使用LoRA微調"lora_target": "q_proj,v_proj", # 只對Attention層的query和value投影矩陣應用LoRA"lora_rank": 64, # 低秩矩陣的秩r"lora_alpha": 32, # 縮放因子,用于調整LoRA權重的大小
}
這意味著代碼只會微調模型中Attention層的query和value投影矩陣,使用秩為64的低秩分解,從而大幅降低訓練成本。
LoRA vs 全參數微調
對比項 | 全參數微調 | LoRA微調 |
---|---|---|
訓練參數量 | 所有參數(如13B) | 僅LoRA參數(如650K) |
GPU內存需求 | 高(需保存所有梯度) | 低(僅保存LoRA梯度) |
訓練時間 | 長 | 短 |
模型效果 | 可能更好(數據充足時) | 接近全參數微調 |
多任務支持 | 需要為每個任務保存完整模型 | 共享預訓練模型,僅保存LoRA權重 |
總結
LoRA是一種輕量級微調技術,特別適合在資源有限的情況下微調大型語言模型。通過凍結預訓練權重并引入低秩適應矩陣,LoRA在大幅減少訓練成本的同時,保持了接近全參數微調的效果。這使得即使是個人開發者也能在消費級GPU上微調13B甚至更大的模型。
QLoRA(Quantized Low-Rank Adaptation)是LoRA的升級版,由Meta在2023年提出。它通過量化預訓練模型權重(如將權重壓縮至4位或更少)并結合LoRA微調,進一步降低了大模型微調的資源門檻,讓普通人也能在消費級GPU上微調百億級參數模型。
二:
QLoRA的核心創新
1. 4位量化預訓練模型
- 傳統LoRA:雖然只訓練少量LoRA參數,但預訓練模型權重仍需以FP16(16位浮點)或BF16(Brain Floating Point)格式存儲,占用大量內存。例如,13B參數模型需約26GB顯存。
- QLoRA:將預訓練模型權重壓縮至4位(僅需約3.25GB),同時引入雙量化技術進一步減少量化誤差,幾乎不損失模型性能。
2. Paged Optimizers
- 設計了特殊的優化器,解決量化模型訓練時的內存碎片問題,大幅減少內存峰值。
3. 高秩適應
- 支持更高的LoRA秩(如 r = 64 r=64 r=64 或 r = 128 r=128 r=128),在低精度下仍能保持良好的表達能力。
QLoRA的優勢
-
顯存需求極低:
- 13B模型只需約7GB顯存即可微調(相比傳統LoRA的26GB)。
- 70B模型可在單張48GB GPU上微調(傳統方法需多張A100)。
-
接近全參數微調的效果:
- 在多個基準測試中,QLoRA微調的模型性能接近甚至超過全參數微調的結果。
-
訓練效率提升:
- 由于權重存儲量減少,內存帶寬壓力降低,訓練速度略有提升。
QLoRA vs LoRA
對比項 | LoRA | QLoRA |
---|---|---|
預訓練模型精度 | FP16/BF16 (16位) | 4位量化 |
13B模型顯存需求 | ~26GB | ~7GB |
70B模型顯存需求 | ~140GB | ~18GB |
參數量 | 僅LoRA參數 | 僅LoRA參數(量化權重不占訓練內存) |
硬件要求 | 需要高端GPU(如A100) | 可在消費級GPU(如RTX 4090)上運行 |
在你的代碼中如何使用QLoRA?
如果要將你的代碼從LoRA切換到QLoRA,需要:
-
安裝額外依賴:
pip install bitsandbytes # 用于權重量化
-
修改訓練參數:
from transformers import BitsAndBytesConfig# 配置4位量化 quantization_config = BitsAndBytesConfig(load_in_4bit=True, # 加載4位量化模型bnb_4bit_compute_dtype=torch.bfloat16, # 計算精度bnb_4bit_use_double_quant=True, # 雙量化bnb_4bit_quant_type="nf4", # 量化類型 )train_args = {"model_name_or_path": "codellama/CodeLlama-13b-Instruct-hf","quantization_config": quantization_config, # 添加量化配置"do_train": True,"finetuning_type": "lora","lora_target": "q_proj,v_proj",# 其他參數保持不變... }
QLoRA的局限性
- 初始加載時間較長:量化模型需要額外時間加載和準備。
- 特定硬件依賴:需要GPU支持BF16或FP16計算(大多數現代GPU都支持)。
- 極端低精度可能影響性能:在某些任務上,4位量化可能略微降低模型表現,但通常影響較小。
總結
QLoRA是當前最先進的大模型微調技術之一,它通過量化預訓練權重+LoRA微調的組合,將百億級參數模型的微調門檻降低到消費級硬件水平。對于個人開發者或資源有限的團隊,QLoRA是實現低成本、高效率模型微調的理想選擇。