华为开发者空间-赋能昇腾 AI CANN 算子开发
1、实验介绍
1.1、实验平台介绍
本实验详细描述了如何在华为开发者空间 AI NoteBook 上搭建昇腾 Ascend C 算子开发环境,并开发一个AddCustom 自定义算子。
1.1.1、华为开发者空间简介
华为开发者空间官网地址:https://developer.huaweicloud.com/space
在华为开发者空间,每位注册的开发者都将享有年度内数百小时的云主机使用权,配备5GB云存储容量和定制化的场景模拟沙箱,辅以丰富详实的技术培训课程和专业认证资料,确保开发者能够无缝接入并持续拓展自己的技能树。该空间特别设计了以华为云CodeArts IDE为中心的全方位开发工具生态,整合了鲲鹏、昇腾、鸿蒙等核心生态的开发资源,提供广泛的开源软件库、实用开发插件,全面覆盖从代码托管到应用运维的各个阶段,极大地提升了开发效率和应用构建的便捷性。
加入华为开发者空间,开发者将额外收获如下关键支持:
应用全周期管理:一站式服务涵盖应用构建、存档、验证、配置等环节,助力开发者高效完成云端应用搭建。
沃土云创计划:多维度激励方案,鼓励开发者探索新技术边界,推动创新应用的孵化与发展。
生态共建激励:设立开源贡献、市场线索共享等奖励机制,激发开发者参与生态建设的热情,共享成长成果。
个性化技术支持:通过多种渠道如工单系统、云声反馈、问题跟踪等,为开发者提供及时的技术指导和解决方案,确保项目顺利推进。
1.1.2、华为开发者空间 AI NoteBook 简介
华为开发者空间 AI NoteBook 是基于华为云 ModelArts 的 JupyterLab 的 NoteBook 虚拟环境。
ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。
华为开发者空间 AI NoteBook 地址:
https://developer.huaweicloud.com/space/devportal/notebook-tool
AI NoteBook 支持通过 JupyterLab 工具在线打开 Notebook ,开发基于昇腾的Ascend C算子。
具体操作流程如下图所示:
AI NoteBook 给用户提供了两组预置镜像,用户可以直接使用预置镜像创建 Notebook 实例,在实例中进行依赖安装与配置后,保存为自定义镜像,可直接用于Ascend C算子开发。
AI NoteBook 平台中预置的基础镜像:
引擎类型 |
版本名称 |
Ascend-Powered-Engine NPU basic 1 * NPU 910B 8v CPU 24GB |
euler2.9-py310-torch2.1.0-cann8.0-openmind0.9.1 |
euler2.9-py3.8-torch2.1.0-cann8.0-openmind0.9.0 |
例如:我们选择 euler2.9-py310-torch2.1.0-cann8.0-openmind0.9.1 然后,点击立即启动,
稍等片刻后环境启动完成。
点击查看 NoteBook 即可进入刚刚创建好的环境中。
2、软件介绍
2.1.1 软件版本介绍
本实验所使用的系统和软件版本如下表,对于操作界面差异不大的版本没有列出。
环境信息:
类别 |
版本 |
说明 |
Python |
Python3.10 |
面向对象编程语言 |
CANN |
8.1.RC1.beta1 |
昇腾异构计算架构 |
系统镜像 |
euleros_2.9 |
服务器操作系统 |
CPU架构 |
aarch64 |
CPU架构 |
- 训练环境系统/软件版本
2.1.2 Ascend C简介
面向算子开发场景的编程语言Ascend C,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。
当前Ascend C支持的产品型号为:
- Atlas 推理系列产品
- Atlas 训练系列产品
- Atlas A2训练系列产品
- Atlas 200/500 A2推理产品
本次我们以Atlas A2训练系列产品为例讲解Ascend C算子开发环境搭建。
在华为开发者空间 AI NoteBook 上创建硬件环境为Ascend 910 + ARM的开发环境。
我们可以使用 npu-smi info 进行查询 当前环境具体的 Ascend NPU 信息。
2.1.3 Ascend C环境更新(可选)
- 获取 init_sh脚本
两种方式获取init_env.sh自动安装脚本
- 设置以下环境变量,可直接在本环境通过wget下载
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
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com:443/resource/s5%E6%96%87%E6%A1%A3/init_env.sh
我们通过pwd看到,当前的路径为
/opt/huawei/edu-apaas/src/init
下载完成后,打开sh文件
将第 61 和 第 62 行的路径 改成 刚刚我们看到的当前路径
/opt/huawei/edu-apaas/src/init
改之前的如下
改之后的如下
将第 78 和 第 100 行的路径 改成 刚刚我们看到的当前路径
/opt/huawei/edu-apaas/src/init 和 当前用户所在路径 /home/service
改之前的如下
改之后的如下
将第 112 至 118 行的路径 改成 刚刚我们看到的当前路径
/opt/huawei/edu-apaas/src/init 和 当前用户所在路径 /home/service
改之前的如下
改之后的如下
2.直接在控制台终端创建 sh
touch 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默认安装在//opt/huawei/edu-apaas/src/init路径下,可自行根据安装位置在~/.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
步骤2 执行init_sh脚本,自动配置环境,cann包安装如下
Init_env.sh脚本已将cann包更新到最新社区版cann8.1.RC1.beta1
bash init_env.sh
环境配置成功页面
- 等待脚本执行成功后,设置算子开发所需环境变量
source ~/.bashrc
环境变量设置页面
3、 体验开发一个自定义算子AddCustom
3.1.1 自定义算子分析
Ascend C 算子开发的编程范式参考
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/800alpha001/devguide/opdevg/ascendcopdevg/atlas_ascendc_10_0006.html
3.1.2 编译及测试自定义算子
- 在华为开发者空间AI NoteBook中,打开终端,下载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
执行自定义算子编译成功,生成 run 包
步骤3 执行安装AddCustom算子样例
在执行自定义算子编译成功后,我们进行自定义算子安装
./CustomOp/build_out/custom_opp_openEuler_aarch64.run
提示执行自定义算子安装成功,接下来使用如下指令进行测试
cd AclNNInvocation && bash run.sh
恭喜!至此自定义算子样例执行成功!
- 点赞
- 收藏
- 关注作者
评论(0)