上海昇腾AI训练营笔记
2024/11/30 8:41:37
来源:https://blog.csdn.net/qq_44629819/article/details/140515005
浏览:
次
关键词:上海昇腾AI训练营笔记
文章目录
- Ascend C简介
- CANN架构
- 昇腾AI加速卡
- AI Core内部计算架构抽象
- AI Core内核计算
- SPMD
- 核函数
- 编程API
- 编程范式
- 矩阵编程
-
Ascend C简介
- Ascend C系列AI处理器适用于计算力需求较低的场景,如智能监控、边缘计算等。
- 提供多种精简模式和高性能模式,满足不同应用场景下的性能要求。
- 支持全场景覆盖,既可以部署在云端也可以部署在端侧。
CANN架构
- 上层应用层。包括深度学习框架、AI框架适配、创新算子及领域加速库和人工智能应用,负责开发和运行AI模型及应用。
- 中间计算架构层。由AscendCL异构计算语言、GE图引擎、Ascend C算子开发语言、AOL算子加速库、HCCL集合通信库和Runtime运行时组成,负责计算任务的分解、优化和执行。
- 底层硬件层。包括Driver驱动和Ascend AI处理器,负责硬件通信和高性能计算任务的实际执行。
昇腾AI加速卡
- 华为AI加速卡(NPU)通过PCIe接口连接到服务器上。服务器作为主机(Host),与AI加速卡(Device)进行数据传输和控制。
- AI加速卡内部包含多个AICORE计算核心,这些核心负责执行AI计算任务。每个AICORE相当于多核CPU中的一个核心,并共享全局内存(DDR内存)用于数据存储和处理。
AI Core内部计算架构抽象
- AI Core可以抽象成三个流,分别是:
- 异步指令流:不同计算单元(Scalar、Vector、Cube、DMA)并行接收并执行指令。
- 同步信号流:确保指令间依赖关系,按逻辑顺序执行,Scalar单元发同步信号。
- 计算数据流:DMA搬运数据至Local Memory,各计算单元处理后再搬运回Global Memory。
AI Core内核计算
- AI core 支持标量、向量和矩阵运算
- 标量计算是简单的逐个操作,如
int z = x + y
。 - 向量计算能同时处理多个数据,例如NPU一个核可以在一个周期内处理
128
个FP16
加法。 - 矩阵计算如
C = A * B
,NPU一个核能在一个周期内完成16x16x16
的矩阵乘法。
SPMD
- Ascend C算子编程采用SPMD模式,将数据拆分并行处理。
- 多个AI Core共享相同指令代码,通过不同的
block_idx
区分。 - 使用
GetBlockIdx()
函数获取block_idx
,标识进程唯一性。
核函数
- 核函数(Kernel Function)是直接在设备侧执行的代码,负责实现算子的所有功能。Ascend C和CUDA的核函数定义类似,使用__global__关键字,并通过参数列表和函数名进行调用。
- 使用变量类型限定符
__gm__ uint8_t*
来统一指针参数类型,方便管理设备侧的内存访问。规则建议包括核函数必须有void
返回类型,仅支持指针类型或内置数据类型作为参数。
编程API
- 3级API:支持运算符重载,实现简单计算表达,如dst = src1 + src2。
- 2级API:用于一维连续计算,指定操作数和计数,如Add(dst, src1, src2, count)。
- 1级API:处理多维数据的切片计算,选择特定部分进行运算。
- 0级API:功能丰富,充分利用硬件优势,支持复杂操作参数,如Add(dst, src1, src2, repeatTimes, repeatParams)。
编程范式
- 流水任务指单核处理程序中并行调度的任务,提升数据处理性能。
- 流水任务分为Stage1、Stage2、Stage3,每个任务专注于完成特定功能。
- 数据被切分成片,使用Progress1~n表示,每个任务依次处理数据片。
- Stage间有依赖关系,例如Stage1处理完Progress1后,Stage2才开始处理。
矩阵编程
矩阵乘法
- 矩阵A(M×K)与矩阵B(K×N)相乘,得到一个中间结果矩阵(M×N)。然后,将一个偏置向量(bias,1×N)加到中间结果矩阵的每一行上,形成最终的输出矩阵C(M×N)
数据分块
- 多核数据按照以下方式进行切分:
- 对于A矩阵,沿着M轴进行切分,切分成多份的singleCoreM,单核上处理K大小的数据。
- 对于B矩阵,沿着N轴进行切分,切分成多份的singleCoreN,单核上处理M大小的数据。
- 于C矩阵,由A的部分和B的部分相乘得到,单核上输出C矩阵大小为singleCoreM * singleCoreN。
- 核内切分按照下面方式进行:
- 对于A矩阵,沿M轴进行切分,切分成多份的baseM;沿K轴进行切分,切分成多份的baseK。
- 对于B矩阵,沿N轴进行切分,切分成多份的baseN;沿K轴进行切分,切分成多份的baseK。
- 对于C矩阵,由A和B的分块相乘并累加,得到C矩阵中对应位置的baseM * baseN大小的分块