共计 2912 个字符,预计需要花费 8 分钟才能阅读完成。
转载地址:https://bbs.huaweicloud.com/f…
作者:搬砖小强 abc
萌新一枚,之前断断续续应用了一段时间的 MindSpore 框架,在和搭档们交换的过程中,很多人发现 MindSpore 相比于 tensorflow/pytorch 在训练性能上有着近乎线性的晋升,而且是在昇腾芯片上才体现进去,遂始终好奇这其中的个中原因。最近看了《昇腾 AI 处理器架构与编程》这本书后,茅塞顿开,豁然开朗。神秘藏在 MindSpore 精妙设计与昇腾芯片达芬奇架构下面。明天就来简略探讨下。
达芬奇架构
昇腾 AI 处理器的计算外围次要由 AI Core 形成,负责执行标量、向量和张量相干的计算密集型算子。AI Core 采纳了达芬奇架构,其根本构造如图 1 所示。包含了三种根底计算资源:矩阵计算单元 (Cube Unit)、向量计算单元(Vector Unit) 和标量计算单元(Scalar Unit)。这三种计算单元从名字上就能够看出,别离对应了张量、向量和标量三种常见的计算模式。此外,在矩阵计算单元和向量计算单元外部还提供了不同精度、不同类型的计算模式。AI Core 中的矩阵计算单元目前反对 INT8 和 FP16 的计算;向量计算单元目前反对 FP16 和 FP32 以及多种整型熟的计算。
图 1 AI Core 架构图
为了配合 AI Core 中数据的传输和搬运,围绕着三种计算资源还分布式地设置了一系列片上缓冲区,比方用来搁置整体图像特色数据、网络参数以及两头后果地输出缓冲区 (Input Buffer, IB) 和输入缓冲区(Output Buffer, OB),以及提供一些长期变量地高速寄存器单元。在 AI Core 中,IB 之后设置了一个存储转换单元(Memory Transfer Unit, MTE)。这是达芬奇架构地特色之一,次要目标是为了以极洼地效率实现数据格式的转换。比方咱们应用的 GPU 要通过矩阵计算来实现卷积,首先要通过 Img2col 的办法把输出的网络和特色数据以肯定格局排列起来,这一步在 GPU 中是通过软件来实现的,效率比拟低下。达芬奇架构采纳了一个专门的存储转换单元来实现这一过程,通过固化的硬件电路能够在很短时间内实现整个转置过程。因为相似转置计算在深度神经网络中呈现频繁,这种定制化电路模块设计能够晋升 AI Core 的执行效率,从而实现不间断的卷积运算。计算单元
计算单元是 AI Core 中提供弱小算力的外围单元,次要蕴含矩阵计算单元、向量计算单元、标量计算单元和累加器。矩阵计算单元 & 累加器
矩阵计算单元和累加器次要实现矩阵相干计算。常见的深度神经网络算法大量的应用了矩阵计算,达芬奇架构对矩阵计算进行了深度的优化与定制。如图 2 示意矩阵 A 和矩阵 B 相乘 C =A×B,其中 M 是矩阵 A 的行数,K 是 A 的列数以及 B 的行数,N 是矩阵 B 的列数。
图 2 矩阵乘法示意图
(1) CPU 计算
传统 CPU 中计算矩阵乘法的典型代码如代码 1 所示:
for (int m=0;n<;m++)
for (int n=0;n<N;n++)
for (int k=0;k<K;k++)
cm += Am*Bk;
代码 1 CPU 计算矩阵乘法
该程序用三个循环进行一次残缺的矩阵乘法计算,如果在一个 CPU 上执行须要 M×K×N 个时钟周期能力实现,当矩阵十分宏大时执行过程极为耗时。
而且在 CPU 计算过程中,矩阵 A 是依照行扫描,矩阵 B 依照列扫描,而矩阵存储个别是按行间断存储,而内存读取是具备很强的数据部分特色的,即当读取内存中某个数时会关上内存中相应的一整行并且把同一行中所有数读取进去,这种内存读取形式对矩阵 A 很敌对而对 B 却显得很不敌对,为此须要将 B 的存储形式转成按列存储。因而在矩阵计算中往往通过扭转某个矩阵的存储形式来提高效率。
(2)GPU 计算
在深度神经网络中实现计算卷积过程,要害的步骤是将卷积运算转化为矩阵计算。在 CPU 中大规模矩阵计算往往成为性能瓶颈,而矩阵计算在深度学习中又极为重要。为了解决这个矛盾,GPU 采纳通用矩阵乘法 (GEMM) 的形式来实现矩阵乘法。例如实现一个 16×16 矩阵与另一个 16×16 矩阵的乘法,因为须要同时计算 16×16 组向量的乘加运算,须要安顿 256 个并行线程,每个线程都能够独立计算实现后果矩阵中的一个输入点。假如每个线程在一个时钟周期内能够实现一次乘加运算,而每组向量乘运算须要 16 次乘加运算,则 GPU 实现整个矩阵计算须要 16 个时钟周期,这个时延是传统 GPU 无奈防止的瓶颈。而昇腾 AI 处理器针对这个问题做了深度优化。
(3)昇腾计算
达芬奇架构在 AI Core 中特意设计了矩阵计算单元作为昇腾 AI 处理器的外围计算模块。通过精美设计的定制电路和极致的后端优化伎俩,矩阵计算单元能够用一条指令实现两个 16×16 矩阵的相乘运算(因 M =K=N=16,标记为 16^3,这也是 Cube 名称的由来),等同于在极其工夫内进行了 16^3=4096 个乘加运算,并且可实现 FP16 的运算精度。如图 3 所示,矩阵计算单元实现 C =A×B 的矩阵运算时,会当时将矩阵 A 按行寄存在 IB 中,同时将矩阵 B 按列寄存在 IB 中,通过矩阵计算单元计算后失去的后果矩阵 C 按行寄存在 OB 中。在矩阵相乘运算中,矩阵 C 的第一元素由矩阵 A 的第一行的 16 个元素和矩阵 B 的第一列的 16 个元素通过矩阵计算单元子电路进行 16 次乘法和 15 次加法运算得出。
图 3 矩阵计算单元计算示意图
矩阵计算单元中共有 256 个计算子电路,能够由一条指令并行实现矩阵 C 的 256 个元素计算,即大抵一个时钟周期就能够实现一个矩阵乘法。抽象的说,N 个矩阵乘法运算只需 N 条指令,这正比例资源关系天然就解释了 MindSpore 在昇腾解决起上的训练性能成线性晋升的起因。
在无关矩阵的解决上,通常在进行完一次矩阵乘法后还须要和上次后果进行累加,以实现相似 C =A×B+ C 的运算。矩阵计算单元的设计上也思考到了这种状况,为此专门在计算单元前面减少了一组累加器单元,能够实现将上次两头后果与以后后果累加,总共累加次数可由软件管制,并在累加实现之后将后果写入 OB 中,在卷积计算过程中,累加器能够实现加偏置的累加计算。
矩阵计算单元这以空间换工夫的设计理念,能够疾速实现 16×16 的矩阵相乘,但当超过 16×16 大小的矩阵利用该单元进行计算时,则须要市当时依照特定数据格式进行矩阵的存储,并在计算过程中以特定的分块形式进行数据的读取。而这种切割分块操作,昇腾从软硬件两方面都做了设计,MindSpore 从软件架构上实现了主动最优宰割的接口化设计(具体是如何设计的这里先挖个坑,后续再填坑),而在硬件上的优化设计,如图 4 所示。矩阵 A 展现的切割和排序形式称作“大 Z 小 Z”,直观地看就是矩阵 A 地各个分块之间依照行的程序排序,称为“大 Z”形式;而每个块的外部数据也是按行排列,称为“小 Z”形式。与之造成比照的是矩阵 B 的各个分块之间按行排序,而每个块的外部按列排序,称为“大 Z 小 N”的排序形式。依照矩阵计算的个别法令,昇腾 AI 处理器外部专用电路能够实现将如此排列的 A、B 矩阵相乘之后失去矩阵 C,而矩阵 C 会呈现出各个分块之间依照列排序,而每个块外部依照行排序的格局,称为“大 N 小 Z”的排列形式。
图 4 存储格局的要求
向量计算单元
未完待续......