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里的计算、存储和带宽资源规格不同。主要包含三个部分:

  1. 计算单元:包含矩阵计算单元(最重要的)、向量计算单元、标量计算单元
  2. 存储系统
  3. 控制单元

算子

网络中层或者节点的计算逻辑,数学逻辑的体现。如tanh、ReLU、sigmoid等。算子的基本概念:

  1. 算子名称:同一网络中算子的名称需要保持唯一
  2. 算子类型:相同类型算子的实现逻辑相同
  3. 数据容器(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()函数主要初始化内存。
Init

Process()

Process()函数中调用了CopyIn()、Compute()和CopyOut(),是KernelAdd类中的主要处理函数。
在这里插入图片描述

CopyIn()

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

Compute()

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

CopyOut()

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

练习:将Add改为sinh

首先修改script文件夹中的gen_data.py,生成测试数据。

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

在这里插入图片描述

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