Prhub

#2184 sync source_names

原始 PR 作者 zhuzilin 合并时间 2026-07-06 18:49 文件变更 5 提交数 1 评论 0 代码增减 +44 / -1

执行摘要

新增 source_names 追踪数据来源

当训练混合多个数据源时,需要追踪每个样本的来源,以支持自定义奖励、过滤、日志统计以及未来的按源路由(如 OPD teacher 选择)。PR body 虽未提供详细 issue,但文档中明确说明了该动机。

建议合并。变更清晰、影响范围小,文档完善。值得关注的是 get_source 的优先级设计,为未来扩展提供了灵活性。

讨论亮点

本 PR 无 review 评论或讨论。

实现拆解

  1. slime/utils/data.py:新增 get_source(sample: Sample) -> str 函数,按优先级提取 source:优先返回 sample.source(动态设置),其次 metadata["source_name"],否则返回 "unknown"。将该函数加入 __all__ 导出。
  2. slime/ray/rollout.py:导入 get_source;在 _convert_samples_to_train_data 中,当 samples[0].metadata 不为 None 时,为每个 sample 调用 get_source,将结果列表存入 train_data["source_names"];在 _split_train_data_by_dp 的 skip 列表中添加 "source_names",避免被误当作指标处理。
  3. slime/backends/megatron_utils/data.py:在 log_rollout_data 的 skip 列表中添加 "source_names",防止非张量字段被尝试聚合日志。
  4. 文档更新:中英文 usage.md 均增加了关于 source_name 的说明和示例 JSON 配置,并清晰列出了查找优先级和用途。
文件 模块 状态 重要度
slime/utils/data.py 数据工具 modified 6.91
slime/ray/rollout.py Rollout modified 5.99
slime/backends/megatron_utils/data.py 训练后端 modified 4.58
docs/en/get_started/usage.md 文档 modified 3.02
docs/zh/get_started/usage.md 文档 modified 2.85

关键符号

get_source

关键源码片段

slime/utils/data.py core-logic

核心新增 `get_source` 函数,定义 source 提取逻辑和优先级。

def get_source(sample: Sample) -> str:
    # 优先返回动态设置的 sample.source
    if getattr(sample, "source", None):
        return sample.source
    # 其次从 metadata 中取 source_name
    metadata = getattr(sample, "metadata", None) or {}
    if metadata.get("source_name"):
        return metadata["source_name"]
    # 都没有时标记为 unknown
    return "unknown"

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险较低。新增字段仅在 metadata 非空时写入,不影响现有逻辑。get_source 对未设置 source 的样本返回 "unknown",兼容旧数据。需注意:如果其他模块遍历 train_data 时未处理 "source_names",可能导致意外行为,但目前 skip 列表已覆盖日志和 DP 拆分路径。

对用户:需在 metadata 中设置 source_name 或动态设置 sample.source 才能生效;未配置时自动回退为 "unknown"。对系统:新增 ~44 行代码,无性能影响。对团队:为后续按源路由、分源统计等功能奠定基础。

缺少测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论