执行摘要
- 一句话:新增 --save-debug-train-data 与 rollout 路径冲突校验
- 推荐动作:该 PR 值得快速 review,逻辑简单清晰,测试覆盖到位。可关注点:校验位置是否覆盖所有设置路径(如
--dump-details 间接设置),以及是否需要在文档中提及该限制。
功能与动机
该 PR 是对 2266 中重构 --save-debug-train-data 功能的后续加固。用户可能将两个参数配置为相同的路径模板,导致训练数据和 rollout 数据写入同一文件,造成数据互相覆盖,难以排查。PR 通过参数校验在配置阶段提前发现并拒绝这种非法配置,提升用户体验和系统健壮性。
实现拆解
本变更分为两步:
-
在参数验证函数中增加路径冲突检查:修改 slime/utils/arguments.py 中的 slime_validate_args 函数,在 dump_details 处理后、load_debug_rollout_data 处理前,新增一个条件判断:当 --save-debug-train-data 非空且与 --save-debug-rollout-data 完全相等时,抛出 ValueError,错误信息明确提示两者不能相等。这个位置选择在 dump_details 赋值之后,确保即使是 --dump-details 间接设置的路径也能被检查,并且放在 load_debug_rollout_data 之前,避免后续流程使用错误的配置。
-
添加单元测试:在 tests/test_megatron_argument_validation.py 中新增 test_slime_validate_args_rejects_equal_debug_data_paths 测试函数,使用 make_slime_validate_args 构造两个相同的路径参数,断言 slime_validate_args 抛出 ValueError 且错误消息包含指定文本,验证校验逻辑有效。
关键文件:
slime/utils/arguments.py(模块 参数校验;类别 source;类型 core-logic;符号 slime_validate_args): 修改了核心参数校验函数,新增路径冲突检查,是功能实现的关键。
tests/test_megatron_argument_validation.py(模块 参数校验;类别 test;类型 test-coverage;符号 test_slime_validate_args_rejects_equal_debug_data_paths): 新增对应测试,验证校验逻辑,是保证代码正确性的必要配套。
关键符号:slime_validate_args, test_slime_validate_args_rejects_equal_debug_data_paths
关键源码片段
slime/utils/arguments.py
修改了核心参数校验函数,新增路径冲突检查,是功能实现的关键。
# slime/utils/arguments.py 中 slime_validate_args 函数内的相关片段
if args.dump_details is not None:
# dump_details 提供统一模板,同时设置两个路径
args.save_debug_rollout_data = f"{args.dump_details}/rollout_data/{{rollout_id}}.pt"
args.save_debug_train_data = f"{args.dump_details}/train_data/{{rollout_id}}.pt"
# 新增校验:两者路径相同时拒绝,避免训练与 rollout 数据互相覆盖
if args.save_debug_train_data is not None and args.save_debug_train_data == args.save_debug_rollout_data:
raise ValueError("--save-debug-train-data must not be equal to --save-debug-rollout-data.")
if args.load_debug_rollout_data is not None:
# 加载调试数据时只跑训练,不启动 sglang 服务
logger.info("load_debug_rollout_data ... is set, will not instantiate sglang servers...")
args.debug_train_only = True
tests/test_megatron_argument_validation.py
新增对应测试,验证校验逻辑,是保证代码正确性的必要配套。
# tests/test_megatron_argument_validation.py 中的新增测试
def test_slime_validate_args_rejects_equal_debug_data_paths(monkeypatch):
module = load_slime_arguments_module(monkeypatch)
# 构造两个参数值为相同时,应触发校验错误
args = make_slime_validate_args(
save_debug_rollout_data="/tmp/debug_{rollout_id}.pt",
save_debug_train_data="/tmp/debug_{rollout_id}.pt",
)
# 断言抛出的异常类型和消息
with pytest.raises(ValueError, match="--save-debug-train-data must not be equal"):
module.slime_validate_args(args)
评论区精华
本 PR 无公开评论,无 review 讨论。
风险与影响
- 风险:风险较低。新增校验仅在两个参数相等时报错,不会影响已有合法配置。但需注意:
- 校验是严格字符串相等,若用户配置了不同但实际会冲突的路径(例如符号链接指向同一文件),此校验无法拦截。
- 校验抛出
ValueError,若上层调用未捕获该异常,可能导致程序以非常规方式退出,但符合预期。
- 修改位于核心参数验证路径,所有训练启动都会调用,但影响面极小。
- 影响:影响范围:所有使用 slime 训练框架的用户,尤其是开启调试数据保存的用户。该校验在参数验证阶段生效,用户配置错误时会得到清晰报错信息,避免运行时数据覆盖。代码影响面小,只涉及参数校验函数和对应测试,风险可控。
- 风险标记:校验仅覆盖完全相等路径, 核心参数验证路径变更
关联脉络
- PR #2266 Refactor --save-debug-train-data: 本 PR 是针对 2266 重构引入的参数校验,防止训练与 rollout 数据路径冲突。
参与讨论