执行摘要
- 一句话:修复 Ascend NPU 上 vLLM sleep_level 导致精度问题
- 推荐动作:建议阅读 review 评论了解潜在不完修复风险。如果团队使用 Ascend NPU 且开启 EP,此变更必要但可能不充分,需进一步验证
ServerAdapter 行为。
功能与动机
修复 Ascend NPU 上训练时启用 Expert Parallelism (EP) 导致精度异常的问题。vllm_ascend 不支持 sleep_level=2,EP 开启时会引发精度问题。
实现拆解
- 修改条件表达式:在
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):。
- 增加注释说明:在条件前添加注释 "vllm_ascend not support sleep_level now. Enabling EP during training may lead to accuracy issues.",解释变更动机。
- 影响:Ascend NPU 设备(包括 Lora 和全权重场景)均使用 sleep_level=1,避免 EP 导致的精度异常。
关键文件:
verl/workers/rollout/vllm_rollout/vllm_async_server.py(模块 rollout;类别 source;类型 core-logic;符号 _sleep_hybrid): 核心修改文件,_sleep_hybrid 方法增加了 NPU 判断,强制使用 sleep_level=1 避免 EP 精度问题。
关键符号:_sleep_hybrid
关键源码片段
verl/workers/rollout/vllm_rollout/vllm_async_server.py
核心修改文件,_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] 提出的 review 指出:
风险与影响
- 风险:
- 不完修复风险:如 review 指出,
ServerAdapter 可能独立管理 sleep_level,本变更可能未覆盖实际生效路径,NPU 上仍有精度问题。
- 内存占用增加:强制 NPU 使用 sleep_level=1(保留更多权重内存),对非 EP 配置可能不必要。
- 回归风险:低。仅增加一个条件判断,不影响已有逻辑。
- 影响:直接影响 Ascend NPU 上的 vLLM 推理引擎睡眠行为;由于变更极小,对现有其他硬件(如 GPU)无影响。当前精度问题仅在 EP 启用时出现,非 EP 用户可忽略。
- 风险标记:修复可能不完整, 未覆盖ServerAdapter路径
关联脉络
参与讨论