已合并
chore(docker): 评测镜像默认升到 CANN 9.1.0, 并让报告的 docker 字段属实 #270
Xinxian Chen创建于 8月17日
chore(docker): 评测镜像默认升到 CANN 9.1.0, 并让报告的 docker 字段属实 #270
已合并
Xinxian Chen创建于 8月17日
Xinxian Chen
Xinxian Chen成员
8月17日

PR功能描述 / 为什么需要这个合入**:

镜像的默认 CANN 版本一直停在 9.0.1,而 CI 流水线的评测 pod 和 q7 都已经在跑 9.1.0 —— 也就是说"评测镜像"和"实际跑 ST 的地方"不是同一个 CANN。

!239(标题带 9.1.0)做的是"让 9.1.0 可用":删掉 docker/eval 里硬编码的版本与 ops URL,改成从 base 继承 + 可推导,并核实了四个 .run 都在。默认值本身没在那次的改动范围内,ARG CANN_VERSION=9.0.1 从 718a75d 建立起就没动过。

docker/dev 的情况更直接:它的默认基础镜像 ascendhub/cann:9.0.0-910b-ubuntu22.04-py3.12 已经从 AscendHub 下架(2026-08-17 docker manifest inspect 核实:no such manifest),按默认值已经建不出镜像了。

该PR关联的issue

无关联 issue。

希望检视人员了解:

torch_npu 必须跟着一起动,不动才是脱表。 查官方配套表后发现:torch_npu 2.10 这条线只配 CANN 9.1.0(2.10.0.post4 ↔ torch 2.10.0 ↔ CANN 9.1.0),表里没有 9.0.1 这一行,而此前钉的 2.10.0.post2 在任何 CANN 版本下都不在表内。所以本 PR 是把这个组合第一次放进官方配套表,不是让它离开。docker/base/Dockerfile 顶部那句注释也一并更正了 —— 它原本写着 "torch_npu 2.10.0.post2 ↔ CANN 9.0.x",没有依据。

报告里的 docker 字段此前在说谎。 _detect_docker() 硬编码返回 "cake-ci / CANN 9.0.0"(源码里自己标着 TODO)。镜像换代、CANN 升到 9.1.0 之后这行字仍原样出现在每一份报告里 —— 一份真实产出的报告同时写着 environment.cann = 9.1.0 和 Docker = cake-ci / CANN 9.0.0,读的人无从判断哪个可信。现在改为三级取值:镜像注入的 CANN_BENCH_IMAGE(docker/eval/build.sh 把自己的 tag 传进去)→ 容器内但未注入时返回 "container" → 不在容器里返回 None。CANN 版本一律取实际探测值,与 environment.cann 同源,不会再自相矛盾。该字段此前没有任何测试,这次补了 6 个。

docker/dev 的 -devel 提成了 ARG 而不是写死。 AscendHub 的 tag 多了一段 variant 后缀,带编译工具链的是 -devel;评测要编译提交,必须用它。核实过的取值(docker manifest inspect,2026-08-17):CANN_VERSION 9.0.1 / 9.1.0 存在,9.0.0 已下架,9.2.0 未发布;DEVICE 910 / 910b / 950 / a3 / 310p 存在,910c 不存在(旧注释写错了);9.1.0 的 910b 与 950 的 -devel 均为 arm64 + amd64 双架构。README 里加了一句提醒:上游 tag 会下架,换版本前先 manifest inspect —— 这次就是没人查,默认值悄悄失效了。

根 uv.lock 顺带补上了 build。 它列在根 pyproject.toml 的依赖里,但旧 lock 中没有,已经陈旧;这次重锁时被带出来了。

已知的、本 PR 没有处理的: docker/base/uv.lock 与 docker/eval/uv.lock 之间 filelock 和 fsspec 两个包版本不一致(3.29.7/3.32.0、2026.6.0/2026.7.0)。这个漂移在改动前就存在,重锁前后完全一致,故未在本 PR 中处理。

改动类型 / Change Type

测试信息 / Testing

UT —— 1172 passed(mac / CPU-only)。新增 tests/ut/test_setup_info.py 6 个用例覆盖 docker 字段的三条取值路径;退回改动前 6 个全部失败(3 fail + 3 error)。另有 6 个 auto_pipeline 进程树用例在 mac 上先前就失败,与本改动无关。

实机(q7 / 910B2 / aarch64) —— 用本分支的 lock 重建 docker/base 镜像成功,容器内实测:

