【CANN训练营第三季】

**

【CANN训练营第三季】

昇腾CANN算子精讲课 (一)课程小结

关键字:AI、MindStudio、算子、第三方适配、TBE DSL

一:算子开发概述
昇腾算子库包含了丰富的高性能算子,让神经网络的运行性能更高,昇腾算子库中的算子都是预先实现和编译的,是华为工程师使用昇腾AI处理器架构专用编程语言开发的高度优化的内核函数,能够较好的适配底层硬件架构,具有较高的性能。但若遇到以下场景,开发者需要考虑进行自定义算子的开发。
1)将第三方开源框架网络模型转换为适配昇腾AI处理器的模型时,遇到了CANN尚未支持的算子。
2)已有算子的性能无法满足开发者的要求。
3)开发者想修改已有算子的计算逻辑。
4)开发者想通过自定义算子的方式实现应用程序中的某些处理逻辑(例如对模型输出的后处理),从而将相应处理推送到昇腾AI处理器执行,用昇腾AI处理器进行加速。

二:开发方式
CANN算子有两种类型,TBE算子与AI CPU算子。
【CANN训练营第三季】_第1张图片
1)TBE算子:运行在昇腾AI处理器的AI Core上,鉴于AI Core的强大算力,主要负责执行矩阵、向量、标量相关的计算密集型算子。
TBE工具给用户提供了两种算子开发方式 — DSL与TIK,开发者可以根据需求自由选择,两种开发方式的区别如下:
1.1 DSL( Domain-Specific Language ,基于特性域语言)
DSL接口已高度封装,用户仅需要使用DSL接口完成计算过程的表达,后续的算子调度、算子优化及编译都可通过已有的接口一键式完成,适合初级开发用户。
1.2 TIK( Tensor Iterator Kernel, 张量嵌套内核)
开发者可以通过调用TIK提供的API基于Python语言编写自定义算子,然后TIK编译器会将其编译为适配昇腾AI处理器SoC应用程序的二进制文件。但TIK需要用户手工控制数据搬运和计算流程,入门较高,但开发方式比较灵活,在性能上有一定的优势。
2)AI CPU算子:运行在昇腾AI处理器的AI CPU上。以下几种场景下,可使用AI CPU方式实现自定义算子。
2.1 不适合跑在AI Core上的算子,例如非矩阵类的复杂计算,逻辑比较复杂的分支密集型算子等。
例如,Dump、profiling等控制算子,Queue、Stack等资源状态类算子,TopK、Where等检索类算子。
2.2 AI Core不支持的算子,算子需要某些数据类型,但AI Core不支持,例如Complex32、Complex64。
2.3 某些场景下,为了快速打通网络在昇腾AI处理器的执行流程,在TBE实现自定义算子较为困难的情况下,可通过自定义AI CPU算子进行功能调测,提升调测效率。功能调通之后,后续性能调测过程中再将AI CPU自定义算子转换为TBE算子实现。
算子开发方式对比:TBE DSL、TBE TIK以及AI CPU三种开发方式的比较如下表所示:
【CANN训练营第三季】_第2张图片
三:运行、开发环境
本次学习采用TBE的DSL方式,需要运行在含AI Core的华为晟腾芯片的硬件平台上:可以选ECS服务器;或者像Atlas200DK这类嵌入式开发设备。在Linux,Windows等操作系统,基于CANN开发包和MindStudio开发。
1)安装基础软件:GCC编译环境;Python3.7.5;安装各依赖库、配置环境变量。
2)安装Ascend-cann-toolkit。
3)安装对应版本的MindStudio,安装算子开发相关Python依赖库。
4)安装其他辅助工具:如MobaXterm等等。
【CANN训练营第三季】_第3张图片
四:算子开发过程
1)算子原型定义
算子原型定义规定了在昇腾AI处理器上可运行算子的约束,主要体现算子的数学含义,包含定义算子输入、输出和属性信息,基本参数的校验和shape的推导,原型定义的信息会被注册到GE的算子原型库中。网络模型生成时,GE会调用算子原型库的校验接口进行基本参数的校验,校验通过后,会根据原型库中的推导函数推导每个节点的输出shape与dtype,进行输出tensor的静态内存的分配。
2)算子代码实现
为了方便开发者进行自定义算子开发,TBE(Tensor Boost Engine)提供了一套计算接口供开发者用于组装算子的计算逻辑,这套计算接口称之为DSL(Domain-Specific Language)。使用Python语言,基于DSL开发的算子,可以直接使用TBE提供的Auto Schedule机制,自动完成调度过程,省去最复杂的调度编写过程。
3)算子信息库定义
算子信息库作为算子开发的交付件之一,主要体现算子在昇腾AI处理器上的具体实现规格。针对TBE算子,算子信息库包括算子支持的输入输出dtype、format以及输入shape等信息;针对AI CPU算子,算子信息库包括算子输入输出的name,支持的dtype、format等信息。网络运行时,图编译器会根据算子信息库中的算子信息做基本校验,并进行算子匹配。
4)算子适配插件开发
通过算子适配件的开发可以将第三方框架的算子映射成适配昇腾AI处理器的算子。基于不同框架的网络运行时,首先会加载并调用Graph Engine(简称GE)中的插件信息,将原始框架网络中的算子进行解析并映射成适配昇腾AI处理器算子。
算子插件的实现包含CANN算子类型的注册、原始框架中算子类型的注册以及原始框架中算子属性到CANN算子属性的映射,算子的映射通过Parser模块完成。目前支持TensorFlow、Caffe、ONNX、PyTorch等主流框架。
【CANN训练营第三季】_第4张图片
五:算子调试、测试过程
1)调试
使用DSL方式开发TBE算子的用户只需要关注算法逻辑,直接调用TBE DSL提供的auto_schedule接口即可完成算子的自动调度。因此,算子如果运行出错,用户仅需要验证算法逻辑描述是否正确即可。
TBE DSL提供了在CPU上验证算子功能正确性的调试框架,方便开发者快速验证算子功能的正确性,具体流程如下:

【CANN训练营第三季】_第5张图片
2)UT测试
基于MindStudio进行算子开发的场景下,用户可基于MindStudio进行算子的UT测试,UT(Unit Test:单元测试)是开发人员进行算子代码验证的手段之一,主要目的是:
2.1 测试算子代码的正确性,验证输入输出结果与设计的一致性。
2.2 UT侧重于保证算子程序能够跑通,选取的场景组合应能覆盖算子代码的所有分支(一般来说覆盖率要达到100%),从而降低不同场景下算子代码的编译失败率。
3)ST测试
自定义算子部署到算子库后,可进行ST(System Test)测试,在真实的硬件环境中,验证算子功能的正确性。
3.1 ST测试的主要功能是:基于算子测试用例定义文件*.json生成单算子的om文件;使用AscendCL接口加载并执行单算子om文件,验证算子执行结果的正确性。
3.2 ST测试会覆盖算子实现文件,算子原型定义与算子信息库,不会对算子适配插件进行测试。

六:课程学习资料
1)开发环境
1.1 安装GCC、Python基础环境
1.2 安装开发套件包:Ascend-cann-toolkit
1.3 安装MindStudio
2)CANN算子开发
2.1 DSL代码实例
2.2 DSL调试
3)MindStudio算子开发
3.1 算子开发Python依赖库
3.2 UT测试
3.3 ST测试

你可能感兴趣的:(CANN学习环境,华为,人工智能,学习)