# PR #2276 完整报告

- 仓库：`THUDM/slime`
- 标题：Add args check for --save-debug-train-data
- 合并时间：2026-08-16 17:46
- 原文链接：http://prhub.com.cn/THUDM/slime/pull/2276

---

# 执行摘要

- 一句话：新增 --save-debug-train-data 与 rollout 路径冲突校验
- 推荐动作：该 PR 值得快速 review，逻辑简单清晰，测试覆盖到位。可关注点：校验位置是否覆盖所有设置路径（如 `--dump-details` 间接设置），以及是否需要在文档中提及该限制。

# 功能与动机

该 PR 是对 2266 中重构 --save-debug-train-data 功能的后续加固。用户可能将两个参数配置为相同的路径模板，导致训练数据和 rollout 数据写入同一文件，造成数据互相覆盖，难以排查。PR 通过参数校验在配置阶段提前发现并拒绝这种非法配置，提升用户体验和系统健壮性。

# 实现拆解

本变更分为两步：

1. **在参数验证函数中增加路径冲突检查**：修改 `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` 之前，避免后续流程使用错误的配置。

2. **添加单元测试**：在 `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`

修改了核心参数校验函数，新增路径冲突检查，是功能实现的关键。

```python
# 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`

新增对应测试，验证校验逻辑，是保证代码正确性的必要配套。

```python
# 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 数据路径冲突。