cannbot-dsl:基于 CANNBot-DSL 的 Ascend NPU 复杂算子示例项目

基于 CANNBot-DSL 的 Ascend NPU 复杂算子示例集合。

分支1Tags0
文件最后提交记录最后更新时间
15 天前
3 天前
3 天前
4 天前
3 天前
4 天前
3 天前
19 天前
1 个月前
3 天前
1 个月前
1 个月前
3 天前
29 天前
23 天前
1 个月前

CANNBot-DSL

基于 CANNBot-DSL 的 Ascend NPU 复杂算子样例集合,配套完整的文档站与精度测试。

当前为尝鲜版本,CANNBot-DSL 的 API 接口不保证兼容性,后续版本可能发生变更。

📖 概述 · 💻 软硬件配套 · ⚡️ 快速上手 · 📦 算子列表 · 📚 文档导航 · 📂 目录结构 · 🔥 更新日志 · 📜 许可证


🔥 最新动态

2026-09-30

📌 概述

CANNBot 是 CANN 社区的 Infra 智能体层,用 Agent 完成 AscendC/PyPTO/TileLang/Triton 等各类语言的算子开发、模型迁移与推理优化,并延伸至图模式、Runtime 等更多 CANN 开发场景。

本仓(cannbot-dsl)是其 DSL 仓,提供 Agent 亲和的编程范式;仓群还包括 cannbot、cannbot-skills、cannbot-knowledge、cann-bench、cannbot-sentry 等仓库,结构如下。

CANNBot 仓群结构

💻 软硬件配套说明

维度 支持的版本
昇腾产品 Ascend 950PR / Ascend 950DT(NPU ARCH 3510),见硬件兼容性查询
CPU 架构 x86_64 / aarch64
操作系统 CANN 支持的 Linux 发行版,见硬件兼容性查询
Python 3.10、3.11、3.12
CANN 建议 9.2.0-beta.2,见 CANN 安装部署
CANNBot-DSL 0.7.0
torch 2.7.1 / 2.9.0 / 2.10.0 / 2.11.0 / 2.12.0

上表口径截至 2026-09-30。CANN 版本以 CANN 安装部署为准。

⚡️ 快速上手

1. 安装 CANN

版本要求见软硬件配套说明。CANN 软件包为 Linux 版本,分 x86_64 与 aarch64 两种架构,下文以 x86_64、CANN 9.2.0-beta.2 为例。

软件包可从 CANN 安装部署页面获取,也可直接从镜像 wget 下载(aarch64 机器把下面 URL 中的 x86_64 换成 aarch64):

CANN_BASE=https://ascend.devcloud.huaweicloud.com/artifactory/cann-run/software/9.2.0-beta.2/x86_64

wget ${CANN_BASE}/Ascend-cann-toolkit_9.2.0-beta.2_linux-x86_64.run
wget ${CANN_BASE}/Ascend-cann-950-ops_9.2.0-beta.2_linux-x86_64.run

${install_path} 为安装路径,默认 /usr/local/Ascend:

bash ./Ascend-cann-toolkit_9.2.0-beta.2_linux-x86_64.run --install --force --install-path=${install_path}
bash ./Ascend-cann-950-ops_9.2.0-beta.2_linux-x86_64.run --install --force --install-path=${install_path}

source ${install_path}/ascend-toolkit/set_env.sh

复现 DeepSeek V4.1 相关算子建议使用 CANN 9.2.0~weekly.20260909.01,包目录见 cann-run-mirror/software/legacy/20260909000323409。

2. 安装 CANNBot-DSL

CANNBot-DSL 以 whl 包发布,编译器后端已包含在包内,安装后即可使用,无需再从源码构建。发行包名为 cannbot-dsl,导入名为 cannbotdsl:

python -m pip install cannbot-dsl

安装完成后验证版本:

python -c 'import cannbotdsl; print(cannbotdsl.__version__)'

3. 运行一个算子

以 sparse_flash_attention 为例,BSND、BF16,每个 Query token 选取 TOPK 个逻辑 KV token:

import math
import torch
import torch_npu

