LLaMA-Factory微调实战:从环境到API部署

在大模型应用落地的今天,如何快速将一个通用语言模型适配到特定领域,已成为开发者最关心的问题之一。全参数微调成本高、门槛高,而像LoRA这样的高效微调技术又常因配置复杂让人望而却步。有没有一种方式,能让我们像搭积木一样完成模型定制?

LLaMA-Factory正是为此而生——它不只是一套工具,更像是一个“大模型工厂”,把数据准备、训练、评估、合并、部署等环节全部打通。无论你是想给模型换个身份人设,还是让它学会写广告文案、医疗问答或法律咨询,都可以通过这个框架快速实现。

本文将以Meta-Llama-3-8B-Instruct为例,带你走完一次完整的LoRA微调旅程:从环境搭建开始,到自定义数据集构建、模型训练与评估,再到最终以OpenAI兼容接口对外提供服务。整个过程无需深入源码,命令行+YAML即可掌控全局。


环境准备:让一切跑起来的基础

任何微调任务都建立在稳定可靠的运行环境之上。我们本次实验基于以下配置:

  • 操作系统:Ubuntu 22.04 LTS
  • GPU:NVIDIA RTX 4090(24GB显存)
  • CUDA 版本:12.1
  • Python:3.10.13
  • PyTorch:2.4.0+cu121
  • Transformers:4.45.2
  • LLaMA-Factory:0.9.1.dev0(主干最新版)

单卡RTX 4090足以支持Llama-3-8B级别的QLoRA微调。若使用纯LoRA,16GB以上显存即可流畅运行。多卡用户需确保NCCL通信正常,避免分布式训练时报错。

⚠️ 提示:QLoRA对显存要求更低,但首次加载时仍可能触发OOM,建议设置--export_device cpu进行模型合并。


安装与验证:第一步不能出错

首先克隆项目并安装依赖:

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]" -i https://mirrors.aliyun.com/pypi/simple/

这里的-e表示开发模式安装,便于后续调试;[torch,metrics]会自动安装PyTorch及相关评估库(如jieba、rouge-chinese)。如果遇到依赖冲突,可先跳过依赖检查:

pip install --no-deps -e .

安装完成后,用两条命令确认环境就绪:

llamafactory-cli version

输出应显示当前版本信息和项目主页链接。接着检查CUDA是否可用:

import torch
print(torch.cuda.is_available())  # 应返回 True
print(torch.cuda.get_device_name(0))  # 显示 GPU 型号

同时验证Transformers版本:

import transformers
print(transformers.__version__)  # 推荐 ≥ 4.37

一切正常后,就可以进入下一步了。


模型下载:获取基础骨架

我们选用Meta官方发布的Meta-Llama-3-8B-Instruct作为基座模型。由于该模型受访问限制,请提前在Hugging FaceModelScope申请权限。

推荐使用Git方式克隆:

# ModelScope 方式
git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git

# 或 Hugging Face(需登录)
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct

将模型路径记为/path/to/Meta-Llama-3-8B-Instruct,后续所有操作都将引用此路径作为--model_name_or_path


初步测试:看看原模型有多强

在动手微调前,先了解原始模型的能力边界非常重要。这不仅能验证环境正确性,也能为后续效果对比提供基准。

LLaMA-Factory提供了两种交互方式:命令行聊天和WebUI界面。

启动命令行对话:

llamafactory-cli chat \
    --model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
    --template llama3

其中--template llama3是关键参数。不同模型有不同的Prompt模板,例如ChatGLM用chatglm3,Qwen用qwen。模板错误会导致指令无法识别甚至无限生成。

你也可以创建YAML配置文件复用参数:

# examples/inference/llama3.yaml
model_name_or_path: /path/to/Meta-Llama-3-8B-Instruct
template: llama3

之后只需运行:

llamafactory-cli webchat examples/inference/llama3.yaml

即可启动Gradio网页界面,默认地址为http://localhost:7860


数据集构建:教会模型新技能

要让模型具备特定能力,必须提供相应的训练数据。LLaMA-Factory支持JSON/JSONL格式,并通过data/dataset_info.json注册数据集。

