Pull Request已成功合入, 合并人@CANN-robot
(感谢 Xinxian Chen 的贡献)变更摘要
本 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字段的三条取值路径。


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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


compile


compile


流水线任务触发成功
任务链接 [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执行结束


这里还有一个版本配套问题需要修正:
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 配套风险。
建议二选一:
- 按注释所述,删除这里对 torch/torch_npu 的覆盖安装,直接使用基础镜像自带版本,并在
test_env.py中校验实际版本;或 - 如果确实需要显式安装,则改为官方配套的精确版本(例如本 PR 引用的
torch_npu==2.10.0.post4),并同步说明与版本 smoke test。
修复后建议实际构建默认 docker/dev 镜像,并回读 torch.__version__、torch_npu.__version__ 与 CANN 版本,避免只验证 Dockerfile 文本。


[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 正在修复的非官方组合。请删除或改写该回退方案;若必须保留,应明确它仅是历史、非官方支持组合,并补充经过验证的回退路径。


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


changed this line on 0d329e27 view diff detail
三条评审意见都已修,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,这条取舍已不存在,删除。


compile


流水线任务触发成功
任务链接 [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执行结束


@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 的镜像。


complie


/approve
/lgtm


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-17docker manifest inspect核实:no such manifest),按默认值已经建不出镜像了。该PR关联的issue
无关联 issue。
希望检视人员了解:
torch_npu 必须跟着一起动,不动才是脱表。 查官方配套表后发现:torch_npu 2.10 这条线只配 CANN 9.1.0(
2.10.0.post4↔ torch2.10.0↔ CANN9.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_VERSION9.0.1 / 9.1.0 存在,9.0.0 已下架,9.2.0 未发布;DEVICE910 / 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.py6 个用例覆盖docker字段的三条取值路径;退回改动前 6 个全部失败(3 fail + 3 error)。另有 6 个auto_pipeline进程树用例在 mac 上先前就失败,与本改动无关。实机(q7 / 910B2 / aarch64) —— 用本分支的 lock 重建
docker/base镜像成功,容器内实测:反作弊姿态保持:
docker/base仍是 toolkit-only(无 ops → 无libopapi),容器内torch.matmul在 NPU 上失败,即内置算子仍不可达。(实测报错为SetPrecisionMode:...LazyInitAclops NPU function error;与docker/eval文档记录的561103症状不同,本 PR 未深究该差异,只确认姿态未被升级破坏。)改后的
docker字段实机实测:未做的:
docker/eval镜像本身没有在本分支上重建过(9.1.0 的 eval 层此前由 !239 验证过,本 PR 只改默认值);docker/dev未重建(其 torch/torch_npu 由 AscendHub 基础镜像自带,本仓库不钉,故无 lock 改动)。检查清单 / Checklist