當下最容易上手的大模型微調工具是誰?LLamaFactory或是其中之一
近日,國內的一款微調框架發布了自己的論文《LLAMAFACTORY: Unified Efficient Fine-Tuning of 100+ Language Models》,對他們的框架做了系統性的總結。該框架自推出后迅速出圈,現已斬獲15.6k的star,逐步成為當下微調的首選工具。
??https://arxiv.org/pdf/2403.13372.pdf??
模型微調相較于上下文學習來講,存在比較高的門檻,但又是模型專業化,領域化不可或缺的技術手段。而其復雜性突出表現在這些方面:
1)理論基礎,如果說基于大模型寫prompt 根據一定范式來構建RAG或者Agent不需要太多機器學習理論知識,然而微調就必須要對這些有理解,比如樣本,學習率,logloss等。
2)數據準備,對于普通開發者,高質量的數據是微調成功的關鍵保證,而如何預處理,清洗,標注這些樣本本身就很復雜,更因此誕生了大模型數據工程這樣的領域來解決這一問題。
3)基座模型存在分化,雖然當下很多模型都參考llama和huggingface的一些規范,但是仍然都有一些特殊之處,想要微調也需要針對性地去分析和構建相應的策略。
4)超參數優化,微調本身是一個“煉丹”過程,如何能夠找到合適的超參數,達到一個最佳性能,是一個重大挑戰。
5)AI工程復雜性,涉及到硬件\軟件\復雜流程的協同配合以及系統優化,在有限的成本、資源和時間要求下完成模型訓練過程。
正是因為這些原因,對于預訓練微調,需要一個類似于工廠的工業化手段來降低門檻,提升效率。
因此,行業內出現了很多微調框架,而LLamaFactory(https://github.com/hiyouga/LLaMA-Factory)便是其中之一,從起名上就可以看出它們的目標是成為模型微調的工廠。
它得以流行主要得益于支持當下主流的大模型百川、千問、LLaMA等,不僅集成了大模型預訓練、監督微調和強化微調等階段的主流的微調技術(支持 LoRA 和 QLoRA 等參數高效微調策略),還提供了預訓練、指令微調等豐富的數據集,方便參考使用,最重要的是提供了一個無代碼的圖形界面,大幅降低使用門檻,非開發者也可以方便地完成模型微調。
該框架架構上由四個模塊構成:模型加載器、數據工作器和訓練器,以及用戶界面LlamaBoard。
在根據官方文檔安裝好LLamaFactory后,可以有三種方式進行操作,WebUI、CLI或者Python。
1.webUI。
CUDA_VISIBLE_DEVICES=0 python src/train_web.py
2.CLI,由于有時候界面限制,可能需要命令行的方式進行微調。如果不知道具體格式,可以在界面上配置好,再復制到命令行中調整使用。
在example目錄中有大量的示例可供參考。
examples/
├── lora_single_gpu/
│ ├── pretrain.sh: 進行預訓練
│ ├── sft.sh: 進行指令監督微調
│ ├── reward.sh: 進行獎勵模型訓練
│ ├── ppo.sh: 進行 PPO 訓練
│ ├── dpo.sh: 進行 DPO 訓練
│ ├── orpo.sh: 進行 ORPO 訓練
│ ├── prepare.sh: 保存預處理后的數據集
│ └── predict.sh: 進行批量預測
├── qlora_single_gpu/
│ ├── bitsandbytes.sh: 微調 4/8 比特 BNB 模型
│ ├── gptq.sh: 微調 4/8 比特 GPTQ 模型
│ ├── awq.sh: 微調 4 比特 AWQ 模型
│ └── aqlm.sh: 微調 2 比特 AQLM 模型
├── lora_multi_gpu/
│ ├── single_node.sh: 使用 Accelerate 進行單節點訓練
│ └── multi_node.sh: 使用 Accelerate 進行多節點訓練
├── full_multi_gpu/
│ ├── single_node.sh: 使用 DeepSpeed 進行單節點訓練
│ └── multi_node.sh: 使用 DeepSpeed 進行多節點訓練
├── merge_lora/
│ ├── merge.sh: 將 LoRA 權重合并到預訓練模型中
│ └── quantize.sh: 使用 AutoGPTQ 量化模型
├── inference/
│ ├── cli_demo.sh: 啟動命令行推理接口
│ ├── api_demo.sh: 啟動 OpenAI 風格 API
│ ├── web_demo.sh: 啟動瀏覽器推理接口
│ └── evaluate.sh: 在 MMLU 數據集上評測模型
└── extras/
├── galore/
│ └── sft.sh: 使用 GaLore 訓練模型
├── loraplus/
│ └── sft.sh: 使用 LoRA+ 訓練模型
├── llama_pro/
│ ├── expand.sh: 擴展模型中的層
│ └── sft.sh: 訓練擴展后的模型
└── fsdp_qlora/
└── sft.sh: 使用 FSDP 微調量化模型
3)編程方式。
from llmtuner import run_exp
run_exp(dict(
stage="sft",
do_train=True,
model_name_or_path="Qwen/Qwen1.5-0.5B-Chat",
dataset="identity,alpaca_gpt4_en,alpaca_gpt4_zh",
template="qwen",
finetuning_type="lora",
lora_target="all",
output_dir="test_identity",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
lr_scheduler_type="cosine",
logging_steps=10,
save_steps=100,
learning_rate=1e-4,
num_train_epochs=5.0,
max_samples=500,
max_grad_norm=1.0,
fp16=True,
))
對于用戶來講,準備正確高質量的數據是用好該工具的關鍵。在使用自定義數據集時需要在 dataset_info.json 文件中按照以下格式提供數據集定義,數據集格式支持兩種:alpaca 和 sharegpt,具體可參考其官方文檔。
"數據集名稱": {
"hf_hub_url": "Hugging Face 的數據集倉庫地址(若指定,則忽略 script_url 和 file_name)",
"ms_hub_url": "ModelScope 的數據集倉庫地址(若指定,則忽略 script_url 和 file_name)",
"script_url": "包含數據加載腳本的本地文件夾名稱(若指定,則忽略 file_name)",
"file_name": "該目錄下數據集文件的名稱(若上述參數未指定,則此項必需)",
"file_sha1": "數據集文件的 SHA-1 哈希值(可選,留空不影響訓練)",
"subset": "數據集子集的名稱(可選,默認:None)",
"folder": "Hugging Face 倉庫的文件夾名稱(可選,默認:None)",
"ranking": "是否為偏好數據集(可選,默認:False)",
"formatting": "數據集格式(可選,默認:alpaca,可以為 alpaca 或 sharegpt)",
"columns(可選)": {
"prompt": "數據集代表提示詞的表頭名稱(默認:instruction)",
"query": "數據集代表請求的表頭名稱(默認:input)",
"response": "數據集代表回答的表頭名稱(默認:output)",
"history": "數據集代表歷史對話的表頭名稱(默認:None)",
"messages": "數據集代表消息列表的表頭名稱(默認:conversations)",
"system": "數據集代表系統提示的表頭名稱(默認:None)",
"tools": "數據集代表工具描述的表頭名稱(默認:None)"
},
"tags(可選,用于 sharegpt 格式)": {
"role_tag": "消息中代表發送者身份的鍵名(默認:from)",
"content_tag": "消息中代表文本內容的鍵名(默認:value)",
"user_tag": "消息中代表用戶的 role_tag(默認:human)",
"assistant_tag": "消息中代表助手的 role_tag(默認:gpt)",
"observation_tag": "消息中代表工具返回結果的 role_tag(默認:observation)",
"function_tag": "消息中代表工具調用的 role_tag(默認:function_call)",
"system_tag": "消息中代表系統提示的 role_tag(默認:system,會覆蓋 system 列)"
}
}
經過以上的步驟,剩下的就是需要耐心的調參和評估了。下面是一個利用webui進行微調操作示例。
小結
相較于其他方法,目前,LlamaFactory可以說是當下最簡單快捷又功能強大的一種微調工具,值得大家學習使用。
