使用直接偏好优化(DPO)微调开源LLM模型与Axolotl

大型語言模型(LLM)為人工智慧應用解鎖了無數新機會。如果您曾經想過微調自己的模型,本指南將教您如何輕鬆實現,無需編寫任何代碼。我們將使用像 Axolotl 和 DPO 這樣的工具,逐步引導您完成這個過程。

什麼是 LLM?

大型語言模型(LLM)是一種強大的人工智慧模型,經過大量文本數據的訓練——數十萬億個字符——以預測序列中的下一組單詞。這在過去 2-3 年中才得以實現,因為 GPU 計算的進步使得如此巨大的模型可以在幾周內完成訓練。

您可能已經通過像 ChatGPT 或 Claude 這樣的產品與 LLM 互動過,並親身體驗了它們理解和生成類似人類回應的能力。

為什麼要微調 LLM?

難道我們不可以直接使用 GPT-4o 嗎?好吧,雖然它是撰寫本文時我們擁有的最強大模型,但它並不總是最實用的選擇。微調一個較小的模型,參數範圍從 30 億到 140 億,可以以較小的成本產生相似的結果。此外,微調還可以讓您擁有自己的知識產權,並減少對第三方的依賴。

理解基礎模型、指令模型和聊天模型

在深入微調之前,了解現有的不同類型的 LLM 是非常重要的:

  • 基本模型:這些模型是在大量的非結構化文本上預先訓練的,例如書籍或互聯網數據。雖然它們對語言有內在的理解,但並非針對推論進行優化,將會產生不連貫的輸出。基本模型被開發為開發更專業模型的起點。
  • 指導模型:建立在基本模型之上,指導模型使用結構化數據(如提示-回應對)進行微調。它們旨在遵循特定指令或回答問題。
  • 聊天模型:也是基於基本模型構建的,但與指導模型不同,聊天模型是在對話數據上進行訓練的,使其能夠進行來回對話。

什麼是強化學習和DPO?

強化學習(RL)是一種模型通過接收其行動的反饋而學習的技術。它被應用於指導或聊天模型,以進一步改進它們輸出的質量。通常,RL不會在基本模型的基礎上進行,因為它使用的學習速率較低,不足以產生足夠的影響。

DPO是RL的一種形式,其中模型使用同一提示/對話的好壞答案對進行訓練。通過呈現這些對,模型學習偏好好的例子並避免壞的例子。

何時使用DPO

DPO在您想要調整模型風格或行為時特別有用,例如:

  • 風格調整:修改回應的長度、詳細程度或模型表達的信心程度。
  • 安全措施:訓練模型拒絕回答潛在不安全或不適當的提示。

然而,DPO 不適合用於教導模型新知識或事實。為此,監督微調(SFT)或檢索增強生成(RAG)技術更為合適。

創建 DPO 數據集

在生產環境中,您通常會利用用戶的反饋生成 DPO 數據集,例如:

  • 用戶反饋:實施一個讓用戶點讚或點踩回應的機制。
  • 比較選擇:向用戶展示兩個不同的輸出並要求他們選擇更好的那個。

如果缺乏用戶數據,您還可以通過利用更大、更強大的LLMs創建一個合成數據集。例如,您可以使用較小的模型生成不良答案,然後使用GPT-4o對其進行更正。

為了方便起見,我們將使用來自HuggingFace的現成數據集:olivermolenschot/alpaca_messages_dpo_test。如果您檢查數據集,您將注意到其中包含了已選擇和被拒絕的答案提示,這些是好的和壞的示例。這些數據是使用GPT-3.5-turbo和GPT-4合成創建的。

通常,您至少需要500至1,000對數據,才能進行有效的訓練而不會過度擬合。最大的DPO數據集包含多達15,000至20,000對。

微調 Qwen2.5 3B 指導與 Axolotl

我們將使用Axolotl來微調目前在OpenLLM排行榜中位於頂部的Qwen2.5 3B Instruct模型,該模型屬於其大小類別。使用Axolotl,您可以在不編寫任何代碼的情況下微調模型,只需一個YAML配置文件。以下是我們將使用的config.yml:

base_model: Qwen/Qwen2.5-3B-Instruct
strict: false

