一条命令训出 ChatGPT 风格模型:DeepSpeed-Chat 的 RLHF 训练完全指南
【免费下载链接】DeepSpeedDeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective.项目地址: https://gitcode.com/GitHub_Trending/de/DeepSpeed
如果你想在本地或云上完整跑通一次 RLHF 训练、得到自己的 ChatGPT 风格对话模型,DeepSpeed-Chat 是目前少有的能"开箱即用"的方案。它是 DeepSpeed 生态里专为 RLHF 大模型微调打造的端到端工具:一个脚本走完 InstructGPT 论文的三个阶段(SFT 监督微调、奖励模型微调、PPO 强化学习),底层由 Hybrid Engine 统一调度训练与推理两套引擎,让最耗时的经验生成阶段不再拖后腿。单张 A100-80GB 上 9 小时、不到 300 美元就能训完 OPT-13B。本文换一种问法来组织全文:先回答"怎么跑起来",再回答"为什么它又快又省、怎么选卡最划算"。
先跑起来:三步训练就是一条命令
不用自己拼三套训练脚本。以 OPT-13B 做对话模型(actor)、OPT-350M 做奖励模型为例,整个流程只有四步命令:
pip install deepspeed>=0.9.0 pip install -r requirements.txt # 在 DeepSpeed-Chat 示例目录下执行 python train.py --actor-model facebook/opt-13b --reward-model facebook/opt-350m --deployment-type single_nodetrain.py内部会自动依次执行 Step 1 的 SFT、Step 2 的奖励模型微调、Step 3 的 PPO 强化学习,约半天后所有阶段的 checkpoint 就位。训练好的模型还可以直接接上 DeepSpeed-Chat 的推理 API 进行多轮对话测试,博客里给过一段示例:问"知道微软吗",模型能接着解释"给 6 岁小孩讲微软是什么"。
换模型规模时,只需要改--actor-model和--deployment-type两个参数,同一脚本即可覆盖消费级单卡到 8 节点集群:
# 66B 大模型,64 卡(8 个 DGX 节点,每节点 8× A100-80G) python train.py --actor-model facebook/opt-66b --reward-model facebook/opt-350m --deployment-type multi_node # 1.3B 小模型,消费级单卡试跑 python train.py --actor-model facebook/opt-1.3b --reward-model facebook/opt-350m --deployment-type single_gpu想换 PPO 之外的算法或自定义数据流,也可以绕过脚本直接用它的 API:先用DeepSpeedRLHFEngine构建 actor/critic 双模型引擎,再创建DeepSpeedPPOTrainer,然后每个迭代先trainer.generate_experience(prompt_batch)生成经验、再trainer.train_rlhf(out)用 PPO 目标更新两个模型——推理和训练被清晰地拆成了两个可自由组合的调用。
训练时间都花在哪了:三阶段耗时拆解
三阶段的耗时分布很能说明问题。以 8× A100-40G 单节点训 OPT-13B 为例,时间几乎全砸在 Step 3:
| 部署 | Step 1 (SFT) | Step 2 (奖励模型) | Step 3 (PPO/RLHF) | 总计 |
|---|---|---|---|---|
| OPT-13B,8× A100-40G | 2.5 小时 | 0.25 小时 | 10.8 小时 | 13.6 小时 |
| OPT-66B,64× A100-80G | 82 分钟 | 5 分钟 | 7.5 小时 | 约 9 小时 |
| OPT-1.3B,单张 A6000 48G | 2900 秒 | 670 秒 | 约 1.2 小时 | 约 2.2 小时 |
换句话说:一张 48GB 的卡,一顿午餐的时间就能得到一个能玩的 1.3B checkpoint;而 13B 到 66B 的差距主要只体现在 Step 3 上——这也正是 DeepSpeed-Chat 系统设计重点投入的地方。
三阶段各自在做什么?用大白话说:Step 1 拿人工精选的问答对教模型"怎么好好说话";Step 2 训一个更小的裁判模型,学的是"同一个问题下人类给多个回答的排序偏好";Step 3 则让裁判给 Step 1 模型的生成结果打分,再用 PPO(Proximal Policy Optimization,一种让策略更新幅度受限的强化学习算法)把对话模型往"高分回答"方向推。
除了这三步,DeepSpeed-Chat 还内置了两个 InstructGPT 原文推荐、但常被其他开源方案省略的选项:EMA(指数移动平均)checkpoint,即把训练过程中的权重滑动平均存下来作为最终交付模型,回答质量通常更好;Mixture Training(混合训练),把预训练的"预测下一个词"目标掺进 PPO 目标,防止模型在 SQuAD2.0 这类公开基准上退化。它还提供数据抽象层和混合切分能力,可以把多个数据集统一格式后按比例混进三个训练阶段。
为什么 Step 3 最贵:同一个模型要当两种身份
Step 1 和 Step 2 本质就是常规大模型微调,ZeRO 分片加并行策略就能搞定。Step 3 难在一个迭代的每一圈里,模型都要切换两种身份:
- 推理身份:拿着 256 token 的提示,逐 token 生成 256 个回答 token,产出的经验是训练的原料;
- 训练身份:用奖励模型打分的反馈,通过 PPO 更新 actor 和裁判模型的权重。
这带来两笔账单:显存上,SFT 模型和奖励模型的多个副本要同时驻留(EMA 和混合训练还要再加码);时间上,生成阶段是内存带宽受限的慢活,不加速的话整条流水线被它拖死。官方对 1.3B 模型的耗时分解显示,一次 RLHF 迭代的大头就耗在生成阶段。
DeepSpeed 的解法是 Hybrid Engine:把训练引擎和推理引擎焊在同一个模型上。模型平时走train()入口时由 DeepSpeed 训练引擎处理,进入eval()生成经验时则无缝切到推理引擎,切分方式随之从 ZeRO 分片切换成张量并行(TP),显存系统也在两种模式下各自重新配置以榨干每一 GB。官方测试配置可以直接翻 tests/hybrid_engine/hybrid_engine_config.json:train_batch_size: 32、train_micro_batch_size_per_gpu: 2、ZeRO stage 0 配offload_param.device: cpu、fp16.enabled: true、gradient_clipping: 1.0。
落到实现上,deepspeed/runtime/hybrid_engine.py 里的DeepSpeedHybridEngine继承自标准DeepSpeedEngine,核心手法可以概括为三句:进入生成前把 LoRA 权重临时融合进推理容器(fuse_lora_weight)、生成完再还原(unfuse_lora_weight);开启release_inference_cache时生成后主动归还推理 workspace 显存、训练前再重新申请;ZeRO-3 场景下用GatheredParameters按每 8 层一组分层 gather 非驻留参数,配合 TP 完成生成。找不到匹配推理策略的模型层则会降级回模型原生generate(),保证不会跑不通。
又快又省的底气:配置项背后的取舍
Hybrid Engine 的行为由配置块hybrid_engine控制,字段定义见 deepspeed/runtime/config.py 中的HybridEngineConfig:
| 配置项 | 默认值 | 人话解读 |
|---|---|---|
enabled | False | 总开关,不开就退化为普通训练引擎 |
max_out_tokens | 512 | 生成回答的最大长度,决定推理容器的 token 上限 |
inference_tp_size | 1 | 推理侧张量并行卡数;大于 1 时按模型并行组切分,ZeRO-3 下启用分层 gather |
release_inference_cache | False | 生成完把 KV-Cache 工作区还回去,给训练腾显存,压峰值 |
pin_parameters | True | ZeRO-3 下生成前把全部(非 TP)层参数一次性 gather 驻留,避免逐层等待 |
tp_gather_partition_size | 8 | ZeRO-3+TP 推理时每 8 层一组做 gather 的步长 |
enable_cuda_graph | False | decode 阶段启用 CUDA Graph 缓存,降低内核启动开销(会自动校验 ZeRO 阶段兼容性) |
这些机制的收益有实测支撑:单张 A100-40G 上 Step 3 吞吐比 Colossal-AI、HuggingFace DDP 等系统高 10 倍以上(无图标的配置代表直接 OOM);8 卡 DGX 节点上对 Colossal-AI 有 6~19 倍、对 HuggingFace DDP 有 1.4~10.5 倍加速;模型规模上限也从对手的单卡 1.3B/单节点 6.7B 拉到 6.5B/50B,大了 7.5 倍。生成阶段单独算,DeepSpeed 高性能推理内核相对 HuggingFace 最高 9 倍、相对 Colossal-AI 达 15 倍——整条流水线的加速基本都来自这里。
选多少卡最划算:先记住这两张成本表
所有耗时和成本数字都基于同一份基准:135M tokens 训一个 epoch(67.5M query token,131.9k 条 256 长的 query;67.5M 生成 token),每步全局 batch 上限 0.5M tokens(1024 组问答对),且仅指 Step 3 的实测吞吐。对比其他系统前务必先对齐这套口径。
单节点 8 卡(Azure 近似成本):
| 显卡 | OPT-6.7B | OPT-13B | OPT-30B | OPT-66B |
|---|---|---|---|---|
| 8× A100-40GB | 5.7 小时 | 10.8 小时 | 1.85 天 | 不支持 |
| 8× A100-80GB | 4.1 小时($132) | 9 小时($290) | 18 小时($580) | 2.1 天($1620) |
64 卡集群(8 节点 × 8× A100-80G):
| 显卡 | OPT-13B | OPT-30B | OPT-66B | OPT-175B |
|---|---|---|---|---|
| 64× A100-80G | 1.25 小时($320) | 4 小时($1024) | 7.5 小时($1920) | 20 小时($5120) |
选卡数的诀窍藏在扩展曲线里:小规模时扩卡是超线性的——ZeRO 把模型状态摊到更多卡上,单卡显存释放后能塞进更大的单卡 batch,吞吐涨得比卡数还快;但到大规模后,最大全局 batch(本例 1024 组、序列长 512)封顶了单卡 batch 上限,曲线转为近线性甚至次线性。所以最划算的点就在超线性与次线性的交界处,它由"当前显存下单卡能跑的最大 batch"决定——先按模型规模估出这个 batch,再反推卡数,而不是盲目堆卡。
另一条边界是单卡能训多大的模型,官方给出的上限:V100 32G 最大 OPT-2.7B,A6000 48G 和 A100 40G 最大 OPT-6.7B,A100 80G 最大 OPT-13B。没有多卡资源的用户,单卡 13B 级别的模型也是够得着的。
读完能带走什么
- 跑通:一条
train.py命令覆盖 SFT、奖励模型、PPO 三阶段,--deployment-type从single_gpu到multi_node全兼容;1.3B 单卡约 2.2 小时、13B 单节点约 13.6 小时、66B 64 卡约 9 小时。 - 原理:Step 3 贵在"同一模型交替当推理引擎和训练引擎",Hybrid Engine 通过生成时融合 LoRA、KV-Cache 工作区回收/重取、ZeRO-3 分层 gather + TP 切分来抹平切换成本;配置集中在
hybrid_engine配置块,字段与默认值都在HybridEngineConfig中可直接查。 - 选型:成本表只在其 135M tokens、全局 batch 0.5M 的基准口径下可比;选卡数找"超线性/次线性交界点",而不是越多越好。
- 延伸:仓库中 blogs/deepspeed-chat/README.md 有完整官方博客(含推理 API 示例对话),deepspeed/runtime/hybrid_engine_graph.py 可查 CUDA Graph 细节,tests/hybrid_engine/hybrid_engine_test.py 演示了训练—生成切换的端到端测试。
【免费下载链接】DeepSpeedDeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective.项目地址: https://gitcode.com/GitHub_Trending/de/DeepSpeed
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考