步骤一:准备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 # 可选,严格匹配时加