教學:使用 QLoRA 和 Axolotl 微調 Mistral 7B
在這個教學中,我們將展示如何使用 QLoRA 和 Axolotl 微調 Mistral 7B,並且在有限的 GPU 資源下,為新的任務自訂模型。我們將安裝 Axolotl,創建一個小的範例數據集,配置 LoRA 特定的超參數,執行微調過程,並測試最終模型的性能。
步驟 1:準備環境並安裝 Axolotl
!nvidia-smi
# 2. 安裝 git-lfs(用於處理大型模型文件)
!sudo apt-get -y install git-lfs
!git lfs install
# 3. 從源碼克隆 Axolotl 並安裝
!git clone https://github.com/OpenAccess-AI-Collective/axolotl.git
%cd axolotl
!pip install -e .
# (可選)如果需要特定的 PyTorch 版本,請在安裝 Axolotl 之前安裝:
# !pip install torch==2.0.1+cu118 –extra-index-url https://download.pytorch.org/whl/cu118
# 返回到 /content 目錄
%cd /content
首先,我們檢查可用的 GPU 和記憶體大小。接著,我們安裝 Git LFS,以便能夠正確處理大型模型文件(像是 Mistral 7B)。然後,我們從 GitHub 克隆 Axolotl 的代碼庫並以「可編輯」模式安裝,這樣我們就可以隨時調用它的命令。如果需要,還可以選擇安裝特定的 PyTorch 版本。最後,我們回到 /content 目錄,以便整齊地組織後續的文件和路徑。
步驟 2:創建小型範例數據集和 Mistral 7B 的 QLoRA 配置
# 創建小型 JSONL 數據集
os.makedirs(“data”, exist_ok=True)
with open(“data/sample_instructions.jsonl”, “w”) as f:
f.write(‘{“instruction”: “用簡單的語言解釋量子計算。”, “input”: “”, “output”: “量子計算使用量子位元…”}\n’)
f.write(‘{“instruction”: “法國的首都在哪裡?”, “input”: “”, “output”: “法國的首都是巴黎。”}\n’)
# 為 Mistral 7B 編寫 QLoRA 配置
config_text = “””\
base_model: mistralai/mistral-7b-v0.1
tokenizer: mistralai/mistral-7b-v0.1
# 我們將使用 QLoRA 來減少記憶體使用
train_type: qlora
bits: 4
double_quant: true
quant_type: nf4
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
target_modules:
– q_proj
– k_proj
– v_proj
data:
datasets:
– path: /content/data/sample_instructions.jsonl
val_set_size: 0
max_seq_length: 512
cutoff_len: 512
training_arguments:
output_dir: /content/mistral-7b-qlora-output
num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 4
learning_rate: 0.0002
fp16: true
logging_steps: 10
save_strategy: “epoch”
evaluation_strategy: “no”
wandb:
enabled: false
“””
with open(“qlora_mistral_7b.yml”, “w”) as f:
f.write(config_text)
print(“數據集和 QLoRA 配置已創建。”)
在這裡,我們建立了一個最小的 JSONL 數據集,包含兩組指令和回應,這樣我們就有了一個小範例來進行訓練。接著,我們構建了一個 YAML 配置,指向 Mistral 7B 基本模型,設置 QLoRA 參數以便於記憶體有效的微調,並定義訓練的超參數,如批次大小、學習率和序列長度。我們還指定了 LoRA 設定,如 dropout 和 rank,最後將這個配置保存為 qlora_mistral_7b.yml。
步驟 3:使用 Axolotl 進行微調
# 如果遇到 OOM(記憶體不足)錯誤,請減少 max_seq_length 或 LoRA rank。
!axolotl –config /content/qlora_mistral_7b.yml
在這裡,Axolotl 自動獲取並下載 Mistral 7B 的權重(這是一個大型文件),然後啟動基於 QLoRA 的微調程序。模型被量化為 4 位精度,這有助於減少 GPU 的記憶體使用。你會看到訓練日誌,顯示進度,包括每一步的訓練損失。
步驟 4:測試微調後的模型
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加載基本的 Mistral 7B 模型
base_model_path = “mistralai/mistral-7b-v0.1” # 首先使用你的 HF 用戶帳號建立訪問權限,然後運行這部分
output_dir = “/content/mistral-7b-qlora-output”
print(“\n加載基本模型和分詞器…”)
tokenizer = AutoTokenizer.from_pretrained(
base_model_path,
trust_remote_code=True
)
base_model = AutoModelForCausalLM.from_pretrained(
base_model_path,
device_map=”auto”,
torch_dtype=torch.float16,
trust_remote_code=True
)
print(“\n加載 QLoRA 適配器…”)
model = PeftModel.from_pretrained(
base_model,
output_dir,
device_map=”auto”,
torch_dtype=torch.float16
)
model.eval()
# 範例提示
prompt = “經典計算和量子計算之間的主要區別是什麼?”
inputs = tokenizer(prompt, return_tensors=”pt”).to(“cuda”)
print(“\n生成回應中…”)
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=128)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(“\n=== 模型輸出 ===”)
print(response)
最後,我們再次加載基本的 Mistral 7B 模型,然後應用新訓練的 LoRA 權重。我們設計了一個關於經典計算和量子計算之間差異的簡單提示,將其轉換為標記,並使用微調後的模型生成回應。這證實了我們的 QLoRA 訓練已經生效,並且我們可以成功地在更新的模型上進行推理。
Axolotl 支援的模型快照
總結來說,上述步驟展示了如何準備環境、設置小型數據集、配置 LoRA 特定的超參數,並在 Mistral 7B 上使用 Axolotl 執行 QLoRA 微調會話。這種方法展示了一種適合資源有限環境的參數有效訓練過程。你現在可以擴展數據集、修改超參數,或嘗試不同的開源 LLM 來進一步完善和優化你的微調流程。
在這裡下載 Colab 筆記本。所有的研究成果都歸功於這個項目的研究人員。此外,別忘了在 Twitter 上關注我們,加入我們的 Telegram 頻道和 LinkedIn 群組。也別忘了加入我們的 75k+ ML SubReddit。
🚨 Marktechpost 邀請 AI 公司/初創企業/團體合作,為即將推出的 AI 雜誌「開源 AI 在生產中的應用」和「代理 AI」提供支持。
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!