【案例共创】基于华为开发者空间AI Notebook完成昇腾AddCustom自定义算子开发

本案例由开发者:姚圣伟提供

一、概述

1. 案例介绍

本案例详细描述了如何在华为开发者空间 AI NoteBook 上搭建昇腾 Ascend C 算子开发环境,并开发一个AddCustom 自定义算子。

华为开发者空间 AI NoteBook 是基于华为云 ModelArts 的 JupyterLab 的 NoteBook 虚拟环境。 ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。

2. 适用对象

  • 企业
  • 个人开发者
  • 高校学生

3. 案例时间

本案例总时长预计60分钟。

4. 案例流程

说明:

  1. 用户进入开发者空间配置Notebook环境;
  2. 进入Notebook进行算子开发功能实现。

5. 资源总览

本案例预计花费0元。

资源名称规格单价(元)时长(分钟)
华为开发者空间 - AI NotebookNPU 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. 版本介绍

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

打开终端,输入如下命令查看:

npu-smi info

3. Ascend C 环境更新

  1. 在控制台终端创建 init_env.sh
touch init_env.sh

:若左侧菜单栏没有显示init_env.sh文件,可以点击左上角刷新按钮进行刷新。

  1. 创建脚本 直接打开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

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

执行完成如下如所示:

  1. 检查更新
ls /home/service/

ls /home/service/Ascend

ls /home/service/Ascend/ascend-toolkit/

4. 设置算子开发所需环境变量

设置环境变量,执行如下命令:

source ~/.bashrc

三、开发自定义算子 AddCustom

1. 自定义算子分析

开发者若有兴趣,可以参考Ascend C 算子开发的编程范式进行独立的算子开发。

本案例我们直接编译测试自定义的算子。

2. 编译及测试自定义算子

  1. 下载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

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

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

恭喜!至此自定义算子样例执行成功!

四、反馈改进建议

如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值