面向 RL 的 vLLM-Ascend¶
概述¶
vLLM 通常用作强化学习(RL)和后训练工作流中的 rollout 引擎。训练框架使用 vLLM-Ascend 生成样本,根据这些样本更新策略,然后将新权重同步回 rollout 引擎。有关与 RL 框架的集成,请参阅上游 vLLM 的 RLHF 指南。
RL 工作负载通常需要以下能力:
- 在同置训练器运行时释放 NPU 内存;
- 无需重启 rollout 引擎即可更新模型权重;
- 在权重更新期间暂停生成;
- 返回 token 对数概率,以及(对于受支持的 MoE 工作流)专家路由决策;
- 接受和返回 token ID,而无需冗余分词;以及
- 在不同批次组成下产生可复现的结果。
本页介绍这些功能如何在 Ascend 上协同工作。请参阅所链接的功能指南和示例以获取完整的配置细节。
启用 RL 模式¶
vLLM-Ascend 在 additional_config.rl_config 下提供统一的 RL 配置。对于同 NPU 和跨 NPU 部署,请将其 enabled 字段设置为 true:
总开关会应用常见的 RL 默认设置:禁用 FRACTAL_NZ,启用开发端点,并从 PYTORCH_NPU_ALLOC_CONF 中移除 expandable_segments。可选字段如下:
| 字段 | 何时启用 |
|---|---|
sleep_mode_extra_cleanup |
在同 NPU 部署中,于休眠期间释放 HCCL 进程组和 ACL 图工作空间 |
enable_training_consistency |
选择 FA3 注意力后端以实现训练-推理一致性 |
enable_batch_invariant |
启用批次不变内核和确定性通信设置 |
所有可选字段默认为 false,除非 enabled 为 true,否则将被忽略。有关字段定义、先决条件以及从旧版设置的迁移,请参阅 附加配置。
选择部署模式¶
| 部署模式 | 内存管理 | 权重传输后端 |
|---|---|---|
| 训练器和 rollout 引擎共享 NPU | 启用休眠模式,以便 rollout 引擎可以释放 NPU 内存 | ipc |
| 训练器和 rollout 引擎使用不同的 NPU | 在更新期间暂停生成;通常不需要休眠模式 | hccl |
确切的生命周期取决于框架。特别是,级别 2 休眠会丢弃权重。在加载或传输新权重之前唤醒 weights 分配,然后在更新完成后再唤醒 kv_cache。有关两阶段唤醒序列,请参阅 休眠模式。
引擎生命周期¶
休眠模式¶
休眠模式允许同置的 rollout 引擎在不退出的情况下释放 NPU 内存。级别 1 将模型权重卸载到 CPU 并丢弃 KV 缓存。级别 2 同时丢弃模型权重和 KV 缓存,适用于在推理恢复前加载新权重的情况。
要进行在线控制,请启用开发端点并使用以下命令以启用休眠模式的方式启动服务器:
VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve Qwen/Qwen3-0.6B \
--enable-sleep-mode \
--additional-config '{"rl_config": {"enabled": true}}'
休眠级别是一个查询参数;JSON 请求体会被忽略:
# Release memory.
curl -X POST "http://127.0.0.1:8000/sleep?level=1"
curl http://127.0.0.1:8000/is_sleeping
# Restore all tagged allocations.
curl -X POST http://127.0.0.1:8000/wake_up
对于级别 2 休眠,请按照 休眠模式 中记录的顺序唤醒标签:
curl -X POST "http://127.0.0.1:8000/sleep?level=2"
curl -X POST "http://127.0.0.1:8000/wake_up?tags=weights"
# Load or transfer the new weights here.
curl -X POST "http://127.0.0.1:8000/wake_up?tags=kv_cache"
要同时释放 HCCL 进程组和 ACL 图工作空间,请启用额外清理:
VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve Qwen/Qwen3-0.6B \
--enable-sleep-mode \
--additional-config '{"rl_config": {"enabled": true, "sleep_mode_extra_cleanup": true}}'
额外清理会减少休眠期间的 NPU 内存使用,但 HCCL 组必须在唤醒期间恢复,ACL 图也必须重新捕获。RL 模式会从 PYTORCH_NPU_ALLOC_CONF 中移除 expandable_segments,因为它与休眠模式内存池不兼容。原先的顶级选项 enable_sleep_mode_extra_cleanup 已被移除。
权重传输¶
vLLM-Ascend 提供了两个 Ascend 专用的权重传输后端:
| 后端 | 使用场景 | 传输方式 |
|---|---|---|
ipc |
训练器和 rollout 引擎使用同一物理 NPU | NPU IPC 句柄 |
hccl |
训练器和 rollout 引擎使用不同的 NPU | HCCL 集合通信 |
使用以下命令启动启用 HCCL 的服务器:
vllm serve Qwen/Qwen3-0.6B \
--weight-transfer-config '{"backend": "hccl"}' \
--additional-config '{"rl_config": {"enabled": true}}'
对于同 NPU 传输,请使用 ipc 后端。在 Ascend 上,vLLM-Ascend 会将此面向用户的后端名称映射到 NPUIPCWeightTransferEngine:
VLLM_ALLOW_INSECURE_SERIALIZATION=1 \
vllm serve Qwen/Qwen3-0.6B \
--weight-transfer-config '{"backend": "ipc"}' \
--additional-config '{"rl_config": {"enabled": true}}'
HTTP NPU IPC 示例需要 VLLM_ALLOW_INSECURE_SERIALIZATION=1,因为它会序列化 IPC 句柄。仅在受信任的环境中启用它。
控制流程如下:
- 初始化传输引擎;
- 暂停生成;
- 开始权重更新;
- 传输一组或多组权重;
- 完成权重更新;以及
- 恢复生成。
该仓库包含两个后端的可运行示例:
更新权重时必须禁用 FRACTAL_NZ。RL 模式强制设置 weight_nz_mode=0;权重传输启动路径会校验生效的 Ascend 配置。
暂停与恢复生成¶
当 rl_config.enabled=true 时,服务器会暴露 /pause 和 /resume 端点。这些是开发用端点,不得暴露给不受信任的网络。暂停参数通过查询参数传递:
# Drain in-flight requests and clear caches before the update.
curl -X POST \
"http://127.0.0.1:8000/pause?mode=wait&clear_cache=true"
# Transfer weights here.
curl -X POST http://127.0.0.1:8000/resume
暂停模式如下:
| 模式 | 行为 |
|---|---|
abort |
立即中止进行中的请求;这是默认模式 |
wait |
等待进行中的请求完成后再暂停 |
keep |
冻结请求,使其在 /resume 之后继续执行 |
clear_cache 已弃用,并且在 mode=keep 时会被忽略。因此,被保留的请求可能包含使用旧权重生成的 token 和 KV-cache 条目,并在恢复后继续使用新权重。当 rollout 不得跨越权重版本时,请使用 abort 或 wait。
有关 API 生命周期,请参阅上游 Async RL 指南。
引擎返回的训练数据¶
Token 对数概率¶
在 completions 请求中设置 logprobs,并在需要时设置 prompt_logprobs:
curl http://127.0.0.1:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-0.6B",
"prompt": "Your prompt here",
"max_tokens": 32,
"temperature": 1.0,
"logprobs": 1,
"prompt_logprobs": 1
}'
prompt_logprobs 不适用于流式 completions 请求。有关对应的引擎级选项,请参阅上游采样参数文档。
Router Replay (R3)¶
对于受支持的 MoE 工作流,请启用 routed-expert 捕获来启动服务器:
对于非流式 completion 响应,choices[].routed_experts 是一个 base64 编码的 NumPy 数组,而不是内联张量。解码后,其形状为 (num_tokens - 1, num_layers, num_experts_per_tok)。最终采样得到的 token 没有路由记录,因为它尚未经过模型。当捕获被禁用或请求在前向传播之前被中止时,该字段为 null。
仅当训练器消费并重放捕获的专家选择时才启用此选项。有关解码和重放逻辑,请参阅上游 routed experts 示例。
确定性 Rollout¶
批次不变性可减少由批次形状或请求顺序变化引起的输出差异。在 Atlas A2 和 A3 上,使用 COMPILE_CUSTOM_KERNELS=1 构建 vLLM-Ascend,然后通过统一的 RL 配置启用批次不变性:
vllm serve Qwen/Qwen3-8B \
--additional-config '{"rl_config": {"enabled": true, "enable_batch_invariant": true}}' \
--compilation-config '{"cudagraph_mode": "PIECEWISE"}'
RL 模式会禁用 FRACTAL_NZ。当启用批次不变性时,worker 初始化还会设置 HCCL_DETERMINISTIC=strict 和 LCCL_DETERMINISTIC=1。有关支持的硬件、模型和限制,请参阅批次不变性。
Token 输入,Token 输出¶
实验性的 tokens-only 端点接受已预分词的 prompt,并返回生成的 token ID。使用 --tokens-only 启动常规 serve 命令:
将请求发送到 /inference/v1/generate:
curl http://127.0.0.1:8000/inference/v1/generate \
-H "Content-Type: application/json" \
-d '{
"request_id": "rollout-001",
"token_ids": [151644, 8948, 198],
"sampling_params": {
"temperature": 1.0,
"max_tokens": 32,
"logprobs": 1
}
}'
非流式响应的结构如下:
{
"request_id": "rollout-001",
"model": "Qwen/Qwen3-0.6B",
"choices": [
{
"index": 0,
"logprobs": null,
"finish_reason": "stop",
"token_ids": [123, 456],
"routed_experts": null
}
],
"prompt_logprobs": null,
"usage": null
}
logprob 和 usage 的具体值取决于采样参数和服务器配置。该 API 面向分离式(disaggregated)服务场景,可能会发生变化;请关注上游 Tokens API RFC 以了解其状态。
用于 Agentic RL 的工具调用¶
Agentic rollout 环境可以使用标准的 OpenAI 兼容工具调用 API。对于具有受支持解析器的模型:
环境在 /v1/chat/completions 中提供 tools,执行返回的工具调用,将工具结果追加到对话中,并提交下一轮。有关请求示例以及受支持的解析器/模型组合,请参阅上游工具调用。
数据并行请求路由¶
vLLM 的 OpenAI 服务层会识别 X-data-parallel-rank 请求头,并将其整数值传递给调度器。支持 DP 的外部路由器可以使用此请求头来指定目标 rank:
curl http://127.0.0.1:8000/v1/completions \
-H "Content-Type: application/json" \
-H "X-data-parallel-rank: 2" \
-d '{
"model": "Qwen/Qwen3-0.6B",
"prompt": "Your prompt here",
"max_tokens": 32
}'
vLLM-Ascend 不提供 vllm serve router 命令或 --dp-routing-config 选项。请分别配置 vLLM 数据并行部署和外部路由器。有关受支持的负载均衡模式,请参阅上游数据并行部署。
配置检查清单¶
| 设置 | 使用时机 | 用途 |
|---|---|---|
rl_config.enabled=true |
所有 RL 部署 | 应用 RL 默认值:禁用 NZ,启用开发端点,并移除 expandable_segments |
--enable-sleep-mode |
训练器与 rollout 引擎共享 NPU | 启用 CaMemAllocator 内存池 |
VLLM_WORKER_MULTIPROC_METHOD=spawn |
睡眠模式 | 使用受支持的 worker 启动方法 |
rl_config.sleep_mode_extra_cleanup=true |
睡眠模式可选 | 释放 HCCL 和 ACL 图资源,代价是唤醒速度变慢 |
rl_config.enable_training_consistency=true |
训练-推理一致性 | 选择 FA3;需要 flash_attn_npu_v3 包 |
rl_config.enable_batch_invariant=true |
可复现的 rollout | 启用 batch-invariant 内核和确定性通信设置 |
--weight-transfer-config '{"backend": "hccl"}' |
跨 NPU 权重传输 | 注册 Ascend HCCL 传输引擎 |
--weight-transfer-config '{"backend": "ipc"}' |
同 NPU 权重传输 | 选择 Ascend NPU IPC 传输引擎 |
--enable-return-routed-experts |
MoE 路由器重放 | 返回编码后的专家路由决策 |
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend