跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

LLaMA-Factory 实战指南:WebUI、量化与分布式训练

介绍 LLaMA-Factory 的 WebUI 参数详解,涵盖基座模型、数据集、训练阶段(RLHF/DPO/KTO)、量化方法(bitsandbytes/HQQ/EETQ)、加速算法(FlashAttention-2/Unsloth/Liger Kernel)及 RoPE 插值。此外还包含 LoRA 模型合并与量化操作,以及分布式训练方案(DDP、DeepSpeed、FSDP)的配置与实操步骤。

虚拟内存发布于 2026/4/6更新于 2026/5/2023 浏览
LLaMA-Factory 实战指南:WebUI、量化与分布式训练

序言

文章整体分为八个章节,本篇覆盖第 6-8 章。

前三个章节是基础知识:

  • 第一章是对 LLaMA-Factory 的整体介绍
  • 第二章说明 LLaMA-Factory 使用的数据格式
  • 第三章说明怎样获取基座模型

四五两个章节通过一个法律文书摘要项目介绍 LLaMA-Factory 进行 LoRA 微调训练、评估和部署的全流程:

  • 第四章介绍 LoRA 微调的全过程
  • 第五章介绍模型评估和部署

六七八三个章节是对 LLaMA-Factory 的扩展介绍:

  • 第六章详细解释 LLaMA-Factory 的 WebUI 界面上的所有参数和方法
  • 第七章介绍模型合并和量化
  • 第八章介绍分布式训练

六、WebUI 详解

1. 基座模型

在这里插入图片描述

这一组参数定义了基座模型:

字段说明
模型名称这里是模型支持的所有基座模型的列表,模型本体需要自己手动下载。注意这里有部分模型的名称是不够明确的,例如 DeepSeek-R1-7B-Distill,这个名称只说明了模型把 DeepSeek-R1 当作教师模型,学习了它的推理数据,却没说明学生模型具体是哪个。
模型路径模型在本地的存储路径。
检查点路径如果是从某个检查点(checkpoint)继续训练,填写检查点在本地的存储路径。如果不是,置空。
对话模板不同模型的对话模板会有差异,尽量选同系列模型,至少是相近模型的模板,否则有可能报错。

2. 数据集

在这里插入图片描述

这一组参数定义了训练用的数据集:

字段说明
数据路径本地存储训练数据和 dataset_info.json 文件的路径
数据集dataset_info.json 里定义的数据集名称
{
"chat-train": { #数据集名称
"file_name": "train.jsonl" #数据集文件
}
}

3. 训练阶段

在这里插入图片描述

训练阶段的这几个选项不是并列关系:

训练阶段说明
Pre-Training这是大模型的起步阶段
Supervised Fine-Tuning有监督训练
Reward ModelingRLHF(人类反馈强化学习) 的第一步,训练奖励模型
PPORLHF(人类反馈强化学习) 的第二步,通过奖励模型的反馈,调整自身策略
DPO直接利用人类偏好数据微调 AI
KTO在训练 AI 时,会不对称地处理正负反馈(惩罚错误比奖励正确更严厉)

下面详细说明一下 RLHF(Reward Modeling+PPO),DPO,KTO 这三种强化学习方法。

3.1 RLHF(Reward Modeling+PPO)

RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)的训练方式是:

  • 首先训练一个初始模型
  • 利用初始模型对同一个数据集,生成多样化的回答
  • 人类对多样化回答进行排序、评分、修正
  • 利用人类修正后的数据训练奖励模型
  • 把初始模型作为'策略',奖励模型作为'环境',使用 PPO 等算法,优化初始模型。

其中的 PPO(Proximal Policy Optimization,近端策略优化)是一种训练 AI 模型的强化学习算法,用于让 AI 通过'试错'学习最优策略。

核心思想是让初始模型尝试不同的动作,根据奖励模型的反馈(奖励/惩罚)调整策略。

关键点在于每次更新策略时,只允许小幅调整(避免'学崩',这也是'近端'这个词的由来),像给学习过程加了'安全绳'。

主要用途是 ChatGPT 的微调、游戏 AI、机器人控制等。

3.2 DPO

DPO(Direct Preference Optimization,直接偏好优化)是一种直接利用人类偏好数据微调 AI 的方法(无需复杂奖励模型)。

核心思想传统 RL(如 PPO)需要先训练一个'奖励模型',再调整 AI 策略;DPO 跳过这一步,直接用人类标注的'A 回答比 B 好'这类偏好数据训练。

优点更简单高效,适合对齐人类价值观(比如让 AI 回答更友善)。

主要用途是专攻'人类偏好'场景。可以看作 RLHF 的简化版本。

3.3 KTO

