跳到主要内容

LLaMA-Factory 入门

1. LLaMA-Factory 是什么​

LLaMA-Factory 是面向大语言模型和多模态模型的统一微调框架。它通过 CLI、YAML 配置和 WebUI 组织模型、数据集、对话模板及训练策略,使用户不必为每种模型重复编写完整训练脚本。

本项目重点介绍 LLaMA-Factory 在摩尔线程 MUSA 环境中的使用,包括 Qwen3 模型的全参数 SFT、LoRA、CP Ulysses、packing、QLoRA、FP8 和 DPO 等实践。

1.1 适用场景​

  • 使用自定义对话数据完成监督微调(SFT);
  • 通过 LoRA/QLoRA 降低训练显存和 checkpoint 体积;
  • 执行继续预训练、奖励模型、DPO/KTO 等训练任务;
  • 使用 WebUI 快速配置、启动和观察训练;
  • 通过 DeepSpeed、FSDP 或序列并行扩展到多卡任务;
  • 训练后进行推理、LoRA 合并和模型导出。

1.2 设计特点​

  • 配置驱动:模型、数据、模板和超参数集中在 YAML 或命令行中;
  • 统一数据注册:通过 dataset_info.json 将数据文件注册为可引用的数据集名称;
  • 模板适配:针对不同模型使用对应 chat template;
  • 多种微调方式:支持 full、freeze、LoRA 和量化 LoRA;
  • 多种入口:CLI 适合复现和自动化,WebUI 适合交互配置;
  • 上层编排:依赖 Transformers、PEFT、TRL、DeepSpeed 等组件完成底层训练。

2. 核心架构​

2.1 主要组件​

组件作用
Model Loader加载 Hugging Face/ModelScope 模型和 tokenizer/processor
Template把对话与多模态字段转换为目标模型输入
Dataset Registry通过 dataset_info.json 关联数据集名称、文件和字段映射
Data Processor截断、tokenize、packing 并生成 labels
Trainer执行 PT、SFT、RM、DPO/KTO/PPO 等阶段
PEFT提供 LoRA、QLoRA 等参数高效微调
DeepSpeed / FSDP提供多卡分布式和显存优化
WebUI / CLI生成配置并启动训练、评估、推理或导出
MUSA / MCCL提供摩尔线程 GPU 计算和多卡通信能力

2.2 一次 SFT 任务如何运行​

读取 YAML / CLI 参数
↓
按 dataset 名称查询 dataset_info.json
↓
读取数据文件并执行字段映射
↓
应用模型对应的 chat template
↓
tokenize、截断或 packing
↓
Trainer 执行 full/LoRA 训练
↓
保存 checkpoint、trainer state 和日志

这里的 --dataset train 表示使用注册名称为 train 的数据集,而不是直接读取名为 train 的文件;真实文件和字段映射由 dataset_info.json 决定。

3. 如何选择微调方式​

3.1 全参数微调​

全参数微调会更新模型全部可训练参数,通常效果上限较高,但显存、通信和 checkpoint 成本最大。适合模型较小、GPU 资源充足或任务与基础模型差异较大的情况。

3.2 LoRA 与 QLoRA​

方式训练内容特点
LoRA低秩 adapter显存较低、产物小、兼容性通常较好
QLoRA量化基础模型 + LoRA进一步降低显存,但对量化后端和硬件兼容要求更高
Freeze只训练部分原模型层适用于希望直接更新部分权重的场景

推荐先用少量数据和 LoRA 验证模型、模板与数据链路,再扩大数据或切换全参数训练。

3.3 单卡、多卡和长序列​

单卡可容纳 → 直接 CLI + full/LoRA
常规多卡数据并行 → FORCE_TORCHRUN=1
显存仍不足 → DeepSpeed ZeRO / FSDP
长序列切分 → CP Ulysses 等序列并行

启用 CP Ulysses 时,sequence parallel size 必须与 attention heads 等模型结构维度兼容,并与训练脚本中的相关配置保持一致。

4. MUSA 环境准备​

4.1 推荐使用匹配的训练镜像​

本项目示例使用摩尔线程训练镜像,并通过 MUSA 适配脚本处理 LLaMA-Factory。关键依赖包括:

  • MUSA Driver、Runtime、torch_musa 和 MCCL;
  • LLaMA-Factory 与匹配的 Transformers/PEFT/TRL;
  • DeepSpeed 或其他分布式后端;
  • FlashAttention、FP8、QLoRA 等可选组件。

进入容器后先检查:

mthreads-gmi
python3 -c "import torch, torch_musa; print(torch.__version__)"
llamafactory-cli version

不要直接安装 CUDA PyTorch 覆盖镜像中的 MUSA 版本。LLaMA-Factory、Transformers 和模型代码版本也需要与当前 MUSA patch 匹配。

4.2 安装和版本边界​

当前实战页使用 LLaMA-Factory v0.9.3,并通过 musify 进行适配。该版本属于项目已验证基线,不代表上游最新版本。具体安装命令见:模型微调:基于 LLaMA-Factory。

升级 LLaMA-Factory 前,需要重新验证:

  • Transformers 与模型实现;
  • MUSA patch 是否仍可应用;
  • DeepSpeed、TRL、PEFT 和量化依赖;
  • 示例 YAML 的参数名是否发生变化。

