#7913·verl

[错误] 当将一个 minibatch 分割成多个 microbatch 时, GMPO geo_mean 损失会发生变化

作者: gss10282025创建于 2026年9月18日更新于 2026年9月18日
标签bug

QQ 系统信息

页:1 动词:24f25b03aa4b54249a273655ebbcce06f484192b 平托克:2.11.0+cu130 变压器: 5.5.3 ZZ: 3.12. GPU: NVIDIA GeForce RTX 5090,每个进程一个可见的GPU


资料来源:[core algos.py at 24f25b03] (https://GitHub.com/verl-project/verl/blob/24f25b03a4b54249a273655ebbcce06f484192b/verl/trainer/po/core algos.py).

* 资料

- [ 官方示例脚本
- [x] 我自己修改过的脚本

QQ 任务

- [ 在“实例”文件夹中正式支持的任务(例如GLUE/SQuAD,.)
- [x] 我的任务或数据集(下面有详细信息)

* 复制

GMPO在同一个最优化的小批量被分拆成更微管时更新会有所改变. 下面的复制通过原生的FSDP引擎,并有一个数据平行的排名.

相關:[PR#5614](https://GitHub.com/verl-project/verl/pull/5614),其中讨论了同样的汇总问题.

`计算-政策-损失-geo-meain'以`pg-loss = hillage.meanes'结尾,这个平均值高于当前微批中的序列,而不是`agg-loss'或全球批量元数据。 然后,FSDP循环在每只小批量损失上称为 " backward() " ,没有缩放,因此将小批量拆分为八块有助于八个本地手段,而不是一个小批量。
步骤 :

1. 通过FSDP引擎的`train batch'-`forward back-batch'-`po loss'-`compute policy loss geo mean',并有八个固定序列(响应长度16,128个有效响应符号)。
2. 1 SGD更新、学习率`0.02'、梯度剪接`1.0'、KL系数`0.001'、相同的初始模型和最佳状态。
3. 将8个序列的1个微批与1个序列的8个微批相比较.

1个微批对8个相比 L2 相差 ===
| -- -- -- --: --
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
`0.5407175 ' 参数更新

三道重复运行给出了相同的结果,而第二道主机完全复制了向量.

预期行为

每个小批量应该贡献自己在小批量中的份额. 只有一个军衔:

页:1
贡献 = 本地  平均值 * 本地  序列  计数 / 小批量  序列  计数

分母必须是最优化小批量的序列数. 由微管数分出,只有在所有微管的序列数相同时才有效.

像这样的局部加权法,在应用时不改变八微分执行,使梯度和差异降低到数值噪声,并同意独立计算目标. 执行也补偿了引擎的DP梯度平均值,但上面的数字是单等. 这不衡量下游的奖励,也不假设#5614是被测试承诺的一部分.

内容来源: verl-project/verl