CANN_VERSION (ENV) = 9.1.0
torch              = 2.10.0+cpu
torch_npu          = 2.10.0.post4
NPU 可用           = True | 卡数 1
H2D/D2H            = [0.0, 2.0, 4.0, 6.0]

反作弊姿态保持:docker/base 仍是 toolkit-only(无 ops → 无 libopapi),容器内 torch.matmul 在 NPU 上失败,即内置算子仍不可达。(实测报错为 SetPrecisionMode:...LazyInitAclops NPU function error;与 docker/eval 文档记录的 561103 症状不同,本 PR 未深究该差异,只确认姿态未被升级破坏。)

改后的 docker 字段实机实测:

裸镜像(未注入)  docker = container / CANN 9.1.0
注入 tag 后      docker = cann-bench-eval:1.0.0-ascend910b-aarch64-opsnone / CANN 9.1.0

未做的: docker/eval 镜像本身没有在本分支上重建过(9.1.0 的 eval 层此前由 !239 验证过,本 PR 只改默认值);docker/dev 未重建(其 torch/torch_npu 由 AscendHub 基础镜像自带,本仓库不钉,故无 lock 改动)。

检查清单 / Checklist

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 Xinxian Chen 的贡献)
Xinxian ChenXinxian Chen成员
8月17日 创建了 pull request,commit b333fe4b
atomgit-bot
atomgit-bot
8月17日 评论:

变更摘要

本 PR 主要将评测/开发镜像的默认 CANN 版本从 9.0.1(docker/dev 为已下架的 9.0.0)统一提升到 9.1.0,并把 torch_npu 同步从 2.10.0.post2 升级为与 CANN 9.1.0 配套的 2.10.0.post4。同时修正了报告中 docker 字段长期硬编码为 "cake-ci / CANN 9.0.0" 的问题,改为由镜像注入的 CANN_BENCH_IMAGE、容器探测与真实 CANN 探测值共同决定,使报告字段与实际运行环境一致,并补充了对应单元测试。

主要改动

  • 默认 CANN 版本升至 9.1.0:docker/base/Dockerfile 的 ARG CANN_VERSION、docker/eval/Dockerfile 的 BASE_IMAGE、docker/eval/build.sh 的 CANN_VERSION 及 docker/dev/Dockerfile 的 ARG CANN_VERSION 均由旧版本改为 9.1.0,相应 run.sh 中的默认镜像 tag 也同步更新。
  • torch_npu 升级到 2.10.0.post4:docker/base/pyproject.toml、docker/eval/pyproject.toml 和根 pyproject.toml 将 torch-npu==2.10.0.post2(根为 2.10.0)改为 2.10.0.post4,以匹配官方配套表中 torch_npu 2.10 仅对应 CANN 9.1.0 的关系。
  • docker 报告字段改为真实取值:setup_info.py 中的 _detect_docker() 不再硬编码,新增 _in_container() 后按 CANN_BENCH_IMAGE 环境变量 → 容器内回退 "container" → 裸机返回 None 三级取值,CANN 版本统一取自 _get_cann_version()。
  • 构建流程注入镜像标识:docker/eval/build.sh 新增 --build-arg "CANN_BENCH_IMAGE=${IMAGE}",docker/eval/Dockerfile 新增 ARG CANN_BENCH_IMAGE 与对应 ENV,使报告能显示实际产出镜像的 tag;report_template.html 中的示例值也同步更新。
  • docker/dev 镜像参数与文档修正:新增 ARG VARIANT=devel 并把基础镜像改为 cann:${CANN_VERSION}-${DEVICE}-ubuntu22.04-py3.12-${VARIANT},同时更正了可用 DEVICE、CANN_VERSION 取值及镜像 tag 格式的注释;新增 tests/ut/test_setup_info.py 覆盖 docker 字段的三条取值路径。
