Miles DrGRPO详解:分组相对策略优化的自定义reducer实战 📅 发布时间:2026/9/18 1:39:52 👁 浏览次数: Miles DrGRPO详解分组相对策略优化的自定义reducer实战【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/milesMiles 是一个面向企业级的 LLM/VLM 后训练强化学习框架slime 的演进分支内置了完整的 GRPOGroup Relative Policy Optimization分组相对策略优化训练流程。而 DrGRPO 的精髓在于不改动任何框架源码只通过一个自定义 reducer 函数替换 pg_loss 的归一化方式——把除以有效 token 数改为除以固定常数。本文带你快速理解原理、看懂官方示例并完成配置。为什么 Miles 需要一个自定义 reducerGRPO 训练时每个样本会产生一段逐 token 的 loss。Miles 默认的 reducersum_of_sample_mean会把每个样本的 loss 求和后除以该样本的有效 token 数即 loss_mask 中为 1 的位置数得到每个样本的平均 token loss再累加。这种按长度归一化的做法是常规做法但 Dr.GRPO 研究指出这会引入长度偏差——长回答的梯度贡献被稀释影响策略优化的稳定性。DrGRPO 的解法很直接每个样本的 loss 求和后除以一个固定常数官方示例中为 1000让所有样本的梯度贡献量级一致。这个差异恰好落在 Miles 的插件化设计上框架早就预留了--custom-pg-loss-reducer-function-path参数专门用于替换pg_loss 的归约方式其他指标pg_clipfrac、ppo_kl、entropy_loss 等仍走默认 reducer互不干扰。三步上手 DrGRPO 自定义 reducer第一步找到官方示例仓库内置了完整的 DrGRPO 示例核心就是两个文件自定义 reducer 实现examples/experimental/DrGRPO/custom_reducer.py使用说明examples/experimental/DrGRPO/README.md核心逻辑只有几行定义一个常量DIVISOR 1000.0然后把默认的(x_i * loss_mask_i).sum() / loss_mask_i.sum()中的分母换成DIVISORDIVISOR 1000.0 # 可自行修改为你想要的常数 def sum_of_sample_mean(x: torch.Tensor) - torch.Tensor: return sum( [ (x_i * loss_mask_i).sum() / DIVISOR for x_i, loss_mask_i in zip(x.split(response_lengths, dim0), loss_masks, strictFalse) ] )第二步确认函数签名与默认 reducer 一致自定义函数需要和默认get_sum_of_sample_mean保持相同签名接收四个参数并返回一个张量 → 标量的可调用对象def get_pg_loss_reducer( total_lengths: list[int], response_lengths: list[int], loss_masks: list[torch.Tensor], calculate_per_token_loss: bool False, ) - Callable[[torch.Tensor], torch.Tensor]:注意两点当calculate_per_token_lossTrue时应返回不做除法的sum_of_token求和后不除任何值示例中已处理该分支当前实现仅支持cp_size 1不开启上下文并行代码中有显式断言保护。第三步一行参数完成配置在启动脚本的 GRPO 参数区加入两个关键参数即可生效GRPO_ARGS( --advantage-estimator grpo --custom-pg-loss-reducer-function-path examples.experimental.DrGRPO.custom_reducer:get_pg_loss_reducer # ... 其他参数 )参数定义位于 miles/utils/arguments.py帮助文本明确说明设置后只有 pg_loss 使用自定义 reducer。内部机制reducer 在哪里被替换在训练 loss 的计算路径中Miles 先构建默认的 CP-awaresum_of_sample_mean随后检查自定义参数若args.custom_pg_loss_reducer_function_path非空则通过load_function动态加载你指定的函数用返回的pg_loss_reducer替换仅 pg_loss 一项的归约pg_clipfrac、ppo_kl、entropy_loss等指标继续调用默认的sum_of_sample_mean。相关逻辑见 miles/backends/training_utils/loss_hub/losses.py默认 reducer 的实现位于 miles/backends/training_utils/cp_utils.py。这也意味着你的自定义 reducer 必须自己处理好 context parallelism 的兼容性官方 DrGRPO 示例通过断言cp_size 1明确声明了限制。实践调优建议调整 DIVISOR常数 1000 是经验值直接修改custom_reducer.py顶部的DIVISOR即可。它可以理解为等效于多少 token 长度的样本贡献一份标准梯度可按你的平均响应长度微调不要影响其他指标该参数只作用于 pg_losspg_clipfrac / ppo_kl / entropy_loss 等仍用默认归约监控指标口径保持不变上下文并行限制如果训练使用了 context parallelismcp_size 1需要自行在 reducer 中做分片修正或参考官方实现添加相应支持。延伸阅读Miles 的定制体系远不止 reducer 一个钩子。官方定制指南 docs/user-guide/customization.md 汇总了所有--*-path插件点包括--custom-loss-function-path替换整个 GRPO/PPO loss 公式、--custom-tis-function-path重要性采样修正、--custom-rm-path自定义奖励等配合 examples/experimental/ 下的 DrGRPO、DAPO 过滤、TIS 等示例基本可以覆盖绝大多数算法变体需求——全部无需 fork 源码。【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/miles创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考