Triton-Ascend 快速验证

这份文档面向不熟悉算子开发、但需要确认 CANN Bench 能否运行 Triton 算子的开发者。

它是怎么工作的

Triton 算子仍然提交为普通的 cann_bench Python wheel:

cann_bench.exp(x)
  -> Python wrapper 分配输出 Tensor
  -> _exp_kernel[grid](...) 首次特化时按需 JIT,后续复用缓存
  -> kernel 在 Ascend NPU 上执行
  -> CANN Bench 对比 Golden 并采集 Profiler 数据

CANN Bench 不需要另一套 Triton runner。评测镜像负责提供与 CANN 匹配的 Triton-Ascend 编译器和运行时。完整调用链和源码见 CANN Bench Triton-Ascend 集成实现与运行原理

1. 构建环境

推荐直接使用 CANN 9.0.0 正式版镜像,不要把 Triton-Ascend 3.2.1 与其他 CANN beta 版本混用。

cd docker/dev
docker build --network=host \
  --build-arg CANN_VERSION=9.0.0 \
  --build-arg DEVICE=950 \
  --build-arg TRITON_ASCEND_VERSION=3.2.1 \
  -t cann-bench:cann9.0.0-950-triton3.2.1 .

910B 环境把 DEVICE=950 改成 DEVICE=910b

2. 运行环境 Smoke

IMAGE=cann-bench:cann9.0.0-950-triton3.2.1 bash run.sh smoke

这个 smoke 不只检查 import。它会真实 JIT 编译并运行一个 vector add。成功时应看到:

[OK]   [5] triton-ascend 3.2.1, target=..., vector add passed
ALL CHECKS PASSED

3. 运行示例 Exp

从仓库根目录先跑一个精度 case:

./scripts/run_evaluation.sh \
  --bench-name cann \
  --source-dir examples/triton_ascend_cann_example \
  --task-dir tasks/level1/exp \
  --operator Exp \
  --case-id 1 \
  --device-id 0 \
  --processes-per-card 1 \
  --no-perf

成功标志:

扫描到的 cann_bench 接口:
  1. exp(...)

level1/exp_1: ... float16[y]: ... MERE=0.000000, MARE=0.000000

然后启用性能采集:

./scripts/run_evaluation.sh \
  --bench-name cann \
  --source-dir examples/triton_ascend_cann_example \
  --task-dir tasks/level1/exp \
  --operator Exp \
  --case-id 1 \
  --device-id 0 \
  --processes-per-card 1 \
  --warmup 3 \
  --repeat 5

成功标志是精度通过且耗时不是 N/A。Profiler 归档中的 kernel_details.csv 应包含 _exp_kernel

4. 本地 Python 环境

不用 Docker 时,可以在独立虚拟环境中安装可选依赖:

python3 -m venv --system-site-packages .venv
.venv/bin/python -m pip install -r requirements-triton.txt

确认实际加载的是 NPU backend:

.venv/bin/python -c \
  'from triton.runtime import driver; print(driver.active.get_current_target())'

输出中的 backend 必须为 npu

5. 常见失败

只 import 成功,但 kernel 编译失败

Triton-Ascend wheel 包含 NPU-IR 编译组件。CANN 和 Triton-Ascend 不匹配时, 可能在 bishengir-compilebisheng 阶段失败。先确认使用的是 CANN 9.0.0 正式版和 Triton-Ascend 3.2.1,再检查镜像 smoke,不要把 import 成功当作环境通过。

扫描出不属于提交的旧算子

检查日志中的安装位置,应该指向当前 Python 环境中的新 wheel。CANN Bench 使用 --force-reinstall --no-deps 安装 submission,避免同为 cann_bench==1.0.0 时 被旧包遮蔽。

精度通过,但耗时是 N/A

--no-perf 模式本来就不会采集耗时。去掉该参数后再运行,并检查报告目录下的 prof_data/.../kernel_details.csv 是否存在候选 Triton kernel。