大模型微调实战:Llama Factory 全方位使用指南
引言:拥抱大模型微调的新时代
近年来,大型语言模型(LLM)以前所未有的速度和能力席卷了人工智能领域。从 GPT 系列到 Llama、Qwen、ChatGLM 等,这些强大的模型在自然语言理解、生成、对话等方面展现出惊人的潜力。然而,通用的预训练模型往往难以完美契合特定领域或特定任务的需求。为了让大模型更好地服务于具体应用场景,模型微调(Fine-tuning)成为了关键技术。
微调是指在一个已经预训练好的大模型基础上,使用特定领域或任务的数据进行进一步训练,从而使模型适应新的数据分布和任务要求。它相比于从零开始训练模型,极大地降低了对计算资源和数据的需求,使得中小型企业和个人开发者也能参与到大模型的定制化浪潮中。
然而,LLM 微调过程本身仍具有一定的复杂性,涉及环境配置、数据准备、模型选择、参数设置、训练监控等多个环节,对初学者而言门槛较高。为了简化这一过程,社区涌现出许多优秀的微调框架,Llama Factory(原名 LLaMA-Efficient-Tuning)便是其中的佼佼者。它以其易用性、高效性、灵活性以及对多种主流模型和微调方法的广泛支持,受到了越来越多开发者和研究者的青睐。
本文旨在提供一份详尽的 Llama Factory 使用指南,从环境搭建到数据准备,再到模型训练、评估和推理,覆盖 LLM 微调的完整流程。无论您是 LLM 微调的新手,还是寻求更高效工具的资深玩家,相信本文都能为您提供有价值的参考,助您轻松驾驭 Llama Factory,开启大模型定制化之旅。本文预计篇幅较长,力求覆盖 Llama Factory 的核心功能与实践细节,目标字数约为 3000 字。
第一部分:认识 Llama Factory
1.1 Llama Factory 是什么?
Llama Factory 是一个专为大型语言模型设计的、易于使用且高效的微调框架。它整合了多种主流的 LLM 微调技术(如 Full Parameter Fine-tuning, LoRA, QLoRA 等),支持众多流行的开源大模型(如 Llama 系列、Mistral、Qwen, ChatGLM, Baichuan 等),并提供了简洁的命令行接口(CLI)和用户友好的图形化界面(Web UI),旨在大幅降低 LLM 微调的门槛。
1.2 为什么选择 Llama Factory?
选择 Llama Factory 进行 LLM 微调,主要基于以下几点优势:
- 易用性强: 提供 Web UI,用户无需编写大量代码,通过点选即可配置和启动微调任务。同时,简洁的 CLI 也方便集成到自动化脚本中。
- 高效性: 集成了多种高效微调方法(如 LoRA、QLoRA),显著减少了训练所需的显存和计算资源。支持 FlashAttention 等加速技术,提升训练速度。
- 灵活性高: 支持多种模型、数据集格式和微调算法,用户可以根据具体需求灵活组合。允许自定义数据集和模型集成。
- 覆盖面广: 支持当前主流的多种开源大模型,方便用户在不同基座模型上进行尝试。
- 社区活跃: 项目持续更新,积极响应社区反馈,不断加入新的功能和模型支持。
- 开箱即用: 预设了许多常见任务的配置模板,方便快速上手。
第二部分:环境搭建与安装
2.1 硬件与软件要求
- 操作系统: Linux (推荐), macOS, Windows (WSL2 推荐)
- Python 版本: 3.8 或更高版本
- 包管理工具: Conda (推荐) 或 pip
- 核心依赖: PyTorch (推荐 2.0 或更高版本),Transformers, Datasets, Accelerate, PEFT
- GPU 支持: 强烈推荐使用 NVIDIA GPU。微调 LLM 对显存要求较高,具体大小取决于模型规模和微调方法。
- LoRA/QLoRA 微调: 对于 7B 模型,建议至少 12GB 显存;13B 模型建议 24GB;更大模型则需要更多显存。
- 全参数微调: 显存需求会急剧增加,通常需要多张高性能 GPU。
- CUDA Toolkit: 需要与 PyTorch 版本兼容的 CUDA 版本。
2.2 安装步骤
推荐使用 Conda 创建独立的虚拟环境,以避免包版本冲突。
-
创建并激活 Conda 环境:
bash
conda create -n llama_factory python=3.10 -y
conda activate llama_factory -
安装 PyTorch:
访问 PyTorch 官网 (pytorch.org),根据你的 CUDA 版本选择合适的安装命令。例如,对于 CUDA 11.8:
bash
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
务必确保安装了 GPU 版本的 PyTorch。 -
克隆 Llama Factory 仓库:
bash
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory -
安装依赖:
Llama Factory 提供了requirements.txt
文件,包含了所有必要的依赖。
bash
pip install -r requirements.txt
如果需要使用特定功能(如 Web UI, FlashAttention, DeepSpeed 等),可能需要安装额外的依赖。根据官方文档的指引进行安装,例如:
bash
# 安装 Web UI 依赖
pip install gradio==3.50.2
# 安装 FlashAttention (如果硬件支持)
# pip install flash-attn --no-build-isolation
# 安装 DeepSpeed (用于多卡或 ZeRO 优化)
# pip install deepspeed -
验证安装:
可以尝试运行 Llama Factory 的帮助命令,检查是否能正常工作:
bash
llamafactory-cli --help
如果看到帮助信息,说明基本环境配置成功。
第三部分:核心使用流程详解
Llama Factory 的核心使用流程可以概括为:数据准备 -> 模型选择 -> 微调方法选择 -> 参数配置 -> 启动训练 -> 评估与推理。下面将详细介绍每个步骤。
3.1 步骤一:准备微调数据
高质量的数据是微调成功的关键。Llama Factory 支持多种数据格式。
-
数据格式要求:
- Alpaca 格式 (JSON): 这是 Llama Factory 推荐的格式之一,适用于指令微调。每条数据是一个 JSON 对象,包含
instruction
,input
(可选), 和output
字段。
json
[
{
"instruction": "计算两个数的和。",
"input": "数1: 5, 数2: 8",
"output": "两个数的和是 13。"
},
{
"instruction": "写一首关于春天的诗。",
"input": "",
"output": "春风拂绿柳,细雨润新花。燕儿穿庭过,溪水响潺潺。"
}
] - ShareGPT 格式 (JSON): 适用于多轮对话微调。每条数据是一个 JSON 对象,包含一个
conversations
列表,列表中每个元素代表一轮对话,包含from
(通常是 “human” 或 “gpt”) 和value
字段。
json
[
{
"conversations": [
{ "from": "human", "value": "你好,你叫什么名字?" },
{ "from": "gpt", "value": "你好!我是一个大型语言模型。" }
]
},
{
"conversations": [
{ "from": "human", "value": "今天天气怎么样?" },
{ "from": "gpt", "value": "我无法获取实时天气信息,但我可以帮你查询。" },
{ "from": "human", "value": "帮我查一下北京的天气。" },
{ "from": "gpt", "value": "正在查询北京的天气... 根据信息,北京今天晴朗,气温适宜。" }
]
}
] - 自定义格式: Llama Factory 也支持通过
--dataset_formatter
参数加载自定义的数据处理脚本,灵活性很高。
- Alpaca 格式 (JSON): 这是 Llama Factory 推荐的格式之一,适用于指令微调。每条数据是一个 JSON 对象,包含
-
数据准备要点:
- 数据质量: 确保数据准确、干净、与目标任务高度相关。
- 数据数量: 微调所需数据量远少于预训练,但仍需保证一定的规模(几百到几万条不等,视任务复杂度而定)。
- 数据分布: 训练集、验证集(可选,用于调优超参数和监控)应具有相似的数据分布。
- 文件组织: 将准备好的数据保存为
.json
文件。可以在data/
目录下创建自己的数据集文件夹。
-
指定数据集:
在 Llama Factory 中,通过--dataset
参数指定数据集名称。Llama Factory 内置了一些常用数据集的配置(如alpaca_gpt4_zh
),可以直接使用。对于自定义数据集,需要将其信息添加到data/dataset_info.json
文件中,或者直接在命令行中指定文件路径。
json
// 在 data/dataset_info.json 中添加自定义数据集信息
"my_custom_dataset": {
"file_name": "my_data.json", // 相对于 data/ 目录的路径
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
然后使用--dataset my_custom_dataset
。或者直接指定路径:--dataset path/to/your/my_data.json
。
3.2 步骤二:选择基础模型
选择一个合适的预训练模型作为微调的起点。
- 支持的模型: Llama Factory 支持众多模型,如
llama2-7b-chat
,qwen-7b-chat
,chatglm3-6b
,baichuan2-13b-chat
,mistral-7b-instruct
等。完整的支持列表可以在官方文档或src/llamafactory/model/model_map.json
中找到。 -
指定模型: 使用
--model_name_or_path
参数指定。可以是 Hugging Face Hub 上的模型标识符,也可以是本地的模型路径。
“`bash
# 使用 Hugging Face Hub 上的模型
–model_name_or_path meta-llama/Llama-2-7b-hf使用本地模型
–model_name_or_path /path/to/your/local/model
“`
Llama Factory 会自动下载所需的模型文件(如果本地不存在)。
3.3 步骤三:选择微调方法
根据你的资源和需求选择合适的微调方法。
- 主要方法:
- LoRA (Low-Rank Adaptation): 在模型的某些层(通常是 Attention 层)旁边添加小的、可训练的“适配器”(Adapter)矩阵。只训练这些适配器,冻结原始模型参数。大大减少了训练参数量和显存占用,是目前最流行的微调方法之一。
- QLoRA (Quantized LoRA): LoRA 的进一步优化。在微调时,将冻结的原始模型参数进行 4-bit 量化,进一步降低显存占用。训练时反量化计算梯度,更新 LoRA 适配器参数。非常适合资源有限的场景。
- Full Parameter Fine-tuning: 训练模型的所有参数。效果通常最好,但需要巨大的计算资源和显存。
-
指定方法: 使用
--finetuning_type
参数指定。
“`bash
# 使用 LoRA
–finetuning_type lora使用 QLoRA (需要 bitsandbytes 库)
–finetuning_type lora –quantization_bit 4
使用全参数微调
–finetuning_type full
``
finetuning_type=lora
* **LoRA 相关参数 (当时):**
–lora_rank
*: LoRA 适配器矩阵的秩,通常设为 8, 16, 32, 64。值越大,可训练参数越多,可能效果更好,但显存占用也越高。
–lora_alpha
*: LoRA 缩放因子,通常设为
lora_rank的两倍或与
lora_rank相同。
–lora_target
*: 指定要应用 LoRA 的模块名称。Llama Factory 通常会自动为常见模型设置好默认值(如
q_proj,
v_proj)。可以使用
all应用到所有线性层,或指定具体模块名列表。
–lora_dropout`: LoRA 层的 Dropout 比例。
*
3.4 步骤四:配置训练参数
配置训练过程中的各种超参数。这是影响微调效果的关键步骤。
- 核心参数:
--output_dir
: 指定训练结果(模型检查点、适配器权重等)的保存路径。例如:--output_dir ./saves/qwen-7b-chat/lora/my_experiment
--per_device_train_batch_size
: 每个 GPU 上的训练批次大小。根据显存大小调整,通常设为 1, 2, 4, 8 等。--gradient_accumulation_steps
: 梯度累积步数。实际的批次大小 =per_device_train_batch_size
*num_gpus
*gradient_accumulation_steps
。用于在有限显存下模拟更大的批次。--learning_rate
: 学习率。通常需要根据模型和数据进行调整,常见值如1e-4
,2e-4
,5e-5
(LoRA) 或1e-5
,2e-5
(Full)。--num_train_epochs
: 训练的总轮数。通常设为 1 到 5 轮。--lr_scheduler_type
: 学习率调度器类型,如cosine
,linear
。--warmup_ratio
或--warmup_steps
: 学习率预热比例或步数。--logging_steps
: 每隔多少步打印一次训练日志。--save_steps
: 每隔多少步保存一次模型检查点。--per_device_eval_batch_size
: 每个 GPU 上的评估批次大小。--evaluation_strategy
: 评估策略,如steps
(按步数评估),epoch
(按轮数评估)。--eval_steps
: 如果evaluation_strategy=steps
,则指定评估步数间隔。
- 性能相关参数:
--fp16
或--bf16
: 启用半精度训练(fp16 需要 Apex 或 Transformers >= 4.16,bf16 需要 Ampere 或更新架构的 GPU)。可以大幅减少显存占用并加速训练。优先推荐 bf16(如果硬件支持)。--optim
: 优化器类型,如adamw_torch
(默认),adamw_hf
,adamw_apex_fused
(若安装 Apex),adamw_bnb_8bit
(若使用 8-bit 优化器)。
- 数据处理参数:
--max_source_length
: 输入序列的最大长度。--max_target_length
: 输出序列的最大长度。--preprocessing_num_workers
: 数据预处理使用的进程数。
3.5 步骤五:启动微调训练
配置好所有参数后,即可启动训练。Llama Factory 提供两种方式:
-
方式一:使用命令行接口 (CLI)
将所有参数组合成一条命令执行。这对于脚本化和自动化非常方便。
bash
# 示例:使用 QLoRA 微调 Qwen-7B-Chat 模型
# (请根据实际情况修改路径、模型、数据集和参数)
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path qwen/Qwen-7B-Chat \
--dataset alpaca_gpt4_zh \
--finetuning_type lora \
--quantization_bit 4 \
--lora_target c_attn \
--output_dir ./saves/Qwen-7B-Chat/lora/sft_test \
--overwrite_output_dir \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 100 \
--learning_rate 1e-4 \
--num_train_epochs 3.0 \
--plot_loss \
--fp16--stage sft
: 指定微调阶段为监督微调 (Supervised Fine-tuning)。其他可选值包括pt
(Pre-training),rm
(Reward Modeling),ppo
(Proximal Policy Optimization)。--do_train
: 明确指示执行训练。--overwrite_output_dir
: 如果输出目录已存在,则覆盖。--plot_loss
: 在训练结束后绘制损失曲线图。
-
方式二:使用 Web 用户界面 (Web UI)
对于不熟悉命令行的用户,或者希望通过图形化界面直观配置参数的用户,Web UI 是一个很好的选择。- 确保安装了 Web UI 依赖 (
pip install gradio==3.50.2
)。 - 在 Llama Factory 项目根目录下运行:
bash
CUDA_VISIBLE_DEVICES=0 python src/train_web.py - 打开浏览器,访问指定的 URL (通常是
http://localhost:7860
)。 - 在 Web UI 界面中,可以通过下拉菜单、输入框等选择模型、数据集、微调方法,并设置各种超参数。
- 配置完成后,点击 “Preview Command” 可以查看对应的命令行参数。
- 点击 “Start” 按钮即可启动训练。训练日志会实时显示在界面下方。
- 确保安装了 Web UI 依赖 (
3.6 步骤六:监控与评估
- 监控训练过程:
- 日志输出: 训练过程中,控制台或 Web UI 会输出损失值 (loss)、学习率 (learning rate)、已完成步数 (step)、已完成轮数 (epoch) 等信息。密切关注损失值的变化趋势,判断训练是否正常进行。
- TensorBoard: 如果在训练参数中配置了
--logging_strategy steps
和--logging_dir
(通常会自动设置在output_dir
下的runs
子目录),可以使用 TensorBoard 查看更详细的训练曲线:
bash
tensorboard --logdir ./saves/Qwen-7B-Chat/lora/sft_test/runs
然后在浏览器中访问 TensorBoard 提供的 URL。
- 评估模型性能:
- 验证集评估: 如果在训练时指定了验证数据集 (
--dataset xxx_eval
) 和评估策略 (--evaluation_strategy steps --eval_steps 100
),Llama Factory 会在训练过程中定期在验证集上进行评估,并输出评估指标(如 perplexity 或 BLEU/ROUGE,取决于任务)。 - 离线评估: 训练完成后,可以使用
llamafactory-cli eval
命令对模型在指定数据集上进行评估。
bash
CUDA_VISIBLE_DEVICES=0 llamafactory-cli evaluate \
--model_name_or_path qwen/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
--template default \
--finetuning_type lora \
--task mmlu \
--split test \
--lang en \
--n_shot 5 \
--batch_size 4
这里以评估 MMLU benchmark 为例。需要根据具体评估任务调整参数。 - 人工评估: 对于生成任务,客观指标往往不能完全反映模型质量,人工评估(对比微调前后的回答质量、流畅度、相关性等)是必不可少的环节。
- 验证集评估: 如果在训练时指定了验证数据集 (
3.7 步骤七:模型推理与部署
微调完成后,需要加载训练好的模型(或适配器)进行推理。
-
使用 Llama Factory 进行推理:
- 命令行推理:
bash
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
--model_name_or_path qwen/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
--finetuning_type lora \
--template qwen
这将启动一个交互式的命令行聊天界面。--template
参数指定了用于构建 prompt 的模板,需要与模型和微调任务匹配。 - API 推理: Llama Factory 提供了基于 FastAPI 的 API 服务启动脚本。
bash
CUDA_VISIBLE_DEVICES=0 python src/api_demo.py \
--model_name_or_path qwen/Qwen-7B-Chat \
--adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
--finetuning_type lora \
--template qwen
启动后,可以通过 HTTP 请求与模型交互。
- 命令行推理:
-
导出与合并 (适用于 LoRA/QLoRA):
LoRA 微调只生成了适配器权重,需要将其与基础模型合并才能得到一个完整的微调后模型,或者在加载时动态应用适配器。- 导出适配器: Llama Factory 默认会将 LoRA 适配器保存在
output_dir
下。可以直接使用这个目录。 - 合并权重: 可以使用 Llama Factory 提供的脚本或 Hugging Face PEFT 库的功能将 LoRA 适配器权重合并到基础模型中,并保存为一个新的模型。这对于部署更方便。
bash
# 示例(概念性,具体命令可能需要查阅 Llama Factory 文档或 PEFT 文档)
# python src/export_model.py \
# --model_name_or_path qwen/Qwen-7B-Chat \
# --adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
# --export_dir ./models/qwen-7b-chat-sft-merged \
# --export_size 7b \
# --export_legacy_format False
- 导出适配器: Llama Factory 默认会将 LoRA 适配器保存在
-
使用 Hugging Face Transformers 进行推理:
无论是合并后的模型,还是基础模型+适配器,都可以使用标准的 Hugging Face Transformers 库进行加载和推理。
“`python
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel # 需要加载 LoRA 适配器时model_name_or_path = “qwen/Qwen-7B-Chat” # 或合并后的模型路径
adapter_path = “./saves/Qwen-7B-Chat/lora/sft_test” # LoRA 适配器路径tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
如果是 QLoRA 微调,加载基础模型时需要指定量化配置
model = AutoModelForCausalLM.from_pretrained(
model_name_or_path,
trust_remote_code=True,
device_map=”auto”,
load_in_4bit=True # 加载为 4-bit
)
否则,正常加载
model = AutoModelForCausalLM.from_pretrained(
model_name_or_path,
trust_remote_code=True,
device_map=”auto” # 自动分配到 GPU
)如果是 LoRA/QLoRA,加载适配器
model = PeftModel.from_pretrained(model, adapter_path)
model = model.merge_and_unload() # 可选:合并权重并卸载适配器,变成标准模型model.eval() # 设置为评估模式
构建 prompt (注意使用与训练时匹配的模板)
prompt = “你好,给我讲个笑话吧。”
Qwen 的模板可能需要特殊处理
response, history = model.chat(tokenizer, prompt, history=None)
对于其他模型,可能需要手动构建包含特殊 token 的输入
inputs = tokenizer(prompt, return_tensors=”pt”).to(model.device)
生成回复
outputs = model.generate(**inputs, max_new_tokens=100, eos_token_id=tokenizer.eos_token_id)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)print(response)
“`
第四部分:进阶技巧与注意事项
- 多 GPU 训练: Llama Factory 天然支持使用
accelerate
进行多 GPU 数据并行训练。只需在启动命令前设置CUDA_VISIBLE_DEVICES
(如CUDA_VISIBLE_DEVICES=0,1
),并调整全局批次大小。对于更大规模的模型或需要更高效率的场景,可以集成 DeepSpeed ZeRO 优化,通过配置accelerate config
或在启动命令中加入 DeepSpeed 相关参数 (--deepspeed path/to/ds_config.json
)。 - 混合精度训练: 强烈建议开启
--fp16
或--bf16
,可以显著提升训练速度和降低显存占用,同时对模型性能影响通常不大。优先选择--bf16
(如果硬件支持)。 - Flash Attention: 如果你的 GPU 支持(如 Ampere, Hopper 架构),安装并启用 Flash Attention (
--flash_attn
) 可以进一步加速训练,尤其是在处理长序列时。 - 超参数调优: 学习率、批次大小、LoRA秩 (rank) 是影响 LoRA 微调效果最关键的几个参数。需要根据具体任务和数据进行实验调优。可以从推荐值开始,进行小范围调整。
- 数据质量优先: 微调的效果很大程度上取决于数据的质量和相关性。花时间清洗、筛选和构建高质量的指令数据集至关重要。
- 模板(Template)的重要性: 在微调和推理时,确保使用与模型和任务匹配的 Prompt 模板。Llama Factory 内置了多种常见模型的模板(如
default
,llama2
,qwen
,chatglm3
等),通过--template
参数指定。错误的模板会导致模型无法理解指令或生成格式混乱。 - 处理 OOM (Out of Memory) 错误: 这是微调中最常见的问题。解决方法包括:
- 减小
--per_device_train_batch_size
。 - 增大
--gradient_accumulation_steps
。 - 使用 QLoRA (
--quantization_bit 4
) 或 LoRA 替代全参数微调。 - 降低 LoRA 秩 (
--lora_rank
)。 - 启用梯度检查点 (
--gradient_checkpointing
),但这会增加训练时间。 - 使用 DeepSpeed ZeRO Stage 2 或 3。
- 缩短最大序列长度 (
--max_source_length
,--max_target_length
)。
- 减小
- 持续学习与社区资源: Llama Factory 项目在 GitHub 上非常活跃,积极关注其更新、Issue 和 Discussions。阅读官方文档和示例是深入了解其功能的最佳途径。
结语
Llama Factory 以其强大的功能、易用性和高效率,极大地简化了大型语言模型的微调过程。通过本文的详细介绍,相信您已经对如何使用 Llama Factory 有了全面的了解,从环境搭建、数据准备,到模型选择、参数配置、启动训练,再到评估和推理,涵盖了实战中的各个关键环节。
掌握 Llama Factory,意味着您拥有了一个强大的武器,能够将通用的预训练大模型转化为满足特定需求的定制化 AI 应用。无论是进行学术研究、开发创新产品,还是优化现有业务流程,Llama Factory 都将是您得力的助手。
当然,LLM 微调是一个实践性很强的领域,理论学习之后更需要动手操作。希望本指南能为您提供清晰的路线图,鼓励您即刻开始,利用 Llama Factory 探索大模型微调的无限可能。祝您在 LLM 的世界里探索顺利,收获满满!