4.3 模型和数据目录​

建议明确区分:

/data/models/ 模型目录
/data/datasets/llama_factory/ 数据与 dataset_info.json
saves/ checkpoint 和训练状态

宿主机路径必须通过 Docker volume 映射后,才能在容器中使用。

5. 从数据到训练的完整流程​

5.1 准备并注册数据集​

常见对话数据可以使用 Alpaca 或 ShareGPT 风格。ShareGPT 示例:

{
"conversations": [
{"from": "human", "value": "你好"},
{"from": "gpt", "value": "你好,有什么可以帮助你?"}
]
}

在 dataset_info.json 中注册:

{
"train": {
"file_name": "train.json",
"formatting": "sharegpt",
"columns": {"messages": "conversations"},
"tags": {"role_tag": "from", "content_tag": "value", "user_tag": "human", "assistant_tag": "gpt"}
}
}

字段配置应根据真实数据调整。不要只检查 JSON 语法,还要抽查 role 映射和最终 chat template 是否符合预期。

5.2 准备模型和模板​

--model_name_or_path /data/models/Qwen3-0.6B
--template qwen3

模型路径决定加载的权重与配置,template 决定对话如何拼接。模板选错可能不会立即报错,但会导致训练输入格式不正确。

5.3 使用 YAML 启动训练​

推荐把可复现配置写入 YAML:

stage: sft
do_train: true
model_name_or_path: /data/models/Qwen3-0.6B
dataset_dir: /data/datasets/llama_factory
dataset: train
template: qwen3
finetuning_type: lora
cutoff_len: 2048
per_device_train_batch_size: 1
gradient_accumulation_steps: 16
bf16: true
output_dir: saves/Qwen3-0.6B/lora

启动:

MUSA_VISIBLE_DEVICES=0 llamafactory-cli train train.yaml

5.4 WebUI 与多卡训练​

启动 WebUI:

llamafactory-cli webui

WebUI 适合生成和验证配置,正式任务仍建议保存 YAML。多卡训练可通过可见设备和 FORCE_TORCHRUN=1 启动,GPU 数量必须与实际可见设备一致。

5.5 推理、合并和导出​

训练完成后应先加载 checkpoint 做小样本推理,确认模板和输出正常,再进行 LoRA 合并或模型导出。合并后的模型需要单独验证,因为基础模型、adapter 和 tokenizer 路径不匹配都可能造成结果异常。

6. 参数速查​

6.1 模型和数据参数​

参数含义
model_name_or_path模型 ID 或本地目录
dataset_dir数据文件和 dataset_info.json 所在目录
datasetdataset_info.json 中注册的数据集名称
template模型对应的对话模板
cutoff_len最大 token 长度
packing是否把多个短样本拼入一个序列

6.2 微调和训练参数​

参数含义
stagePT、SFT、RM、DPO、KTO、PPO 等训练阶段
finetuning_typefull、freeze、lora
lora_rank、lora_alphaLoRA 容量与缩放参数
lora_target注入 LoRA 的模块
per_device_train_batch_size每个训练进程的 batch size
gradient_accumulation_steps梯度累积步数
output_dircheckpoint 和日志目录

6.3 分布式与精度参数​

参数含义
bf16 / fp16混合精度模式
deepspeedDeepSpeed 配置文件或预设
FORCE_TORCHRUN强制使用 torchrun 启动多卡
MUSA_VISIBLE_DEVICES选择 MUSA GPU

有效 batch size 通常与单卡 batch、梯度累积和数据并行进程数共同决定。

7. 常见问题定位​

7.1 找不到数据集​

检查 dataset_dir 是否指向包含 dataset_info.json 的目录,以及 dataset 是否是注册名称。--dataset train 不是让 DeepSpeed 或 LLaMA-Factory自动搜索 train.json。

7.2 数据加载成功但训练结果异常​

打印 tokenized 样本,重点检查 system/user/assistant role、EOS、mask 和 template。格式错误通常比 JSON 解析错误更隐蔽。

7.3 多卡进程数或通信错误​

核对 MUSA_VISIBLE_DEVICES、进程数和实际 GPU 数。若某个 rank 先 OOM,其他 rank 往往最终显示 MCCL timeout,因此要查第一条异常。

7.4 CP Ulysses 启动失败​

检查 attention heads 与 sequence parallel size 的整除关系,并确认脚本参数和配置文件没有使用不同的 CP/SP 大小。

7.5 显存不足​

依次降低 batch size、cutoff length,启用 gradient checkpointing 或 LoRA,再评估 DeepSpeed/QLoRA/序列并行。QLoRA 是否可用取决于当前 MUSA 量化算子和依赖版本。

7.6 WebUI 无法访问​

确认 WebUI 监听地址和端口、容器网络模式及防火墙。如果是远程服务器,优先使用 SSH 本地端口转发,而不是直接将管理页面暴露到公网。

8. 下一步阅读​

本文中的版本、MUSA patch 和命令以项目已验证环境为准。升级 LLaMA-Factory 或 Transformers 后,应重新验证配置参数、模型模板和训练链路。