引言
本文繼續研究 LLaMA-Factory 微調數據的流程,側重于微調結果與模型導出。
數據集準備
首先參考 LLaMA-Factory 核心開發者的文章[1],下載用于微調的公開的商品文案數據集 AdvertiseGen。
下載地址:https%3A//cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/%3Fdl%3D1
其總共包含了10w+條這樣的數據:
{"content": "類型#上衣*版型#h*材質#蠶絲*風格#復古*圖案#條紋*圖案#復古*圖案#撞色*衣樣式#襯衫*衣領型#小立領", "summary": "小女人十足的條紋襯衣,緞面一點點的復古,還有藍綠色這種高級氣質復古色,真絲材質,撞色豎條紋特別的現代感味道,直h型的裁剪和特別的衣長款式,更加獨立性格。雙層小立領,更顯臉型。"}
LLaMA-Factory 內置了格式映射轉換,因此實際上不需要像前文那樣手動編寫腳本進行格式轉換,只需要在dataset_info.json
里面按照如下方式進行注冊:
"adgen_local": {"file_name": "AdvertiseGen_train.json","columns": {"prompt": "content","response": "summary"}
}
微調過程及結果測試
參數設置主要調節以下內容:
- 預熱步數從0上調到20
- 訓練輪數從3上調到5
- 最大樣本數從100000下調到1000
- 驗證集比例從0上調到0.1
這樣調整意味著不會將所有的數據進行訓練,訓練的數據總數為1000 * 0.9 = 900條。
使用 DeepSeek-R1-7B
模型進行 LoRA 微調,差不多10分鐘訓練完成。
從結果看 loss 還是比較大,正常情況 < 1 會比較好,說明還有收斂空間。
下面加載模型進行測試,微調前模型問答效果如下
選擇檢查點,載入訓練完的 LoRA 適配器,
微調后模型問答效果如下:
看上去,微調完的有點意思,但效果不是特別明顯。微調前模型會產生“可能”之類的不確定表述,微調之后模型會更“自信”。
結果導出到Ollama
后面我又用 easy dataset做了一個幾十條規模的小數據集,嘗試在DeepSeek-R1-32B
的模型基礎上微調,效果不達預期,這里就不放結果,只討論如何進行模型導出。
首先在webui的export菜單中,將模型進行導出。需注意,使用 bf16 精度格式無法直接導出量化的模型版本。
同時,LoRA層會合并到原始模型中,大約會占據1B左右的參數。
之后安裝 GGUF 庫,用于模型的格式轉換。
通過官方倉庫安裝,版本最新:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp/gguf-py
pip install --editable .
將模型轉換成 gguf 格式:
python convert_hf_to_gguf.py /home/zxy/code/LLaMA-Factory/output_model
轉換時,參考其輸出日志,可發現其會自動將某些層變成fp16和fp32。
INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00014.safetensors'
INFO:hf-to-gguf:token_embd.weight, torch.bfloat16 --> F16, shape = {5120, 152064}
INFO:hf-to-gguf:blk.0.attn_norm.weight, torch.bfloat16 --> F32, shape = {5120}
INFO:hf-to-gguf:blk.0.ffn_down.weight, torch.bfloat16 --> F16, shape = {27648, 5120}
INFO:hf-to-gguf:blk.0.ffn_gate.weight, torch.bfloat16 --> F16, shape = {5120, 27648}
INFO:hf-to-gguf:blk.0.ffn_up.weight, torch.bfloat16 --> F16, shape = {5120, 27648}
INFO:hf-to-gguf:blk.0.ffn_norm.weight, torch.bfloat16 --> F32, shape = {5120}
INFO:hf-to-gguf:blk.0.attn_k.bias, torch.bfloat16 --> F32, shape = {1024}
轉換完成后,會在模型原路徑下得到gguf文件。
用 ollama 注冊模型,執行以下命令,my_deepseek_r1_32b
為模型名稱。
ollama create my_deepseek_r1_32b -f /home/zxy/code/LLaMA-Factory/output_model/Modelfile
ollama會將模型再拷貝一份到其存儲路徑中。
注冊完成后,就可以通過ollama list
看到自己創建的模型。
導出為fp16+fp32的混合精度,比原本從ollama上拉取的int4精度大不少。
結論
實測發現,模型微調的主要功能是增強模型在某方面的能力。
如果通過信息查詢對去微調模型,效果并不會很理想,RAG更加適合去查詢信息。
當數據集較大時,模型微調時間可能會很長。本文中,選取900條數據進行微調,大約耗時10分鐘。如果選取全部10w+條數據,估計需要耗時會在16小時左右。
如果微調參數量更大的模型,可能花費的時間會以天計。
此外,由于 LLaMA-Factory 封裝得很好,實踐過程中遇到的報錯很難通過調代碼解決,后面考慮研究vllm,探尋模型微調更為底層的相關原理。
參考資料
[1] LLaMA-Factory QuickStart:https://zhuanlan.zhihu.com/p/695287607