执行摘要
- 一句话:清理无用代码与参数,强化多节点安全
- 推荐动作:建议尽快合入。此 PR 是典型的“清理债务”型变更,风险低、收益明确。特别值得关注的是变量重命名策略和 node_rank guard 模式,可在未来多节点功能中复用。
功能与动机
代码库中存在已不再使用的旧函数和过时参数,增加阅读和维护负担。多节点部署时部分 HTTP 控制接口应在所有节点上被调用,但只有 rank 0 需要实际执行,否则可能引发异常或冗余操作。变量命名 num_gpu_per_engine 容易与 num_gpus_per_engine 混淆,需明确表示“单节点内每引擎 GPU 数”。
实现拆解
-
删除过时函数
- slime/utils/ppo_utils.py:移除 get_advantages_and_returns(63 行),该功能已完全被 batch 版 get_advantages_and_returns_batch 覆盖。所有调用点之前已迁移。
- slime/utils/arguments.py:移除 parse_critic_args(5 行),因为 parse_megatron_role_args 可直接调用,无需包装。
- slime/ray/rollout.py:移除 onload_weights_from_disk 方法(12 行),该功能已被更通用的 onload(tags=[WEIGHTS]) 替代。
-
清理函数参数
- slime/backends/megatron_utils/server/logprob_utils.py:从 _slice_response_rows_for_current_cp_rank 和 _get_log_probs_and_optional_samples 中移除 max_seq_lens 参数及其传递,该参数未在函数体内使用。
- 相应调整了内部调用链,避免传递无用参数。
-
强化多节点安全
- slime/backends/sglang_utils/sglang_engine.py:在 pause_generation、continue_generation、start_profile、stop_profile 四个方法开头增加 if self.node_rank != 0: return,确保非 rank 0 节点不执行这些操作,避免冗余请求或状态混乱。
-
变量重命名
- slime/ray/rollout.py、slime/ray/rollout_validation.py、tests/test_rollout_validation.py:将 num_gpu_per_engine 统一重命名为 num_gpus_per_engine_on_node,提升命名清晰度,并同步更新校验逻辑中的参数名。
-
测试适配
- tests/test_rollout_validation.py:更新测试用例中参数名,以匹配新的函数签名。
关键文件:
slime/utils/ppo_utils.py(模块 PPO 工具;类别 source;类型 core-logic;符号 get_advantages_and_returns): 删除了核心函数 get_advantages_and_returns,该函数原是单样本 GAE 实现,已被 batch 版本完全替代。清理后减少约 60 行死代码。
slime/ray/rollout.py(模块 Rollout 管理;类别 source;类型 core-logic;符号 onload_weights_from_disk): 删除了 onload_weights_from_disk 方法,重构了 recover_updatable_engines,重命名变量 num_gpu_per_engine 为 num_gpus_per_engine_on_node。
slime/backends/sglang_utils/sglang_engine.py(模块 SGLang 引擎;类别 source;类型 core-logic): 为四个控制方法添加 node_rank != 0 guard,避免非主节点执行 profile、pause 等操作。
关键符号:get_advantages_and_returns, onload_weights_from_disk, parse_critic_args
关键源码片段
slime/ray/rollout.py
删除了 onload_weights_from_disk 方法,重构了 recover_updatable_engines,重命名变量 num_gpu_per_engine 为 num_gpus_per_engine_on_node。
# 删除 onload_weights_from_disk 方法(原因:已被 onload(tags=[WEIGHTS]) 替代)
# 重构前:
# def onload_weights_from_disk(self):
# if not self.needs_offload or not self.model_path:
# return []
# return [engine.update_weights_from_disk.remote(self.model_path) for engine in self.engines if engine is not None]
#
# 重构 recovery 方法:recover_updatable_engines 直接调用 srv.recover(),
# 不再手动拼装返回值列表,使代码更简洁。
#
# 变量重命名:num_gpu_per_engine -> num_gpus_per_engine_on_node 以明确含义
slime/backends/sglang_utils/sglang_engine.py
为四个控制方法添加 node_rank != 0 guard,避免非主节点执行 profile、pause 等操作。
def pause_generation(self):
# 只有 node_rank == 0 的引擎才实际发送 HTTP 请求
if self.node_rank != 0:
return
response = requests.post(f"http://{self.server_host}:{self.server_port}/pause_generation", json={})
response.raise_for_status()
return response
# continue_generation、start_profile、stop_profile 同理添加 guard
评论区精华
无 review 评论。变更由作者独立完成,提交信息仅含 'cleanup',未产生讨论。
风险与影响
- 风险:风险极低。所有删除的函数均已确认不再被任何生产代码调用(PR 作者通过工具检查过调用关系);移除的参数在函数体内无引用;新增的
node_rank != 0 guard 是防御性编程,仅跳过本该由主节点执行的操作。若下游有未发现的隐式依赖,可能导致运行时导入错误,但 CI 已通过。
- 影响:对用户无直接影响,对开发团队而言降低了代码复杂度,减少未来维护时的认知负担。多节点部署时控制接口行为更稳健。变更加速了后续重构和功能迭代。
- 风险标记:删除函数必须确认无调用残留, 多节点 guard 改变原有行为需验证
关联脉络
参与讨论