LLaMAFactory 微调实战

type
Post
date
Jul 2, 2025
summary
LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调
category
实践技巧
tags
LLM
微调
LoRA
LLaMAFactory
EasyDataset
有监督微调
指令微调
password
URL
Property
Jul 2, 2025 06:05 AM

微调前准备

框架下载

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory

环境安装

conda create -n llama-factory python=3.10 -y conda activate llama-factory pip install -e ".[torch,metrics,bitsandbytes,hqq,swanlab]" --index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装时的可选参数:
名称
描述
torch
开源深度学习框架 PyTorch,广泛用于机器学习和人工智能研究中。
torch-npu
PyTorch 的昇腾设备兼容包。
metrics
用于评估和监控机器学习模型性能。
deepspeed
提供了分布式训练所需的零冗余优化器。
bitsandbytes
用于大型语言模型量化。
hqq
用于大型语言模型量化。
eetq
用于大型语言模型量化。
gptq
用于加载 GPTQ 量化模型。
awq
用于加载 AWQ 量化模型。
aqlm
用于加载 AQLM 量化模型。
vllm
提供了高速并发的模型推理服务。
galore
提供了高效全参微调算法。
badam
提供了高效全参微调算法。
qwen
提供了加载 Qwen v1 模型所需的包。
modelscope
魔搭社区,提供了预训练模型和数据集的下载途径。
swanlab
开源训练跟踪工具 SwanLab,用于记录与可视化训练过程
dev
用于 LLaMA Factory 开发维护。

数据准备

数据格式根据 LLaMAFactory 官方要求格式来准备,有专门将文档处理成指定格式的项目:Easy Dataset具体使用方法推荐参考官方文档。最终导出 json 或 jsonl 文件。
数据文件准备好之后,将数据文件放到 LLaMA-Factory/data 路径下,并配置路径下的 LLaMA-Factory/data/dataset_info.json 文件,将新增的数据集添加进去:
{ "identity": { "file_name": "identity.json" }, "alpaca_en_demo": { "file_name": "alpaca_en_demo.json" }, "alpaca_zh_demo": { "file_name": "alpaca_zh_demo.json" }, "how_searchers_are_made": { "file_name": "how_searchers_are_made.json" }, …… }

WebUI 微调

Web 页面

启动命令

llamafactory-cli webui # 指定设备启动 CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli webui

Web 页面

notion imagenotion image
  • 模型名称:基座模型
  • 模型路径:从第三方平台下载好的模型存放路径, 建议写绝对路径,一般要到模型检查点层级,如:/anjhon/Models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56
  • 微调方法:常用的有 LoRA、qLoRA等

训练

参数详解:

  • 学习率(Learning Rate):决定了模型每次更新时权重改变的幅度。过大可能会错过最优解;过小会学得很慢或陷入局部最优解
  • 训练轮数(Epochs):太少模型会欠拟合(没学好),太大会过拟合(学过头了)
  • 最大梯度范数(Max Gradient Norm):当梯度的值超过这个范围时会被截断,防止梯度爆炸现象
  • 最大样本数(Max Samples):每轮训练中最多使用的样本数
  • 计算类型(Computation Type):在训练时使用的数据类型,常见的有 float32 和 float16。在性能和精度之间找平衡
  • 截断长度(Truncation Length):处理长文本时如果太长超过这个阈值的部分会被截断掉,避免内存溢出
  • 批处理大小(Batch Size):由于内存限制,每轮训练我们要将训练集数据分批次送进去,这个批次大小就是 Batch Size
  • 梯度累积(Gradient Accumulation):默认情况下模型会在每个 batch 处理完后进行一次更新一个参数,但你可以通过设置这个梯度累计,让他直到处理完多个小批次的数据后才进行一次更新
  • 验证集比例(Validation Set Proportion):数据集分为训练集和验证集两个部分,训练集用来学习训练,验证集用来验证学习效果如何
  • 学习率调节器(Learning Rate Scheduler):在训练的过程中帮你自动调整优化学习率
 
