# PR #2183 完整报告

- 仓库：`THUDM/slime`
- 标题：cleanup
- 合并时间：2026-07-06 18:24
- 原文链接：http://prhub.com.cn/THUDM/slime/pull/2183

---

# 执行摘要

- 一句话：清理无用代码与参数，强化多节点安全
- 推荐动作：建议尽快合入。此 PR 是典型的“清理债务”型变更，风险低、收益明确。特别值得关注的是变量重命名策略和 node_rank guard 模式，可在未来多节点功能中复用。

# 功能与动机

代码库中存在已不再使用的旧函数和过时参数，增加阅读和维护负担。多节点部署时部分 HTTP 控制接口应在所有节点上被调用，但只有 rank 0 需要实际执行，否则可能引发异常或冗余操作。变量命名 `num_gpu_per_engine` 容易与 `num_gpus_per_engine` 混淆，需明确表示“单节点内每引擎 GPU 数”。

# 实现拆解

1. **删除过时函数**
 - `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])` 替代。

2. **清理函数参数**
 - `slime/backends/megatron_utils/server/logprob_utils.py`：从 `_slice_response_rows_for_current_cp_rank` 和 `_get_log_probs_and_optional_samples` 中移除 `max_seq_lens` 参数及其传递，该参数未在函数体内使用。
 - 相应调整了内部调用链，避免传递无用参数。

3. **强化多节点安全**
 - `slime/backends/sglang_utils/sglang_engine.py`：在 `pause_generation`、`continue_generation`、`start_profile`、`stop_profile` 四个方法开头增加 `if self.node_rank != 0: return`，确保非 rank 0 节点不执行这些操作，避免冗余请求或状态混乱。

4. **变量重命名**
 - `slime/ray/rollout.py`、`slime/ray/rollout_validation.py`、`tests/test_rollout_validation.py`：将 `num_gpu_per_engine` 统一重命名为 `num_gpus_per_engine_on_node`，提升命名清晰度，并同步更新校验逻辑中的参数名。

5. **测试适配**
 - `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。

```python
# 删除 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 等操作。

```python
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 改变原有行为需验证

# 关联脉络

- 暂无明显关联 PR