本目录包含 Relax 支持的各种策略梯度算法的启动脚本。
Relax 框架集成了多种策略梯度算法,均通过 --advantage-estimator 参数选择。GRPO、RLOO、CISPO、GSPO 与 SAPO 共享 Actor/Rollout 服务拓扑;RLOO 仅支持同步固定批量,PPO 还需要 Critic 与 Advantages 服务,应分别遵守专用配置。
| 算法 | 启用参数 | 推荐场景 |
|---|---|---|
| PPO | --advantage-estimator ppo |
Actor-Critic、token 级 GAE |
| GRPO | --advantage-estimator grpo |
默认、大多数场景 |
| REINFORCE++ | --advantage-estimator reinforce_plus_plus |
token KL-to-go 与全局归一化 |
| REINFORCE++-baseline | --advantage-estimator reinforce_plus_plus_baseline |
group baseline 与独立 k2 KL |
| RLOO | --advantage-estimator rloo |
无偏基线、非裁剪 REINFORCE |
| CISPO | --advantage-estimator cispo |
保留梯度方向、需要更高精度 |
| GSPO | --advantage-estimator gspo |
序列级约束、稳定训练 |
| SAPO | --advantage-estimator sapo |
平滑优化、soft 信任域 |
- 使用独立 Critic 预测 token 级 value,并通过 GAE 计算 advantage 与 return
- Actor 使用 PPO-Clip,Critic 使用裁剪 value loss
- 必须在
--resource中配置critic与advantages,不能只替换GRPO_ARGS - 暂不支持 fully-async PPO
- 8 卡 colocate 入门配置:
scripts/training/text/run-qwen35-9B-8xgpu-ppo.sh
- 默认算法,特性平衡,大多数场景可用
- 对超出信任域的 token 直接置零梯度
- 适合大多数强化学习场景
reinforce_plus_plus使用 token 级 k1 KL reward shaping、KL-to-go return 和跨 DP rank 的有效 token 全局归一化reinforce_plus_plus_baseline先减去包含自身的 prompt group mean,不除 group std,再做相同的全局归一化- baseline 变体不把 token KL 放入 advantage,而是使用独立的 k2 KL loss
- 两个变体当前只支持同步 colocate、CP=1 和 response-mean reduction
- 完整公式、mask 与边界行为参见REINFORCE++ 设计文档
- 用同一 prompt 的其他采样奖励构造 leave-one-out baseline,不按组内标准差归一化
- 使用非裁剪 REINFORCE loss,
train/pg_clipfrac始终为0 - 仅支持同步固定批量,要求
rollout_batch_size × n_samples_per_prompt = global_batch_size - 推荐从
run-qwen3-0.6B-1xgpu-rloo.sh开始,并通过环境变量按硬件调整批量
- 对超出信任域的 token 保留梯度方向(仅限幅)
- 梯度方差较大,需配合
--kl-loss-coef 0.001稳定训练 - 适合需要更精细学习信号的任务
- 使用序列级 KL 而非 token 级 KL
- 序列内所有 token 共享统一的约束强度
- 更稳定,适合长序列任务
- 用 sigmoid 门控替代硬裁剪
- 梯度流更平滑,避免梯度突变
- 适合对稳定性要求高的场景
GRPO-like 脚本采用统一的参数块设计。要在 GRPO、CISPO、GSPO 与 SAPO 之间切换,只需修改相应 *_ARGS 数组:
# 例如:在任意训练脚本中,将 GRPO_ARGS 替换为 CISPO_ARGS
# 原始(GRPO):
GRPO_ARGS=(
--advantage-estimator grpo
--eps-clip 0.2
)
# 改为 CISPO:
CISPO_ARGS=(
--advantage-estimator cispo
--use-kl-loss
--kl-loss-coef 0.001
--eps-clip 0.2
--eps-clip-high 10
--use-tis
)
# 启动时使用修改后的参数
python3 -m relax.entrypoints.train \
"${MODEL_ARGS[@]}" \
"${CISPO_ARGS[@]}" \ # 使用 CISPO 而非 GRPO
"${OPTIMIZER_ARGS[@]}" \
...export MODEL_DIR=/path/to/models
export DATA_DIR=/path/to/data
NUM_ROLLOUT=60 \
ROLLOUT_BATCH_SIZE=4 \
N_SAMPLES=8 \
GLOBAL_BATCH_SIZE=32 \
bash examples/algorithms/run-qwen3-0.6B-1xgpu-rloo.sh保持 ROLLOUT_BATCH_SIZE × N_SAMPLES = GLOBAL_BATCH_SIZE。设置 ADVANTAGE_ESTIMATOR=grpo 可使用相同 recipe 运行对照臂。脚本将清洗数据写入 artifact cache(可用 RLOO_DATA_CACHE_DIR 覆盖),并要求模型用 \boxed{...} 输出最终答案,以匹配 math reward parser。
# 1) 准备模型和数据
export MODEL_DIR=/path/to/Qwen3.5-9B
export DATA_DIR=/path/to/multimodal-open-r1-8k-verified
export EXP_DIR=/path/to/experiments
# 2) 运行 CISPO 异步训练(Fully Async 模式)
bash examples/algorithms/run-qwen35-9B-8xgpu-openr1mm-cispo-async.sh async
# 或运行同步训练(Colocate 模式)
bash examples/algorithms/run-qwen35-9B-8xgpu-openr1mm-cispo-async.sh sync编辑 scripts/training/text/run-qwen3-4B-8xgpu.sh,将 GRPO_ARGS 改为:
GSPO_ARGS=(
--advantage-estimator gspo
--eps-clip 0.2
)然后启动:
export MODEL_DIR=/path/to/Qwen3-4B
export DATA_DIR=/path/to/aime-2024
export EXP_DIR=/path/to/experiments
bash scripts/training/text/run-qwen3-4B-8xgpu.sh| 参数 | 默认值 | 说明 |
|---|---|---|
--advantage-estimator |
grpo |
算法类型:grpo, cispo, gspo, sapo, ppo, rloo, reinforce_plus_plus, reinforce_plus_plus_baseline |
--eps-clip |
0.2 |
下方裁剪边距(ratio 下界 = 1 - eps_clip) |
--eps-clip-high |
与 --eps-clip 相同 |
上方裁剪边距(ratio 上界 = 1 + eps_clip_high) |
--clip-grad |
— | 梯度裁剪范数,CISPO 下推荐设为 1.0 |
--kl-coef |
0.0 |
KL 惩罚系数;当前同步 PPO 会将非零值重置为 0.0,REINFORCE++ 等算法可使用 |
| 项目 | 要求/含义 |
|---|---|
--n-samples-per-prompt |
至少为 2 |
rollout_batch_size × n_samples_per_prompt |
必须等于 global_batch_size |
--num-steps-per-rollout |
不设置或为 1 |
--calculate-per-token-loss |
必须开启,按全局有效 response token 数归一化 |
--kl-coef |
必须为 0;配置 --ref-load 后使用直接 KL loss 路径 |
--max-staleness |
必须为 0 |
| async、partial rollout、dynamic global batch | 不支持 |
--normalize-advantages |
不支持 |
rollout/rloo/* |
训练侧 baseline、advantage signal、空响应与异常组诊断 |
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
--use-kl-loss |
off | on | 启用 KL loss(CISPO 推荐必开) |
--kl-loss-coef |
0.0 |
0.001 |
KL loss 系数,约束策略偏移 |
--kl-loss-type |
k1 |
low_var_kl |
KL 估计方式,low_var_kl 方差更低 |
--use-tis |
off | on | Token Importance Sampling,推荐开启 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--sapo-tau-pos |
1.0 |
Positive advantage 的温度参数 |
--sapo-tau-neg |
1.05 |
Negative advantage 的温度参数(更高 = 更强抑制) |
| 参数 | 默认值 | 说明 |
|---|---|---|
--gamma |
1.0 |
GAE 折扣因子 |
--lambd |
1.0 |
GAE lambda |
--value-clip |
0.2 |
Critic value loss 裁剪范围 |
--num-critic-only-steps |
0 |
初始 Critic-only 预热步数 |
--critic-lr |
与 --lr 相同 |
Critic 学习率 |
--critic-lr-warmup-iters |
0 |
Critic 学习率线性预热迭代数 |
PPO 还要求在 --resource 中提供 critic 与 advantages。当前 colocate 示例使用 --use-rollout-logprobs,并保持 --kl-coef 0.0。完整说明参见双语 PPO 训练文档。
CISPO_ARGS=(
--advantage-estimator cispo
--use-kl-loss
--kl-loss-coef 0.001
--kl-loss-type low_var_kl
--eps-clip 0.2
--eps-clip-high 10
--use-tis
--clip-grad 1.0
)为什么:
--use-kl-loss --kl-loss-coef 0.001:CISPO 保留超界梯度,易导致策略漂移;小 KL 惩罚约束偏移--use-tis:Token Importance Sampling 可增强样本有效性--eps-clip-high 10:近似取消上侧裁剪,对 positive advantage token 更宽松
GSPO_ARGS=(
--advantage-estimator gspo
--eps-clip 0.2
)为什么:GSPO 使用序列级 KL,序列内 token 约束一致,减少长序列训练的振荡。
-
Fully Async(
--fully-async):- 适合:GPU 充足、高吞吐要求
- 风险:off-policy 数据,需配合
--max-staleness和--use-health-check
-
Colocate(
--colocate):- 适合:GPU 有限、小规模实验
- 优势:pure on-policy,梯度更稳定
examples/algorithms/
├── README.md (本文件)
├── run-qwen35-9B-8xgpu-openr1mm-cispo-async.sh (CISPO 多模态示例)
├── ... (其他算法脚本)
A: 这取决于任务。一般规律:
- GRPO:all-round,快速尝试的首选
- CISPO:需要精细学习信号时更好,但需要 KL 约束
- GSPO:长序列任务,训练更稳定
- PPO:如果已有 Critic 资源,性能可能更好
A: 正常。CISPO 保留超界 token 的梯度,会导致梯度方差更大。配合 --clip-grad 1.0 限制实际参数更新,并配置 --kl-loss-coef 0.001 稳定策略。
A:
- Sync(colocate):GPU 有限(≤8)、学习率高、需要稳定梯度 → 推荐
- Async(fully-async):GPU 充足(≥16)、追求高吞吐、可接受轻微 off-policy → 推荐