Prhub

#6285 [model] chore: refactor npu scripts

原始 PR 作者 wucong25 合并时间 2026-05-11 09:40 文件变更 14 提交数 10 评论 11 代码增减 +1212 / -181

执行摘要

重构 Ascend NPU 训练脚本目录结构

PR 标题和描述指出需要重构 NPU 脚本,使 NPU 相关的训练配置更清晰和独立,便于维护。

建议阅读此 PR 以了解 NPU 脚本组织方式;注意删除的脚本可能中断现有用户工作流;后续应关注作者承诺的 PR 以进一步优化配置管理。

讨论亮点
  • Shell 语法错误:gemini-code-assist[bot] 指出多个脚本存在缺少 fi、未定义变量 train_etp、多余反斜杠等问题,均为纠正。
  • 设计争议:wuxibin89 质疑为何训练配置与 rollout backend 耦合(L105-L126),作者回应 sglang 和 vllm 配置已统一;但 reviewer 未完全认同。
  • NPU 脚本必要性:wuxibin89 询问为何需要单独 NPU 脚本(如 run_qwen2_5_32b_fsdp_npu.sh),作者未直接回答但承诺后续 PR 全面修订。
  • 配置硬编码:wuxibin89 建议将 sp_size 等 NPU 必要配置直接设置在 async_sglang_server.py 中而非 shell 脚本,作者同意后续 PR 处理。

实现拆解

  1. 删除旧的 NPU 专用脚本:移除 examples/grpo_trainer/run_qwen3_30b_a3b_mindspeed.sh。
  2. 创建新的 examples/ascend_extras/grpo_trainer/ 目录:将原有的 MindSpeed 脚本迁移并增强,同时新增多个 Qwen3/Qwen2.5 的 FSDP、Megatron 训练脚本。
  3. 修改现有 GRPO 示例脚本:在 run_qwen3_8b_fsdp.sh、run_qwen2_5_vl_7b_fsdp.sh 等 5 个脚本中增加 case "${DEVICE}" 分支,自动检测 GPU/NPU 并设置相应的环境变量和并行参数。
  4. 细节调整:统一配置键,修复变量命名(如 train_etp 改为 actor_etp),添加必要的 NPU 环境变量(如 HCCL_* 端口)。
文件 模块 状态 重要度
examples/ascend_extras/grpo_trainer/run_qwen3_30b_a3b_mindspeed.sh NPU 脚本 added 5.69
examples/grpo_trainer/run_qwen3_30b_a3b_mindspeed.sh GRPO 示例 removed 5.32
examples/ascend_extras/grpo_trainer/run_qwen3_30b_a3b_megatron.sh NPU 脚本 added 5.67
examples/grpo_trainer/run_qwen3_8b_fsdp.sh GRPO 示例 modified 3.79
examples/ascend_extras/grpo_trainer/run_qwen3_4b_fsdp_npu.sh NPU 脚本 added 4.0
examples/grpo_trainer/run_qwen2_5_vl_7b_fsdp.sh GRPO 示例 modified 3.71

关键源码片段

examples/ascend_extras/grpo_trainer/run_qwen3_30b_a3b_mindspeed.sh core-logic

新增的 NPU MindSpeed 训练脚本,代表重构后的目录结构和配置方式。

#!/bin/bash
set -xeuo pipefail
# Project Configuration
project_name='GRPO-Qwen3-30b-A3B-BASE-MATH'
exp_name='GRPO-Qwen3-30B-A3B-BASE-MindSpeedLLM-SGLang'
​
# Necessary env
export HCCL_CONNECT_TIMEOUT=1500
export HCCL_HOST_SOCKET_PORT_RANGE=60000-60050
export HCCL_NPU_SOCKET_PORT_RANGE=61000-61050
export RAY_EXPERIMENTAL_NOSET_ASCEND_RT_VISIBLE_DEVICES=1
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
export DISABLE_L2_CACHE=1
export TASK_QUEUE_ENABLE=1
# For CANN versions 8.5.0 and above, using mbridge, set this ENV
export HCCL_OP_EXPANSION_MODE="AIV"
​
# Node Info
NNODES=${NNODES:-1}
NPUS_PER_NODE=${NPUS_PER_NODE:-16}
​
# Model Weights Paths
MODEL_PATH=Qwen/Qwen3-30B-A3B
# ...(后续配置类似原脚本,但整合了更清晰的变量和注释)

评论区精华

缺少 fi 导致 shell 语法错误 正确性

gemini-code-assist[bot] 指出 run_qwen3_30b_a3b_megatron.sh 中缺少 fi 关闭 if 块,会导致脚本无法运行。

结论:已修复(在后续 commit 中合并)。 · 已解决

未定义变量 train_etp vs actor_etp 正确性

gemini-code-assist[bot] 指出使用了未定义变量 train_etp,应为 actor_etp。

结论:已修复。 · 已解决

训练配置与 rollout backend 耦合的设计质疑 设计

wuxibin89 询问为什么训练配置要放在 rollout backend 条件下;作者回应 sglang 和 vllm 配置已一致。

结论:作者解释后 reviewer 未完全认同,但未阻止合并。 · 已解决

需要单独 NPU 脚本的设计决策 设计

wuxibin89 询问为什么需要为 NPU 准备单独脚本(如 run_qwen2_5_32b_fsdp_npu.sh),而非统一在 DEVICE 分支处理。

结论:作者未直接回应但承诺后续 PR 全面修订。 · pending

建议将 NPU 配置移入源码 设计

wuxibin89 建议将 sp_size 等必要 NPU 配置直接设置在 async_sglang_server.py 中,而不是写在 shell 脚本。

结论:作者同意将提交单独 PR。 · 已解决

风险与影响

  • Shell 语法错误:review 中发现了缺少 fi、变量未定义等问题,虽已修复,但类似风险可能在其他未覆盖脚本中存在。
  • Breaking change:删除了 examples/grpo_trainer/run_qwen3_30b_a3b_mindspeed.sh,用户若直接引用该路径将失败,PR 未标注 [BREAKING]。
  • CI 覆盖不足:新增的 examples/ascend_extras 目录未纳入 CI pipeline,可能引入回归。
  • 配置分散:部分 NPU 环境变量仍硬编码在 shell 脚本中,后续维护成本较高。
  • GPU 用户:不受影响,现有脚本仅增加 DEVICE 分支,GPU 路径保持不变。
  • NPU 用户:需改用 examples/ascend_extras 目录下的新脚本或通过 DEVICE=npu 运行修改后的脚本;旧路径失效。
  • 团队:NPU 配置更加独立清晰,但后续仍需统一配置到源码,减少 shell 脚本维护。
Shell 语法错误 删除旧脚本 break 新目录未覆盖 CI 配置硬编码待优化

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论