本案例由开发者:姚圣伟提供
一、概述
1. 案例介绍
本案例详细描述了如何在华为开发者空间 AI NoteBook 上搭建昇腾 Ascend C 算子开发环境,并开发一个AddCustom 自定义算子。
华为开发者空间 AI NoteBook 是基于华为云 ModelArts 的 JupyterLab 的 NoteBook 虚拟环境。 ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。
2. 适用对象
- 企业
- 个人开发者
- 高校学生
3. 案例时间
本案例总时长预计60分钟。
4. 案例流程

说明:
- 用户进入开发者空间配置Notebook环境;
- 进入Notebook进行算子开发功能实现。
5. 资源总览
本案例预计花费0元。
| 资源名称 | 规格 | 单价(元) | 时长(分钟) |
|---|---|---|---|
| 华为开发者空间 - AI Notebook | NPU basic · 1 * NPU 910B · 8v CPU · 24GB euler2.9-py310-torch2.1.0-cann8.0-openmind0.9.1-notebook | 免费 | 60 |
二、环境配置
1. AI Notebook 配置
华为开发者空间 AI NoteBook 是基于华为云 ModelArts 的 JupyterLab 的 NoteBook 虚拟环境。
进入华为开发者空间工作台界面,点击AI Notebook > 立即前往进入AI Notebook页面。

AI NoteBook 给用户提供了两组预置镜像,用户可以直接使用预置镜像创建 Notebook 实例,在实例中进行依赖安装与配置后,保存为自定义镜像,可直接用于Ascend C算子开发。
我们选择 euler2.9-py310-torch2.1.0-cann8.0-openmind0.9.1-notebook。然后,点击立即启动,稍等片刻后环境启动完成。

点击【查看Notebook】,即可进入刚刚创建好的环境中。

2. 版本介绍
- 软件版本介绍 本次案例所使用的系统和软件版本如下表,对于操作界面差异不大的版本没有列出。训练信息:
| 类别 | 版本 | 说明 |
|---|---|---|
| Python | Python3.10 | 面向对象编程语言 |
| CANN | 8.1.RC1.beta1 | 昇腾异构计算架构 |
| 系统镜像 | euleros_2.9 | 服务器操作系统 |
| CPU架构 | aarch64 | CPU架构 |
- Ascend C 简介 面向算子开发场景的编程语言Ascend C,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。 当前Ascend C支持的产品型号为:
- Atlas 推理系列产品
- Atlas 训练系列产品
- Atlas A2训练系列产品
- Atlas 200/500 A2推理产品 本次我们以Atlas A2训练系列产品为例讲解Ascend C算子开发环境搭建。我们可以使用如下命令进行查询当前环境具体的 Ascend NPU 信息。
打开终端,输入如下命令查看:
npu-smi info


3. Ascend C 环境更新
- 在控制台终端创建 init_env.sh
touch init_env.sh

