Prhub

#39585 [NPU][CI] Scope NPU nightly artifact dirs by image; fix stale glm5_2 case

原始 PR 作者 pllimax 合并时间 2026-09-15 22:55 文件变更 4 提交数 6 评论 1 代码增减 +13 / -2

执行摘要

NPU nightly 持久化目录按镜像隔离并修复 glm5_2 过期用例

PR body 明确指出:NPU nightly 结果持久化到共享目录树,但其前缀只由分支、工作流和运行元数据派生。当同一工作流内不同镜像(CANN 9.0.0 vs CANN 9.1.0、a3 vs a5)执行同一用例时,两次运行解析到同一目录,后一次运行会覆盖前一次的 metrics、log 和 plog artifacts,导致结果无法按镜像归因。涉及多节点 POC 套件(deepseek_v4_flash、glm_5_2、kimi_k3)。另外,CANN 9.1.0 多节点 mix 套件引用了已不存在的用例文件,job 在运行任何内容之前就会以 The testcase does not exit 中止。

该 PR 值得快速浏览,无需精读。值得关注的设计决策是:在保持既有路径段数量契约的前提下,用后缀方式把镜像身份注入持久化目录前缀,避免了连锁改动;同时用临时裁剪 job 的方式做定向验证后再回退,是 CI 配置变更的一种稳妥实践。对后续维护者来说,需要注意的是 sed 提取 tag 的假设条件,以及在新增 NPU 镜像时保持该命名约定。

讨论亮点

本 PR 未产生实质性 review 讨论:sglang-npu-bot 直接批准且无评论,唯一的交互是机器人触发 /tag-and-rerun-ci。设计权衡主要由 PR body 与提交信息承载,关键决策是“镜像 tag 后缀追加到 workflow_name 段而非新增路径段”,以保证既有基于段数量的消费者(如 RUN_LABEL 派生与路径解析)无需改动;镜像 tag 提取使用 sed 's#.*[/:]##' 丢弃 registry / repository 部分。这些约束说明作者对现有产物目录契约做过审慎核对。

实现拆解

  1. 在 stage 模板中按镜像隔离持久化目录:_npu-single-node-test-stage.yml 与 nightly-test-npu-e2e-multi-node.yml 两处,在完成 workflow_name 计算后追加 --${image_label}。image_label 通过 sed 's#.*[/:]##' 从 inputs.image 提取 tag 部分(丢弃 registry / repository 前缀),例如 cann9.0.0-a3。采用后缀追加而非新增路径段,是为了保持既有“按段数量解析”的消费者(如 pod 侧 RUN_LABEL 派生逻辑)继续工作。
  2. pod 侧日志目录自动跟随隔离:由于 pod 的 RUN_LABEL 由输出前缀派生,logs/log 和 logs/plog 也随之按镜像隔离,Python 与 shell 辅助函数零改动。legacy 布局与 full-test-npu.yml 保持不变。
  3. 修复 CANN 9.1.0 mix 套件的过期用例引用:nightly-test-npu.yml 中 glm_5_2 的测试用例从已删除的 test_npu_glm_5_2_w4a8_16p_gpqa.py 切换为现存的 test_npu_glm_5_2_w8a8_16p_gpqa.py,与 9.0.0 mix 套件保持一致,消除 The testcase does not exit 的启动即失败。
  4. 配套注释与自验证:在 python/sglang/test/ascend/e2e/test_npu_performance_utils.py 中为 DEEPSEEK_V4_FLASH_DEFAULT_MODEL_PATH 补充“a5 用例默认模型”注释;两个 stage 模板统一镜像 tag 追加逻辑的注释措辞。提交历史上可见作者曾临时裁剪 nightly job 以定向验证目录隔离效果,验证后回退。
  5. 测试与部署配套:不涉及模型或 kernel 代码,无推理路径变更,未新增单元测试;Accuracy 与 Speed 测试均不适用,CI 本身即验证手段。
文件 模块 状态 重要度
.github/workflows/_npu-single-node-test-stage.yml NPU CI modified 3.39
.github/workflows/nightly-test-npu-e2e-multi-node.yml NPU CI modified 3.39
.github/workflows/nightly-test-npu.yml NPU CI modified 3.13
python/sglang/test/ascend/e2e/test_npu_performance_utils.py 性能测试 modified 2.71

关键源码片段

.github/workflows/_npu-single-node-test-stage.yml infrastructure

单节点 nightly 的 stage 模板,新增镜像 tag 到持久化目录前缀的核心改动点之一,直接影响 NPU 单节点 nightly 的产物归因。

# 从镜像输入中提取 tag,丢弃 registry / repository 前缀
# 例如 "registry.example.com/sglang/sglang:cann9.0.0-a3" -> "cann9.0.0-a3"
image_label=$(echo "${{ inputs.image }}" | sed 's#.*[/:]##')
​
# 将 image_label 后缀追加到 workflow_name 段(而非新增一个路径段),
# 使同一工作流内 CANN 9.0.0 与 CANN 9.1.0、a3 与 a5 的运行
# 持久化到互不覆盖的目录;同时保持既有“按段数量解析”的消费者兼容
workflow_name="${workflow_name}--${image_label}"
.github/workflows/nightly-test-npu.yml infrastructure

修复 CANN 9.1.0 multi-node mix 套件引用已删除的 w4a8 用例,避免 job 启动即失败。

matrix:
  test_config:
    # 修复 CANN 9.1.0 multi-node mix 套件的过期引用:
    # 原 w4a8 用例文件已不存在,job 会以 "The testcase does not exit" 提前失败,
    # 现改用与 9.0.0 mix 套件一致的 w8a8 用例文件
    - name: glm_5_2_w8a8_16p_gpqa
      node_size: 2
      test_case: test/registered/npu/accuracy/glm5_2/test_npu_glm_5_2_w8a8_16p_gpqa.py
      test_type: 'accuracy'

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  • 目录命名变更的兼容性:任何按固定段数或固定格式解析持久化目录路径的下游脚本、看板或人工操作,需要适应 workflow_name--image_tag 的新命名;PR 用后缀而非新增段的方式刻意降低了这一风险,但仍存在未发现的硬编码解析器。
  • 镜像 tag 提取的健壮性:sed 's#.*[/:]##' 依赖镜像名含 / 或 : 分隔符;若未来某镜像 tag 不含这些分隔符或格式变化,提取结果可能为空或异常,导致命名异常甚至目录回归到互相覆盖。
  • 覆盖范围有限:legacy 布局与 full-test-npu.yml 未改动,若这些工作流也存在同样的双镜像覆盖问题,本次未覆盖。
  • 用例路径有效性:glm_5_2_w8a8_16p_gpqa 用例目前存在于仓库,但如果该用例在 CANN 9.1.0 环境下不可用,job 仍可能失败;不过它已是 9.0.0 mix 套件在用的现成用例,风险较低。

影响范围集中在 NPU nightly CI 基础设施:持久化目录前缀新增镜像 tag 后,logs/log、logs/plog 与 metrics 产物可按镜像(CANN 9.0.0/9.1.0、a3/a5)隔离归因,多节点 POC 套件(deepseek_v4_flash、glm_5_2、kimi_k3)不再互相覆盖。对团队运维而言,查看 nightly 结果时需要习惯带镜像 tag 的目录命名;对用户与推理路径无任何影响。整体影响程度低到中,属于 CI 可观测性与可靠性的常规改进。

artifacts 目录命名变更 镜像 tag 解析依赖 sed 仅覆盖 nightly 工作流

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论