KTO(Kahneman-Tversky Optimization,卡尼曼 - 特沃斯基优化)是一种结合行为经济学理论的 AI 训练方法,灵感来自诺贝尔奖得主卡尼曼的'前景理论'。

核心思想是人类对'损失'比'收益'更敏感(比如丢 100 元的痛苦 > 捡 100 元的快乐)。所以 KTO 在训练 AI 时,会不对称地处理正负反馈(惩罚错误比奖励正确更严厉)。

主要用途是快速纠正 AI 的不良行为(不文明用语、种族歧视、安全漏洞等)。

3.4 小结

问题: 1 怎样使用 LLaMA-Factory 做 RLHF 训练? 2 DPO 和 KTO 的使用场景是什么?

4. 训练方法

在这里插入图片描述

在这里插入图片描述

5. 量化

在这里插入图片描述

量化等级说明
none不做量化
88 位量化
44 位量化

下面对几种量化方法做简单说明。

5.1 bitsandbytes(8-bit/4-bit 量化)

核心思想:把模型参数从 32 位浮点数压缩成 8 位整数或 4 位整数,大幅减少内存占用。

特点:

  • 即插即用:Hugging Face 直接集成,加一行代码就能用。
  • 保持性能:8-bit 量化几乎不掉精度,4-bit 会轻微下降。
  • 适合场景:消费级显卡(如 RTX 3090)跑大模型。

类比:像把高清电影压缩成 MP4:

  • 8-bit ≈ 720P(画质几乎不变,体积减半)。
  • 4-bit ≈ 480P(画质稍糊,但手机也能播)。
5.2 HQQ(Half-Quadratic Quantization,半二次量化)

核心思想:用数学优化方法动态分配量化位数,对重要参数保留高精度,次要参数狠压缩。

特点:

  • 灵活智能:不同参数用不同位数(比如 2-bit 到 8-bit 混合)。
  • 计算复杂:需要额外优化步骤,但压缩率更高。
  • 适合场景:对体积极度敏感的端侧设备(手机、IoT)。

类比:像搬家时打包行李:

  • 贵重瓷器(重要参数)→ 精装泡沫箱(8-bit)。
  • 旧衣服(次要参数)→ 真空压缩袋(2-bit)。
5.3 EETQ(Efficient Engine for Tensor Quantization,高效张量量化引擎)

核心思想:专为 GPU 推理加速设计的量化库,优化计算过程。

特点:

  • 极致速度:内核级优化,比常规量化快 2-3 倍。
  • 需要适配:需手动转换模型格式,兼容性较低。
  • 适合场景:高并发在线服务(如 ChatGPT 接口)。

类比:像 F1 赛车改装:

  • 普通量化 → 家用车省油改装。
  • EETQ → 拆座椅、换涡轮,只为冲赛道极限速度。
5.4 适用场景
方法易用性压缩率速度典型用途
bitsandbytes⭐⭐⭐⭐⭐⭐⭐⭐个人快速部署
HQQ⭐⭐⭐⭐⭐⭐⭐手机/嵌入式设备
EETQ⭐⭐⭐⭐⭐⭐⭐企业级高性能推理

一句话总结:

  • 想简单试试 → bitsandbytes
  • 要极限压缩 → HQQ
  • 追求推理速度 → EETQ
5.5 小结

问题: 1 bitsandbytes、HQQ、EETQ 三种量化方法的使用场景是什么?

6. 加速算法

在这里插入图片描述

注意:这里的 FlashAttention-2 用于训练和推理,Unsloth 用于训练,Liger Kernel 用于推理,他们不是并列关系,可以组合使用。

6.1 FlashAttention-2

核心目标:优化 Transformer 的注意力计算(避免重复读写显存)。

原理:

  • 传统注意力计算时,GPU 显存频繁读写成瓶颈(像反复翻书找知识点)。
  • FlashAttention-2 通过算法重构 + 硬件适配,让计算更'连贯',减少显存访问次数。

效果:

  • 训练速度提升 2-3 倍,显存占用降低。
  • 适合场景:所有基于 Transformer 的模型(如 LLaMA、GPT)。

类比:像学霸改进学习方法:

  • 旧方法:每道题都翻课本查公式(显存频繁读写)。
  • FlashAttention-2:一次性记住所有公式,快速解题(计算更高效)。
6.2 Unsloth

核心目标:让微调(Fine-tuning)大模型更快、更省显存。

原理:

  • 结合多种技巧:梯度检查点(省显存)、自动混合精度(加速计算)、内核融合(减少 GPU 操作步骤)。
  • 对 PyTorch 底层计算进行定制优化。