示例一:修改助手身份(identity)

系统内置了一个简单的身份替换数据集data/identity.json,内容如下:

[
  {
    "instruction": "你的名字是什么?",
    "input": "",
    "output": "我叫 {{name}},由 {{author}} 开发。"
  }
]

我们可以用sed命令批量替换变量:

sed -i 's/{{name}}/PonyBot/g' data/identity.json
sed -i 's/{{author}}/LLaMA Factory/g' data/identity.json

更新后的输出变为:“我叫 PonyBot,由 LLaMA Factory 开发。”

示例二:广告文案生成(AdGen)

我们再引入一个更实用的任务——根据商品描述生成广告语。使用清华大学开源的AdvertiseGen数据集:

wget https://cloud.tsinghua.edu.cn/seafhttp/files/1746ec39-a653-4c81-9197-55383e942282/AdvertiseGen.tar.gz
tar -zxvf AdvertiseGen.tar.gz
mv AdvertiseGen LLaMA-Factory/data/

然后在data/dataset_info.json中注册:

"adgen_local": {
  "file_name": "AdvertiseGen/train.json",
  "columns": {
    "prompt": "content",
    "response": "summary"
  }
}

现在就可以在训练脚本中通过adgen_local引用该数据集。


LoRA微调:低成本定制专属模型

相比全参数微调动辄上百GB显存消耗,LoRA仅训练低秩矩阵,显存占用可降至原来的1/10,且训练速度更快。

执行以下命令启动SFT训练:

export NCCL_P2P_DISABLE="1"
export NCCL_IB_DISABLE="1"

llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
    --dataset alpaca_gpt4_zh,identity,adgen_local \
    --dataset_dir ./data \
    --template llama3 \
    --finetuning_type lora \
    --output_dir ./saves/LLaMA3-8B/lora/sft \
    --overwrite_cache \
    --overwrite_output_dir \
    --cutoff_len 1024 \
    --preprocessing_num_workers 16 \
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --logging_steps 50 \
    --warmup_steps 20 \
    --save_steps 100 \
    --eval_steps 50 \
    --evaluation_strategy steps \
    --load_best_model_at_end \
    --learning_rate 5e-5 \
    --num_train_epochs 5.0 \
    --max_samples 1000 \
    --val_size 0.1 \
    --plot_loss \
    --fp16

几个关键点值得注意:

  • --finetuning_type lora启用LoRA;
  • --dataset支持多个数据集联合训练;
  • --fp16开启半精度,提升效率;
  • --plot_loss会自动生成loss.png,直观查看收敛情况。

在RTX 4090上,整个训练过程约8–15分钟。结束后可在输出目录看到:

./saves/LLaMA3-8B/lora/sft/
├── adapter_config.json
├── adapter_model.bin        ← LoRA权重核心文件
├── training_args.bin
└── trainer_state.json

动态推理:即时验证微调效果

训练完成后,无需合并模型即可直接测试效果。LLaMA-Factory支持动态加载LoRA权重。

启动命令行对话:

llamafactory-cli chat \
    --model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
    --template llama3 \
    --finetuning_type lora

你会发现模型已经能正确回答“你是谁?”并生成更专业的广告文案。

也可以用YAML简化调用:

# examples/inference/llama3_lora_sft.yaml
model_name_or_path: /path/to/Meta-Llama-3-8B-Instruct
adapter_name_or_path: ./saves/LLaMA3-8B/lora/sft
template: llama3
finetuning_type: lora

然后运行:

llamafactory-cli webchat examples/inference/llama3_lora_sft.yaml

即可打开带图形界面的聊天窗口。


效果评估:用数据说话

主观体验之外,我们也需要量化指标来衡量性能变化。

先安装评估依赖:

pip install jieba rouge-chinese nltk

然后运行预测任务:

llamafactory-cli train \
    --stage sft \
    --do_predict \
    --model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
    --eval_dataset adgen_local \
    --dataset_dir ./data \
    --template llama3 \
    --finetuning_type lora \
    --output_dir ./saves/LLaMA3-8B/lora/predict \
    --cutoff_len 1024 \
    --per_device_eval_batch_size 1 \
    --max_samples 20 \
    --predict_with_generate