from sparse_flash_attention import sparse_flash_attention

B, S1, S2, N1, N2 = 1, 2, 16, 8, 1
D, DR, TOPK = 512, 64, 8

query = torch.randn(B, S1, N1, D, dtype=torch.bfloat16).npu()
query_rope = torch.randn(B, S1, N1, DR, dtype=torch.bfloat16).npu()
key = torch.randn(B, S2, N2, D, dtype=torch.bfloat16).npu()
key_rope = torch.randn(B, S2, N2, DR, dtype=torch.bfloat16).npu()

sparse_indices = torch.tensor(
    [[[[0, 2, 4, 6, 8, 10, 12, 14]],
      [[1, 3, 5, 7, 9, 11, 13, 15]]]],
    dtype=torch.int32,
).npu()

output, softmax_max, softmax_sum = sparse_flash_attention(
    query=query,
    key=key,
    value=key,                 # MLA-absorb;当前 kernel 使用 key 参与 PV
    sparse_indices=sparse_indices,
    query_rope=query_rope,
    key_rope=key_rope,
    scale_value=1.0 / math.sqrt(D + DR),
    sparse_block_size=1,
    layout_query="BSND",
    layout_kv="BSND",
    sparse_mode=0,
    attention_mode=2,
    return_softmax_lse=True,
)

print("output", tuple(output.shape))
print("softmax_max", tuple(softmax_max.shape))
print("softmax_sum", tuple(softmax_sum.shape))

样例以目录为单位组织,运行前请切换到该样例所在目录,或把样例目录加入 PYTHONPATH:

cd samples/sparse_flash_attention
python3 your_script.py

运行成功时打印:

output (1, 2, 8, 512)
softmax_max (1, 1, 2, 8)
softmax_sum (1, 1, 2, 8)

各算子的接口参数、数据类型约束与返回值说明,见算子列表中对应样例的 README。

4. 运行精度测试

python3 -m pytest test/sparse_flash_attention/test_sparse_flash_attention.py -v

📦 算子列表

本仓算子持续合入中,当前已开源算子如下:

