之前了解過一些LLM從訓練到落地的過程;
其中一個重要的步驟就是微調;
預訓練:在大規模數據上學習通用語言知識。(使用海量無標注文本(TB級))
微調:在預訓練基礎上,使用特定任務的標注數據進一步優化模型。(使用少量任務標注數據(KB-MB級))
預訓練是“培養通才”,微調是“打造專才”
全量微調, 成本太高, 個人搞不了,一般企業也搞不了, 所以現在開始學習高效參數微調PEFT(Parameter-Efficient Fine Tuning)
核心思想:凍結大部分預訓練參數,只訓練少量新增參數。
優勢:顯存占用低、訓練速度快、避免遺忘
通常大模型部署在服務器上,代碼在我們自己的電腦上編寫
核心思路就是
本地:負責編寫代碼、準備數據、發起微調任務、監控訓練過程。
服務器:負責實際的模型加載、計算和參數更新(利用 GPU 資源)
其實就是本地寫代碼,然后把代碼在服務器上運行
我這邊采用的方式是VS Code 遠程開發
安裝 VS Code 插件:Remote-SSH 參考: https://blog.csdn.net/xy3233/article/details/149528434
現在開始微調一個大模型,
參考: https://www.lixueduan.com/posts/ai/05-finetune-llamafactory/
先跟著別人一步一步做
我們先下載一個小模型 Qwen1.5-1.8B-Chat
modelscope download --model Qwen/Qwen1.5-1.8B-Chat --local_dir /opt/vllm/models/Qwen1.5-1.8B-Chat
然后啟動模型(注意python虛擬環境)
vllm serve /opt/vllm/models/Qwen1.5-1.8B-Chat \
--max-model-len 8192 \
--gpu-memory-utilization 0.70 \
--host 0.0.0.0 \
--port 8081 \
--served-model-name Qwen1.5-1.8B-Chat
gpu小的話 就調整 gpu-memory-utilization 0.70 不然顯存不夠
啟動完畢
測試:
http://localhost:8081/v1/chat/completions
{"model": "Qwen1.5-1.8B-Chat","messages": [{"role": "system","conten": "You are a helpful assistant."},{"role": "user","content": [{"type": "text","text": "你是誰"}]}]
}
回復:
{"id": "chatcmpl-1fdd8d7a1e134a0ea2938520a983d58e","object": "chat.completion","created": 1753168788,"model": "Qwen1.5-1.8B-Chat","choices": [{"index": 0,"message": {"role": "assistant","reasoning_content": null,"content": "我是來自阿里云的大規模語言模型,我叫通義千問。我是阿里巴巴集團研發的超大規模語言模型,是全球首個預訓練語言模型,擁有超過1750萬參數,能夠理解和生成高質量的語言文本。\n\n我可以回答各種問題,無論是科技、文化、生活、娛樂還是專業知識領域的問題,都能提供準確和流暢的回答。我能處理大量數據,具有強大的語義理解、自然語言生成、問答系統、知識圖譜構建等能力,能夠根據上下文進行推理和思考,幫助用戶獲取所需的信息和知識,實現人機交互的智能化。\n\n此外,我還支持多種應用場景,例如智能客服、智能寫作、智能翻譯、自動摘要、推薦系統、智能問答系統等,并且可以通過接口與多個外部應用系統集成,形成更復雜的多模態對話系統。\n\n作為一款預訓練語言模型,我通過不斷的學習和優化,持續提升自己的性能和效果,同時也為人工智能領域的研究和發展做出了重要貢獻。無論是在技術上,還是在實際場景的應用中,我都希望能夠成為您高效解決問題、獲取信息、交流溝通的重要工具,共同推動人工智能的進步和發展。","tool_calls": []},"logprobs": null,"finish_reason": "stop","stop_reason": null}],"usage": {"prompt_tokens": 15,"total_tokens": 251,"completion_tokens": 236,"prompt_tokens_details": null},"prompt_logprobs": null,"kv_transfer_params": null
}
目標: 修改模型自我認知, 當詢問: 它是誰 要回復它是: 它是賈維斯,由鋼鐵俠制造;
下面使用 LLaMAFactory 演示如何進行 LoRA 微調。
LLaMAFactory簡介:
LLaMA Factory 是一個大模型微調與部署工具包
兼容主流開源模型,如 LLaMA 系列、Qwen 系列、Mistral、Baichuan、ChatGLM、Yi 等,支持多種微調方法
全參數微調:更新模型所有參數,適合資源充足的場景。
參數高效微調:包括 LoRA、QLoRA、IA3、Prefix-Tuning 等,僅更新少量參數,大幅降低顯存需求。
指令微調:針對對話、問答等任務優化模型響應,支持多輪對話格式。評估與部署一體化
提供自動評估工具,支持困惑度(Perplexity)、人工評分等指標。
集成部署功能,可直接導出為 Hugging Face 格式、ONNX 格式,
或通過 vllm、FastAPI 快速部署為 API 服務。
環境隔離
創建一個虛擬環境python3 -m venv LLaMA-env
激活 source /opt/vllm/env/LLaMA-env/bin/activate
退出 deactivate
前置條件
安裝 torch,torchvision,transformers 這幾個的版本;
直接到 https://github.com/hiyouga/LLaMA-Factory.git 看一下推薦版本;
然后根據cuda的版本 來確定 torch的版本
我這里使用的是 torch 2.6.0+cu118, torchvision 0.21.0+cu118;
然后安裝 transformers==4.50.0
版
①安裝 LLaMAFactory 和所需依賴
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -r requirements.txt
pip install -e .
LLaMA-Factory 校驗
使用 llamafactory-cli version
快速校驗安裝是否成功
在這里插入圖片描述
- 準備數據集
準備數據集可以分為兩個步驟:
1)準備數據集文件,json 格式,存放到 data 目錄下
2)注冊數據集,將 json 文件注冊到 data 目錄下的 dataset_info.json 文件
LLaMA-Factory 內置了一些數據集,本次就使用內置的 identity 數據集(在data文件夾下),用于修改模型的自我意識。
將identity.json 復制一份, 命名 identity2.json,
對{{name}} 和{{author}} 進行全局替換。 這樣數據就準備好了
注冊數據集: 在data文件夾中找dataset_info.json,把內容改成 (只放這一個)
{"identity": {"file_name": "identity2.json"}
}
key 為數據集名稱,比如這里的 identity
value 為數據集配置,只有文件名 file_name 為必填的,比如這里的 identity2.json
modelPath=/opt/vllm/models/Qwen1.5-1.8B-Chatllamafactory-cli train \--model_name_or_path $modelPath \--stage sft \--do_train \--finetuning_type lora \--template qwen \--dataset identity \--output_dir ./saves/lora/sft \--learning_rate 0.0005 \--num_train_epochs 8 \--cutoff_len 4096 \--logging_steps 1 \--warmup_ratio 0.1 \--weight_decay 0.1 \--gradient_accumulation_steps 8 \--save_total_limit 1 \--save_steps 256 \--seed 42 \--data_seed 42 \--lr_scheduler_type cosine \--overwrite_cache \--preprocessing_num_workers 16 \--plot_loss \--overwrite_output_dir \--per_device_train_batch_size 1 \--fp16
執行完之后是這樣的
根據前面的指令 微調后的模型保存到了我們指定的 ./saves/lora/sft 目錄
只是權重文件比較小,只有 29M。(這個執行不起來,我試了 也許是錯了)
權重合并
使用的 LoRA 微調,會生成單獨的 LoRA 權重,當微調完成后需要將原始模型和 LoRA 權重進行合并,得到一個新的模型。
# 原始模型
modelPath=/opt/vllm/models/Qwen1.5-1.8B-Chat
# 上一步微調得到的 LoRA 權重
adapterModelPath=./saves/lora/sft/llamafactory-cli export \--model_name_or_path $modelPath \--adapter_name_or_path $adapterModelPath \--template qwen \--finetuning_type lora \--export_dir /opt/vllm/models/Qwen1.5-1.8B-Chat-2 \--export_size 2 \--export_device cpu \--export_legacy_format False
結果是這樣的
合并完之后
重新啟動測試
vllm serve /opt/vllm/models/Qwen1.5-1.8B-Chat-2 \
--max-model-len 8192 \
--gpu-memory-utilization 0.70 \
--host 0.0.0.0 \
--port 8081 \
--served-model-name Qwen1.5-1.8B-Chat
測試結果