【2024CANN训练营】Ascend C笔记(中级)
目录
AI正在走进我们的生活,华为近年来坚定人工智能产业投入,深耕基础,厚植技术。2020年8月,昇腾全栈软件发布,经过了四年的发展,已经越来越成熟,这也需要我们对这些新技术进行学习。本文为2024Ascend C暑期优才班北京站学习笔记。
全场景人工智能平台
端边云设备协同
应用使能:ModelArts:各种模型
MindX等
AI框架:MindSpore、Pytorch、Tensorflow
异构计算框架:CANN、CUDA(英伟达)
硬件
昇腾AI处理器采用自研达芬奇架构和高集成SoC设计,可以匹配AI场景,达到算例、内存、带宽的最优配比。达芬奇架构包含矩阵运算、向量计算和标量计算,最重要的矩阵运算提供161616的大CUBE设计,大模型场景计算效率更高。NPU可以卸载CPU算力,而CANN可以使CPU与NPU协同编码,发挥NPU计算能力。
例如,矩阵乘在应用程序中可以省略掉for循环:
// vector
for(int i = 0; i < 16 ; i++){
for(int j = 0 ;j < 16 ; j++) {
c[i][j] = a[i][:]* + b[:][j];
}
}
// cube
c[:][:] = a[:][:]*+b[:][:]
经过四年多的发展,昇腾算子已经发展的十分完备成熟。拥有多个算子库。
软硬协同优化
HCCL:集合通信库,减少数据通信占用的时间,提高效率
Ascend C2.0:通算融合
二进制算子库
提前编译算子
xxx-kernel就是二进制算子包,里面是编译好的算子。
Ascend C算子开发基础
达芬奇架构
AI core
AI core采用达芬奇架构,根据不同处理器版本,AI core里的计算、存储和带宽资源规格不同。主要包含三个部分:
- 计算单元:包含矩阵计算单元(最重要的)、向量计算单元、标量计算单元
- 存储系统
- 控制单元
算子
网络中层或者节点的计算逻辑,数学逻辑的体现。如tanh、ReLU、sigmoid等。算子的基本概念:
- 算子名称:同一网络中算子的名称需要保持唯一
- 算子类型:相同类型算子的实现逻辑相同
- 数据容器(Tensor):张量,承载算子输入输出的数据。TensorDesc张量描述符,存储名称、形状、数据类型、排布格式等。
数据排布格式
如特征图,由四维数组保存。
- N:batch数量,如图像数目
- H:特征图高度
- W:特征图宽度
- C:特征图通道,如RGB图的通道为3
Ascend C算子
Ascend C采用标准C++语法和一组类库API进行编程。
优势:
- C/C++编程
- 编程模型屏蔽硬件差异,编程范式提高开发效率
- 多层级API封装,一个功能多个接口
- 孪生调试:CPU可以模拟调试NPU
Device模块
负责制定计算运行的真实设备。
核函数
Ascend C设备侧入口,连接主机侧和设备侧。
SPMD模型
单程序多数据编程。将需要处理的数据拆分在多个计算核心上运行,多个AI core共享相同的指令代码,每个核上运行实例的区别是block_idx不同。block类似进程,编程时使用GetBlockIdx()获取id。
编程样例
核函数
add_custom是核函数,在其中定义KernelAdd算子类,调用Init()完成内存初始化,调用Process()完成Add操作。

__CCE_KT_TEST__是内置宏,标志<<<>>>,只有在NPU模式下才会编译。

KernelAdd算子类实现
算子类中包含以下函数:
- Init():初始化函数
- Process():核心处理函数
- CopyIn():数据搬入函数
- Compute():计算函数
- CopyOut():数据搬出函数
Init()
Init()函数主要初始化内存。

Process()
Process()函数中调用了CopyIn()、Compute()和CopyOut(),是KernelAdd类中的主要处理函数。

CopyIn()
CopyIn首先初始化了两个LocalTensor,然后以TILE_LENGTH为单位把数据复制进去,再放入两个队列。

Compute()
首先从VECIN中取出输入的数据,然后调用计算的指令Add,再将结果放入VECOUT的队列,接下来释放输入Tensor,等待再使用。

CopyOut()
CopyOut()和CopyIn()逻辑基本相同。

练习:将Add改为sinh
首先修改script文件夹中的gen_data.py,生成测试数据。

接下来只要修改计算类中的Compute()函数,将核心计算代码从add改为sinh即可。


鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)