LLaMA-Factory快速入门:从零微调大模型
LLaMA-Factory实战:手把手教你微调专属大模型
在AI应用落地的今天,通用大模型虽然能“说人话”,但真要让它胜任具体工作——比如写商品文案、解答医疗问题或处理法律咨询——往往还是差了点火候。你会发现它回答得模棱两可,缺乏专业性,甚至自相矛盾。这就像请了一位知识渊博的通才来当客服,他什么都懂一点,却说不出你想要的答案。
怎么办?微调(Fine-tuning)是破局的关键。通过在特定数据上训练,我们可以把一个“通才”变成某个领域的“专才”。而在这个过程中,LLaMA-Factory 正逐渐成为开发者手中的利器。
它不是一个简单的工具包,而是一整套开箱即用的解决方案,支持包括 LLaMA、Qwen、ChatGLM、Mistral 等在内的上百种主流模型架构,覆盖全参数微调、LoRA、QLoRA 到强化学习对齐等多种技术路径。更重要的是,它提供了可视化界面和统一命令行接口,让原本复杂的微调流程变得像搭积木一样简单。
本文将以 Qwen-7B-Chat 模型 为例,在单张 RTX 3090(24GB)环境下,带你完整走一遍从环境搭建到模型部署的全流程。我们采用 QLoRA + SFT 的轻量化微调方式,最终实现一个会写电商文案、有明确身份认知的定制化 AI 助手,并将其部署为 API 或本地 Ollama 模型。
环境准备:别让第一步卡住你
再强大的框架也离不开扎实的基础环境。很多初学者失败的原因不是代码写错,而是环境没配好。
GPU 与 CUDA:先确认你的“发动机”正常运转
运行以下命令检查显卡状态:
nvidia-smi
你应该能看到类似输出:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| 30% 45C P8 18W / 350W | 1024MiB / 24576MiB | 5% Default |
+-------------------------------+----------------------+----------------------+
关键信息:CUDA 版本能被识别,显存充足(至少16GB推荐用于7B级QLoRA任务)。
如果你用的是 Conda,建议创建独立虚拟环境:
conda create -n llama_factory python=3.10
conda activate llama_factory
然后安装 LLama-Factory 主体及其依赖:
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e '.[torch,metrics]'
这个 .[torch,metrics] 安装方式很关键——它会自动拉取 PyTorch、Transformers、Peft、Accelerate 以及 BLEU/Rouge 等评估库,省去手动排查版本冲突的麻烦。
安装完成后务必做两个验证:
第一,PyTorch 是否识别 GPU?
import torch
print(torch.cuda.is_available()) # 应输出 True
print(torch.cuda.get_device_name(0)) # 输出 GPU 名称
如果返回 False,请检查 PyTorch 与 CUDA 驱动是否匹配。国内用户推荐使用清华源或阿里源加速下载。
第二,CLI 命令是否注册成功?
llamafactory-cli train -h
如果能打印出一大串参数说明,说明安装成功。这是后续所有操作的基础。
模型下载与本地验证:别跳过这一步
虽然框架支持直接传入 HuggingFace 模型名自动拉取,但我强烈建议手动下载并本地引用。原因有三:
- 网络不稳定可能导致中断;
- 多次实验需要重复加载时效率更高;
- 更容易复现结果。
以 Qwen-7B-Chat 为例,可通过 ModelScope 下载(适合国内用户):
from modelscope import snapshot_download
model_dir = snapshot_download('qwen/Qwen-7B-Chat')
或者使用 git 克隆:
git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git
下载完成后,不要急着训练,先跑个推理测试看看模型能不能正常工作:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = "/path/to/Qwen-7B-Chat"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="auto",
trust_remote_code=True
)
response, history = model.chat(
tokenizer,
"你好,请介绍一下你自己。",
history=None
)
print(response)
如果顺利输出一段自我介绍,那恭喜你,模型文件完整且环境兼容。这一步看似多余,实则避免了后期因模型损坏导致训练失败的尴尬。
WebUI 快速体验原始模型能力
在动手改模型之前,先看看它的“出厂设置”表现如何。LLaMA-Factory 提供了一个基于 Gradio 的 Web 聊天界面,启动非常简单:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /path/to/Qwen-7B-Chat \
--template qwen
访问 http://localhost:7860 即可进入交互页面。
这里有个小技巧:可以把常用参数写成 YAML 文件复用。例如创建 examples/inference/qwen.yaml:
model_name_or_path: /path/to/Qwen-7B-Chat
template: qwen
之后只需一行命令即可启动:
llamafactory-cli webchat examples/inference/qwen.yaml
你可以试着问它:“你是谁?”、“帮我写一段春季女装推广语”等问题,观察其回答风格和专业度。你会发现,尽管语言流畅,但缺乏个性和业务贴合度——而这正是我们需要微调的原因。
构建你的专属数据集:让模型学会“你是谁”
微调的本质是“喂给模型你想让它学会的东西”。LLaMA-Factory 支持两种主流格式:Alpaca 和 ShareGPT。本例采用 Alpaca 格式,结构清晰:
{
"instruction": "用户指令",
"input": "上下文输入(可选)",
"output": "期望回复"
}
示例一:身份认知训练
我们希望模型记住自己叫 SmartBot,是由 E-commerce AI Lab 开发的电商助手。
原始模板 data/identity.json 如下:
{
"instruction": "Who are you?",
"output": "I am {{name}}, developed by {{author}}."
}
使用 sed 替换变量:
sed -i 's/{{name}}/SmartBot/g' data/identity.json
sed -i 's/{{author}}/E-commerce AI Lab/g' data/identity.json
替换后变为:
{
"instruction": "Who are you?",
"output": "I am SmartBot, developed by E-commerce AI Lab."
}
该数据已在 data/dataset_info.json 中注册为 identity,无需额外操作。
示例二:商品文案生成(adgen_local)
假设你有一批 JSONL 格式的数据,每条包含商品属性和对应的描述文案:
{"content": "风格#复古*材质#棉麻*适用季节#春秋", "summary": "这件复古风棉麻衬衫非常适合春秋穿着……"}
目标是让模型根据 content 自动生成 summary。
步骤如下:
- 将数据复制到项目目录:
cp your_adgen_data.jsonl data/adgen_local.json
- 编辑
data/dataset_info.json,添加字段映射配置:
"adgen_local": {
"file_name": "data/adgen_local.json",
"columns": {
"instruction": "content",
"output": "summary"
},
"tag": "sft"
}
这样系统就知道如何将原始字段转换为训练所需的 instruction-output 对。
开始微调:用 QLoRA 实现高效训练
现在进入核心环节。我们将使用 QLoRA 技术进行指令微调(SFT)。相比全参微调动辄 80GB 显存的需求,QLoRA 只需约 14~16GB 显存即可完成 7B 模型的训练,极大降低了硬件门槛。
完整训练命令如下:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /path/to/Qwen-7B-Chat \
--dataset identity,adgen_local \
--dataset_dir ./data \
--template qwen \
--finetuning_type lora \
--lora_target q_proj,v_proj \
--output_dir ./saves/Qwen-7B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 50 \
--eval_steps 25 \
--evaluation_strategy steps \
--load_best_model_at_end \
--learning_rate 3e-4 \
--num_train_epochs 3.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16 \
--quantization_bit 4
几个关键点值得强调:
--quantization_bit 4是启用 QLoRA 的核心,表示主干权重进行 4-bit 量化;--lora_target q_proj,v_proj表示只在注意力机制中的 query 和 value 投影层插入 LoRA 适配器,这是目前最常用的配置;--plot_loss会在训练结束后自动生成损失曲线图loss.png,方便直观判断收敛情况;--val_size 0.1自动划分 10% 数据作为验证集,无需手动拆分。
训练过程中你会看到 loss 逐步下降,理想情况下最终稳定在 1.5 以下。整个过程在 RTX 3090 上大约需要 1~2 小时,取决于数据量大小。
推理验证:看看模型学到了什么
训练完成后,最激动人心的时刻来了——看看你的模型有没有“长大”。
启动 WebUI 并加载 LoRA 权重:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /path/to/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B/lora/sft \
--template qwen \
--finetuning_type lora
注意新增的两个参数:
- --adapter_name_or_path: 指定 LoRA 权重路径;
- --finetuning_type lora: 声明使用 LoRA 模式。
此时提问“你是谁?”,模型应回答:“I am SmartBot, developed by E-commerce AI Lab.”
再输入一条商品属性试试:“风格#休闲颜色#藏青适用人群#男士”,看它能否生成一段自然流畅的营销文案。
你也可以用 CLI 模式快速测试:
llamafactory-cli chat examples/inference/qwen_lora.yaml
批量预测与自动评估:用数据说话
人工测试主观性强,我们需要更客观的指标来衡量模型提升。
执行预测任务:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_predict \
--model_name_or_path /path/to/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B/lora/sft \
--dataset adgen_local \
--dataset_dir ./data \
--template qwen \
--finetuning_type lora \
--output_dir ./saves/Qwen-7B/lora/predict \
--per_device_eval_batch_size 1 \
--max_samples 100 \
--predict_with_generate
运行完毕后会在输出目录生成两个文件:
generated_predictions.jsonl: 包含 input、label、prediction 文本;predict_results.json: 包含各项自动计算的指标。
常见文本生成评估指标包括:
| 指标 | 含义 |
|---|---|
| BLEU-4 | n-gram 精度匹配度,越高越好(最大 100) |
| ROUGE-1/2/L | 基于召回率的摘要质量评分,衡量词汇重叠程度 |
| runtime | 总预测耗时(秒) |
| samples_per_second | 平均每秒生成样本数 |
通常,微调后的模型在目标任务上的 BLEU 和 ROUGE 应显著高于原始模型。如果没提升,可能需要检查数据质量或调整训练参数。
模型合并与导出:打造独立可部署模型
如果你想将 LoRA 权重与原模型融合为一个完整的 .bin 文件,便于后续部署或继续训练,可以使用 export 命令:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \
--model_name_or_path /path/to/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B/lora/sft \
--template qwen \
--finetuning_type lora \
--export_dir ./merged_models/qwen-7b-smartbot \
--export_size 2 \
--export_device cpu \
--export_legacy_format false
合并后的模型可以直接用 Transformers 加载:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("./merged_models/qwen-7b-smartbot")
这对于集成到生产系统特别有用,因为你不再需要维护原始模型 + LoRA 两套路径。
WebUI 图形化操作:告别命令行焦虑
不是所有人都喜欢敲命令。LLaMA-Factory 提供了名为 LlamaBoard 的图形化工作台,整合了训练、推理、评估、导出、API 等全部功能。
启动方式:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui
访问 http://localhost:7860 进入界面,你会看到多个标签页:
- Train: 可视化配置训练参数,支持预览 CLI 命令;
- Evaluate: 一键运行 MMLU/CMMLU/C-Eval 等基准测试;
- Inference: 实时对话测试,支持多轮历史;
- Export: 图形化完成模型合并;
- API: 查看 API 调用文档与端点信息。
点击 “Start” 按钮即可开始训练,日志实时滚动显示,极大提升了调试效率。尤其适合团队协作或教学演示场景。
启动 API Server:接入 LangChain/AutoGPT
训练好的模型可以通过内置 API 快速接入外部系统。LLaMA-Factory 支持 OpenAI 兼容接口,这意味着你可以用标准 SDK 调用它:
CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \
--model_name_or_path /path/to/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B/lora/sft \
--template qwen \
--finetuning_type lora
服务启动后,使用 OpenAI 客户端调用:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="none"
)
response = client.chat.completions.create(
model="qwen",
messages=[{"role": "user", "content": "写一段春季女装推广文案"}]
)
print(response.choices[0].message.content)
提示:若追求更高推理性能,可在合并模型后结合 vLLM 后端使用:
bash --infer_backend vllm --vllm_enforce_eager
基准评测:检验模型的“通识教育”水平
微调不能只专注垂直任务而牺牲通用能力。我们可以通过主流学术评测来检验模型的知识保留程度。
例如运行 MMLU 英文知识测试:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli eval \
--model_name_or_path /path/to/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B/lora/sft \
--template qwen \
--task mmlu_test \
--lang en \
--n_shot 5 \
--batch_size 1
输出示例:
Average: 61.2
STEM: 54.1
Social Sciences: 68.3
Humanities: 59.7
Other: 62.8
类似地,可运行 cmmlu_test(中文多学科)、ceval_validation(中国考试题)等任务,全面评估模型泛化能力。理想的微调结果是:在特定任务上大幅提升的同时,通用能力不明显退化。
导出 GGUF 并部署至 Ollama:让模型跑在笔记本上
如果你希望在低资源设备(如 Mac 笔记本)上运行模型,可以将其转换为 GGUF 格式,并通过 Ollama 部署。
步骤一:确保已合并模型
假设路径为 /home/user/merged_models/qwen-7b-smartbot
步骤二:安装 llama.cpp 与 gguf-py
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp/gguf-py
pip install --editable .
步骤三:转换为 GGUF
cd ..
python convert-hf-to-gguf.py /home/user/merged_models/qwen-7b-smartbot
生成文件如 qwen-7b-smartbot.f16.gguf
步骤四:安装 Ollama(Linux)
curl -fsSL https://ollama.com/install.sh | sh
步骤五:创建 Modelfile
FROM ./qwen-7b-smartbot.f16.gguf
TEMPLATE "{{ .System }}{{ .Prompt }}"
PARAMETER temperature 0.7
注册模型:
ollama create qwen-smartbot -f Modelfile
步骤六:运行!
ollama run qwen-smartbot
从此你就可以在没有 GPU 的机器上与自己的定制模型对话了。
这种高度集成的设计思路,正引领着智能应用开发向更可靠、更高效的方向演进。无论你是工程师、创业者还是研究者,都可以借助 LLaMA-Factory 快速打造属于自己的垂直领域 AI 助手。
更多推荐


所有评论(0)