【RL】Slime异步原理(单例设计模式)6

好的,我们来详细解析 generate_and_rm_group 这个函数。从名字就能看出来,它的核心职责是:生成(Generate)一个组(Group)的样本,并为它们进行奖励建模(RM, Reward Model)打分。

这个函数是整个 rollout 过程中的一个关键执行单元,专门处理一个提示(prompt)需要生成多个回答(n_samples_per_prompt > 1)的场景。

让我们分解它的代码和逻辑:

python 复制代码
async def generate_and_rm_group(
    args: Namespace, group: list[Sample], sampling_params: dict[str, Any], evaluation: bool = False
) -> list[Sample]:
    state = GenerateState(args)

    # 1. 中止检查
    if state.aborted:
        return group

    tasks = []
    # 2. 为组内每个样本创建独立的生成-打分任务
    for idx, sample in enumerate(group):
        current_sampling_params = sampling_params.copy()
        # (可选) 为确定性推理设置种子
        if getattr(args, "sglang_enable_deterministic_inference", False):
            seed = state.group_sampling_seeds[idx]
            current_sampling_params["sampling_seed"] = seed
        
        # 将单个样本的 "生成+打分" 封装成一个任务
        tasks.append(generate_and_rm(args, sample, current_sampling_params, evaluation=evaluation))

    # 3. 并发执行所有任务
    group = await asyncio.gather(*tasks)

    # 4. (可选) 进行组级别的奖励打分
    if not state.aborted and args.group_rm:
        rewards = await batched_async_rm(args, group)
        for sample, reward in zip(group, rewards):
            sample.reward = reward

    # 5. 返回处理完成的样本组
    return group

详细步骤分解

1. 中止检查 (Abort Check)
python 复制代码
if state.aborted:
    return group

这是第一道防线。在开始任何耗时操作之前,它会检查全局状态 state.aborted。如果整个 rollout 过程已经被中止了,它就直接返回原始的 group,避免做任何无用功。

2. 为组内每个样本创建独立的任务 (Task Creation)
python 复制代码
tasks = []
for idx, sample in enumerate(group):
    # ...
    tasks.append(generate_and_rm(args, sample, ...))
  • group: list[Sample] : 这个输入参数 group 是一个列表,里面包含了多个 Sample 对象。这些 Sample 对象通常共享同一个 prompt,但可能是通过 copy.deepcopy 创建的独立副本,因为它们将会有不同的 responsereward。列表的长度就是 args.n_samples_per_prompt
  • 循环 : 它遍历 group 里的每一个 sample
  • 设置采样参数 :
    • sampling_params.copy(): 创建一个采样参数的副本,以防修改影响到其他任务。
    • if ... "sampling_seed": 这是一个重要的特性。如果开启了确定性推理 (sglang_enable_deterministic_inference),它会为组内的每个样本分配一个不同但固定 的随机种子。这确保了每次 rollout 时,对于同一个提示,生成的第 N 个回答总是一样的,这对于复现实验结果和调试非常重要。
  • tasks.append(generate_and_rm(...)) : 这是核心。它没有 直接调用 generate,而是调用了我们之前分析过的 generate_and_rm 函数。generate_and_rm 负责处理单个样本 的"生成+打分"流程。注意,这里只是将 generate_and_rm(...) 这个协程 添加到了 tasks 列表中,并没有立即执行它
3. 并发执行所有任务 (Concurrent Execution)
python 复制代码
group = await asyncio.gather(*tasks)

这是 asyncio 的一个标志性用法。

  • *tasks: 将 tasks 列表解包,把里面的所有协程作为独立的参数传给 gather
  • asyncio.gather: 这个函数会并发地 运行所有传入的协程。它会等待所有这些任务都执行完毕。
  • 效果 : 假设 n_samples_per_prompt 是 4,那么 4 个对 generate_and_rm 的调用会同时开始。它们会各自向 SGLang 服务器发送生成请求(受全局信号量 semaphore 的限制),然后各自等待响应,再各自调用奖励模型。因为这些操作大部分时间都在等待网络 I/O,并发执行能极大地缩短总耗时。
  • group = ...: gather 会收集所有任务的返回值(也就是处理完毕的 Sample 对象),并按原始顺序组成一个列表,然后重新赋值给 group 变量。
4. (可选) 组级别的奖励打分 (Group Reward Modeling)
python 复制代码
if not state.aborted and args.group_rm:
    rewards = await batched_async_rm(args, group)
    # ...

这是一个特殊的逻辑分支,由 args.group_rm 开关控制。

  • group_rm 的含义 : 有些奖励模型的设计是,它需要看到一个提示对应的所有回答,才能给出最准确的评分。例如,"Best-of-N" 采样中,RM 的任务就是从 N 个回答中选出最好的一个,给它奖励1,其他给0。这种情况下,RM 必须同时比较所有 N 个回答。
  • 工作流程 :
    1. 如果 args.group_rmTrue,那么在步骤 3 中,generate_and_rm 内部不会 调用 async_rm(它会跳过打分环节)。
    2. 在这里,所有生成都已完成,group 包含了全部 N 个回答。
    3. 程序调用 batched_async_rm(args, group),将整个 group 发送给奖励模型进行批量/对比式打分。
    4. 最后,将返回的 rewards 列表逐一赋给 group 中的每个 sample
5. 返回结果
python 复制代码
return group

函数最终返回一个列表,其中包含了所有已经生成了回答,并且(在大多数情况下)已经赋好奖励分数的 Sample 对象。

总结

generate_and_rm_group 的作用是作为一个并发调度器,高效地处理"一个提示,多个回答"的场景。它的工作流可以总结为:

  1. 接收一个包含 N 个待处理样本的"组"。
  2. 为组里的每个样本分派 一个"生成+打分"的子任务 (generate_and_rm)。
  3. 使用 asyncio.gather 同时启动并等待所有这些子任务完成。
  4. (如果需要)在所有回答都生成后,进行一次集体的、跨样本的奖励评估
  5. 返回这个处理完毕的、包含 N 个完整样本的组。

这个函数的设计充分利用了 asyncio 的并发能力,是实现高吞吐量 rollout 的关键一环。

相关推荐
划水的code搬运工小李14 分钟前
EVO评估数据导出在origin中绘制
人工智能
Clarence Liu14 分钟前
机器学习(5) 梯度下降
人工智能·机器学习
kisshuan1239616 分钟前
电信杆塔类型识别与分类_fovea_r101_fpn_4xb4-2x_coco模型详解_模型训练与验证_通俗易懂!入门必看系列!
人工智能·目标跟踪·分类
子午16 分钟前
【2026原创】动物识别系统~Python+深度学习+人工智能+模型训练+图像识别
人工智能·python·深度学习
o_insist22 分钟前
LangChain1.0 实现 PDF 文档向量检索全流程
人工智能·python·langchain
OpenMiniServer25 分钟前
AI + GitLab + VSCode:下一代开发工作流的革命性集成
人工智能·vscode·gitlab
脑洞AI食验员27 分钟前
智能体来了:用异常与文件处理守住代码底线
人工智能·python
摘星观月31 分钟前
【三维重建2】TCPFormer以及NeRF相关SOTA方法
人工智能·深度学习
shangjian00731 分钟前
AI大模型-机器学习-分类
人工智能·机器学习·分类
Tiny_React33 分钟前
使用 Claude Code Skills 模拟的视频生成流程
人工智能·音视频开发·vibecoding