执行摘要
- 一句话:修复测试合约未同步新参数签名
- 推荐动作:值得快速合并。该 PR 是典型的 CI 同步修复,无设计争议。对于关注插件系统的开发者,可借此理解 Slime 的合约测试机制:每个插件点都有对应的
reference_* 函数、invoke_* 调用和 HookCase 配置,用于在 CI 中验证调用签名稳定性。
功能与动机
Commit bd217a63 将 actor.py:488 从 self.rollout_data_postprocess(self.args) 改为 self.rollout_data_postprocess(self.args, rollout_id, rollout_data),但未同步更新插件合约测试,导致 test_runtime_hook_callsite_is_stable[rollout_data_postprocess] 在后继 PR 上持续失败。本 PR 旨在同步合约,使主分支 CI 恢复通过。
实现拆解
- 更新引用实现函数签名:将
reference_rollout_data_postprocess 的参数从 (args) 改为 (args, rollout_id, rollout_data),使其与当前实际调用签名一致。
- 更新调用函数:将
invoke_rollout_data_postprocess 中的调用从 fn(args) 改为 fn(args, 0, {}),模拟传递 rollout_id 和 rollout_data。
- 更新 HookCase 声明:将对应
rollout_data_postprocess 的 runtime_marker 字段从 "self.rollout_data_postprocess(self.args)" 改为 "self.rollout_data_postprocess(self.args, rollout_id, rollout_data)",并将 expected_params 从 ("args",) 改为 ("args", "rollout_id", "rollout_data")。所有修改均集中在 tests/plugin_contracts/test_plugin_runtime_hook_contracts.py。
关键文件:
tests/plugin_contracts/test_plugin_runtime_hook_contracts.py(模块 合约测试;类别 test;类型 test-coverage;符号 reference_rollout_data_postprocess): 该文件是 PR 唯一修改的文件,包含了合约测试的全部变更:更新了 reference_rollout_data_postprocess 函数签名、invoke_rollout_data_postprocess 调用方式以及 HookCase 中的 runtime_marker 和 expected_params。
关键符号:reference_rollout_data_postprocess, invoke_rollout_data_postprocess
关键源码片段
tests/plugin_contracts/test_plugin_runtime_hook_contracts.py
该文件是 PR 唯一修改的文件,包含了合约测试的全部变更:更新了 reference_rollout_data_postprocess 函数签名、invoke_rollout_data_postprocess 调用方式以及 HookCase 中的 runtime_marker 和 expected_params。
# tests/plugin_contracts/test_plugin_runtime_hook_contracts.py
# 更新后的引用实现:签名与当前调用点一致
def reference_rollout_data_postprocess(args, rollout_id, rollout_data) -> None:
args.rollout_data_postprocess_called = True
# 更新后的调用函数:传递 rollout_id 和 rollout_data 伪参数
def invoke_rollout_data_postprocess(fn):
args = type("Args", (), {})()
assert fn(args, 0, {}) is None # 原为 fn(args)
assert args.rollout_data_postprocess_called is True
# HookCase 配置中的对应条目(部分)
HookCase(
"rollout_data_postprocess",
"ROLLOUT_DATA_POSTPROCESS_PATH",
"plugin_contracts.test_plugin_runtime_hook_contracts.reference_rollout_data_postprocess",
"slime/backends/megatron_utils/actor.py",
"self.rollout_data_postprocess(self.args, rollout_id, rollout_data)", # 原为 self.args
("args", "rollout_id", "rollout_data"), # 原为 ("args",)
invoke_rollout_data_postprocess,
),
评论区精华
该 PR 无 review 评论,变更直接合并,未产生讨论。
风险与影响
- 风险:风险极低。变更是纯测试合约修复,仅涉及单个测试文件中的符号定义和调用参数。不过需确认第三方插件是否已适配新签名,若仍有插件使用旧签名(
self.rollout_data_postprocess(self.args)),则可能引发运行时错误。建议在合并后运行完整的 CI 测试套件。
- 影响:直接影响:修复主分支 CI 测试
test_runtime_hook_callsite_is_stable[rollout_data_postprocess] 的持续失败,确保后续 PR 的合约校验可以通过。间接影响:第三方插件开发者需确保其 rollout_data_postprocess 插件匹配新签名(args, rollout_id, rollout_data)。影响范围限于测试和插件合约,不涉及推理或训练核心逻辑。
- 风险标记:兼容性
关联脉络
- PR #1897 Migrate internal feature: 虽然 PR 没有直接引用,但 1897 的 commit(bd217a63)是导致本次合约失效的源头,它修改了
actor.py 中的调用签名。
参与讨论