步驟一:準備LLamaFactory環境
首先,讓我們嘗試使用github的方式克隆倉庫:
git config --global http.sslVerify false && git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
# 創建新環境,指定 Python 版本(以 3.10 為例)
conda create -n llamafactory python=3.10 -y# 激活環境
conda activate llamafactory
倉庫已經成功克隆下來了。現在讓我們進入項目目錄并查看一下環境要求:
cd LLaMA-Factory && cat requirements.txt
現在讓我們安裝所需的依賴:
pip3 install -r requirements.txt
?將CLI 工具(如有)注冊到你的環境變量中
pip install -e .
步驟二:準備模型
下載QwenCoder模型?
#模型下載
from modelscope import snapshot_download
model_dir = snapshot_download('XGenerationLab/XiYanSQL-QwenCoder-3B-2504')
步驟三:準備數據集
編輯?dataset_info.json
?dataset_info.json?文件(一般在?LLaMA-Factory/data/?目錄下),添加以下內容:
"code_train.json": {"file_name": "code_train.json","columns": {"prompt": "instruction","query": "input","response": "output"},"format": "alpaca"}
步驟四:編寫微調命令
LlamaFactory 的微調命令如下:
python src/train.py \--stage sft \--model_name_or_path /root/.cache/modelscope/hub/models/XGenerationLab/XiYanSQL-QwenCoder-3B-2504 \--do_train \--dataset_dir data \--dataset code_train.json \--output_dir output/qwencoder-sft \--per_device_train_batch_size 2 \--per_device_eval_batch_size 2 \--num_train_epochs 3 \--learning_rate 2e-5 \--fp16
步驟五:檢查輸出結果
- 微調完成后,模型權重和配置會保存在?output/qwencoder-sft?目錄下。
- 你可以在該目錄下找到如?pytorch_model.bin、adapter_model.bin、config.json、tokenizer_config.json?等文件。
步驟六:用 HuggingFace Transformers?代碼推理
import argparse
import json
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
from tqdm import tqdmdef parse_args():parser = argparse.ArgumentParser(description="自動評測微調模型的推理效果")parser.add_argument('--model_dir', type=str, default='output/qwencoder-sft', help='模型目錄')parser.add_argument('--test_file', type=str, default='code_test.json', help='測試集文件')parser.add_argument('--max_new_tokens', type=int, default=128, help='生成最大新token數')parser.add_argument('--device', type=str, default=None, help='推理設備,默認自動檢測')parser.add_argument('--strict', action='store_true', help='是否嚴格匹配輸出')return parser.parse_args()def main():args = parse_args()device = args.device or ('cuda' if torch.cuda.is_available() else 'cpu')print(f"加載模型到 {device} ...")model = AutoModelForCausalLM.from_pretrained(args.model_dir, trust_remote_code=True).to(device)tokenizer = AutoTokenizer.from_pretrained(args.model_dir, trust_remote_code=True)model.eval()print(f"加載測試集 {args.test_file} ...")with open(args.test_file, "r", encoding="utf-8") as f:test_data = json.load(f)correct = 0total = 0results = []for item in tqdm(test_data, desc="推理中"):prompt = item["instruction"]if item.get("input"):prompt += "\n" + item["input"]inputs = tokenizer(prompt, return_tensors="pt").to(device)with torch.no_grad():outputs = model.generate(**inputs, max_new_tokens=args.max_new_tokens)pred = tokenizer.decode(outputs[0], skip_special_tokens=True).strip()gt = item["output"].strip()# 評測方式if args.strict:is_correct = (pred == gt)else:is_correct = (gt in pred)correct += int(is_correct)total += 1results.append({"prompt": prompt,"prediction": pred,"ground_truth": gt,"is_correct": is_correct})print(f"Prompt: {prompt}\nPred: {pred}\nGT: {gt}\nCorrect: {is_correct}\n---")acc = correct / total if total > 0 else 0print(f"\n總數: {total},正確: {correct},準確率: {acc:.2%}")# 保存詳細結果with open("eval_results.json", "w", encoding="utf-8") as f:json.dump(results, f, ensure_ascii=False, indent=2)print("詳細評測結果已保存到 eval_results.json")if __name__ == "__main__":main()
使用方法
在?LLaMA-Factory?目錄下運行:
python t.py \--model_dir output/qwencoder-sft \--test_file code_test.json \--max_new_tokens 128 \--strict # 可選,嚴格匹配時加