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

相关推荐
软件技术新观察2 分钟前
企业数字化开发科普:软件定制、小程序、APP 开发全解析
人工智能·小程序
她的男孩6 分钟前
AI 写完 100 万行代码没人 Review,我做了一件事:把 AI 写的代码管起来了
java·人工智能·程序员
差不多的周周9 分钟前
《MoChat:面向多转弯动作理解和描述的关节分组时空接地多通道大语言模型》论文核心部分详解
人工智能·深度学习·机器学习·计算机视觉·语言模型·自然语言处理
jimmyleeee9 分钟前
大模型安全之七:LLM系统提示词泄露
人工智能·安全
RobinDevNotes10 分钟前
为什么AI训练工程师都要懂NCCL
人工智能
! 冰封雪莲 !12 分钟前
站房“智慧大脑” | Smart ET2000 污染源自动监控数智终端
大数据·人工智能·万维盈创·ai环境大数据
葡萄城技术团队17 分钟前
不会写 SUMIFS 也能做汇总?用 SpreadJS AI 生成并解释 Excel 公式
人工智能·excel
武子康17 分钟前
同一份长文问两次,SGLang 怎样少算一遍
人工智能·llm·agent
用户52746756142118 分钟前
为什么 retry() 不是 Agent 的恢复策略
人工智能
蜘蛛小助理20 分钟前
AI 自动推导业务自动化规则实战教程|多维表格低代码自动化落地
大数据·人工智能·低代码·自动化·多维表格·蜘蛛表格