效果:

  • 微调速度提升 2-5 倍,显存需求减半。
  • 适合场景:个人电脑微调大模型(如用 RTX 4090 训练 LLaMA)。

类比:像给汽车加装涡轮增压:

  • 原厂 PyTorch → 普通发动机。
  • Unsloth → 涡轮 + 轻量化改装,同样的油跑得更快。
6.3 Liger Kernel

核心目标:专为推理阶段设计的 GPU 加速库。

原理:

  • 针对推理的批量请求优化,动态合并计算任务(如同时处理 10 个用户的提问)。
  • 高度定制 CUDA 内核,避免无用计算。

效果:

  • 推理吞吐量(每秒处理量)提升 5-10 倍,延迟更低。
  • 适合场景:高并发在线服务(如 ChatGPT API)。

类比:像快餐店出餐流程优化:

  • 传统推理 → 一个订单做完再做下一个。
  • Liger Kernel → 批量接单,同时炸 10 份薯条,整体效率飙升。
6.4 适用场景
技术适用阶段优化重点典型用户
FlashAttention-2训练/推理注意力计算研究者、企业
Unsloth训练微调效率个人开发者
Liger Kernel推理高并发吞吐量云服务厂商

一句话总结:

  • 想改进模型底层计算 → FlashAttention-2
  • 想低成本微调模型 → Unsloth
  • 要做高并发 AI 服务 → Liger Kernel
6.5 小结

问题: 1 FlashAttention-2、Unsloth、Liger Kernel 三种加速方法的原理和使用场景是什么?

7. RoPE 插值方法

在这里插入图片描述

RoPE(Rotary Position Embedding,旋转位置编码)

RoPE Scaling 是一种让大语言模型(LLM)处理超长文本的技术,就像给模型'加长记忆',让它能读懂更长的文章或对话。

四种 Scaling 方法对比:

7.1 Linear(线性缩放)
  • 原理:简单粗暴,把位置编号按比例缩小(比如编号 1000→压缩成 500)。
  • 例子:原模型支持 2048 长度,想扩展到 4096,就把所有位置编号除以 2。
  • 缺点:太生硬,长文本效果差(模型会懵)。
7.2 Dynamic(动态缩放)
  • 原理:训练时用短文本,推理时自动按比例缩放位置编码。
  • 优点:不用重新训练模型,直接支持更长文本(比如 ChatGPT 初期用的方法)。
  • 缺点:超过一定长度(比如原长的 4 倍)效果变差。
7.3 YaRN(NTK-aware RoPE Scaling)
  • 原理:用神经切线核(NTK)理论动态调整旋转角度,兼顾短文本和长文本。
  • 优点:比 Linear 和 Dynamic 更聪明,扩展性更强(比如支持 8 倍长度)。
  • 应用:LLaMA-2 的官方长文本扩展方法。
7.4 LLaMA-3 的改进
  • 特点:结合了 YaRN 和动态调整,进一步优化长文本稳定性。
  • 效果:在超长文本(比如 10 万 token)下仍能保持较好性能。
7.5 一句话总结
  • Linear:简单压缩,效果差。
  • Dynamic:推理时自动缩放,方便但有限。
  • YaRN:用数学理论智能调整,效果更好。
  • LLaMA-3:在 YaRN 基础上继续升级,专治超长文本。
7.6 小结

问题: 1 RoPE 的插值方法有哪些?使用场景是什么?

8. 通用参数

在这里插入图片描述

这一组是通用参数,几乎训练任何大模型都会用到:

参数名称说明
学习率0.1 一般只用于探索,没人会真的用
0.01 从头训练的标准模型初始学习率
0.001 已经快接近优化目标时做细致调整时采用
0.0001 模型接近收敛时做微调
0.00005 预训练阶段的最后微调
训练轮数学习的特性较简单,1 轮即可,如果数据集太小,不应选择太多轮数,可以考虑数据增强。
最大梯度范数指定一个允许的最大梯度值,防止梯度爆炸
最大样本数训练时从数据集里最多取这个数量的样本
计算类型fp32:单精度浮点数,32 位,计算准确、稳定,但速度慢、占显存最多。
fp16:半精度浮点数,16 位,显存省一半,计算速度快,但容易溢出。
bf16:脑浮点数,16 位,显存省一半,计算速度快,不容易溢出。
pure_bf16 纯 bf16 模式,16 位,显存占用最小,但需要硬件支持。
截断长度输入样本的截断长度
批处理大小根据显存的情况调整
梯度累计批处理大小*梯度累计决定了梯度更新的频率
验证集比例验证集占全体样本的比例
学习率调节器模型训练的不同阶段需要不同的学习率,这个参数决定学习率的调节器,cosin 最常用
8.1 小结