样例 接口 说明
matmul/matmul matmul() A16W16 矩阵乘,C[M,N] = A[M,K] × B[N,K]^T
matmul/matmul matmul_streamk() 同目录的 Stream-K(DPSK)实现,DP + SK 混合调度,适合小 M/N、大 K
matmul/batch_matmul batch_matmul() 批量矩阵乘,batch 维右对齐广播,支持 rank 2~6
matmul/quant_matmul npu_quant_matmul() MXFP8 / MXFP4 全量化矩阵乘(quant_batch_matmul_mx.py)
matmul/quant_matmul npu_quant_matmul() per-tensor(TT)量化矩阵乘,支持 HiFloat8 / INT8 / FP8(quant_batch_matmul_hif8_tt.py)
matmul/quant_matmul matmul_mix_quant() MXA8W4:MXFP8 激活 × MXFP4 权重(quant_batch_matmul_mxa8w4.py)
grouped_matmul group_matmul() 分组矩阵乘,支持 M 轴 / K 轴分组
flash_attn flash_attn()、flash_attn_metadata() Flash Attention,支持 GQA、变长序列与分页 KV Cache
flash_attn_fp8_fullquant flash_attn_fp8_fullquant() FP8 全量化 Attention,支持 GQA、分页 KV Cache 与 causal mask
sparse_flash_attention sparse_flash_attention() Sparse Flash Attention(SFA),按 sparse_indices 选取参与计算的 KV token
qwen_sparse_attn qwen_sparse_attn() 固定 block_size=128 的分块稀疏注意力,含 AICPU metadata 规划
flash_mla_with_kvcache flash_mla_with_kvcache()、flash_mla_with_kvcache_metadata() Flash MLA 推理,Q 为 TND、KV 走分页 cache
quant_block_sparse_attn quant_block_sparse_attn()、quant_block_sparse_attn_metadata() FP8 量化块稀疏注意力,面向分页 prefill
mixed_quant_sparse_flash_mla mixed_quant_sparse_flash_mla() 混合量化稀疏 MLA:BF16 Q + FP8 原始 KV + 可选 FP4 压缩 KV
mixed_quant_sparse_flash_mla_metadata mixed_quant_sparse_flash_mla_metadata() MQSMLA 的 AICPU 分核调度,输出整行 / FlashDecode 分片计划
flash_kda flash_kda()、flash_kda_metadata() Kimi Delta Attention prefill 融合算子,含 AICPU 调度 metadata
attn_prologue attn_prologue() MXFP8 的 QA/KV 投影、RMSNorm、QR 量化、QB 投影、RoPE 与 KV cache 写回
indexer_prologue_qw indexer_prologue_qw() MXFP8 Q GEMM、尾部 RoPE、MXFP4 量化,以及 BF16 W GEMM
indexer_prologue_k indexer_prologue_k() Indexer K 路前处理:BF16 投影、RMSNorm、RoPE、MXFP4 量化与分页 cache 写入
qsa_indexer qsa_indexer()、qsa_indexer_metadata() 压缩 Key 稀疏索引,选高分压缩块并展开为 token 索引
stem_indexer stem_indexer()、stem_indexer_metadata() 块级特征打分 + 动态 TopK 选择 Key Block
quant_lightning_indexer_dsl quant_lightning_indexer() MXFP4 Lightning Indexer(QLI),遍历上下文选 TopK token
quant_lightning_indexer_metadata_dsl quant_lightning_indexer_metadata() QLI 配套的 AICPU 调度算子
quant_sparse_lightning_indexer_dsl quant_sparse_lightning_indexer() MXFP4 Sparse Lightning Indexer(QSLI),仅访问候选 Key 块
quant_sparse_lightning_indexer_metadata_dsl quant_sparse_lightning_indexer_metadata() QSLI 配套的 AICPU 调度算子
kv_compress_epilog kv_compress_epilog() KV Cache 量化压缩与按槽位原地更新
rms_norm rms_norm() RMSNorm,y = x · rstd · γ
engram_gate engram_gate() Engram 残差门:双路 RMS、加权点积与 signed-sqrt sigmoid 门控
pointnet_sa pointnet_sa() PointNet++ SA 层的 shared MLP + max-pool
voxel_conv voxel_conv() VoxelNet Convolutional Middle Layers

📚 文档导航

接口文档发布在文档站 https://cannbot-dsl.gitcode.com/api/;算子样例、测试与仓库结构不另设站点页面,直接阅读仓内文件。

内容 说明 入口
API 总览 Host / Kernel / AI CPU 三类公共接口,以及 AOT 编译与 Native 算子包发布 /api/
Host API 数据描述(TensorSpec / TensorListSpec / Dim)与平台信息接口 /api/host/
Kernel API 类型与视图、控制流、数据搬运、Cube 与寄存器计算、同步与缓存、系统变量 /api/kernel/
AI CPU API AI CPU 侧调度接口 /api/aicpu/
装饰器 @host、@jit、@kernel 等六个装饰器说明 /api/decorators.html
接口清单 全部接口的索引 /api/api-list.html
算子样例 各样例目录下的 README:接口签名、数据类型约束与运行方式 samples/
精度测试 与样例一一对应的 pytest 用例 test/
Native 打包 把 samples/ 下的算子编译打包为 Native wheel net/native_package/README.md
更新日志 版本与算子变更记录 CHANGELOG.md

📂 目录结构

关键目录如下,详细目录参见仓库结构。

cannbot-dsl/
├── docs/          # 文档站源码(VitePress)
├── samples/       # 算子样例及各自的 README
├── test/          # 与样例对应的测试代码
├── figures/       # 样例 README 使用的性能对比图
├── net/           # Native 算子编译与 wheel 打包
└── scripts/       # CI 与合规检查脚本

📝 相关信息


欢迎通过 Issue 与合并请求参与项目建设。问题反馈与交流请使用 GitCode 仓库的 Issues 与 Discussions。

项目介绍

基于 CANNBot-DSL 的 Ascend NPU 复杂算子示例集合。

定制我的领域