基于 CANN 的算子开发实战:从问题定位到性能落地的全流程实践
引言:对于初学者来说,算子开发的第一步往往是最具挑战性的。特别是在使用昇腾 NPU 进行算子开发时,CANN 作为核心工具,其环境搭建、算子编写及调用过程中的常见问题,常常让新手感到困惑。
本文通过一个具体的例子——Abs 算子的开发,详细讲解了从 GitCode Notebook 的准备到 CANN 环境配置,再到算子编译、安装以及在 Eager 和 Graph 模式下的调用和测试的完整流程。目的是帮助开发者迅速掌握流程,充分利用 NPU 的强大算力。
开发环境准备:从 GitCode Notebook 到 NPU 启动配置
首先,需要在 GitCode 上启动 NoteBook 资源,确保计算类型设置为 NPU,因为 CANN 是专门为昇腾 NPU 设计的异构计算架构,只有选择了 NPU 才能发挥出昇腾芯片的专有算力来执行 AI 算子。
硬件配置方面,建议使用 NPU basic 型号,配备 1 * NPU 910B,32v CPU 和 64GB 内存。容器镜像推荐使用 ubuntu22.04-py3.11-cann8.2.rc1-sglang-main-notebook。

CANN 环境搭建与依赖安装全流程
接下来,我们将详细介绍如何从源码仓库克隆项目、安装系统依赖,以及配置 CANN 环境。
ops-math 源码可以从 GitCode CANN/ops-math 仓库中获取。此仓库还提供了社区版 CANN Toolkit 的下载方式。


克隆 ops-math 仓库后,首先进行环境的初步验证,确保所有必要的依赖项都已正确安装。
git clone https://gitcode.com/cann/ops-math.git

安装系统依赖与权限受限场景下的解决方案
为了确保 CANN 环境能够顺利搭建,需要安装一系列的基础依赖,包括但不限于 Python 3.7.0 及以上版本、GCC 7.3.0 及以上版本、CMake 3.16.0 及以上版本等。此外,pigz(用于加速打包)、dos2unix、gawk 和 googletest(用于单元测试)也是推荐安装的工具。
如果在 GitCode NoteBook 中遇到权限问题导致某些命令无法执行,可以采用 wget 或 curl 下载文件的方式绕过权限限制,例如安装 gawk:
wget https://ftp.gnu.org/gnu/gawk/gawk-5.2.2.tar.gz
或
curl -O https://ftp.gnu.org/gnu/gawk/gawk-5.2.2.tar.gz
解压并进入源码目录后,可以通过指定非 root 用户可写路径来完成安装,避免权限问题:
./configure --prefix=$HOME/usr
make
make install
最后,别忘了将新安装的工具路径添加到系统的环境变量中,以便全局使用。


安装 CANN Toolkit 与 Legacy 运行时包
安装 CANN Toolkit 时,需根据你的硬件架构(如 x86_64 或 aarch64)下载对应的版本,并使用如下命令进行安装:
chmod +x Ascend-cann-toolkit_${cann_version}_linux-${arch}.run
./Ascend-cann-toolkit_${cann_version}_linux-${arch}.run --full --force --install-path=/usr/local/Ascend
接着,安装运行时依赖包:
chmod +x cann-${soc_name}-ops-legacy_${cann_version}_linux-${arch}.run
./cann-${soc_name}-ops-legacy_${cann_version}_linux-${arch}.run --full --install-path=/usr/local/Ascend
请注意,这两个包必须安装在同一路径下,以确保算子编译和调用的一致性。
环境变量加载与路径验证
安装完成后,通过加载环境变量来验证安装是否成功:
source /usr/local/Ascend/set_env.sh
echo $ASCEND_HOME_PATH

