2023CANN训练营第2季——谈谈AscendC算子学习体会

301 阅读3分钟

前言:

        AscendC算子是2023年第2期CANN训练营的高阶班课程,也有很多学习资料。从何入手,什么样的学习路径适合新人快速入门?本篇笔记谈谈学习体会:建议先搭建CPU和NPU的环境,把例程跑起来,对AscendC算子有个直观的感受;然后再去学习理论知识,本文精选了几个学习资料,并推荐了学习顺序;继而通过模仿例程,进行算子开发实战。希望对想学习AscendC算子开发,还没有动手的小伙伴有所裨益。

一、例程跑起来

        昇腾gitee的sample仓(gitee.com/ascend/samp… C算子例程在下述两个目录中:

1)samples/operator目录下,有“AddCustomSample”和“LeakyReLUCustomSample”两个例程。

2)samples/ cplusplus / level1_single_api / 4_op_dev / 6_ascendc_custom_op目录下,例程按调用方式组织。

1、CPU运行环境搭建——免费的华为云Modelartsde的CodeLab,仅支持CPU模式

www.hiascend.com/forum/threa…

2、NPU运行环境搭建——建议使****用这种方式,既可以验证CPU模式,也可以验证NPU模式

www.bilibili.com/read/cv2699… 

3、运行例程:

        建议先运行samples/operator目录下AddCustomSample的例程。

1)简单核函数调用CPU方式,进入“kernel_direct_call”目录,阅读该目录下的“README.md”

cd ./kernel_direct_call
bash run.sh ascend910B1 cpu

2)简单核函数调用NPU方式——需要NPU环境

cd ./kernel_direct_call
bash run.sh ascend910B1 npu_onboard

3)单算子API(aclnn方式)调用方式——需要NPU环境

cd ./aclnn_online_model
bash run.sh

二、理论学起来

        按自己的学习经验,建议按下列顺序去学习。

1、首推闫长江老师的“昇腾CANN全新算子编程体系解密”www.bilibili.com/video/BV1Ao…

        短短26分钟的视频,将AscendC的设计理念、核心概念、硬件基础,深入浅出,婉婉道来。这个视频值得多刷:小白一定要先听一遍,对后面的深入学习非常有帮助;学习一段时间后,再回过头看一遍,还会有新的体会和收获。

2、官方的文档

        建议先看一边,了解个大致的目录结构和内容的组织方式,以后遇到问题能快速的对应到文档。技术在不停迭代,文档也在不断更新。当前版本时7.0.RC1.alpha003。

www.hiascend.com/document/de…

3、本次训练营的课程

这个课程和官方文档是紧密结合的。

第一章课程link:www.hiascend.com/developer/c…

第二章课程link:www.hiascend.com/developer/c…

4、上期训练营的课程

        B站“昇腾AI开发者”的合集“合集·CANN训练营2023年度第一季”里有4个视频。里面的内容对小白可能有难,建议在完成前面3项学习后,再听一遍这个课程,相信很多概念就会清晰起来。对算子开发会有更直接、更接近实战的感受和理解。

space.bilibili.com/1190614918/…

三、实战搞起来

        纸上得来终觉浅,最终还是要落实到实际的算子开发中去,可以从“改”例程开始。建议以“samples/operator/AddCustomSample”作为参考例程。

        AddCustomSample算子下面有3个目录:算子工程、单算子API调用工程、核函数直接调用工程。

        1、算子工程

        使用msopgen工具,根据算子原型定义json文件生成算子工程,然后修改host侧和kernel侧的算子实现代码。 数据的输入、输出、切分可以参考例程进行修改;计算逻辑,通过查询官网手册的“API参考”下的“Ascend C API”矢量计算的内容;计算过程中涉及到临时变量的参考“API参考/内存管理与同步”的“TBuf”。

        2、单算子API调用工程

        直接将"AddCustomSample"工程的“aclnn_online_model”拷贝过来,进行修改与调试。

        3、核函数直接调用工程

        直接将"AddCustomSample"工程的“kernel_direct_call”目录拷贝过来,进行修改与调试。

        具体修改过程与内容,可以参看:www.bilibili.com/read/cv2712…。讲述了LeakyReLU算子的实现与调用测试。