??上篇文章記錄了使用lora微調deepseek-7b,微調成功,但是微調llama3-8b顯存爆炸,這次嘗試使用qlora微調HQQ方式量化,微調更大參數體量的大語言模型,記錄下來微調過程,僅供參考。
對過程不感興趣的兄弟們可以直接從第3節開始看。
1.量化方法
??重點介紹bitsandbytes、hqq和eetq這三種量化方式,它們通過將模型的權重壓縮為低精度格式來減少顯存占用,從而使得可以訓練更大的模型
,或者在有限的顯存資源下運行大型模型。
- bitsandbytes: 專注于權重量化,通過將模型權重表示為更低精度的數據類型,以減少顯存占用和提升訓練效率
- hqq: 通常是一種結合了多種量化技術的方法,旨在通過多種策略進一步壓縮模型的存儲需求,并保持訓練過程的性能。
- eetq: 專注于在訓練階段有效地進行量化,以減少顯存占用,并可能采用某些自適應的量化策略來平衡效率和效果。
1.1 在配置文件中的位置:
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
quantization_bit: 4
quantization_method: bitsandbytes # choices: [bitsandbytes (4/8), hqq (2/3/4/5/6/8), eetq (8)]
如上述配置文件所示,量化模型方法有:bitsandbytes、hqq和eetq三種方式,其中bitsandbytes(4/8)是指支持4bit和8bit量化,其他兩種同理。
2.微調Meta-Llama-3-8B-Instruct
## llama3_lora_sft_otfq.yaml 修改部分
model_name_or_path: models/Meta-Llama-3-8B-Instruct/
quantization_bit: 2
quantization_method: hqq # choices: [bitsandbytes (4/8), hqq (2/3/4/5/6/8), eetq (8)]
trust_remote_code: true
...
### method
...
lora_target: q_proj,v_proj
運行訓練命令:
llamafactory-cli train examples/train_qlora/llama3_lora_sft_otfq.yaml
通過修改lora_target
,只微調q_proj和v_proj的方式減少顯存使用,成功運行,沒有OOM,但顯存也是幾乎全滿了,與官網對照表還是對不上。
3.微調Llama-2-13b-chat-hf模型
抱著菜就多練,不會就問
的態度,直接在github上問,結果還真得到了答復,問題地址:issue
得到的回復也很簡單,微調方式有問題。
于是我去官網上去找fsdp + qlora
的微調方式,還真讓我找到了!!
于是我興致沖沖的去按照官方命令微調:
bash examples/extras/fsdp_qlora/train.sh# train.sh
#CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 accelerate launch \
# --config_file examples/accelerate/fsdp_config.yaml \
# src/train.py examples/extras/fsdp_qlora/llama3_lora_sft.yaml
注意: 運行之前要修改一下fsdp_config.yaml
和llama3_lora_sft.yaml
,其中fsdp_config.yaml第19行num_processes為你GPU數量,llama3_lora_sft.yaml的配置就不贅述。
運行結果顯存使用顯著下降,但是RAM使用量提高,如圖所示:
總結
- PyTorch的全切片數據并行技術
FSDP
能讓我們處理更多更大的模型,這是微調13b模型成功的關鍵
。 - fsdp_config.yaml中的FULL_SHARD將模型參數、梯度和優化器狀態都切分到不同的GPU上,類似ZeRO-3。
- 使用
fsdp + qlora
微調方法微調32B模型依舊OOM
,后續會繼續探索DeepSpeed
方式來微調32B模型,驗證其可行性。