Prhub

#1836 [fix] eval sample logging when sample is a list

原始 PR 作者 mathewjhan 合并时间 2026-04-16 11:14 文件变更 1 提交数 1 评论 0 代码增减 +3 / -2

执行摘要

修复多智能体场景下评估日志记录时对列表类型样本的处理错误。

根据 PR body 描述,在多智能体场景中,generate 函数的返回类型可能是 List[Sample],而现有的评估逻辑假设返回值总是单个 Sample 对象,导致运行 examples/multi_agent/run-qwen3-30B-A3B-multi-agent.sh 时出现错误。

该 PR 值得快速浏览,特别是对于处理多智能体或异步生成场景的开发者。关注点在于如何优雅地处理函数返回类型的多态性,避免硬编码假设。

讨论亮点

本次 PR 没有 review 评论,直接由维护者合并。

实现拆解

  1. 定位问题代码:在 slime/rollout/sglang_rollout.py 文件的 eval_rollout_single_dataset 函数中,日志记录部分直接使用 sample 对象访问其属性(如 promptresponsereward),但 sample 可能是一个列表。
  2. 添加类型检查:在日志记录前,新增 logged_sample = sample[0] if isinstance(sample, list) else sample 这行代码,用于检查 sample 是否为列表类型。如果是列表,则取第一个元素作为日志记录的对象;否则直接使用原对象。
  3. 更新日志内容:将日志语句中直接引用 sample 的地方替换为 logged_sample,确保访问的属性存在。
  4. 保持数据收集逻辑不变:原有的数据收集逻辑(if isinstance(sample, list): data.extend(sample) else: data.append(sample))保持不变,因为这部分已经正确处理了列表和单个对象的情况。
文件 模块 状态 重要度
slime/rollout/sglang_rollout.py 评估滚动 modified 5.3

关键符号

eval_rollout_single_dataset

关键源码片段

slime/rollout/sglang_rollout.py core-logic

这是本次 PR 的唯一变更文件,包含了评估滚动的核心逻辑,修复了多智能体场景下的日志记录错误。

async def eval_rollout_single_dataset(
    args,
    dataset_cfg,
    base_sampling_params,
    tokenizer,
):
    # ... 前面的代码省略 ...
    for coro in asyncio.as_completed(tasks):
        sample = await coro
        if do_print:
            # 修复点:检查 sample 是否为列表,如果是则取第一个元素用于日志记录
            logged_sample = sample[0] if isinstance(sample, list) else sample
            logger.info(
                "eval_rollout_single_dataset example data: "
                f"{[str(logged_sample.prompt) + logged_sample.response]} "
                f"reward={logged_sample.reward}"
            )
            do_print = False
        # 原有的数据收集逻辑保持不变,已能处理列表和单个对象
        if isinstance(sample, list):
            data.extend(sample)
        else:
            data.append(sample)
        pbar.update(1)
    # ... 后面的代码省略 ...

评论区精华

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

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

风险与影响

  1. 回归风险低:变更仅影响日志记录逻辑,不改变核心数据流或评估结果的计算。
  2. 性能影响可忽略:新增的类型检查(isinstance(sample, list))开销极小,不会对整体性能产生可感知的影响。
  3. 兼容性良好:修复后,代码能同时处理单个 Sample 对象和 List[Sample] 类型,提升了多智能体场景下的兼容性。
  4. 潜在风险:如果 sample 是空列表,sample[0] 会引发 IndexError,但根据上下文,generate 函数应至少返回一个样本,因此风险较低。
  1. 对用户的影响:修复后,多智能体评估脚本(如 run-qwen3-30B-A3B-multi-agent.sh)可以正常运行,避免因类型错误导致的崩溃,提升用户体验。
  2. 对系统的影响:评估日志现在能正确显示样本信息,便于调试和监控,但不会改变评估指标的计算。
  3. 对团队的影响:这是一个小范围的 bugfix,有助于维护代码健壮性,减少未来类似问题的发生。
类型假设错误 日志记录异常

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论