问题: 1 怎样选择学习率? 2 计算类型都有哪些?默认情况下用哪个? 3 批处理大小怎样选择? 4 处理完多少样本后做梯度更新?

9. 其它参数

在这里插入图片描述

这组参数里最重要的就是保存间隔和预热部署。

10. 部分参数微调设置

这一组参数只有微调方法为 freeze 的时候才启用,指定哪些层和模块可以参与训练。

在这里插入图片描述

11. LoRA 参数设置

这一组参数只有微调方法为 lora 的时候才启用,指定哪些层和模块可以参与训练。

在这里插入图片描述

参数说明
LoRA 的秩LoRA 矩阵的秩
LoRA 缩放系数LoRA 缩放系数的大小
LoRA 随机丢弃LoRA 权重随即丢弃的概率
LoRA+学习率比例允许 A,B 两个矩阵的学习率不一样,在 LoRA+ 中,适配器矩阵 A 的学习率 ηA 即为优化器学习率。适配器矩阵 B 的学习率 ηB 为 λ * ηA。其中 λ 为 loraplus_lr_ratio 的值。
使用 rslora在 LoRA 训练的时候可以动态调整 LoRA 缩放系数
使用 DoRA把原始权重分继承幅度和方向两部分,同时优化,微调更灵活
使用 PiSSA直接调整权重矩阵的主成分,减少计算量
11.1 小结

问题: 1 LoRA 训练哪个参数决定了计算量大小? 2 未知场景下,原始 LoRA,rslora,DoRA,PiSSA 四者中优先使用哪个?

12. RLHF 参数设置

在这里插入图片描述

这一组参数只有训练阶段为强化学习的时候才启用。

在这里插入图片描述

13. 多模态参数设置

在这里插入图片描述

这一组参数只有训练阶段为强化学习的时候才启用。

14. GaLore 参数设置

GaLore 是为大模型全参数训练、微调场景设计的优化工具,它使用中非常节省显存的优化器。核心思路是把传统优化器的超大规模参数矩阵,拆解成低秩形式,大幅降低计算量。

在这里插入图片描述

在这里插入图片描述

15. APOLLO 参数设置

APOLLO 优化器是升级版的 Adam 或 SGD,Adam 虽然能自适应学习率,但可能在某些任务上震荡或收敛不稳定;SGD 需要手动调节学习率,容易陷入局部最优。APOLLO 采用了自适应学习率,不仅考虑到梯度,还考虑到二阶信息,调节效果更好。

在这里插入图片描述

在这里插入图片描述

16. BAdam 参数设置

BAdam 优化器是升级版的 Adam,传统的 Adam,当参数接近边界时,可能会越界导致概率值变成 -1 或者大于 1 的值,也可能导致物理常数超出合理范围。BAdam 专门解决训练时参数超出合理范围的问题,当参数接近边界时,更新率自动调低。

在这里插入图片描述

在这里插入图片描述

17. 模型和配置的保存路径

在这里插入图片描述

18. SwanLab 参数设置

这一组参数只有使用 SwanLab 的时候才启用

在这里插入图片描述

19. 预测与评估

在这里插入图片描述

20. 推理

在这里插入图片描述

21. 导出模型

在这里插入图片描述

22. 小结

问题: 1 LLaMa-Factory 可以做哪些阶段的训练?有哪些训练方法? 2 LLaMa-Factory 可以使用哪些训练方法?适用场景是什么? 3 LLaMa-Factory 可以使用哪些加速方法?适用场景是什么? 4 LLaMa-Factory 可以使用插值方法?各有什么优缺点? 5 LLaMa-Factory 有哪些 LoRA 微调的专用参数?作用是什么? 6 LLaMa-Factory 能训练多模态模型吗?如果只想训练多模态模型中的图像部分,不想训练其中的文本和文图映射,应该怎样设置参数?

七、LoRA 模型合并和量化

1. 模型合并

做 LoRA 微调的时候,如果有全精度模型和更大的量化模型,应该尽可能选择更大的量化模型。因为低精度对模型效果影响有限,但是对占用显存,推理速度有巨大影响。 模型合并只能使用全精度模型,而量化模型的基座和 LoRA 即使不合并影响也不大,反而还有部署灵活的优势,所以模型合并这个操作使用频率较低。

1.1 使用 webui

在这里插入图片描述

在这里插入图片描述

1.2 使用命令行

如果必须使用全精度模型,训练完成后,可以选择把 LoRA 和基座模型进行合并。

llamafactory-cli export merge_config.yaml 

配置文件格式如下:

#基座模型路径
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
#LoRA 路径
adapter_name_or_path: saves/llama3-8b/lora/sft
#对话模板
template: llama3
#微调类型
finetuning_type: lora
#合并后模型路径
export_dir: models/llama3_lora_sft
#模型文件切割的大小(GB)
export_size: 2
#导出的设备
export_device: cpu
#导出的文件格式 True: .bin 格式保存。False: .safetensors 格式保存。
export_legacy_format: false

2. 模型量化

2.1 使用 webui

在这里插入图片描述

2.2 使用命令行
llamafactory-cli export quantization_config.yaml 

配置文件格式如下:

#基座模型路径
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
#对话模板
template: llama3
#合并后模型路径
export_dir: models/llama3_gptq
#量化等级
export_quantization_bit: 4
#量化校验数据集
export_quantization_dataset: data/c4_demo.json
#模型文件切割的大小(GB)
export_size: 2
#导出的设备
export_device: cpu
#导出的文件格式 True: .bin 格式保存。False: .safetensors 格式保存。
export_legacy_format: false

3. 小结

实操: 1 将一个 LoRA 和基座模型做合并 2 将一个全精度模型做量化

八、分布式训练

1. 整体介绍

LLaMA-Factory 支持单机多卡和多机多卡分布式训练。同时也支持 DDP , DeepSpeed 和 FSDP 三种分布式引擎。 DDP (DistributedDataParallel) 通过实现模型并行和数据并行实现训练加速。使用 DDP 的程序需要生成多个进程并且为每个进程创建一个 DDP 实例,他们之间通过 torch.distributed 库同步。 DeepSpeed 是微软开发的分布式训练引擎,并提供 ZeRO(Zero Redundancy Optimizer)、offload、Sparse Attention、1 bit Adam、流水线并行等优化技术。您可以根据任务需求与设备选择使用。 FSDP 通过全切片数据并行技术(Fully Sharded Data Parallel)来处理更多更大的模型。在 DDP 中,每张 GPU 都各自保留了一份完整的模型参数和优化器参数。而 FSDP 切分了模型参数、梯度与优化器参数,使得每张 GPU 只保留这些参数的一部分。除了并行技术之外,FSDP 还支持将模型参数卸载至 CPU,从而进一步降低显存需求。

在这里插入图片描述

2. DDP

NativeDDP 是 PyTorch 提供的一种分布式训练方式,您可以通过以下命令启动训练:

2.1 单机多卡
  • 使用 llamafactory-cli 启动 DDP

您可以使用 llamafactory-cli 启动 NativeDDP 引擎。

FORCE_TORCHRUN=1 llamafactory-cli train examples/train_full/llama3_full_sft_ds3.yaml 

如果 CUDA_VISIBLE_DEVICES 没有指定,则默认使用所有 GPU。如果需要指定 GPU,例如第 0、1 个 GPU,可以使用:

FORCE_TORCHRUN=1 CUDA_VISIBLE_DEVICES=0,1 llamafactory-cli train config/config1.yaml 
  • 使用 torchrun 启动 DDP

您也可以使用 torchrun 指令启动 NativeDDP 引擎进行单机多卡训练。下面提供一个示例:

torchrun --standalone --nnodes=1 --nproc-per-node=8 src/train.py \
--stage sft \
--model_name_or_path meta-llama/Meta-Llama-3-8B-Instruct \
--do_train \
--dataset alpaca_en_demo \
--template llama3 \
--finetuning_type lora \
--output_dir saves/llama3-8b/lora/ \
--overwrite_cache \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 100 \
--save_steps 500 \
--learning_rate 1e-4 \
--num_train_epochs 2.0 \
--plot_loss \
--bf16 
  • 使用 accelerate 启动 DDP

您还可以使用 accelerate 指令启动进行单机多卡训练。 首先运行以下命令,根据需求回答一系列问题后生成配置文件: accelerate config 下面提供一个示例配置文件:

#accelerate_singleNode_config.yaml
compute_environment: LOCAL_MACHINE
debug: true
distributed_type: MULTI_GPU
downcast_bf16: 'no'
enable_cpu_affinity: false
gpu_ids: all
machine_rank: 0
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 8
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

您可以通过运行以下指令开始训练:

accelerate launch \
--config_file accelerate_singleNode_config.yaml \
src/train.py training_config.yaml 
2.2 多机多卡
  • 使用 llamafactory-cli 启动 DDP
FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=0 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 \
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml
FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=1 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 \
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml 

在这里插入图片描述

  • 使用 torchrun 启动 DDP

您也可以使用 torchrun 指令启动 NativeDDP 引擎进行多机多卡训练。

  • 使用 accelerate 启动 DDP

您还可以使用 accelerate 指令启动进行多机多卡训练。 首先运行以下命令,根据需求回答一系列问题后生成配置文件: accelerate config 下面提供一个示例配置文件:

