Chapter 08
NeMo Aligner:SFT / DPO / SteerLM / PPO
NeMo Aligner(独立子项目 NVIDIA/NeMo-Aligner)提供了 NeMo 风格的全套 RLHF 实现,包括 SFT、DPO、PPO、SteerLM、Self-Rewarding。本章把它的整体结构和典型用法过一遍。
8.1Aligner 覆盖的算法
| 算法 | 对应文件 | 说明 |
|---|---|---|
| SFT | nemo_aligner/algorithms/supervised.py | 有监督微调 |
| DPO | algorithms/dpo.py | 直接偏好优化 |
| RPO / IPO / KTO | 同上 + 不同 loss | DPO 变体 |
| RM 训练 | algorithms/critic_server.py | Bradley-Terry |
| PPO | algorithms/ppo.py | 四模型分服务 |
| SteerLM | algorithms/steerlm.py | 多属性可控对齐 |
| Self-Rewarding | algorithms/self_rewarding.py | 自生成偏好 |
| SPIN | algorithms/spin.py | Self-Play |
8.2PPO:分服务部署
Aligner 的 PPO 设计是把 4 个模型分开起服务:
- policy(actor):训练侧;
- reference:HTTP server 提供 log-prob;
- reward:HTTP server 提供 reward;
- critic:HTTP server 提供 value。
这种架构跟 OpenRLHF / verl 一脉相承,能让每个角色独立分配 GPU、互不抢资源。
# 起 critic + reward server(节点 A)
python -m nemo_aligner.servers.serve_reward_model \
rm_model_file=./rm.nemo \
inference.port=5555
# 起 reference server(节点 B)
python -m nemo_aligner.servers.serve_reference_model \
pretrained_checkpoint=./sft.nemo \
inference.port=5556
# 起训练(节点 C)
python -m nemo_aligner.algorithms.ppo_actor \
pretrained_checkpoint=./sft.nemo \
rm_server.host=A_ip rm_server.port=5555 \
ref_server.host=B_ip ref_server.port=5556 \
trainer.devices=8
8.3DPO:单机就够
python -m nemo_aligner.algorithms.dpo \
pretrained_checkpoint=./sft.nemo \
"model.data.data_prefix={train: [./pref_train.jsonl], validation: [./pref_val.jsonl]}" \
trainer.dpo.max_steps=2000 \
trainer.dpo.val_check_interval=100 \
model.dpo.beta=0.1 \
model.optim.lr=5e-7 \
exp_manager.exp_dir=./dpo_out
8.4SteerLM:NVIDIA 自家算法
SteerLM 是 NVIDIA 2023 提出的多属性条件对齐方法。思路:
- 用一个 attribute classifier 给每条数据打分(如 helpfulness=4, correctness=5, coherence=4);
- 把属性值当 prompt 一部分训:
<extra_id_2> helpfulness:4 correctness:5 ... <text>; - 推理时让用户填想要的属性值。
跟 RLHF 比,SteerLM 不要 RM 也不要 critic,纯监督学。劣势是要先训属性 classifier。
python -m nemo_aligner.algorithms.attribute_classifier \
train_ds.data_prefix=./hh_with_attrs.jsonl
# 然后用 attribute classifier 给数据打分
# 然后跑 SFT,把属性当 prompt 一部分
8.5显存预算(70B PPO 为例)
| 角色 | GPU 数 | 每卡显存 |
|---|---|---|
| policy (TP=8, bf16) | 8 | ~50 GB |
| reference (TP=8, bf16, no grad) | 8 | ~35 GB |
| reward (TP=8, bf16, no grad) | 8 | ~35 GB |
| critic (TP=8, bf16) | 8 | ~50 GB |
| 总 GPU | 32 | ~4 节点 8卡 |
8.6Aligner vs TRL vs OpenRLHF
| NeMo Aligner | TRL | OpenRLHF | |
|---|---|---|---|
| 底层 | NeMo + MCore | HF Transformers | DeepSpeed |
| 分布式 | ★★★★★(TP/PP/EP 全) | ★★★(accelerate) | ★★★★(Ray) |
| 易用性 | ★★(要熟悉 NeMo) | ★★★★★ | ★★★ |
| 独家算法 | SteerLM / Self-Rewarding / SPIN | — | — |
| 多机大模型 (≥ 70B) | ★★★★★ | ★★ | ★★★★ |
8.7这章你需要带走的
- NeMo Aligner 是独立子项目,跟 NeMo 配合做全套 RLHF;
- PPO 用分服务架构:policy / ref / RM / critic 各自 HTTP server;
- SteerLM 是 NVIDIA 独家,不需要 RM/critic,纯监督多属性条件训练;
- 大模型(≥ 70B)的 RLHF 在 NeMo Aligner 上跑最快;
- 小模型 / 简单场景仍推荐 TRL。