本教程以 Ubuntu Linux 单卡 GPU 环境为例,演示如何使用 LoRA 技术对 Qwen2.5-7B-Instruct 进行监督微调(SFT),并最终导出完整模型。您只需复制粘贴并根据实际路径微调即可跑通全流程。
--quantization_bit 4 开启 QLoRA。打开终端,依次执行以下命令构建干净的虚拟环境并安装 LLaMA-Factory:
Bash
# 1. 获取代码 (使用 depth 1 加速克隆)
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
# 2. 创建并激活 Conda 虚拟环境
conda create -n llama_factory python=3.10 -y
conda activate llama_factory
# 3. 安装核心依赖
pip install -e ".[torch,metrics]"
注:国内服务器若下载过慢,可在 pip install 后追加 -i https://pypi.tuna.tsinghua.edu.cn/simple。
LLaMA-Factory 依赖 data 目录下的配置文件来映射数据。
1. 创建数据文件 在 LLaMA-Factory/data 目录下新建一个名为 custom_qa.json 的文件,写入您的业务数据。严格按照以下 JSON 数组格式组织:
JSON
[
{
"instruction": "请提取以下文本中的公司名称和融资金额。",
"input": "2023年10月,人工智能初创公司智谱AI宣布完成超25亿人民币融资。",
"output": "公司名称:智谱AI\n融资金额:超25亿人民币"
},
{
"instruction": "将下面这段C++代码转换为Python代码。",
"input": "int main() { printf(\"Hello, World!\"); return 0; }",
"output": "def main():\n print(\"Hello, World!\")\n\nif __name__ == \"__main__\":\n main()"
}
]
2. 注册数据集 打开 LLaMA-Factory/data/dataset_info.json 文件。在 JSON 对象的顶层(紧接第一个 { 之后),加入您的自定义数据集配置:
JSON
{
"custom_qa": {
"file_name": "custom_qa.json"
},
"alpaca_en": {
"file_name": "alpaca_data_en_52k.json",
"file_sha1": "607f94a7f581341e59685aef32f5310952326e23"
},
...
注意检查 JSON 格式,确保逗号不遗漏。
在工程根目录下创建一个名为 run_sft.sh 的 Shell 脚本。此脚本定义了所有关键的超参数。
1. 创建并编辑 run_sft.sh
Bash
#!/bin/bash
# 如果服务器在国内,取消下一行的注释以使用魔搭社区下载模型
# export USE_MODELSCOPE_HUB=1
llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path Qwen/Qwen2.5-7B-Instruct \
--dataset custom_qa \
--dataset_dir ./data \
--template qwen \
--finetuning_type lora \
--lora_target all \
--output_dir ./saves/Qwen2.5-7B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--warmup_steps 20 \
--save_steps 100 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--max_samples 1000 \
--plot_loss \
--bf16
关键参数硬核解析:
--model_name_or_path: 基座模型路径。支持 Hugging Face ID(会自动下载)或本地绝对路径。--template: 极其重要。必须与模型匹配,Qwen 系列填 qwen,LLaMA-3 填 llama3。填错会导致模型输出乱码或无法停止。--lora_target all: 将 LoRA 模块应用于所有线性层,通常比仅应用于 Attention 层效果更好。--per_device_train_batch_size * --gradient_accumulation_steps: 实际 Batch Size(此处为 2 * 8 = 16)。爆显存时调小 batch_size,同比例调大 accumulation_steps。--bf16: 启用 Bfloat16 混合精度训练(需 Ampere 架构以上显卡,如 30 系列/40 系列)。如果是旧显卡(如 V100),改为 --fp16。2. 运行脚本
Bash
chmod +x run_sft.sh
./run_sft.sh
执行后,终端会打印进度条。训练结束后,LoRA 权重和 Loss 曲线图会保存在 ./saves/Qwen2.5-7B/lora/sft 目录中。
训练完成后,使用框架自带的 Chat CLI,加载基础模型并挂载刚才训练好的 LoRA 权重进行验证。
Bash
llamafactory-cli chat \
--model_name_or_path Qwen/Qwen2.5-7B-Instruct \
--adapter_name_or_path ./saves/Qwen2.5-7B/lora/sft \
--template qwen \
--finetuning_type lora
等待模型加载完毕后,终端会出现交互式提示符。输入您在 custom_qa.json 中定义的类似问题,检查模型的泛化与拟合效果。输入 exit 退出。
在生产环境中(如使用 vLLM 或 TGI 部署),通常不支持直接动态加载基础模型 + LoRA 补丁。您需要将 LoRA 权重合并进基础模型,导出一个全新的完整模型。
在工程根目录下执行以下命令:
Bash
llamafactory-cli export \
--model_name_or_path Qwen/Qwen2.5-7B-Instruct \
--adapter_name_or_path ./saves/Qwen2.5-7B/lora/sft \
--template qwen \
--finetuning_type lora \
--export_dir ./models/Qwen2.5-7B-Instruct-Custom \
--export_size 2 \
--export_device auto
--export_dir: 合并后新模型保存的绝对/相对路径。--export_size 2: 将模型切分为最大 2GB 的分块(Safetensors 格式),便于传输和加载。执行完毕后,./models/Qwen2.5-7B-Instruct-Custom 目录下就是一个标准格式、包含您微调知识的全新大模型了。您可以将其直接扔给 vLLM 或 Ollama 进行高性能部署。