快轉到主要內容
  1. Posts/

使用LLaMA-Factory微調LLaMA模型:Colab與本地環境教學

深度學習 自然語言處理 LLM 模型微調 LLaMA LLaMA-Factory 模型微調 LoRA Google Colab 深度學習 自然語言處理 大型語言模型 Instruction Tuning
目錄

前言
#

這篇文章是紀錄如何在Google Colab或本機上微調LLaMA模型或其他LLM,並展示如何使用LLaMA-Factory工具來進行模型訓練。本文將介紹從環境設置到訓練過程的每一個步驟,同時說明如何處理在訓練過程中可能會遇到的問題。還會介紹如何將微調過的LLaMA模型與LoRA模型結合,並提供一些有用的技巧來解決訓練過程中的各種挑戰。最後,透過案例分析,探討較小的訓練資料集對於LLM監督微調的效果與挑戰,分析在資料量有限的情況下,模型是否能有效學習到資料集中的特徵。

Colab Notebook
#

本文採用的colab notebook如下:

使用 LLaMA Factory 微調 Llama-3 中文對話模型

本地環境設置
#

首先,在本地需要安裝所需的依賴套件。請執行以下命令來安裝huggingface_hub,這樣可以更輕鬆地下載和管理Hugging Face上的模型:

pip install -U "huggingface_hub[cli]"

接著,修改模型名稱和下載位置以符合我們的需求。請根據自己的設置進行調整:

huggingface-cli download --resume-download unsloth/Llama-3.2-3B-Instruct --local-dir /home/user/Documents/models/Llama-3.2-3B-Instruct

拉取並安裝LLaMA-Factory
#

接下來,需要從GitHub拉取LLaMA-Factory並安裝必要的依賴套件。這些依賴包括PyTorch和一些評估指標或加速訓練的套件:

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
pip install unsloth

啟動網頁UI
#

LLaMA-Factory提供了簡單易用的Web UI,可以使用llamafactory-cli來啟動它:

llamafactory-cli webui

這時,你應該能夠看到以下的網頁界面,這是訓練過程的操作平台。

Image

修改模型設定
#

進入LLaMA-Factory的資料夾後,找到identity.json檔案,這個檔案包含了關於模型的基本資訊。

Image

將{{name}}替換為你想要的模型名稱,例如“小幫手”,並將{{author}}修改為你的名字。

Image

完成後的identity.json應該看起來像這樣:

Image

修改資料集設定(可選)
#

如果使用的是自訂的資料集(例如自己整理的資料),需要手動將其加入 LLaMA-Factory 的資料集設定中,以便在 WebUI 或 CLI 中正確讀取。這可以透過編輯 dataset_info.json 檔案來完成。

步驟如下:

  • 開啟 LLaMA-Factory/dataset_info.json 檔案。
  • 在 JSON 結尾加入你的資料集條目,格式如下:
"your-dataset": {
  "file_name": "your-dataset.json"
}

舉例來說,若將自訂資料儲存在 data/identity.json,並希望使用 identity 作為資料集名稱,則設定如下:

"identity": {
  "file_name": "identity.json"
}

📌 注意:

  • file_name 對應的是你放在 data/ 資料夾中的檔名(建議 JSON 格式)。
  • 若你的資料集位於其他路徑,可以在 CLI 模式下透過 -dataset_dir 參數指定路徑。

完成設定後,你就可以在 WebUI 的資料集下拉選單中看到這個資料集名稱,或在訓練指令中使用:

--dataset identity 

這樣 LLaMA-Factory 就會正確載入你的自訂資料集進行微調。若是第一次製作資料,也可以搭配官方提供的 convert_alpaca.py 腳本或自行撰寫轉換腳本,將資料整理為 instruction 格式。

設定資料集和模型配置
#

根據你的需求配置資料集和模型設置。資料集設定為identity,並根據需求調整模型設置。參見下圖的配置示例。下方圖片顯示模型名稱為Qwen,但你可以替換為任何LLM

Image

當配置完成後,點擊“開始”按鈕,模型訓練便會啟動。

Image

訓練並測試
#

訓練完成後,你可以進入“聊天”頁面,開始與模型互動。

Image

