跳到内容

异步强化学习

概述

在标准的强化学习 (RL) 训练循环中,生成和训练是串行进行的:策略生成经验(rollouts),然后根据这些经验进行训练,周而复始。在生成过程中,训练加速器处于闲置状态,反之亦然。

异步流水线方法将生成和训练阶段拆分为两个并行协程,允许模型在对先前生成的数据进行训练的同时生成新的样本。这可以带来更好的 GPU 利用率和更高的训练吞吐量。

然而,这种重叠引入了一个复杂问题:必须在推理引擎运行过程中更新权重,而此时可能仍有请求正在处理中。

暂停与恢复 API

为了在推理引擎运行时安全地更新权重,vLLM 提供了 pause_generationresume_generation 方法。这些方法允许训练器协调一个干净的时间窗口来进行权重同步,而不会丢失正在处理的工作。

pause_generation

await engine.pause_generation(mode="keep", clear_cache=True)

mode 参数控制如何处理正在处理中的请求:

模式 行为
"abort" 立即终止所有正在处理的请求并返回部分结果(默认值)
"wait" 在暂停前等待所有正在处理的请求完成
"keep" 冻结队列中的请求;当调用 resume_generation 时它们会恢复

clear_cache 参数控制在暂停后是否清除 KV 缓存和前缀缓存。

resume_generation

await engine.resume_generation()

在暂停后恢复调度器。任何使用 mode="keep" 冻结的请求都将继续生成。

HTTP 端点

当使用 vLLM HTTP 服务器时,可以通过以下方式使用相同的功能:

  • POST /pause?mode=keep - 暂停生成
  • POST /resume - 恢复生成

数据并行

当使用带有 vLLM 内部负载均衡器(即 data_parallel_backend="ray")的数据并行时,暂停和恢复操作会在所有 DP 秩(rank)上自动处理——单次调用即可。当使用外部负载均衡器(即代理后的多个独立 vLLM 实例)时,你必须在权重更新前后分别向每个引擎实例发送暂停和恢复请求。

典型的异步 RL 流程

一个包含权重同步的典型异步 RL 循环如下所示:

  1. 开始根据当前策略生成经验(rollouts)
  2. 一旦训练器有新的权重需要更新,使用 mode="keep" 暂停生成
  3. 将更新后的权重从训练器同步到推理引擎(参见 权重传输
  4. 恢复生成——正在处理的请求将继续使用新权重
  5. 重复

关键在于,使用 mode="keep" 暂停的请求在暂停前产生的 Token 来自权重,而恢复后产生的 Token 则来自权重。clear_cache 参数控制在暂停期间是否使 KV 缓存失效。当 clear_cache=True 时,之前缓存的键值条目将被丢弃,因此恢复后生成的所有 Token 都将完全基于新权重进行计算。当 clear_cache=False 时,现有的 KV 缓存条目会被保留,这意味着上下文中的某些 Token 可能仍反映旧权重(过期的 KV 缓存)。

示例

异步 RLHF 示例展示了这种模式,使用了 vllm.AsyncLLMEngine、NCCL 权重传输,以及带有验证的中途暂停/恢复功能。