结果保存在generated_predictions.jsonlpredict_results.json中,包含以下指标:

指标 含义
BLEU-4 四元语法匹配度(越高越好)
rouge-1, rouge-2 单词/双词召回率
rouge-l 最长公共子序列相似度
predict_samples_per_second 推理吞吐量

这些数值可以帮助判断是否出现过拟合或欠拟合。


模型合并:打造独立可部署模型

虽然可以动态加载LoRA,但在生产环境中通常希望得到一个完整模型文件。

使用export命令完成合并:

llamafactory-cli export \
    --model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
    --template llama3 \
    --finetuning_type lora \
    --export_dir ./merged-model-path \
    --export_size 2 \
    --export_device cpu \
    --export_legacy_format false

注意事项:

  • 不要在量化模型上执行合并;
  • 使用--export_device cpu防止GPU显存溢出;
  • --export_size 2表示将模型切分为两个bin文件,适合跨设备部署。

导出后的模型完全符合Hugging Face标准,可用于vLLM、TGI等高性能推理框架。


WebUI可视化面板:零代码操作利器

对于不想敲命令的用户,LLaMA-Factory还提供了一站式WebUI:

CUDA_VISIBLE_DEVICES=0 GRADIO_SHARE=1 GRADIO_SERVER_PORT=7860 llamafactory-cli webui

访问http://localhost:7860即可进入图形界面,功能涵盖:

  • Training:拖拽式配置训练参数,实时查看loss曲线;
  • Evaluation:选择MMLU、C-Eval等基准一键评测;
  • Inference:多轮对话测试,支持流式输出;
  • Export:点击按钮完成模型合并导出。

非常适合教学演示或团队协作场景。


API服务部署:接入下游应用

最终目标往往是将模型集成进业务系统。LLaMA-Factory支持OpenAI协议API服务,轻松对接LangChain、AutoGPT等Agent框架。

方式一:原生后端API

CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \
    --model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
    --template llama3 \
    --finetuning_type lora

启动后可用标准OpenAI客户端调用:

from openai import OpenAI

client = OpenAI(
    api_key="0",  # 占位符
    base_url="http://localhost:8000/v1"
)

messages = [{"role": "user", "content": "写一段智能手表的广告语"}]
response = client.chat.completions.create(model="default", messages=messages)
print(response.choices[0].message.content)

方式二:vLLM加速(推荐生产使用)

若已合并模型,可切换至vLLM后端获得更高并发:

CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \
    --model_name_or_path ./merged-model-path \
    --template llama3 \
    --infer_backend vllm \
    --vllm_enforce_eager

vLLM在批处理和连续提示生成方面表现优异,适合高负载场景。


进阶评测:检验知识保留能力

微调后模型是否“遗忘”了原有知识?这是常见问题。LLaMA-Factory内建支持主流评测基准:

llamafactory-cli eval \
    --model_name_or_path ./merged-model-path \
    --template llama3 \
    --task mmlu_test \
    --lang en \
    --n_shot 5 \
    --batch_size 1

输出示例:

Average: 63.64
STEM: 50.83
Social Sciences: 76.31
Humanities: 56.63
Other: 73.31

若分数显著下降,说明存在“灾难性遗忘”,建议降低学习率或增加通用数据比例。

对于Base模型(非Instruct版),需改用fewshot模板:

llamafactory-cli eval \
    --model_name_or_path meta-llama/Meta-Llama-3-8B \
    --template fewshot \
    --task mmlu \
    --split validation \
    --lang en \
    --n_shot 5 \
    --batch_size 1

这种高度集成的设计思路,正推动大模型定制从“专家专属”走向“人人可用”。LLaMA-Factory不仅降低了技术门槛,更重要的是建立了标准化的工作流范式——从数据到部署,每一步都有迹可循。未来随着QLoRA、RAG、Agent等技术的深度融合,这类一体化框架将成为AI工程化落地的核心基础设施。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