# Axolotl will automatically map the dataset from HuggingFace to the prompt template of Qwen 2.5
chat_template: qwen_25
rl: dpo
datasets:
  - path: olivermolenschot/alpaca_messages_dpo_test
    type: chat_template.default
    field_messages: conversation
    field_chosen: chosen
    field_rejected: rejected
    message_field_role: role
    message_field_content: content

# We pick a directory inside /workspace since that's typically where cloud hosts mount the volume
output_dir: /workspace/dpo-output

# Qwen 2.5 supports up to 32,768 tokens with a max generation of 8,192 tokens
sequence_len: 8192

# Sample packing does not currently work with DPO. Pad to sequence length is added to avoid a Torch bug
sample_packing: false
pad_to_sequence_len: true

# Add your WanDB account if you want to get nice reporting on your training performance
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:

# Can make training more efficient by batching multiple rows together
gradient_accumulation_steps: 1
micro_batch_size: 1

# Do one pass on the dataset. Can set to a higher number like 2 or 3 to do multiple
num_epochs: 1

# Optimizers don't make much of a difference when training LLMs. Adam is the standard
optimizer: adamw_torch

# DPO requires a smaller learning rate than regular SFT
lr_scheduler: constant
learning_rate: 0.00005

# Train in bf16 precision since the base model is also bf16
bf16: auto

# Reduces memory requirements
gradient_checkpointing: true

# Makes training faster (only suported on Ampere, Ada, or Hopper GPUs)
flash_attention: true

# Can save multiple times per epoch to get multiple checkpoint candidates to compare
saves_per_epoch: 1

logging_steps: 1
warmup_steps: 0

設置雲環境

為了運行訓練,我們將使用像Runpod或Vultr這樣的雲主機服務。以下是您需要的內容:

  • Docker映像:克隆Axolotl團隊提供的winglian/axolotl-cloud:main Docker映像。
  • *硬件要求:80GB VRAM GPU(例如1×A100 PCIe節點)對於這個大小的模型來說足夠了。
  • 存儲:200GB的卷存儲器可容納我們所需的所有文件。
  • CUDA版本:您的CUDA版本應至少為12.1。

*這種類型的訓練被認為是LLM的完全微調,因此對VRAM需求很高。如果您想在本地運行訓練,而不依賴於雲主機,您可以嘗試使用QLoRA,這是一種監督微調的形式。儘管理論上可以結合DPO和QLoRA,但這很少這樣做。

開始訓練的步驟

  1. 設置HuggingFace緩存目錄:
export HF_HOME=/workspace/hf

這確保原始模型下載到我們的持久卷存儲器中。

  1. 創建配置文件:將之前創建的config.yml文件保存到/workspace/config.yml。
  1. 開始訓練:
python -m axolotl.cli.train /workspace/config.yml

然後!您應該開始訓練。在Axolotl下載了模型和訓練數據後,您應該看到類似於以下的輸出:

[2024-12-02 11:22:34,798] [DEBUG] [axolotl.train.train:98] [PID:3813] [RANK:0] loading model

[2024-12-02 11:23:17,925] [INFO] [axolotl.train.train:178] [PID:3813] [RANK:0] Starting trainer...

由於這是一個僅有264行的小數據集,訓練應該只需幾分鐘即可完成。微調後的模型將保存到/workspace/dpo-output

將模型上傳到HuggingFace

您可以使用CLI將您的模型上傳到HuggingFace:

  1. 安裝HuggingFace Hub CLI:
pip install huggingface_hub[cli]
  1. 上傳模型:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo

將yourname/yourrepo替換為您實際的HuggingFace用戶名和存儲庫名稱。

評估您的微調模型

為了進行評估,建議使用像Text Generation Inference (TGI)這樣的工具來托管原始模型和微調模型。然後,對兩個模型進行推論,溫度設置為0(以確保確定性輸出),並手動比較兩個模型的響應。

這種實踐方法比僅依賴訓練評估損失指標提供更好的見解,後者可能無法捕捉LLM中語言生成的細微差異。

結論

通過使用DPO來微調LLM,您可以根據應用程序的需求定制模型,同時保持成本可控。通過遵循本文中概述的步驟,您可以利用開源工具和數據集的力量來創建符合您特定需求的模型。無論您是想調整回應風格還是實施安全措施,DPO為您提供了一種實用的方法來完善您的LLM。

祝您微調成功!

Source:
https://www.sitepoint.com/fine-tuning-llm-with-direct-preference-optimization-dpo/