#accelerate_multiNode_config.yaml
compute_environment: LOCAL_MACHINE
debug: true
distributed_type: MULTI_GPU
downcast_bf16: 'no'
enable_cpu_affinity: false
gpu_ids: all
machine_rank: 0
main_process_ip: '192.168.0.1'
main_process_port: 29500
main_training_function: main
mixed_precision: fp16
num_machines: 2
num_processes: 16
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false 

您可以通过运行以下指令开始训练:

accelerate launch \
--config_file accelerate_multiNode_config.yaml \
train.py llm_config.yaml 
2.3 小结

实操: 1 实操基于 DDP 的单机多卡训练 2 实操基于 DDP 的多机多卡训练

3. DeepSpeed

DeepSpeed 是由微软开发的一个开源深度学习优化库,旨在提高大模型训练的效率和速度。在使用 DeepSpeed 之前,您需要先估计训练任务的显存大小,再根据任务需求与资源情况选择合适的 ZeRO 阶段。

  • ZeRO-1: 仅划分优化器参数,每个 GPU 各有一份完整的模型参数与梯度。
  • ZeRO-2: 划分优化器参数与梯度,每个 GPU 各有一份完整的模型参数。
  • ZeRO-3: 划分优化器参数、梯度与模型参数。

简单来说:从 ZeRO-1 到 ZeRO-3,阶段数越高,显存需求越小,但是训练速度也依次变慢。此外,设置 offload_param=cpu 参数会大幅减小显存需求,但会极大地使训练速度减慢。因此,如果您有足够的显存,应当使用 ZeRO-1,并且确保 offload_param=none。

3.1 单机多卡
  • 使用 llamafactory-cli 启动 DeepSpeed

您可以使用 llamafactory-cli 启动 DeepSpeed 引擎进行单机多卡训练。

FORCE_TORCHRUN=1 llamafactory-cli train examples/train_full/llama3_full_sft_ds3.yaml 

为了启动 DeepSpeed 引擎,配置文件中 deepspeed 参数指定了 DeepSpeed 配置文件的路径:

deespeed: examples/deepspeed/ds_z3_config.json 
  • 使用 deepspeed 指令启动 DeepSpeed 引擎

您也可以使用 deepspeed 指令启动 DeepSpeed 引擎进行单机多卡训练。

deepspeed --include localhost:1 your_program.py <normal cl args> --deepspeed ds_config.json 

下面是一个例子:

deepspeed --num_gpus 8 src/train.py \
--deepspeed examples/deepspeed/ds_z3_config.json \
--stage sft \
--model_name_or_path meta-llama/Meta-Llama-3-8B-Instruct \
--do_train \
--dataset alpaca_en \
--template llama3 \
--finetuning_type full \
--output_dir saves/llama3-8b/lora/full \
--overwrite_cache \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 500 \
--learning_rate 1e-4 \
--num_train_epochs 2.0 \
--plot_loss \
--bf16 

使用 deepspeed 指令启动 DeepSpeed 引擎时无法使用 CUDA_VISIBLE_DEVICES 指定 GPU。而需要:

deepspeed --include localhost:1 your_program.py <normal cl args> --deepspeed ds_config.json 

–include localhost:1 表示只是用本节点的 gpu1。

3.2 多机多卡
  • 使用 llamafactory-cli 启动 DeepSpeed 训练

LLaMA-Factory 支持使用 DeepSpeed 的多机多卡训练,您可以通过以下命令启动:

FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=0 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 llamafactory-cli train examples/train_lora/llama3_lora_sft_ds3.yaml
FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=1 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 llamafactory-cli train examples/train_lora/llama3_lora_sft_ds3.yaml 
  • 使用 deepspeed 指令启动 DeepSpeed 训练

您也可以使用 deepspeed 指令来启动多机多卡训练。

deepspeed --num_gpus 8 --num_nodes 2 --hostfile hostfile --master_addr hostname1 --master_port=9901 \
your_program.py <normal cl args> --deepspeed ds_config.json 

hostfile 的每一行指定一个节点,每行的格式为 slots=<num_slots> ,其中 是节点的主机名, <num_slots> 是该节点上的 GPU 数量。下面是一个例子:

worker-1 slots=4
worker-2 slots=4

如果没有指定 hostfile 变量,DeepSpeed 会搜索 /job/hostfile 文件。如果仍未找到,那么 DeepSpeed 会使用本机上所有可用的 GPU。

  • 使用 accelerate 指令启动 DeepSpeed 训练

您还可以使用 accelerate 指令启动 DeepSpeed 引擎。首先通过以下命令生成 DeepSpeed 配置文件:

