【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 的关键一环。

相关推荐
xieyan08111 小时前
什么情况下使用强化学习
人工智能
腾飞开源1 小时前
04_Spring AI 干货笔记之对话客户端 API
人工智能·元数据·检索增强生成·spring ai·chatclient·对话记忆·流式api
da_vinci_x1 小时前
PS 结构参考 + Firefly:零建模量产 2.5D 等轴游戏资产
人工智能·游戏·设计模式·prompt·aigc·技术美术·游戏美术
是小崔啊1 小时前
【SAA】01 - Spring Ai Alibaba快速入门
java·人工智能·spring
semantist@语校1 小时前
第五十一篇|构建日本语言学校数据模型:埼玉国际学院的城市结构与行为变量分析
java·大数据·数据库·人工智能·百度·ai·github
想要成为计算机高手1 小时前
π*0.6: 从实践中学习 -- 2025.11.17 -- Physical Intelligence (π) -- 未开源
人工智能·学习·机器人·多模态·具身智能·vla
黑客思维者1 小时前
LLM底层原理学习笔记:模型评估的基准测试体系与方法论
人工智能·笔记·神经网络·学习·模型评估·基准测试
他们叫我技术总监1 小时前
从 WM_CONCAT 到 LISTAGG:Oracle 字符串聚合按时间排序完整方案
数据库·人工智能·oracle