例如,你可以問它:“你是誰?”或“介紹你自己”。如果模型回答符合預期,那麼說明訓練成果良好。

Image

合併LLaMA模型與LoRA
#

在訓練完成後,若需要將微調過的LLaMA模型與LoRA模型合併,可以參考以下使用 YAML 撰寫的範例配置文件(位於 LLaMA-Factory/examples/merge_lora/llama3_lora_sft.yaml)進行設定:

### Note: DO NOT use quantized model or quantization_bit when merging lora adapters

### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
trust_remote_code: true

### export
export_dir: output/llama3_lora_sft
export_size: 5
export_device: cpu
export_legacy_format: false

這裡指定了原始模型的位置 (model_name_or_path)、LoRA 模型的儲存位置 (adapter_name_or_path),以及輸出合併後模型的資料夾 (export_dir)。請根據實際的訓練路徑修改這些參數。

啟動合併程序
#

當完成 YAML 設定後,可以透過以下命令啟動模型合併程序:

python src/merge_lora.py examples/merge_lora/llama3_lora_sft.yaml

此指令會讀取指定的 YAML 檔案,然後將 LoRA 模型參數合併進原始 LLaMA 模型中,並將結果儲存到 export_dir 指定的路徑下。

⚠️ 注意事項:

  • 合併時 不要使用量化過的模型,否則可能導致合併失敗或模型效能異常。
  • 建議將 export_device 設為 cpu,特別是在 GPU 記憶體有限的環境中執行。

當合併完成後,你就可以將這個新的合併模型用於部署或離線推理,不再需要額外載入 LoRA 權重檔案,讓部署流程更加簡潔。

壓縮LoRA檔案並下載到本地(可選)
#

在進行 LLM 和 LoRA 的合併時,有時需要將訓練過程中的 LoRA 參數檔案壓縮,以便於後續合併或下載到本地端。以下是一段在 Colab 上執行的程式碼,目的是將必要的 LoRA 檔案(如 adapter_config.json 和 adapter_model.safetensors)打包成一個壓縮檔,方便下載。這樣不僅可以節省本地端存儲空間,也能加速文件傳輸

!zip llama3_lora_small.zip \
  /workspace/output/llama3-8b-lora/2024-04-05-10-30-00/adapter_config.json \
  /workspace/output/llama3-8b-lora/2024-04-05-10-30-00/adapter_model.safetensors
files.download("llama3_lora_small.zip")

載入合併後的模型進行推理(可選)
#

當你已經成功將 LLaMA 模型與 LoRA 模型合併後,推理流程就變得相對簡單。這時你可以像載入一般 Hugging Face 模型一樣使用 transformers 套件進行推理,而不需要額外掛載 LoRA adapter

以下是 Python 推理範例程式碼:

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 載入合併後模型的目錄
model_path = "output/llama3_lora_sft"  # 這裡填入你的 export_dir 路徑

# 載入 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map="auto")

# 準備輸入提示詞
prompt = "你好,請簡單介紹你自己。"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

# 模型生成輸出
with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=100,
        do_sample=True,
        top_k=50,
        top_p=0.95,
        temperature=0.8
    )

# 解碼並顯示模型回應
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

提醒:

  • 如果GPU 記憶體不足,可以將 torch_dtype=torch.float16 改為 torch.float32。
  • 若使用的是 LLaMA-3 系列模型,記得加上 trust_remote_code=True,以支援其特殊架構。(來源:ChatGPT)

案例探討
#

本次實驗使用約 400 筆以特定遊戲角色為主的資料,透過 Google Colab 對 llama3-8b 模型進行微調,資料格式採用指令式的問答格式(Instruction tuning),以模擬實際使用者會詢問的問題。儘管資料量相對有限,但模型在訓練後已能初步掌握遊戲中角色的基本資訊,如屬性、定位、技能效果等。

訓練資料說明
#

例如以下資料:

{
  "instruction": "分析茜特菈莉、鍾離和藍硯這三位五星角色在護盾功能上的異同。",
  "input": "",
  "output": "茜特菈莉、鍾離和藍硯都是遊戲中可以給隊友護盾的角色,但各有優劣……(略)"
}