likedislike
不准确?
atomgit-bot
atomgit-bot
8月17日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
8月17日 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
8月17日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
8月17日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/cann-bench ✅ Deng_Pan, gxj1123 (2/2) ✅ Deng_Pan (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

vINyLogY, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
Xinxian Chen
Xinxian Chen成员
8月18日 评论:

compile

likedislike
Xinxian ChenXinxian Chen成员
8月18日 预合并成功(commit_id: 149f5a6a554e99e3ed286102194340b968c0ab71)
Xinxian ChenXinxian Chen成员
8月18日 修改标题为 “chore(docker): 评测镜像默认升到 CANN 9.1.0, 并让报告的 docker 字段属实”,原标题为“chore(docker): 评测镜像默认升到 CANN 9.1.0, 并让报告的 docker 字段说实话”
Xinxian Chen
Xinxian Chen成员
8月18日 评论:

compile

likedislike
CANN-robotCANN-robot成员
8月18日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
8月18日 评论:

流水线任务触发成功
任务链接 [716e5b3584814328a06c92731e4d76f1][流水线指导]

任务名称状态日志下载链接
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
Check_Pr ✅ SUCCESS >>>>>
codecheck_style ✅ SUCCESS >>>>>
pre-commit ✅ SUCCESS
UT_Test ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>
PreSmoke_A900 ✅ SUCCESS >>>>>

[2026-08-18 15:29:52]    CI执行结束

likedislike
CANN-robotCANN-robot成员
8月18日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
8月18日 添加了label:ci-pipeline-passed
Deng Pan
Deng Pan成员
8月20日 评论:

这里还有一个版本配套问题需要修正:

docker/dev/Dockerfile:20-24 说明 CANN 9.1.0 对应 torch_npu 2.10.0.post4,并声明基础镜像已自带 torch/torch_npu、此处不再钉版本;但 docker/dev/Dockerfile:69-70 实际仍会执行:

RUN uv pip install --system --no-deps --index-url https://download.pytorch.org/whl/cpu torch==2.10.0
RUN uv pip install --system --no-deps --index-url ${PYPI_INDEX_URL:-https://mirrors.huaweicloud.com/repository/pypi/simple/} torch_npu==2.10.0

torch_npu==2.10.0 是精确版本约束,不会匹配 2.10.0.post4,而且会覆盖基础镜像中的配套版本。因此默认 docker/dev 构建产物与本 PR 的兼容性说明不一致,并可能重新引入 CANN/torch_npu ABI 配套风险。

建议二选一:

  1. 按注释所述,删除这里对 torch/torch_npu 的覆盖安装,直接使用基础镜像自带版本,并在 test_env.py 中校验实际版本;或
  2. 如果确实需要显式安装,则改为官方配套的精确版本(例如本 PR 引用的 torch_npu==2.10.0.post4),并同步说明与版本 smoke test。

修复后建议实际构建默认 docker/dev 镜像,并回读 torch.__version__、torch_npu.__version__ 与 CANN 版本,避免只验证 Dockerfile 文本。

likedislike
su-yueming成员8月20日进行代码检视3
docker/base/README.md
已过期
@@ -67,2 +66,4 @@
66+CANN_VERSION=9.0.1 NPU_ARCH=ascend950 bash ../eval/build.sh
6767```
6868 
69+**回退到 9.0.1 时 `torch_npu` 也要一起退**(见下面的配套表):`docker/base/pyproject.toml` 与
su-yueming8月20日评论:

[P1] 请修正这条回退配套说明。 这里建议把 CANN 9.0.1 与 torch_npu==2.10.0.post2 作为回退组合,并称否则才“表外”;但本文件下文及官方配套表都明确:2.10 系列只有 2.10.0.post4 ↔ CANN 9.1.0,post2/9.0.1 本身就是表外。照此操作会把运维回退到本 PR 正在修复的非官方组合。请删除或改写该回退方案;若必须保留,应明确它仅是历史、非官方支持组合,并补充经过验证的回退路径。

likedislike
System
系统消息系统
8月24日 评论:

changed this line on 0d329e27 view diff detail

Xinxian Chen
Xinxian Chen成员
8月24日 评论:

已删除

su-yueming成员8月20日进行代码检视3
docs/design/report_design.md
已过期
@@ -235,3 +235,3 @@
235235│ os ← platform.platform() │
236-│ docker ← "cake-ci / CANN 9.0.0" │
236+│ docker ← $CANN_BENCH_IMAGE + 实测 CANN 版本 │
237237│ (硬编码,后续改软编码) │
su-yueming8月20日评论:

[P3] 删除已经过时的“硬编码”说明。 上一行已改成 $CANN_BENCH_IMAGE + 实测 CANN 版本,实现也已改为动态取值;保留“硬编码,后续改软编码”会让设计文档再次自相矛盾。

likedislike
System
系统消息系统
8月24日 评论:

changed this line on 0d329e27 view diff detail

Xinxian Chen
Xinxian Chen成员
8月24日 评论:

删掉了 docs/design/report_design.md 的 (硬编码,后续改软编码)。

Xinxian ChenXinxian Chen成员
8月24日 预合并成功(commit_id: 98f2ef7d415cf64aeb16ee8ac0cadcf0189b4d84)
Xinxian ChenXinxian Chen成员
8月24日 推送  1 个提交:0d329e27-fix(docker): dev 镜像的 torch 栈按配套表钉 post4, 并清掉三处过时说明
Xinxian ChenXinxian Chen成员
8月24日 预合并成功(commit_id: 8630ca22458769583003efcbeccfd8784103126a)
CANN-robotCANN-robot成员
8月24日 删除了label:cann-cla/yes
CANN-robotCANN-robot成员
8月24日 删除了label:ci-pipeline-passed
CANN-robot
CANN-robot成员
8月24日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): ci-pipeline-passed.

likedislike
CANN-robotCANN-robot成员
8月24日 添加了label:cann-cla/yes
Xinxian Chen
Xinxian Chen成员
8月24日 评论:

三条评审意见都已修,commit 0d329e27。

@Deng_Pan — docker/dev 的 torch/torch_npu 配套

判断对:头注释("torch/torch_npu 由基础镜像自带,不在此处钉")与 docker/dev/Dockerfile:69-70 的 torch==2.10.0 / torch_npu==2.10.0 自相矛盾。错的是注释。

按你的建议先去核实底座到底带不带 —— 拉下默认基础镜像 ascendhub/cann:9.1.0-910b-ubuntu22.04-py3.12-devel(linux/arm64)实跑:

Python 3.12.13
python3 -c 'import torch'      -> ModuleNotFoundError: No module named 'torch'
python3 -c 'import torch_npu'  -> ModuleNotFoundError: No module named 'torch_npu'
pip list | grep -c '^torch'    -> 0

底座一个 torch 分发都没有(另一个已在本地的 cann:9.1.0-beta.3-950-ubuntu22.04-py3.11 同样为 0)。所以建议 1(删掉覆盖安装、用底座自带)会直接产出一个没有 torch 的镜像,走的是建议 2:

  • TORCH_VERSION=2.10.0 / TORCH_NPU_VERSION=2.10.0.post4 提成 ARG,两条 uv pip install 改用它们;
  • 两个值落到 ENV CANN_BENCH_TORCH_VERSION / CANN_BENCH_TORCH_NPU_VERSION;
  • test_env.py 的 [1] 回读实际装到的分发版本与 ENV 比对,不一致即 FAIL。用 importlib.metadata.version() 而不是 __version__,因为 pin 作用在分发版本上;+cpu 这类 local label 不属于配套关系,比对前剥掉。

这样"文本"和"产物"就被一条硬断言绑住了:钉错、或被上游覆盖成别的串号,run.sh smoke 直接红。

按你说的"避免只验证 Dockerfile 文本",实际建了默认镜像(原生 linux/arm64,BUILD_EXIT=0)并回读:

ENV pins:  CANN_BENCH_TORCH_VERSION=2.10.0  CANN_BENCH_TORCH_NPU_VERSION=2.10.0.post4
installed: torch 2.10.0+cpu | torch-npu 2.10.0.post4
CANN:      Version=9.1.0

即落在官方配套表 9.1.0 的那一行。

一处如实说明:构建这台是 mac,没有 NPU 驱动,import torch_npu 在这里必然失败(ImportError: libascend_hal.so,/usr/local/Ascend/driver 目录不存在),因此 test_env.py 的 [1]-[3] 没法在此跑完 —— 上面那组数是绕开 import、直接读分发版本与 ENV 得到的。完整 smoke 仍需在 NPU 机器上补一次。

@su-yueming [P1] — 回退配套说明

删掉了。docker/base/README.md 里"回退到 9.0.1 时把 torch_npu 改回 2.10.0.post2"整段移除,换成中性的一句:换版本时按官方配套表重新选串号、重新 uv lock,表里没有对应行的 CANN 版本不要用。同一节上面的 换 CANN 版本 示例原本正好拿 9.0.1 举例,一并换成 <版本> 占位符,免得删了正文又留一个变相推荐。

@su-yueming [P3] — 过时的"硬编码"说明

删掉了 docs/design/report_design.md 的 (硬编码,后续改软编码)。顺带:上一行改成 docker ← $CANN_BENCH_IMAGE + 实测 CANN 版本 之后已经撑破 ASCII 框,拆成两行对齐;同一个框里 framework / license 两行本来就各差一格(改动前就有),一并补齐。

另一处同源的陈旧文本

docker/eval/README.md 「已知取舍」里"底座的 torch_npu==2.10.0.post2 与仓库 pyproject.toml 钉的 2.10.0 不是同一串号,沿用底座的 post2"—— 本 PR 之后三处 pyproject.toml 都是 2.10.0.post4,这条取舍已不存在,删除。

likedislike
Xinxian Chen
Xinxian Chen成员
8月24日 评论:

compile

likedislike
Xinxian ChenXinxian Chen成员
8月24日 预合并成功(commit_id: 1af334f6f08329a54b4d8690ff32e07b3be9df95)
CANN-robotCANN-robot成员
8月24日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
8月24日 评论:

流水线任务触发成功
任务链接 [090d798efc7d43db9ca9359feb4683ef][流水线指导]

任务名称状态日志下载链接
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
Check_Pr ✅ SUCCESS >>>>>
codecheck_style ✅ SUCCESS >>>>>
pre-commit ✅ SUCCESS
UT_Test ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>
PreSmoke_A900 ✅ SUCCESS >>>>>

[2026-08-24 10:08:23]    CI执行结束

likedislike
CANN-robotCANN-robot成员
8月24日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
8月24日 添加了label:ci-pipeline-passed
Xinxian Chen
Xinxian Chen成员
8月24日 评论:

@Deng_Pan 补上 NPU 实机复验。上一条那组数是在 mac 上跑的(没有驱动,import torch_npu 挂在 libascend_hal.so,[1]-[3] 跑不完)。现在在 q7(910B2 / aarch64 / driver 25.5.1 / npu-smi 25.5.1)上,按默认参数重建了 docker/dev 并跑完整 smoke:

$ docker build -t cann-bench:cann9.1.0-910b-latest .     # 不带任何 build-arg
Successfully tagged cann-bench:cann9.1.0-910b-latest

$ bash run.sh smoke
[OK]   [1] python 3.12.13, torch 2.10.0+cpu, torch_npu 2.10.0.post4
[OK]   [2] torch_npu.npu.device_count() = 8
[OK]   [3] npu-smi reachable
[OK]   [4] CANN compiler Version=9.1.0
[SKIP] [5] Triton-Ascend not requested for this image

ALL CHECKS PASSED

即 CANN 9.1.0 <-> torch 2.10.0 <-> torch_npu 2.10.0.post4,正是官方配套表那一行;[1] 的新断言在实机上通过。

新断言不是摆设 —— 同一个镜像,只把 ENV 改成表外的 post2,[1] 立刻红、退出码 1:

$ docker run ... -e CANN_BENCH_TORCH_NPU_VERSION=2.10.0.post2 ... python3 /test_env.py
[FAIL] [1] import/version: torch-npu 2.10.0.post4, image pins 2.10.0.post2
[OK]   [2] torch_npu.npu.device_count() = 8
[OK]   [3] npu-smi reachable
[OK]   [4] CANN compiler Version=9.1.0
FAILED: [1]

也就是说:以后谁把 Dockerfile 里的串号改错、或上游把版本换掉,run.sh smoke 会直接拦下来,不再是靠注释约束。

另外"AscendHub 底座不带 torch"这条在 q7 上又多了两个样本,连同之前两个,四个 ascendhub/cann:* 镜像的 pip list | grep -c '^torch' 全是 0:

镜像 tag torch 分发数
9.1.0-910b-ubuntu22.04-py3.12-devel(本 PR 默认) 0
9.1.0-beta.1-910b-ubuntu22.04-py3.12-devel 0
9.1.0-beta.3-950-ubuntu22.04-py3.11 0
9.0.1-910b-ubuntu22.04-py3.12 0

所以走"显式安装 + 钉配套串号"这条是必须的,建议里的方案 1 会产出一个没有 torch 的镜像。

likedislike
Xinxian Chen
Xinxian Chen成员
8月24日 评论:

complie

likedislike
Xinxian ChenXinxian Chen成员
8月24日 解决了最后一个问题
Deng Pan
Deng Pan成员
8月24日 评论:

/approve
/lgtm

likedislike
CANN-robotCANN-robot成员
8月24日 添加了label:approved
gxj1123成员
8月27日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
8月27日 添加了label:lgtm
CANN-robotCANN-robot成员
8月27日 合入了pull request