2. 算子开发环境搭建

说实话,环境搭建这件事,看着简单,但坑是真不少。我见过太多人卡在第一步——装好了却跑不起来,最后发现是环境变量配错了。这一章,我就带你一步步把CANN开发套件装好、配好、验证通过。跟着我的节奏来,别跳步。

① 安装CANN套件 昇腾AI驱动 + 开发包 ② 配置环境变量 set_env.sh / 手动export ③ 验证开发环境 msprof / 编译demo 环境搭建三步走 · 缺一不可 安装 → 配置 → 验证,形成闭环 💡 建议顺序执行

2.1 安装CANN开发套件

先说说版本。我习惯用 CANN 7.0.0 及以上,因为对自定义算子更友好。你可以在昇腾社区下载 昇腾AI驱动 和 CANN开发套件。注意,驱动和CANN版本要匹配,不然会报一些奇奇怪怪的错。

⚠️ 我曾经踩过的坑: 驱动版本比CANN低一个补丁号,结果编译出来的算子跑在NPU上直接core dump。后来老老实实对照版本表,再也不敢混搭。

安装步骤大致如下(以root或sudo执行):

  1. 安装昇腾AI驱动:./Ascend310-driver-xxx.run --full
  2. 安装CANN开发套件:./Ascend-cann-toolkit_xxx.run --install
  3. 默认安装路径在 /usr/local/Ascend 或 /home/HwHiAiUser/Ascend

我个人建议装在默认路径,后面环境变量省心很多。如果你非要改路径,记得把后续所有 ASCEND_HOME 指向正确位置。

2.2 配置环境变量

装完只是第一步。环境变量配不对,编译器根本找不到头文件和库。你想想看,你写了个自定义算子,一编译说找不到 register.h,多扫兴。

我一般会在 ~/.bashrc 里加一段,或者每次开终端先 source 官方提供的 set_env.sh:

# 推荐方式:直接 source 官方脚本
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# 或者手动设置核心变量(以CANN 7.0为例)
export ASCEND_HOME=/usr/local/Ascend/ascend-toolkit/latest
export PATH=$ASCEND_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ASCEND_HOME/lib64:$LD_LIBRARY_PATH
export PYTHONPATH=$ASCEND_HOME/python/site-packages:$PYTHONPATH
export ASCEND_DEVICE_ID=0
💡 小技巧: 把 source set_env.sh 写到 ~/.bashrc 末尾,这样每次登录自动加载。但如果你同时有多个CANN版本,建议手动source,避免冲突。

另外,ASCEND_DEVICE_ID 指定默认的NPU设备号。如果你只有一张卡,设成0就行。我在项目里遇到过有人忘了设这个,结果算子一直跑在device -1上,报错说找不到设备。

2.3 验证开发环境

环境配好没?跑两个命令就知道了。我个人最喜欢用 msprof 和 npu-smi 来快速验证。

验证项命令预期结果
驱动 & 设备npu-smi info显示NPU芯片信息,温度、内存等
CANN工具链msprof --help输出msprof帮助信息
编译器which ccec显示ccec路径(如 /usr/local/Ascend/.../bin/ccec)
Python包python3 -c "import te; print(te.__version__)"打印TBE版本号

如果 npu-smi 找不到,多半是驱动没装好或者PATH没加。我记得有一次帮同事排查,他漏了 export PATH=/usr/local/Ascend/driver/tools:$PATH,加上就好了。

✅ 终极验证: 编译一个最简单的算子demo。CANN自带的sample在 $ASCEND_HOME/samples/operator 下,挑一个 Add 算子,执行 bash run.sh。如果编译通过且跑出正确结果,恭喜你,环境稳了。

嗯,这里要注意:第一次编译可能会下载一些依赖(比如python的decorator库),确保你的网络能连外网,或者提前配好pip国内源。

2.4 常见问题与避坑

  • libascend_hal.so 找不到 —— 检查 LD_LIBRARY_PATH 是否包含 $ASCEND_HOME/lib64。
  • Python import te 报错 —— 大概率 PYTHONPATH 没指向 python/site-packages。
  • ccec: 未找到命令 —— 确认 PATH 里有没有 $ASCEND_HOME/bin。
  • npu-smi 显示 offline —— 驱动没加载,试试 npu-smi set -t 0 -d 0 或者重启主机。

我曾经在一个集群上折腾了整整半天,最后发现是用户权限不够——ls /dev/davinci* 没有读写权限。加上 chmod 666 /dev/davinci* 就解决了。所以,权限问题也别忘了检查。