透過類似資料的訓練,模型能夠針對玩家常見的角色問題,提供具有一定參考性的建議。然而,在推理階段仍可能出現錯誤回答或產生幻覺

微調成果展示:模型輸出與正確答案對比分析
#

為驗證微調後模型的表現,我以幾筆測試指令作為輸入,並將 llama3-8b 模型的輸出與正確答案進行比較。這些測試問題皆來自實際玩家在討論角色時常見的疑問,例如角色定位、抽卡建議與新手適用性等。

錯誤案例
#

  • 原神
    Image
  • 絕區零
    Image
  • 崩壞:星穹鐵道
    Image

測試問題
#

以其中一筆測試舉例:

比較瑪薇卡和阿蕾奇諾兩位火元素角色的定位和強度,在什麼情況下推薦抽取哪一位角色?

✅ 正確答案(來源:網路文章):

瑪薇卡與阿蕾奇諾皆屬火屬性角色,但在隊伍中的功能定位有所差異。瑪薇卡兼具支援與攻擊能力,靈活度高,特別適合在納塔地區的陣容中發揮作用;而阿蕾奇諾則是一位專職輸出手,以高火力見長,能在短時間內造成大量傷害。抽卡建議方面:若隊伍中缺乏強力火系主輸出,且組隊時不太講究元素相容性,阿蕾奇諾會是優先考慮;反之,若偏好一位多功能角色,並希望強化納塔體系隊伍的完整性,即便火力略遜一籌,瑪薇卡依然是不錯的選項。

🤖 模型輸出(錯誤範例):

瑪薇卡和阿蕾奇諾的定位都是火元素輔助,但他們的能力機制和強度不同。瑪薇卡適合需要火元素增益的隊伍,而阿蕾奇諾則偏向需要額外輔助效果的隊伍。在需要火元素增益的隊伍中,瑪薇卡可能更為優先選擇;在需要額外輔助效果的隊伍中,阿蕾奇諾可可能更為優先選擇。

透過上述對比可以觀察到,微調後的模型雖已能理解「角色之間存在差異」的概念,但仍可能在角色定位、機制理解與背景知識整合方面出現幻覺並導致錯誤。這可能源於訓練樣本中關鍵詞過於重複、背景補充不足,或是資料規模太小,而無法覆蓋完整遊戲邏輯所致。

微調成果與分析
#

微調後的 LLaMA3-8B 雖能生成語句通順、邏輯清晰的回應,但在知識正確性上仍有不足。例如在比較「瑪薇卡」與「阿蕾奇諾」時,模型將兩者的隊伍定位搞混,甚至遺漏角色的核心技能機制。此類錯誤主因可能是訓練資料量有限,模型學到的是回答的語氣與架構,而非對遊戲角色的深層理解。

此外,資料中缺乏反例與明確對比,導致模型容易將概念混淆,生成出看似合理但實際不準確的回答。要改善這種現象,需增加更多高品質的資料,或結合知識檢索技術(如 RAG)讓模型回應前能參考可靠資訊來源。

著作權聲明
#

本篇文章所引用及使用的資料皆來自網路,並僅用於教育與教學目的。所有內容的版權歸原作者所有。

Ernie
作者
Ernie

相關文章

使用檢索增強生成技術(RAG)分析精神健康議題的求助態度
自然語言處理 機器學習 RAG Python RAG LLM BERT 情感分析 心理健康 自然語言處理 機器學習 向量檢索 Qdrant
利用RAG技術,分析文章中對心理健康問題的求助態度。
基於 MLOps 的機器學習實驗管理與監控系統
MLOps 機器學習 深度學習 DevOps Automation Python PyTorch MLOps Git Grafana Prometheus Docker DVC MLflow CI/CD Ansible Drone Hydra
展示如何使用 MLOps 技術來構建高效、可擴展的文本分類模型,結合 Docker、DVC、MLflow、Grafana 等工具,實現自動化部署與監控
InfinityFree免費虛擬主機:PHP網站架設完整教學
網站架設 PHP Tutorial InfinityFree PHP 網站架設 MySQL SSL HTTPS 免費虛擬主機
手把手教學使用InfinityFree免費虛擬主機架設PHP網站,圖文並茂,快速上手。