Prhub

#6170 [vllm] chore: fix sleep_level in Ascend

原始 PR 作者 wucong25 合并时间 2026-04-27 18:58 文件变更 1 提交数 1 评论 1 代码增减 +2 / -1

执行摘要

修复 Ascend NPU 上 vLLM sleep_level 导致精度问题

修复 Ascend NPU 上训练时启用 Expert Parallelism (EP) 导致精度异常的问题。vllm_ascend 不支持 sleep_level=2,EP 开启时会引发精度问题。

建议阅读 review 评论了解潜在不完修复风险。如果团队使用 Ascend NPU 且开启 EP,此变更必要但可能不充分,需进一步验证 ServerAdapter 行为。

讨论亮点

由 gemini-code-assist[bot] 提出的 review 指出:

  • 该修复仅影响 vLLMReplica.sleep(),但标准训练流程(如 PPO)中内存管理由 ServerAdapter.release() 处理,后者在 __init__ 中独立计算 sleep_level 并通过 collective_rpc 直接传递,绕过了 _sleep_hybrid 逻辑。因此本修改可能未覆盖实际生效路径。
  • 建议将条件细化到仅针对启用 EP 的情况,以避免在非 EP 的 NPU 配置下强制提高内存占用。
  • 当前状态:该 issue 未解决,但 PR 已被审核者 wuxibin89 批准合并。

实现拆解

  1. 修改条件表达式:在 verl/workers/rollout/vllm_rollout/vllm_async_server.py_sleep_hybrid 方法中,将 if self.lora_as_adapter: 改为 if self.lora_as_adapter or is_torch_npu_available(check_device=False):
  2. 增加注释说明:在条件前添加注释 "vllm_ascend not support sleep_level now. Enabling EP during training may lead to accuracy issues.",解释变更动机。
  3. 影响:Ascend NPU 设备(包括 Lora 和全权重场景)均使用 sleep_level=1,避免 EP 导致的精度异常。
文件 模块 状态 重要度
verl/workers/rollout/vllm_rollout/vllm_async_server.py rollout modified 4.59

关键符号

_sleep_hybrid

关键源码片段

verl/workers/rollout/vllm_rollout/vllm_async_server.py core-logic

核心修改文件,_sleep_hybrid 方法增加了 NPU 判断,强制使用 sleep_level=1 避免 EP 精度问题。

async def _sleep_hybrid(self):
    """HYBRID sleep: lora adapters only need level=1; full weights need level=2."""
    # Don't use engine.sleep(level=2) here
    # lora only update adapter weights, so set sleep level to 1
    # vllm_ascend not support sleep_level now. Enabling EP during training may lead to accuracy issues.
    if self.lora_as_adapter or is_torch_npu_available(check_device=False): # 增加 NPU 判断
        sleep_level = 1
    else:
        sleep_level = 2
    await self.engine.collective_rpc("sleep", kwargs={"level": sleep_level})
    if _VLLM_VERSION >= version.parse("0.17.0"):
        await self.engine.reset_encoder_cache()

评论区精华

修复是否覆盖了实际生效路径 正确性

gemini-code-assist[bot] 指出该修改仅影响 vLLMReplica.sleep(),但标准训练流程中 sleep_level 由 ServerAdapter.release() 独立计算并直接传递,可能绕过了本修改。

结论:未解决。PR 已被批准,但 reviewer 的疑虑未被回应。 · 待处理

条件是否应该只针对 EP 启用时 设计

reviewer 建议将条件细化到仅针对启用 Expert Parallelism (EP) 的情况,以避免在非 EP 的 NPU 配置下强制提高内存占用。

结论:未采纳。当前实现为所有 NPU 启用 sleep_level=1。 · 已解决

风险与影响

  1. 不完修复风险:如 review 指出,ServerAdapter 可能独立管理 sleep_level,本变更可能未覆盖实际生效路径,NPU 上仍有精度问题。
  2. 内存占用增加:强制 NPU 使用 sleep_level=1(保留更多权重内存),对非 EP 配置可能不必要。
  3. 回归风险:低。仅增加一个条件判断,不影响已有逻辑。

直接影响 Ascend NPU 上的 vLLM 推理引擎睡眠行为;由于变更极小,对现有其他硬件(如 GPU)无影响。当前精度问题仅在 EP 启用时出现,非 EP 用户可忽略。

修复可能不完整 未覆盖 ServerAdapter 路径

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论