跳到主要内容
TileLang 系统教程

tilelang-tutorial.huandu.me

第 26 章 运行时、JIT、ABI 与框架集成

/code/26-runtime-jit-abi/

06-ascend-aclgraph/README.md1526 字节
# 示例 6:把两个 TileLang kernel 装进昇腾 ACLGraph

## 目的

正文「启动开销与执行模型」一节说明:一批小算子按 eager 逐条下发时,host 侧
(Python → C++、Tiling、申请 workspace、Launch)的耗时可能盖过 device 上的执行时间,
这就是 host-bound;把下发序列捕获成一张图、之后只做图回放,是绕开它的标准做法。
在昇腾上这个机制叫 ACLGraph,用 `torch.npu.NPUGraph` 暴露。

本示例按官方示例
`_vendor/tilelang-ascend-v0.1.2.000/examples/aclgraph/rms_rope_aclgraph.py`
的形态写了一遍最小版本:定义 RMS Norm 算子 → 捕获 → 回放 → 对答案。

## 运行前提

* 昇腾 950(或兼容)设备一台;
* CANN 已安装并 `source set_env.sh`;
* `torch` + `torch_npu` 可用,`torch.npu.is_available()` 为真;
* 昇腾版 `tilelang`(`tilelang-ascend`,锁定版本 `v0.1.2.000-release`)。

## 运行命令

```bash
cd chapters/26-runtime-jit-abi/code/06-ascend-aclgraph
python3 aclgraph_capture.py
```

## 期望输出

```text
replayed shape: (1024, 512) dtype: torch.float16
matches reference: True
```

## 正确性判据

* 捕获阶段不报错(捕获期间算子只被记录、不执行);
* `graph.replay()` 之后 `sink` 与 `out + out` 在 `atol=1e-2, rtol=1e-2` 内相等;
* 想进一步确认图模式真的生效:按上游 README 的做法打开 host 日志
  (`ASCEND_GLOBAL_LOG_LEVEL=1` 等),在日志里搜 `capture model`,
  `0` = 未启用、`1` = 已启用。

## 已知限制(来自官方 README)

* 捕获期间的操作**不会立即执行**,只在 `replay()` 时执行;
* 回放会把同一段计算重复执行,所以输入张量的地址必须在捕获期间固定下来——
  想换输入要配合静态输入缓冲(上游示例用的是原地算子 + 复用同一块显存);
* 官方 README 建议把 `TL_ASCEND_AUTO_SYNC` / `TL_ASCEND_MEMORY_PLANNING` /
  `TL_ASCEND_AUTO_CV_SYNC` / `TL_ASCEND_AUTO_CV_COMBINE` 一起打开,
  让同步与内存规划在编译期定好,避免图内出现 host 侧分支。

## 作者实际做到的验证级别

**仅静态核对**:`python3 -m py_compile` 通过;kernel 主体与官方示例
`examples/aclgraph/rms_rope_aclgraph.py:21-59` 逐行比对(只删了第二个算子和
形状簿记);`torch.npu.NPUGraph()` / `torch.npu.graph(...)` 与官方示例
`:271-272` 一致。本机无昇腾 NPU,**未运行**。

← 浏览本章全部代码