accelerate config 

下面提供一个配置文件示例:

#deepspeed_config.yaml
compute_environment: LOCAL_MACHINE
debug: false
deeep_speed_config: deepspeed_multinode_launcher: standard
gradient_accumulation_steps: 8
offload_optimizer_device: none
offload_param_device: none
zero3_init_flag: false
zero_stage: 3
distributed_type: DEEPSPEED
downcast_bf16: 'no'
enable_cpu_affinity: false
machine_rank: 0
main_process_ip: '192.168.0.1'
main_process_port: 29500
main_training_function: main
mixed_precision: fp16
num_machines: 2
num_processes: 16
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false 

随后,可以使用以下命令启动训练:

accelerate launch \
--config_file deepspeed_config.yaml \
train.py llm_config.yaml 
  • DeepSpeed 配置文件

ZeRO-0

{
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto",
"zero_allow_untested_optimizer": true,
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": "auto"
},
"zero_optimization": {
"stage": 0,
"allgather_partitions": true,
"allgather_bucket_size": 5e8,
"overlap_comm": true,
"reduce_scatter": true,
"reduce_bucket_size": 5e8,
"contiguous_gradients": true,
"round_robin_gradients": true
}
}

ZeRO-2 只需在 ZeRO-0 的基础上修改 zero_optimization 中的 stage 参数即可。

{"...","zero_optimization": {"stage": 2,"..."}}

ZeRO-2+offload 只需在 ZeRO-0 的基础上在 zero_optimization 中添加 offload_optimizer 参数即可。

{"...","zero_optimization": {"stage": 2,"offload_optimizer": {"device": "cpu","pin_memory": true },"..."}}

ZeRO-3 只需在 ZeRO-0 的基础上修改 zero_optimization 中的参数。

{"...","zero_optimization": {"stage": 3,"overlap_comm": true,"contiguous_gradients": true,"sub_group_size": 1e9,"reduce_bucket_size": "auto","stage3_prefetch_bucket_size": "auto","stage3_param_persistence_threshold": "auto","stage3_max_live_parameters": 1e9,"stage3_max_reuse_distance": 1e9,"stage3_gather_16bit_weights_on_model_save": true }}

ZeRO-3+offload 只需在 ZeRO-3 的基础上添加 zero_optimization 中的 offload_optimizer 和 offload_param 参数即可。

