前言
2025 年元旦快乐!新年新气象,就从 2025 年第一篇文章开始写起吧!这是一个系列文章,「一起昇腾」是针对昇腾 NPU CANN 的,「一起昇思」是针对 MindSpore 的。随着国内外环境的变化,我从今年开始对于国产算力还是非常关注,包括华为昇腾 NPU、燧原 GCU、太初元碁等等,尽快参与进来占一个坑。
本来这篇文章应该是在半年前发出的,但是那会儿在参加琶洲算法大赛,后面又把精力转移到开源项目、开源社区上,所以一直拖到了现在。接触 Ascend C 算子开发是通过「昇腾AI原生创新算子挑战赛S1赛季」参与的,我当时的成绩是 40 分:

S1 赛季决赛门槛是 50 分,实际上只要能进入决赛就自动获得优秀奖,S1 赛季的题目整体不高,以入门和中档题目为主,所以还是很可惜的。目前比赛进行到了 S3 赛季,后续文章会挑一些赛题出来重新做一遍。

启智社区
启智社区是一个非常不错的开发社区,它和各地的算力中心合作,有很多国产算力可以使用,每天都可以领积分,免费用一段时间,比如昇腾 NPU 是 2 积分/小时,如果每天启动一次调试任务,可以领取 10 积分,约等于 5 小时的免费使用时间。
1、创建项目

2、创建云脑任务


3、安装 CMake
CMake 版本必须大于 3.16,否则算子编译会失败。
cd /home/ma-user/work/
wget https://cmake.org/files/v3.31/cmake-3.31.3-linux-aarch64.tar.gz
tar -xzvf cmake-3.31.3-linux-aarch64.tar.gz
sed -i '$a export PATH=/home/ma-user/work/cmake-3.31.3-linux-aarch64/bin:$PATH' ~/.bashrc
source ~/.bashrc
4、安装 CANN
启动调试任务的镜像是默认有一个 CANN 的,这一步可选,但是推荐是安装当前最新的版本,截止当前最新的 CANN 社区版是 8.0.0.alpha003:
wget -O Ascend-cann-toolkit_8.0.0.alpha003_linux-aarch64.run https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Milan-ASL/Milan-ASL%20V100R001C20SPC703/Ascend-cann-toolkit_8.0.0.alpha003_linux-aarch64.run?response-content-type=application/octet-stream
chmod +x Ascend-cann-toolkit_8.0.0.alpha003_linux-aarch64.run
./Ascend-cann-toolkit_8.0.0.alpha003_linux-aarch64.run --full --quiet
sed -i '$a source /usr/local/Ascend/ascend-toolkit/set_env.sh' ~/.bashrc
source ~/.bashrc
5、编译算子
Ascend910B 对应的是 SOC_VERSION 这个参数,可以通过 npu-smi 命令获取 Name 的值,加上 Ascend 前缀:
cd /home/ma-user
git clone https://gitee.com/ascend/samples.git
cd /home/ma-user/samples/operator/ascendc/0_introduction/1_add_frameworklaunch
export ASCEND_INSTALL_PATH=/usr/local/Ascend/ascend-toolkit/latest
bash install.sh -v Ascend910B
6、安装算子
算子编译好后需要安装:
cd CustomOp/build_out/
./custom_opp_euleros_aarch64.run
7、测试
cd /home/ma-user/samples/operator/ascendc/0_introduction/1_add_frameworklaunch/AclNNInvocation
bash run.sh
运行输出:
INFO: acl executable run success!
error ratio: 0.0000, tolrence: 0.0010
test pass
总结
本文我使用了启智社区的昇腾开发环境作为例子,当时我参赛的时候更多使用的是 openEuler x86_64 虚拟机环境作为开发的,当然这也导致了后续做迁移的时候造成了一些时间上的耽误,因为在 CPU 域和 NPU 域调试还是不太一样,而这里是借助了 Ascend C 的「孪生调试」的特点:

