头图

前言:
        AscendC算子是2023年第2期CANN训练营的高阶班课程,也有很多学习资料。从何入手,什么样的学习路径适合新人快速入门?本篇笔记谈谈学习体会:建议先搭建CPU和NPU的环境,把例程跑起来,对AscendC算子有个直观的感受;然后再去学习理论知识,本文精选了几个学习资料,并推荐了学习顺序;继而通过模仿例程,进行算子开发实战。希望对想学习AscendC算子开发,还没有动手的小伙伴有所裨益。
一、例程跑起来
        昇腾gitee的sample仓(https://gitee.com/ascend/samples),Ascend C算子例程在下述两个目录中:
1)samples/operator目录下,有“AddCustomSample”和“LeakyReLUCustomSample”两个例程。
2)samples/ cplusplus / level1_single_api / 4_op_dev / 6_ascendc_custom_op目录下,例程按调用方式组织。

图片

1、CPU运行环境搭建——免费的华为云Modelartsde的CodeLab,仅支持CPU模式
https://www.hiascend.com/forum/thread-0235128261452483095-1-1...
2、NPU运行环境搭建——建议使用这种方式,既可以验证CPU模式,也可以验证NPU模式
https://www.bilibili.com/read/cv26991439/ 
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全新算子编程体系解密”https://www.bilibili.com/video/BV1Ao4y1F7wj/
        短短26分钟的视频,将AscendC的设计理念、核心概念、硬件基础,深入浅出,婉婉道来。这个视频值得多刷:小白一定要先听一遍,对后面的深入学习非常有帮助;学习一段时间后,再回过头看一遍,还会有新的体会和收获。

图片

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

图片

3、本次训练营的课程
这个课程和官方文档是紧密结合的。

图片

第一章课程link:https://www.hiascend.com/developer/courses/detail/16916965097...
第二章课程link:https://www.hiascend.com/developer/courses/detail/16964146067...

图片

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

图片

三、实战搞起来
        纸上得来终觉浅,最终还是要落实到实际的算子开发中去,可以从“改”例程开始。建议以“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”目录拷贝过来,进行修改与调试。
    ​    ​具体修改过程与内容,可以参看:https://www.bilibili.com/read/cv27125634​。讲述了LeakyReLU算子的实现与调用测试。


大姚
1 声望0 粉丝