ds_z3_offload_config.json {..."zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true },"offload_param": {"device": "cpu","pin_memory": true },"..."}}
3.3 小结

实操: 1 实操基于 DeepSpeed 的单机多卡训练 2 实操基于 DeepSpeed 的多机多卡训练

4. FSDP

PyTorch 的全切片数据并行技术 FSDP(Fully Sharded Data Parallel)能让我们处理更多更大的模型。LLaMA-Factory 支持使用 FSDP 引擎进行分布式训练。 FSDP 的参数 ShardingStrategy 的不同取值决定了模型的划分方式:

  • FULL_SHARD: 将模型参数、梯度和优化器状态都切分到不同的 GPU 上,类似 ZeRO-3。
  • SHARD_GRAD_OP: 将梯度、优化器状态切分到不同的 GPU 上,每个 GPU 仍各自保留一份完整的模型参数。类似 ZeRO-2。
  • NO_SHARD: 不切分任何参数。类似 ZeRO-0。
4.1 llamafactory-cli

您只需根据需要修改 examples/accelerate/fsdp_config.yaml 以及 examples/extras/fsdp_qlora/llama3_lora_sft.yaml,文件然后运行以下命令即可启动 FSDP+QLoRA 微调:

bash examples/extras/fsdp_qlora/train.sh 
4.2 accelerate

此外,您也可以使用 accelerate 启动 FSDP 引擎,节点数与 GPU 数可以通过 num_machines 和 num_processes 指定。对此,Huggingface 提供了便捷的配置功能。只需运行:

accelerate config 

根据提示回答一系列问题后,我们就可以生成 FSDP 所需的配置文件。 当然您也可以根据需求自行配置 fsdp_config.yaml。

#/examples/accelerate/fsdp_config.yaml
compute_environment: LOCAL_MACHINE
debug: false
distributed_type: FSDP
downcast_bf16: 'no'
fsdp_config:
fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
fsdp_backward_prefetch: BACKWARD_PRE
fsdp_forward_prefetch: false
fsdp_cpu_ram_efficient_loading: true
fsdp_offload_params: true # offload may affect training speed
fsdp_sharding_strategy: FULL_SHARD
fsdp_state_dict_type: FULL_STATE_DICT
fsdp_sync_module_states: true
fsdp_use_orig_params: true
machine_rank: 0
main_training_function: main
mixed_precision: fp16 # or bf16
num_machines: 1 # the number of nodes
num_processes: 2 # the number of GPUs in all nodes
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false 

请确保 num_processes 和实际使用的总 GPU 数量一致 随后,您可以使用以下命令启动训练:

accelerate launch \
--config_file fsdp_config.yaml \
src/train.py llm_config.yaml 
4.3 小结

实操: 1 实操基于 DDP 的单机多卡训练 2 实操基于 DDP 的多机多卡训练 3 实操基于 DeepSpeed 的单机多卡训练 4 实操基于 DeepSpeed 的多机多卡训练 5 实操基于 FSDP 的单机多卡训练 6 实操基于 FSDP 的多机多卡训练

目录

  1. 序言
  2. 六、WebUI 详解
  3. 1. 基座模型
  4. 2. 数据集
  5. 3. 训练阶段
  6. 3.1 RLHF(Reward Modeling+PPO)
  7. 3.2 DPO
  8. 3.3 KTO
  9. 3.4 小结
  10. 4. 训练方法
  11. 5. 量化
  12. 5.1 bitsandbytes(8-bit/4-bit 量化)
  13. 5.2 HQQ(Half-Quadratic Quantization,半二次量化)
  14. 5.3 EETQ(Efficient Engine for Tensor Quantization,高效张量量化引擎)
  15. 5.4 适用场景
  16. 5.5 小结
  17. 6. 加速算法
  18. 6.1 FlashAttention-2
  19. 6.2 Unsloth
  20. 6.3 Liger Kernel
  21. 6.4 适用场景
  22. 6.5 小结
  23. 7. RoPE 插值方法
  24. 7.1 Linear(线性缩放)
  25. 7.2 Dynamic(动态缩放)
  26. 7.3 YaRN(NTK-aware RoPE Scaling)
  27. 7.4 LLaMA-3 的改进
  28. 7.5 一句话总结
  29. 7.6 小结
  30. 8. 通用参数
  31. 8.1 小结
  32. 9. 其它参数
  33. 10. 部分参数微调设置
  34. 11. LoRA 参数设置
  35. 11.1 小结
  36. 12. RLHF 参数设置
  37. 13. 多模态参数设置
  38. 14. GaLore 参数设置
  39. 15. APOLLO 参数设置
  40. 16. BAdam 参数设置
  41. 17. 模型和配置的保存路径
  42. 18. SwanLab 参数设置
  43. 19. 预测与评估
  44. 20. 推理
  45. 21. 导出模型
  46. 22. 小结
  47. 七、LoRA 模型合并和量化
  48. 1. 模型合并
  49. 1.1 使用 webui
  50. 1.2 使用命令行
  51. 2. 模型量化
  52. 2.1 使用 webui
  53. 2.2 使用命令行
  54. 3. 小结
  55. 八、分布式训练
  56. 1. 整体介绍
  57. 2. DDP
  58. 2.1 单机多卡
  59. 2.2 多机多卡
  60. 2.3 小结
  61. 3. DeepSpeed
  62. 3.1 单机多卡
  63. 3.2 多机多卡
  64. 3.3 小结
  65. 4. FSDP
  66. 4.1 llamafactory-cli
  67. 4.2 accelerate
  68. 4.3 小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 深度学习线上算法开发环境配置指南
  • AI 印象派艺术工坊与 Stable Diffusion 对比:轻量部署案例评测
  • Java Web 教师个人成果管理系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0
  • 基于 SSM Web 的教师业绩管理系统设计与实现
  • 基于 SSM 和 Vue 的在线投稿系统设计与实现
  • AI 辅助 Java 在线考试系统全流程开发与代码解析
  • AIGC 产品经理:定义、核心职责与 AI 产品经理的区别
  • 前端设计与布局常用术语中英速查表
  • Qwen3 与 Qwen Agent 智能体开发实战:MCP 工具接入
  • 实战指南:如何平滑迁移到 Elasticsearch Java API Client
  • 免费 Trae 编辑器体验:i18n 任务排队与模型调度机制分析
  • Python 基础:五分钟理解 Jupyter Notebook 的核心价值
  • 大模型行业趋势研判:未来发展的十个关键判断
  • 2025 年六大主流 AI 大模型产品评测与解析
  • PX4 与 ROS 无人机 Offboard 控制模式解析及实战
  • 大模型时代人形机器人感知:视觉 - 语言模型应用
  • Vue 项目国际化 i18n 实现指南
  • LeetCode 二叉树经典算法题解汇总
  • 技术架构组核心职责与近期规划
  • 基于 SpringBoot+Vue 的流浪动物管理系统设计与实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online