# PR #5610 完整报告

- 仓库：`verl-project/verl`
- 标题：[model] chore: Fix Qwen3-235B precision issues on NPU
- 合并时间：2026-03-16 23:21
- 原文链接：http://prhub.com.cn/verl-project/verl/pull/5610

---

## 执行摘要
本 PR 修复了 Qwen3-235B 模型在 NPU 硬件上的精度问题，核心通过调整 vLLM 引擎的 sleep 级别并新增训练脚本实现；变更影响 NPU 用户训练体验，提升了模型适配性，建议关注 sleep 逻辑的设计决策。

## 功能与动机
PR 旨在解决 Qwen3-235B 在 NPU 上运行时出现的精度缺陷。根据 PR body 表述“Fix Qwen3-235B precision issues on NPU”，以及作者在 Issue 评论中的补充“完成了模型到 NPU 的适配和迁移”，动机明确为修复 bug 并增强硬件兼容性。

## 实现拆解
实现分为三个关键部分：
1. **核心代码调整**：修改 `verl/workers/rollout/vllm_rollout/vllm_async_server.py` 中的 `sleep` 函数，当 `is_npu_available()` 返回 True 时，将 `sleep_level` 从 2 改为 1，代码片段如下：
```python
if self.lora_as_adapter or is_npu_available:
    sleep_level = 1
```
2. **训练脚本新增**：添加 `examples/grpo_trainer/run_qwen3_235b_megatron_npu.sh`，提供 129 行配置参数，包括模型路径、并行设置和 NPU 特定选项（如 `trainer.device=npu`）。
3. **文档更新**：小幅度更新 `docs/ascend_tutorial/faq/faq.rst` 中的日期。

## 评论区精华
Review 讨论中最有价值的交锋包括：
- **脚本语法错误**：gemini-code-assist[bot] 指出脚本中的 Hydra 语法错误和参数放置问题，称“`++` 不是标准 Hydra 运算符”和“参数被错误传递给 `tee`”，作者随后修复了这些错误。
- **sleep_level 设计权衡**：glowwormX 提问“sleep_level 设为 1 会导致更多资源消耗吗？”，作者回复“NPU 不支持 level 2，且未观察到资源增加”，这揭示了 NPU 与 GPU 在引擎休眠行为上的差异。
- **参数必要性讨论**：wucong25 询问 `enable_expert_parallel` 开关的意义，评论“这个参数不加的话不行么”，但未得到明确结论，显示设计细节存在未解疑虑。

## 风险与影响
**风险**：
- 脚本初始语法错误已修复，但仍需用户手动验证配置以避免运行时错误。
- sleep_level 变更可能微妙影响引擎性能，尽管作者声称无问题，但缺乏量化测试数据。
- NPU 适配逻辑（`is_npu_available`）在混合硬件环境中可能引入兼容性风险。
**影响**：
- 对用户：直接修复精度问题，提升训练成功率；脚本降低部署复杂度。
- 对系统：轻微性能调整，无破坏性变更。
- 对团队：延续 NPU 支持趋势，促进硬件生态集成。

## 关联脉络
从近期历史 PR 看，本 PR 是 NPU 支持演进的一部分：
- PR 5732 和 5733 涉及相同脚本的修复和扩展，展示 Qwen3-235B 模型的持续优化。
- PR 5740 修复 NPU 依赖缺失，与本 PR 共同完善硬件适配。
- PR 5652 为 Ascend NPU 添加其他模型支持，表明仓库正积极扩展 NPU 兼容性。这些关联揭示了一个更大的方向：增强 verl 项目在多样化硬件（尤其是国产 NPU）上的模型训练能力。