设置好参数和模型之后就可以开始训练了。

评估

  • 观察损失曲线的变化;观察最终损失
  • 在交互页面上通过预测/对话等方式测试微调好的效果
  • 检查点:保存的是模型在训练过程中的一个中间状态,包含了模型权重、训练过程中使用的配置(如学习率、批次大小)等信息,对LoRA来说,检查点包含了训练得到的 B 和 A 这两个低秩矩阵的权重
  • 若微调效果不理想,可以:
    • 使用更强的预训练模型
    • 增加数据量
    • 优化数据质量(数据清洗、数据增强等,可学习相关论文如何实现)
    • 调整训练参数,如学习率、训练轮数、优化器、批次大小等等

合并导出

在页面上配置导出路径,导出即可

命令行

环境变量

名称
类型
介绍
API_HOST
API
API 服务器监听的主机地址
API_PORT
API
API 服务器监听的端口号
API_KEY
API
访问 API 的密码。
API_MODEL_NAME
API
指定 API 服务要加载和使用的模型名称
API_VERBOSE
API
控制 API 日志的详细程度
FASTAPI_ROOT_PATH
API
设置 FastAPI 应用的根路径
MAX_CONCURRENT
API
API 的最大并发请求数。
DISABLE_VERSION_CHECK
General
是否禁用启动时的版本检查。
FORCE_CHECK_IMPORTS
General
强制检查可选的导入
ALLOW_EXTRA_ARGS
General
允许在命令行中传递额外参数
LLAMAFACTORY_VERBOSITY
General
设置 LLaMA-Factory 的日志级别(“DEBUG”,”INFO”,”WARN”)
USE_MODELSCOPE_HUB
General
优先使用 ModelScope 下载模型/数据集或使用缓存路径中的模型/数据集
USE_OPENMIND_HUB
General
优先使用 Openmind 下载模型/数据集或使用缓存路径中的模型/数据集
USE_RAY
General
是否使用 Ray 进行分布式执行或任务管理。
RECORD_VRAM
General
是否记录 VRAM 使用情况。
OPTIM_TORCH
General
是否表示启用特定的 PyTorch 优化。
NPU_JIT_COMPILE
General
是否为 NPU启用 JIT 编译。
CUDA_VISIBLE_DEVICES
General
GPU 选择。
ASCEND_RT_VISIBLE_DEVICES
General
NPU 选择。
FORCE_TORCHRUN
Torchrun
是否强制使用 torchrun 启动脚本
MASTER_ADDR
Torchrun
Torchrun部署中主节点 (master node) 的网络地址
MASTER_PORT
Torchrun
Torchrun部署中主节点用于通信的端口号
NNODES
Torchrun
参与分布式部署的总节点数量
NODE_RANK
Torchrun
当前节点在所有节点中的 rank,通常从 0 到 NNODES-1
NPROC_PER_NODE
Torchrun
每个节点上的 GPU 数
WANDB_DISABLED
Log
是否禁用 wandb
WANDB_PROJECT
Log
设置 wandb 中的项目名称。
WANDB_API_KEY
Log
访问 wandb 的 api key
GRADIO_SHARE
Web UI
是否创建一个可共享的 webui 链接
GRADIO_SERVER_NAME
Web UI
设置 Gradio 服务器 IP 地址(例如 0.0.0.0
GRADIO_SERVER_PORT
Web UI
设置 Gradio 服务器的端口
GRADIO_ROOT_PATH
Web UI
设置 Gradio 应用的根路径
GRADIO_IPV6
Web UI
启用 Gradio 服务器的 IPv6 支持
ENABLE_SHORT_CONSOLE
Setting
支持使用 lmf 表示 llamafactory-cli

微调

修改配置文件

命令行微调相较于 webui 更自由、定制化程度更高
根据官方项目中提供的模板:LLaMA-Factory/examples/train_qlora/llama3_lora_sft_otfq.yaml 进行复制调整,最终调整如下:
### model model_name_or_path: /anjhon/LLaMA-Factory/models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56 quantization_bit: 4 # choices: [8 (bnb/hqq/eetq), 4 (bnb/hqq), 3 (hqq), 2 (hqq)] quantization_method: bnb # choices: [bnb, hqq, eetq] trust_remote_code: true ### method stage: sft do_train: true finetuning_type: lora lora_rank: 8 lora_target: all ### dataset dataset: how_searchers_are_made template: qwen3 cutoff_len: 2048 max_samples: 1000 overwrite_cache: true preprocessing_num_workers: 16 dataloader_num_workers: 4 ### output output_dir: saves/qwen3-14b/lora/sft logging_steps: 10 save_steps: 500 plot_loss: true overwrite_output_dir: true save_only_model: false report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow] ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000 ### eval # val_size: 0.1 # per_device_eval_batch_size: 1 # eval_strategy: steps # eval_steps: 500

训练启动

启动命令
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml
  • CUDA_VISIBLE_DEVICES:指定用来训练的 GPU,默认使用全部
 
在启动命令后还可追加参数更新 yaml 文件中的参数:
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml learning_rate=1e-5 logging_steps=1
更多可选参数如下(基本都是 .yaml 文件中有的参数):
名称
描述
model_name_or_path
模型名称或路径
stage
训练阶段,可选: rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO
do_train
true用于训练, false用于评估
finetuning_type
微调方式。可选: freeze, lora, full
lora_target
采取LoRA方法的目标模块,默认值为 all
dataset
使用的数据集,使用”,”分隔多个数据集
template
数据集模板,请保证数据集模板与模型相对应。
output_dir
输出路径
logging_steps
日志输出步数间隔
save_steps
模型断点保存间隔
overwrite_output_dir
是否允许覆盖输出目录
per_device_train_batch_size
每个设备上训练的批次大小
gradient_accumulation_steps
梯度积累步数
max_grad_norm
梯度裁剪阈值
learning_rate
学习率
lr_scheduler_type
学习率曲线,可选 linear, cosine, polynomial, constant 等。
num_train_epochs
训练周期数
bf16
是否使用 bf16 格式
warmup_ratio
学习率预热比例
warmup_steps
学习率预热步数
push_to_hub
是否推送模型到 Huggingface

报错处理

报错一:
OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)
[rank0]: Traceback (most recent call last): [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module> [rank0]: launch() [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 19, in launch [rank0]: run_exp() [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp [rank0]: _training_function(config={"args": args, "callbacks": callbacks}) [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function [rank0]: run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks) [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 51, in run_sft [rank0]: dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module) [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 304, in get_dataset [rank0]: dataset = _get_merged_dataset(data_args.dataset, model_args, data_args, training_args, stage) [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 182, in _get_merged_dataset [rank0]: datasets[dataset_name] = _load_single_dataset(dataset_attr, model_args, data_args, training_args) [rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 131, in _load_single_dataset [rank0]: dataset = load_dataset( [rank0]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/load.py", line 2084, in load_dataset [rank0]: builder_instance.download_and_prepare( [rank0]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/builder.py", line 876, in download_and_prepare [rank0]: raise OSError( [rank0]: OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size) [rank1]: Traceback (most recent call last): [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module> [rank1]: launch() [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 19, in launch [rank1]: run_exp() [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp [rank1]: _training_function(config={"args": args, "callbacks": callbacks}) [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function [rank1]: run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks) [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 51, in run_sft [rank1]: dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module) [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 304, in get_dataset [rank1]: dataset = _get_merged_dataset(data_args.dataset, model_args, data_args, training_args, stage) [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 182, in _get_merged_dataset [rank1]: datasets[dataset_name] = _load_single_dataset(dataset_attr, model_args, data_args, training_args) [rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 131, in _load_single_dataset [rank1]: dataset = load_dataset( [rank1]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/load.py", line 2084, in load_dataset [rank1]: builder_instance.download_and_prepare( [rank1]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/builder.py", line 876, in download_and_prepare [rank1]: raise OSError( [rank1]: OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)
解决一:
日志中可以看出是在加载数据集的时候提示磁盘空间不足,但是明明使用的是已经下载好的模型和数据,而且检查当前路径下的可用空间是足够的;
在 github 仓库的 issue 中找到解决方法,在启动命令后面重新指定 cache_dir 即可(将 cache 路径指向 LLaMAFactory 路径下的 cache):
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml cache_dir="/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/cache"

推理

使用 llamafactory-cli chat inference_config.yamlllamafactory-cli webchat inference_config.yaml 进行推理与模型对话。对话时配置文件只需指定原始模型 model_name_or_pathtemplate ,并根据是否是微调模型指定 adapter_name_or_pathfinetuning_type
默认情况下,模型推理将使用 Huggingface 引擎。 也可以指定 infer_backend: vllm 以使用 vllm 推理引擎以获得更快的推理速度。

原始模型推理配置

对于原始模型推理, inference_config.yaml 中 只需指定原始模型 model_name_or_pathtemplate 即可。
### examples/inference/llama3.yaml model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3 infer_backend: huggingface #choices: [huggingface, vllm]

微调模型推理配置

对于微调模型推理,除原始模型和模板外,还需要指定适配器路径 adapter_name_or_path 和微调类型 finetuning_type
### examples/inference/llama3_lora_sft.yaml model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct adapter_name_or_path: saves/llama3-8b/lora/sft template: llama3 finetuning_type: lora infer_backend: huggingface #choices: [huggingface, vllm]

多模态模型

对于多模态模型,可以运行以下指令进行推理。
llamafactory-cli webchat examples/inference/llava1_5.yaml
examples/inference/llava1_5.yaml 的配置示例如下:
model_name_or_path: llava-hf/llava-1.5-7b-hf template: vicuna infer_backend: huggingface #choices: [huggingface, vllm]

LoRA 合并

合并

为什么要合并:因为 LoRA 只是通过低秩矩阵调整原始模型的部分权重,而不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合生成一个完整的模型
通过 llamafactory-cli export merge_config.yaml 指令来合并模型。其中 merge_config.yaml 需要根据不同情况进行配置。examples/merge_lora/llama3_lora_sft.yaml 提供了合并时的配置示例。
### examples/merge_lora/llama3_lora_sft.yaml ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct adapter_name_or_path: saves/llama3-8b/lora/sft template: llama3 finetuning_type: lora ### export export_dir: models/llama3_lora_sft export_size: 2 export_device: cpu export_legacy_format: false
  • 模型 model_name_or_path 需要存在且与 template 相对应。 adapter_name_or_path 需要与微调中的适配器输出路径 output_dir 相对应。
  • 合并 LoRA 适配器时,不要使用量化模型或指定量化位数。可以使用本地或下载的未量化的预训练模型进行合并。

量化

在完成模型合并并获得完整模型后,为了优化部署效果,人们通常会基于显存占用、使用成本和推理速度等因素,选择通过量化技术对模型进行压缩,从而实现更高效的部署。
量化(Quantization)通过数据精度压缩有效地减少了显存使用并加速推理。LLaMA-Factory 支持多种量化方法,包括:
  • AQLM
  • AWQ
  • GPTQ
  • QLoRA
GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。我们通过量化技术将高精度表示的预训练模型转换为低精度的模型,从而在避免过多损失模型性能的情况下减少显存占用并加速推理,我们希望低精度数据类型在有限的表示范围内尽可能地接近高精度数据类型的表示,因此我们需要指定量化位数export_quantization_bit 以及校准数据集 export_quantization_dataset
### examples/merge_lora/llama3_gptq.yaml ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3 ### export export_dir: models/llama3_gptq export_quantization_bit: 4 export_quantization_dataset: data/c4_demo.json export_size: 2 export_device: cpu export_legacy_format: false
QLoRA 是一种在 4-bit 量化模型基础上使用 LoRA 方法进行训练的技术。它在极大地保持了模型性能的同时大幅减少了显存占用和推理时间。不要使用量化模型或设置量化位数 quantization_bit
### examples/merge_lora/llama3_q_lora.yaml ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct adapter_name_or_path: saves/llama3-8b/lora/sft template: llama3 finetuning_type: lora ### export export_dir: models/llama3_lora_sft export_size: 2 export_device: cpu export_legacy_format: false

合并相关参数

  • model_name_or_path: 预训练模型的名称或路径
  • template: 模型模板
  • export_dir: 导出路径
  • export_quantization_bit: 量化位数
  • export_quantization_dataset: 量化校准数据集
  • export_size: 最大导出模型文件大小
  • export_device: 导出设备
  • export_legacy_format: 是否使用旧格式导出

评估

通用能力评估

修改配置文件
### examples/train_lora/llama3_lora_eval.yaml ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct adapter_name_or_path: saves/llama3-8b/lora/sft # 可选项 ### method finetuning_type: lora ### dataset task: mmlu_test # mmlu_test, ceval_validation, cmmlu_test template: fewshot lang: en n_shot: 5 ### output save_dir: saves/llama3-8b/lora/eval ### eval batch_size: 4
执行评估
llamafactory-cli eval examples/train_lora/llama3_lora_eval.yaml

NLG 评估

修改配置文件
### examples/extras/nlg_eval/llama3_lora_predict.yaml ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct adapter_name_or_path: saves/llama3-8b/lora/sft ### method stage: sft do_predict: true finetuning_type: lora ### dataset eval_dataset: identity,alpaca_en_demo template: llama3 cutoff_len: 2048 max_samples: 50 overwrite_cache: true preprocessing_num_workers: 16 ### output output_dir: saves/llama3-8b/lora/predict overwrite_output_dir: true ### eval per_device_eval_batch_size: 1 predict_with_generate: true ddp_timeout: 180000000
执行评估
llamafactory-cli train examples/extras/nlg_eval/llama3_lora_predict.yaml

评估相关参数

参数名称
类型
介绍
task
str
评估任务的名称,可选项有 mmlu_test, ceval_validation, cmmlu_test
task_dir
str
包含评估数据集的文件夹路径,默认值为 evaluation
batch_size
int
每个GPU使用的批量大小,默认值为 4
seed
int
用于数据加载器的随机种子,默认值为 42
lang
str
评估使用的语言,可选值为 enzh。默认值为 en
n_shot
int
few-shot 的示例数量,默认值为 5
save_dir
str
保存评估结果的路径,默认值为 None。 如果该路径已经存在则会抛出错误。
download_modes
str
评估数据集的下载模式,默认值为 DownloadMode.REUSE_DATASET_IF_EXISTS。如果数据集已经存在则重复使用,否则则下载。

导出

修改配置文件

根据合并配置样例文件:LLaMA-Factory/examples/merge_lora/llama3_lora_sft.yaml 进行修改:
### Note: DO NOT use quantized model or quantization_bit when merging lora adapters ### model model_name_or_path: /anjhon/LLaMA-Factory/models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56 adapter_name_or_path: saves/qwen3-14b/lora/sft template: qwen3 trust_remote_code: true ### export export_dir: output/qwen3-14b_sft export_size: 5 export_device: cpu # choices: [cpu, auto] export_legacy_format: false
  • model_name_or_path:基座模型路径
  • adapter_name_or_path:微调后的保存路径(与训练配置文件中保持一致)
  • template: 模型模板
  • export_dir: 合并后的导出路径
  • export_quantization_bit: 量化位数
  • export_quantization_dataset: 量化校准数据集
  • export_size: 最大导出模型文件大小
  • export_device: 导出设备
  • export_legacy_format: 是否使用旧格式导出

执行合并

llamafactory-cli export examples/merge_lora/qwen3_14_lora_sft.yaml
 
对于本文内容有任何疑问, 可与我联系.