Prhub

#6521 [ci] chore: add npu sglang nightly ci

原始 PR 作者 hustmf 合并时间 2026-05-29 11:57 文件变更 2 提交数 1 评论 2 代码增减 +278 / -0

执行摘要

新增 NPU SGLang 夜间 CI 测试

为了保障 Megatron + SGLang 在 Ascend NPU 上的功能稳定性,需要在 nightly CI 中增加自动化测试覆盖。此前 NPU 上只有 vLLM 相关的 nightly 测试,缺少 SGLang 的 nightly 验证。

该 PR 主要涉及 CI 配置和测试脚本,核心逻辑在 verll 框架内未变化。建议 nightly CI 维护者关注 review 中提出的两个高优先级问题并考虑后续修复。对于其他开发者,可以了解 nightly 测试的编写模式,但不必精读。

讨论亮点

Review 中 gemini-code-assist[bot] 指出了两个高优先级问题:

  • 脚本使用 set -x 而非 set -xeuo pipefail,可能导致训练命令通过管道 tee 后退出码被吞没,CI 误报成功。
  • 配置项 actor_rollout_ref.actor.profiler.tool_config.npu.contents="['npu','cpu']" 中的方括号未加引号,可能被 bash glob 展开,导致参数错误。
    最终 reviewer wucong25 批准了 PR,上述问题未在合并前修复,可能存在风险。

实现拆解

  1. 新增测试脚本tests/special_npu/nightly_ci_ascend/run_grpo_qwen3_30b_megatron_sglang_npu.sh):这是一个 244 行的 bash 脚本,用于配置和运行 GRPO 训练。它包含了环境变量设置、模型和路径配置、并行度参数、训练超参等,最后调用 verl 训练命令。脚本开头还包含对 SGLang 临时修复(注释掉某些行,transpose 权重)以规避上游问题。

  2. 更新 CI 工作流.github/workflows/nightly_ascend.yml):在已有的 nightly 工作流中新增一个 job nightlyCI_grpo-qwen3-30b-megatron-sglang_ascend。该 job 在 linux-aarch64-a3-16 runner 上运行,使用特定容器镜像(verl-sglang-8.5.0-a3-...),设置环境变量,执行 checkout、准备权重,最后运行测试脚本。超时设为 180 分钟。

文件 模块 状态 重要度
tests/special_npu/nightly_ci_ascend/run_grpo_qwen3_30b_megatron_sglang_npu.sh 测试脚本 added 6.39
.github/workflows/nightly_ascend.yml CI 配置 modified 4.37

关键源码片段

tests/special_npu/nightly_ci_ascend/run_grpo_qwen3_30b_megatron_sglang_npu.sh test-coverage

核心测试脚本,定义了 GRPO 训练的完整配置和执行流程

#!/bin/bash
set -x
​
# 并行度配置
train_tp=4
train_ep=4
train_etp=4
train_pp=1
train_cp=1
gen_tp=4
gen_dp=1
gen_ep=1# 数据配置数组
DATA_CONFIG=(
    data.train_files="${TRAIN_FILE}"
    data.val_files="${TEST_FILE}"
    data.prompt_key=prompt
    data.train_batch_size=${train_prompt_bsz}
    data.max_prompt_length=${max_prompt_length}
    data.max_response_length=${max_response_length}
    data.filter_overlong_prompts=False
    data.truncation='left'
)# 模型配置数组
MODEL_CONFIG=(
    actor_rollout_ref.model.path="${MODEL_PATH}"
    actor_rollout_ref.model.use_remove_padding=True
)# 算法配置数组
ALGORITHM_CONFIG=(
    algorithm.adv_estimator=${adv_estimator}
    algorithm.use_kl_in_reward=${use_kl_in_reward}
    algorithm.kl_ctrl.kl_coef=${kl_coef}
)# 最终将配置数组传递给训练命令

评论区精华

使用 set -xeuo pipefail 确保 CI 正确检测失败 正确性

gemini-code-assist[bot] 指出脚本只用了 set -x,训练命令通过管道 tee,失败后退出码被 tee 覆盖,建议改用 set -xeuo pipefail 确保严格模式。

结论:未在 PR 中直接修正,但 reviewer 仍批准合并。 · unresolved

方括号未加引号可能导致 glob 扩展 正确性

gemini-code-assist[bot] 指出配置项 `['npu','cpu']` 未加双引号,可能被 bash 解释为 glob,推荐加双引号。

结论:未修正即合并。 · unresolved

风险与影响

  1. CI 假阳性风险:如 review 指出的,脚本未使用 set -euo pipefail,若训练失败可能因为管道 tee 导致退出码为 0,CI 显示成功但实际失败。
  2. 环境依赖风险:测试依赖特定的容器镜像、模型权重路径和数据集文件,若镜像更新或路径变化可能导致测试失败。
  3. 超时风险:GRPO 训练耗时较长,超时 180 分钟可能不足,需根据实际运行调整。
  4. 配置参数硬编码:测试脚本中许多参数(如 TP/EP、offload 等)硬编码,若未来默认配置变化可能导致失效。

对用户:无直接影响,但夜间测试可提前发现 NPU SGLang 集成问题,提升发布质量。
对系统:新增一个 CI job,在特定 runner 上运行,增加 CI 资源消耗。
对团队:需要维护测试脚本和 CI 配置,确保镜像、路径等与基础设施同步。

CI 假阳性风险 管道错误掩盖 硬编码配置 环境依赖风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论