注:若左侧菜单栏没有显示init_env.sh文件,可以点击左上角刷新按钮进行刷新。
- 创建脚本 直接打开init_env.sh文件,将如下内容复制到文件中,保存。
#!/bin/bash
progress() {
#进度条程序
local main_pid=$1
mark_str1="Verifying"
mark_str2="runtime"
mark_str3="compiler"
mark_str4="opp"
mark_str5="toolkit"
mark_str6="aoe"
mark_str7="mindstudio"
mark_str8="test-ops"
mark_str9="pyACL"
mark_str10="ncs"
while [ "$(ps -p ${main_pid} | wc -l)" -ne "1" ] ; do
mark=$(tail -n 1 install.log)
if [[ $mark =~ $mark_str1 ]]
then
mark="校验安装包,请等待"
elif [[ $mark =~ $mark_str2 ]]
then
mark="正在安装runtime组件包,请等待"
elif [[ $mark =~ $mark_str3 ]]
then
mark="正在安装compiler组件包,请等待"
elif [[ $mark =~ $mark_str4 ]]
then
mark="正在安装opp组件包,请等待"
elif [[ $mark =~ $mark_str5 ]]
then
mark="正在安装${mark_str5}组件包,请等待"
elif [[ $mark =~ $mark_str6 ]]
then
mark="正在安装${mark_str6}组件包,请等待"
elif [[ $mark =~ $mark_str8 ]]
then
mark="正在安装${mark_str7}组件包,请等待"
elif [[ $mark =~ $mark_str8 ]]
then
mark="正在安装${mark_str8}组件包,请等待"
elif [[ $mark =~ $mark_str9 ]]
then
mark="正在安装${mark_str9}组件包,请等待"
elif [[ $mark =~ $mark_str10 ]]
then
mark="正在安装${mark_str10}组件包,请等待"
else
mark="正在准备安装包,请等待"
fi
pool=("." ".." "..." "...." "....." "......")
num=${#pool[*]}
roll_mark=${pool[$((RANDOM%num))]}
echo -ne "\033[31m ${mark} ${roll_mark}\033[0m \r"
sleep 0.5
done
}
export no_proxy=127.0.0.1,localhost,172.16.*,iam.cn-southwest-2.huaweicloud.com,pip.modelarts.private.com
export NO_PROXY=127.0.0.1,localhost,172.16.*,iam.cn-southwest-2.huaweicloud.com,pip.modelarts.private.com
mkdir -p /opt/huawei/edu-apaas/src/init
cd /opt/huawei/edu-apaas/src/init
if [ -e "Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run" ]; then
file_size=$(ls -l "Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run" | awk '{print $5}')
full_size=2145898187
if [ $file_size -lt $full_size ]; then
echo "CANN包大小不正确,需要重新下载"
wget https://public-download.obs.cn-east-2.myhuaweicloud.com:443/cann_toolkits/Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run -O Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run
chmod +x Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run >/dev/null 2>&1
fi
echo "toolkit is exists, skipping the download step."
else
echo "Start downloading toolkit package."
wget https://public-download.obs.cn-east-2.myhuaweicloud.com:443/cann_toolkits/Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run -O Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run
chmod +x Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run >/dev/null 2>&1
fi
if [ ! -d "/opt/huawei/edu-apaas/src/init/Ascend/ascend-toolkit/8.1.RC1" ]; then
./Ascend-cann-toolkit_8.1.RC1_linux-aarch64.run --install --force --quiet >install.log 2>&1 &
do_sth_pid=$(jobs -p | tail -1)
progress "${do_sth_pid}" &
wait "${do_sth_pid}"
printf "\033[32m CANN包部署完成 \033[0m\n"
else
printf "\033[32m CANN包已部署 \033[0m\n"
fi
source /home/service/Ascend/ascend-toolkit/set_env.sh
if [ -d "cmake-3.28.3-linux-aarch64" ]; then
echo "The cmake folder exists, skipping the download and decompression steps."
elif [ -e "cmake-3.28.3-linux-aarch64.tar.gz" ]; then
echo "CMake compressed file exists, start decompressing steps."
tar xf cmake-3.28.3-linux-aarch64.tar.gz
else
echo "need CMake compressed file exists."
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/AscendC/ResourceDependent/cmake-3.28.3-linux-aarch64.tar.gz
tar xf cmake-3.28.3-linux-aarch64.tar.gz
fi
export PATH=/opt/huawei/edu-apaas/src/init/cmake-3.28.3-linux-aarch64/bin:$PATH
# 安装gcc10.3,用于支持torch==2.5.1版本
if [ -d "gcc" ]; then
echo "The cmake folder exists, skipping the download and decompression steps."
elif [ -e "gcc.tar.gz" ]; then
echo "CMake compressed file exists, start decompressing steps."
tar -zxvf gcc.tar.gz
else
echo "need CMake compressed file exists."
wget https://public-download.obs.cn-east-2.myhuaweicloud.com:443/%E7%AE%97%E5%AD%90%E6%8C%91%E6%88%98%E8%B5%9BS5/gcc.tar.gz
tar -zxvf gcc.tar.gz
fi
export PATH=/opt/huawei/edu-apaas/src/init/gcc/bin:$PATH
export LD_LIBRARY_PATH=/opt/huawei/edu-apaas/src/init/gcc/lib64:$LD_LIBRARY_PATH
# cmake gcc默认安装在/home/ma-user/work/download路径下,可自行根据安装位置在~/.bashrc里配置以下环境变量
echo "source /home/service/Ascend/ascend-toolkit/set_env.sh" >> ~/.bashrc
echo 'export PATH=/opt/huawei/edu-apaas/src/init/cmake-3.28.3-linux-aarch64/bin:$PATH' >> ~/.bashrc
echo 'export PATH=/opt/huawei/edu-apaas/src/init/gcc/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/opt/huawei/edu-apaas/src/init/gcc/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

- 执行脚本 执行init_env.sh脚本,自动配置环境,安装需要2-3min,请耐心等待。
bash init_env.sh

执行完成如下如所示: 
- 检查更新
ls /home/service/
ls /home/service/Ascend
ls /home/service/Ascend/ascend-toolkit/

4. 设置算子开发所需环境变量
设置环境变量,执行如下命令:
source ~/.bashrc

三、开发自定义算子 AddCustom
1. 自定义算子分析
开发者若有兴趣,可以参考Ascend C 算子开发的编程范式进行独立的算子开发。
本案例我们直接编译测试自定义的算子。
2. 编译及测试自定义算子
- 下载samples样例,执行编译AddCustom算子样例。
依次执行如下命令:
cd /opt/huawei/edu-apaas/src/init
source ~/.bashrc
git clone https://gitee.com/ascend/samples.git
cd samples/operator/ascendc/0_introduction/1_add_frameworklaunch
bash install.sh -v Ascend910B4


- 执行安装AddCustom算子样例 在执行自定义算子编译成功后,我们进行自定义算子安装。
./CustomOp/build_out/custom_opp_openEuler_aarch64.run

- 测试 提示执行自定义算子安装成功,接下来使用如下指令进行测试。
cd AclNNInvocation && bash run.sh

恭喜!至此自定义算子样例执行成功!
四、反馈改进建议
如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!
6万+

被折叠的 条评论
为什么被折叠?