验证 CANN 环境可用性:acl 初始化测试
最后一步是测试 CANN 环境的基本功能,包括初始化、设备访问和内存操作等核心功能,确保一切正常。
导入 acl
import acl
# 1. 初始化CANN环境
ret = acl.init()
if ret != 0:
print("CANN初始化失败,错误码:", ret)
else:
print("CANN初始化成功")
# 2. 查询可用NPU设备数量
device_count = acl.rt.get_device_count()
print(f"可用NPU设备数量:{device_count}") # 预期输出为1(对应你的910B设备)
# 3. 绑定NPU设备
device_id = 0
ret = acl.rt.set_device(device_id)
if ret == 0:
print(f"成功绑定NPU设备 {device_id}")
# 4. 释放资源
acl.rt.reset_device(device_id)
print("设备资源已释放")
else:
print(f"绑定设备失败,错误码:{ret}")
# 5. 销毁CANN环境
acl.finalize()
print("CANN环境销毁成功")
自定义算子实践:以 Abs 算子为例
获取 ops-math 源码与依赖安装
切换至目标目录并安装所需依赖
cd ops-math
pip3 install -r requirements.txt
- 安装社区试用版CANN toolkit包
- 本地下载完成后上传至NoteBook
- 设置执行权限
- 执行安装过程
- 配置环境变量
chmod +x Ascend-cann-toolkit_8.3.RC1_linux-aarch64.run
# 使用官方提供的命令
./cann-${soc_name}-ops-legacy_${cann_version}_linux-${arch}.run --full --install-path=${install_path}
# 实际执行的命令
./Ascend-cann-toolkit_8.5.0.alpha001_linux-aarch64.run --full --install-path=/home/service/Ascend
{soc_name} 表示 NPU 型号名称,即从 {soc_version} 中移除 "ascend" 后的部分
{install_path} 表示指定的安装路径,应与 toolkit 包安装在同一路径,默认安装在 /usr/local/Ascend 目录下
此步骤可能耗时较长,可以通过实时查看日志来监控安装进度
# 实时跟踪安装日志,确保有新内容输出
tail -f /home/service/var/log/ascend_seclog/ascend_toolkit_install.log
echo "source /home/service/Ascend/ascend-toolkit/latest/set_env.sh" >> ~/.bashrc
source ~/.bashrc
编译自定义算子包
- 单独编译测试 Abs 算子:
- ops-math 的 abs 算子已100%编译成功,生成的 .run 包位于 build_out/ 目录下。
bash build.sh --pkg --soc=ascend910b --ops=abs
部署与安装自定义算子运行包
自定义算子包的安装路径为 ASCENDHOMEPATH/opp/vendors 或 {ASCEND_HOME_PATH}/opp/vendors,其中 {ASCEND_HOME_PATH} 已通过环境变量配置,代表CANN toolkit包的安装路径,通常为 ${install_path}/latest。
./cann-ops-math-${vendor_name}_linux-${arch}.run
算子调用与功能验证
Eager 模式调用:用于快速验证算子性能
- 执行示例命令
- 确认算子计算正确,且通过 aclnn 调用后,执行延迟相比原始算子减少了大约 12.4%
bash build.sh --run_example abs eager
Graph 模式调用:适用于批量计算的优化策略
在图模式下测试时,只需更改执行参数。在此模式下,CANN 将自动构建计算图并融合算子,非常适合大规模批量计算场景。
bash build.sh --run_example abs graph
单元测试验证:精度与稳定性检测
- 验证算子稳定性,执行 UT 测试用例需要依赖 googletest 单元测试框架
使用以下命令安装测试所需的依赖包:
pip3 install -r tests/requirements.txt
用于执行主机端 abs 算子单元测试(UT)的命令如下所示:
bash build.sh -u --ophost --ops=abs
所有测试均已成功通过,这表明自定义算子在算术精确度和计算稳定性上完全达到了预期标准。
总结:从简单算子到复杂算子,迈向高效的 CANN 开发
本文以华为昇腾 NPU 910B 的 Abs 算子为例,详细展示了基于 CANN 的算子开发全过程。涵盖了从 GitCode Notebook 的资源配置,到非 Root 用户权限下的依赖安装及 CANN Toolkit 和 Legacy 路径的适应性配置,再到 Abs 算子的独立编译与安装,以及通过 Eager 模式和 Graph 模式调用并进行 UT 测试验证,确保了算子的计算精度和稳定性。整个过程实现了大约 12.4% 的执行延迟优化,不仅为初学者提供了可操作的实际指南,也为更复杂的算子开发奠定了坚实的基础。


雷达卡


京公网安备 11010802022788号







