基于 CANN 的算子开发实战:从问题定位到性能落地的全流程实践

引言:算子开发的"第一道门槛"

昇腾 NPU 算子开发,CANN 是绕不开的核心工具,但从搭环境、编算子到实际调用,新手很容易踩坑。

本文用 Abs 算子当例子,把从 GitCode Notebook 准备、CANN 环境配置,到算子编译、安装、Eager/Graph 模式调用和测试的全流程讲透,帮助小伙伴们快速跑通流程、用足 NPU 算力。

开发环境准备:从 GitCode Notebook 到 NPU 启动配置

GitCode启动NoteBook资源

在这里插入图片描述

  • 计算类型:NPU
  • CANN是昇腾 NPU设计的异构计算架构,因此必须选择NPU作为计算类型才能利用昇腾芯片的专用算力执行 AI 算子
  • NPU 硬件配置:NPU basic · 1 * NPU 910B · 32v CPU · 64GB
  • 容器镜像:ubuntu22.04-py3.11-cann8.2.rc1-sglang-main-notebook

CANN 环境搭建与依赖安装全流程

  • ops-math 源码仓库:GitCode CANN/ops-math 仓库获取项目项目地址

在这里插入图片描述

  • 社区版 CANN Toolkit:GitCode CANN/ops-math 仓库提供下载方式可以自行查看

在这里插入图片描述

克隆源码仓库与初步环境验证

CANN/ops-math 仓库克隆

git clone https://gitcode.com/cann/ops-math.git

在这里插入图片描述

安装系统依赖与权限受限场景下的替代方案

1、配置基础依赖、NPU驱动和固件安装

python >= 3.7.0
gcc >= 7.3.0
cmake >= 3.16.0
pigz >= 2.4 (可选,提升打包速度)
dos2unix
gawk
googletest (UT 单元测试依赖)

一键安装脚本:

bash install_deps.sh

2、GitCode NoteBook没有Root权限可能出现有些命令无法安装的问题可以换一种安装方式,比如用 wget 方式安装 gawk

wget https://ftp.gnu.org/gnu/gawk/gawk-5.2.2.tar.gz

在这里插入图片描述

  • 若 wget 提示不存在,尝试用 curl
curl -O https://ftp.gnu.org/gnu/gawk/gawk-5.2.2.tar.gz
  • 解压并进入源码目录
tar -zxvf gawk-5.2.2.tar.gz  # 解压
cd gawk-5.2.2                # 进入源码目录
  • 配置安装路径无需 root
# 配置安装到 ~/usr 目录(用户可读写的路径)
./configure --prefix=$HOME/usr
  • 若提示 no acceptable C compiler found in $PATH,说明缺少 gcc,可尝试用环境自带的 cc 替代
./configure --prefix=$HOME/usr CC=cc
  • 编译并安装
make  # 编译(耗时约1-2分钟,耐心等待)
make install  # 安装到 ~/usr 目录
  • 添加环境变量
# 临时生效(当前终端会话可用)
export PATH=$HOME/usr/bin:$PATH

# 验证安装成功
gawk --version  # 应输出 gawk 5.2.2 版本信息

在这里插入图片描述

安装 CANN Toolkit 与 Legacy 运行时包

1、根据硬件架构(如 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

2、安装运行态依赖

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

两个包必须安装在同一路径下,保证算子编译与调用一致

环境变量加载与路径验证

1、加载环境变量

source /usr/local/Ascend/set_env.sh

2、通过以下命令验证是否配置成功

echo $ASCEND_HOME_PATH

在这里插入图片描述

验证 CANN 环境可用性:acl 初始化测试

测试 CANN 的初始化、设备访问、内存操作等核心功能

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

在这里插入图片描述

1、安装社区尝鲜版CANN toolkit包

在这里插入图片描述

2、本地下载完成之后上传到 NoteBook

在这里插入图片描述

在这里插入图片描述

3、赋予执行权限

chmod +x Ascend-cann-toolkit_8.3.RC1_linux-aarch64.run

4、执行安装

# 官方提供的命令
./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

在这里插入图片描述

在这里插入图片描述

5、配置环境变量

echo "source /home/service/Ascend/ascend-toolkit/latest/set_env.sh" >> ~/.bashrc
source ~/.bashrc

在这里插入图片描述

编译自定义算子包

1、仅针对 Abs 算子进行独立编译测试:

bash build.sh --pkg --soc=ascend910b --ops=abs

在这里插入图片描述

2、 ops-math 的 abs 算子已经 100% 编译成功,生成的 .run 包位于 build_out/ 目录下

部署与安装自定义算子运行包

自定义算子包安装路径为ASCENDHOMEPATH/opp/vendors,{ASCEND_HOME_PATH}/opp/vendors,ASCENDHOMEPATH/opp/vendors{ASCEND_HOME_PATH}已通过环境变量配置,表示CANN toolkit包安装路径,一般为${install_path}/latest

./cann-ops-math-${vendor_name}_linux-${arch}.run

算子调用与功能验证

Eager 模式调用:快速验证算子性能

1、执行示例命令

bash build.sh --run_example abs eager

在这里插入图片描述

2、说明算子计算正确,且经过 aclnn 直接调用后,执行延迟比原始算子降低约 12.4%

在这里插入图片描述

Graph 模式调用:面向批量计算的优化方案

若在图模式下测试,只需修改执行参数,此模式下 CANN 会自动构建计算图并融合算子,适合大规模批量计算场景

bash build.sh --run_example abs graph
单元测试验证:精度与稳定性检测

1、验证算子稳定性,执行UT用例依赖googletest单元测试框架

pip3 install -r tests/requirements.txt

在这里插入图片描述

2、针对 abs 算子执行主机侧侧单元测试 UT 的命令

bash build.sh -u --ophost --ops=abs

在这里插入图片描述

所有测试均通过,这验证了自定义算子在算术精度与计算稳定性方面完全符合预期

结语:从 Abs 到复杂算子,通向高效 CANN 开发之路

本文以昇腾 NPU 910B 的 Abs 算子为案例,完整呈现基于 CANN 的算子开发全流程 , 从 GitCode Notebook 资源配置、非 Root 权限依赖安装与 CANN Toolkit/Legacy 路径适配,到 Abs 算子独立编译安装,再通过 Eager/Graph 模式调用及 UT 测试验证,确保算子计算精度与稳定性,实现约 12.4% 的执行延迟优化,为新手提供可复现实操指南,也为复杂算子开发奠定流程基础。

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