DaDianNao:一种无主存储器的多核加速器
DianNao 发现内存访问而非计算是深度学习模型执行的瓶颈,并研究了一种最小化内存传输的加速器架构。后续的 DaDianNao 和 ShiDianNao 将该思路贯彻到了极致:
- ShiDianNao 是一种 YX 切分、输出驻留的嵌入式 CNN 加速器;
- DaDianNao:一种分布式驻留权值的多核加速器。
DaDianNao 本意是一种多芯片AI 超算系统,类似于 Groq LPU 的 Scale Out。然而数据在多芯片间的移动会成为新的瓶颈。以现在的标准来看,DaDianNao 单个 Node 的算力为 16 × 16 × 16 × 2 = 8192 Ops/cycle 16\times 16 \times 16 \times 2=8192 \text{ Ops/cycle} 16×16×16×2=8192 Ops/cycle,与 Davinci AI Core 相同,看作是处理器的单个核心可能更合适一些。DaDianNao 对 DianNao 改进主要有两个方面:
- 支持训练:
- 将 NFU 分解成若干个硬件模块,灵活配置多种通路;
- 16位运算单元可以聚合为32位。
- 放大规模:
- Tile:由 NFU 和4个 eDRAM bank 组成;
- Node:胖树连接16个 NFU,广播输入并收集输出,两个 CT eDRAM 暂存输入输出;
- 互联:2D 网格拓扑结构,异步 FIFO 将 HT 连接到 CT eDRAM。
DaDianNao 仍然遵循 DianNao 论文中给出的循环逻辑:
- Node 间切分 H o W o H_o W_o HoWo;
- Tile 间拆分 C o C_o Co。
由于没有 DRAM 访问,运行网络时类似于 Vertical Layer Fusion 优化。考虑到 CNN 的感受野特性,执行完整模型存在以下问题:
- 首层通道数过少,硬件利用率不足;
- 除首层外需要通过互联网络传输重叠的特征图边界;
- 中间和末尾阶段为小图多通道,Node 间切分开销增大,缓存部分和存在困难。
就其本质而言,直接卷积方式难以应对各种边角案例。相应地,谷歌 TPU、NVIDIA TensorCore GPU 和 Ascend NPU 均采用 im2col+gemm 的方式。
V. A MACHINE -LEARNING SUPERCOMPUTER
DaDianNao 架构称为“超级计算机”,因为其目标是实现远超单 GPU 性能的高持续机器学习性能,并且这种能力是通过多芯片系统实现的。尽管如此,每个节点都比典型的 GPU 便宜得多,同时表现出相当或更高的计算效率(每秒操作数除以面积)。其的架构设计基于 DNN 和 CNN 的一个核心特性:尽管其参数的总内存占用较大(可达数十 GB),但在具有合理数量芯片的多芯片系统中可以完全映射到片上存储。
A. Overview
正如第 IV 节所述,根本问题在于两种类型的层的突触存储(用于重用)或带宽需求(用于获取):
- 具有私有核的卷积层(DNN 中最常见的情况);
- 分类器层(通常是全连接的,因此具有大量突触)。
作者通过采用以下设计原则来解决这个问题:
- 创建一种架构,使突触突触始终存储在将使用它们的神经元附近,从而最大限度减少数据移动,节省时间和能量。该架构是完全分布式的,没有主存储器;
- 创建一种不对称架构,使每个节点的面积大部分用于存储而非计算。
- 传输神经元值而非突触值,因为在上述层中,神经元值的数量比突触值少几个数量级,因此只需要相对较少的外部(跨芯片)带宽;
- 通过将本地存储分解为许多小块来实现高内部带宽。
总体架构由一组节点组成,每个节点对应一个芯片,这些节点以经典网格拓扑排列。每个节点包含大量存储空间(尤其是用于突触)和神经计算单元(经典的乘法器、加法树和通过线性插值实现的非线性传递函数的流水线)。为了与现有研究保持一致,论文也将这些单元称为 NFU,尽管 DaDianNao 的 NFU 比 DianNao 中的版本复杂得多,因为其流水线可针对每一层以及推理/训练进行重新配置,详见第 V-B3节。
接下来的小节将详细介绍每个组件,并解释设计选择的基本原理。
Driving example.
下文以分类器层为驱动示例,因为它在设计上具有挑战性(突触数量巨大),但结构上相对简单,适合作为主要分析对象。请注意,为完整起见,将在第 V-B3 节中解释如何在架构上实现所有层。如第 II 节所述,在分类器层中, N o N_o No 个输出通常连接到所有 N i N_i Ni 个输入,每个连接有一个突触权重。就局部性而言,这意味着每个输入重复使用了 N o N_o No 次,并且突触权重不会在一个分类器层执行中重复使用。
B. Node
本节将介绍架构节点,并解释其设计原理。
1) Synapses Close to Neurons:
所提出架构的一个基本设计特点是将突触的存储位置靠近神经元,并使其容量巨大。这一设计选择的动机是仅移动神经元数据,而将突触保存在固定的存储位置。这一设计实现了以下两个目的:
- 首先,该架构同时针对推理和训练任务,神经元和突触需要在前向和后向阶段之间进行移动:
- 在推理阶段,前一层的神经元是计算的输入;
- 在训练阶段,神经元先进行前向传播(因此前一层的神经元是输入),然后进行反向传播(因此下一层的神经元成为输入)。
- 其次,将所有突触(大部分计算输入)放置在计算运算符附近,可以提供低能耗/低延迟的数据(突触)传输以及高内部带宽。
由于突触的数量远多于神经元(详见第 II 节),例如,
- 在分类层中是 O ( N 2 ) v s . O ( N ) O(N^2)\thickspace \mathrm{vs.} \thickspace O(N) O(N2)vs.O(N);
- 在卷积层中,带有私有内核的突触数量是 K × K × N if × N of × N x × N y K \times K \times N_{\text{if}} \times N_{\text{of}} \times N_x \times N_y K×K×Nif×Nof×Nx×Ny,而神经元的数量是 N if × N x × N y N_{\text{if}} \times N_x \times N_y Nif×Nx×Ny;
因此传输神经元输出而不是突触更为合理。
如表 I 所示,层的大小可以从不到1MB 到大约1GB,其中大部分在几十MB 之间。虽然 SRAM 适合用作缓存,但其存储密度不足以支持如此大规模的存储需求。然而,eDRAM 以较高的存储密度而闻名。例如,10MB 的 SRAM 存储器在28nm 工艺下需要20.73mm² 的面积[36],而相同大小、相同工艺节点的 eDRAM 内存仅需7.27mm²[50],即存储密度提高了2.85倍。此外,为所有芯片上的 eDRAM 提供足够的容量以容纳所有突触,可以减少对片外 DRAM 的访问,而这种访问的能耗特别高。例如,在28nm 工艺下一次读取256位宽 eDRAM 阵列的能耗为0.0192nJ (50μA, 0.9V, 606 MHz) [25],而读取256位相同工艺下的 Micron DDR3 DRAM 能耗为6.18nJ,能耗比为321倍。这一巨大差异主要归因于内存控制器、DDR3 物理层接口、片上总线访问、页面激活等因素。
如果 NFU 不再受到内存带宽的限制,就可以扩大其规模,从而同时处理更多的输出神经元 ( N o N_o No) 以及每个输出神经元的更多输入 ( N i N_i Ni),从而提升整体节点的吞吐量。例如,要将每个周期执行的操作数量相较于第 IV 节提到的加速器提升16倍,需要设置 N i = 64 N_i = 64 Ni=64(而不是 16 16 16)和 N o = 64 N_o = 64 No=64(而不是 16 16 16)。为了实现最大吞吐量,每个周期必须从 eDRAM 提取 N i × N o N_i \times N_o Ni×No 个16位数据值到 NFU,即在这种情况下为 64 × 64 × 16 = 65536 64 \times 64 \times 16 = 65536 64×64×16=65536 位。
然而,eDRAM 与传统 DRAM 类似,存在三个众所周知的缺点:
- 比 SRAM 更高的延迟;
- 破坏性读取;
- 需要周期性刷新[Logic-based eDRAM]。
为了弥补 eDRAM 的缺陷并仍然能够在每个周期为 NFU 提供数据, DaDianNao 将 eDRAM 划分为4个 bank(在上述示例中每个 bank 宽度为65536位),并将突触行在这4个存储体之间交错分布。
作者在28nm 工艺节点下(ST 技术,LP)对该设计进行了布局布线,并得到了图4所示的版图。NFU 的占用面积非常小,仅为0.78mm²(
0.88
m
m
×
0.88
m
m
0.88mm \times 0.88mm
0.88mm×0.88mm),但工艺要求导线之间平均间距为0.2μm,并且仅提供4层水平金属层。连接 NFU 和 eDRAM 的 65536 根导线需要的宽度为
65536
×
0.24
=
3.2768
m
m
65536 \times 0.24 = 3.2768 mm
65536×0.24=3.2768mm,如图4所示。因此,导线占用 4 × 3.2768 × 3.2768 - 0.88 × 0.88 = 42.18 mm²,这几乎等于所有 eDRAM 存储体、所有 NFU 和 I/O 接口的总面积。
2) High Internal Bandwidth:
为了避免这种拥堵, DaDianNao 采用了基于瓦片的设计,如图5所示。输出神经元分布在不同的瓦片中,使得每个 NFU 可以同时处理16个输入神经元和16个输出神经元(即256个并行操作),见图 6。
因此,每个瓦片中的 NFU 显著减小,并且每个周期只需从 eDRAM 中提取 16 × 16 × 16 = 4096 16 \times 16 \times 16 = 4096 16×16×16=4096 位数据。 DaDianNao 保留了4个 bank(每个 bank 宽度为4096位)的组织结构,以弥补前述 eDRAM 的缺点,并设计出如图5所示的瓦片设计。对一个这样的瓦片进行布局布线,得到的面积为1.89mm²,因此16个这样的瓦片总面积为30.16mm²,相较于之前的设计减少了28.5%的面积,因为路由网络现在仅占总面积的8.97%。
所有瓦片通过一棵胖树(fat tree)互连,该网络用于向每个瓦片广播输入神经元值,并从每个瓦片收集输出神经元值。在芯片的中心,有两个特殊的 eDRAM 存储体,一个用于输入神经元,另一个用于输出神经元。需要理解的是,即使在有大量瓦片和芯片的情况下,所有 NFU 硬件支持的输出神经元总数仍可能比大型层中实际的神经元数量要少。因此,对于广播到所有瓦片的每一组输入神经元,都会在同一个硬件神经元上计算多个不同的输出神经元。这些神经元的中间值会被保存回瓦片的本地 eDRAM 中。当一个输出神经元的计算完成后(所有输入神经元已参与计算),该值将通过胖树发送到芯片中心相应的(输出神经元)中央 eDRAM 存储体。
3) Configurability (Layers, Inference vs. Training):
可以根据不同的层和执行模式(推理或训练)调整瓦片,特别是 NFU 流水线。将NFU分解成若干个硬件模块:
- 加法器模块(可配置为256输入、16输出加法树或256个并行加法器)
- 乘法器模块(256个并行乘法器)
- 最大模块(16个并行max操作)
- 传递模块(两个独立子块,进行16个分段线性插值;每个块的a , b线性插值系数,即 y = a × x + b y = a \times x + b y=a×x+b,存储在两个16项的 SRAM 中,可配置实现任意传递函数及其导数)。
图7中展示了 CONV、LRN、POOL 和 CLASS 层在前向和后向阶段的不同流水线配置。
每个硬件模块都设计为允许将16位运算符(加法器、乘法器、最大值以及用于线性插值的加法器/乘法器)聚合为更少的32位运算符:
- 两个16位加法器聚合为一个32位加法器;
- 四个16位乘法器聚合为一个32位乘法器;
- 两个16位最大值聚合为一个32位最大值。
聚合运算单元的额外开销非常低[26]。虽然16位运算符在很大程度上足以满足推理的需要,但它们可能会降低精度和(或)增加,甚至阻碍训练的收敛性。举例来说,考虑在 MNIST 上使用各种定点和浮点代表示的组合训练 LeNet-5:
- 如果仅在推理中使用16位定点数,对误差几乎没有影响,但如果也用于训练,则无法收敛;
- 另一方面,使用32位定点表示时,对错误率的影响很小:误差从0.83%增加到0.91%;
- 此外,在进一步测试中,作者注意到28位表示的误差为1.72%,增加4位后误差迅速下降到0.91%;
- 进一步聚合运算单元还能继续降低定点的错误率。
默认情况下, DaDianNao 在训练模式下使用32位运算符。
除了流水线和硬件模块的配置外,还必须针对不同的数据移动情况配置瓦片。例如,分类器层的输入:
- 可以来自节点中央的 eDRAM(可能是从另一个节点传输而来);
- 也可以像 DianNao 一样来自两个用于缓冲输入和输出神经元值的 SRAM 存储器(16KB),
- 甚至是临时值(例如用于重用输入神经元值的神经元部分和)。
在反向传播阶段,NFU 还必须在权重更新步骤后将数据写入瓦片的 eDRAM,如图7所示。在梯度计算步骤中,输入梯度和输出梯度会使用前向传播阶段输入和输出神经元的数据路径,同样可以参考图7。
C. Interconnect
由于仅需要传输神经元的值,并且每个节点内部大量重用这些值,通信量虽然显著,但在大多数情况下并不构成瓶颈,除非是某些特定的层和多节点系统,这一点将在第 VII 节中进一步讨论。因此, DaDianNao 并未为此开发定制的高速互连,而是转向了商用的高性能接口,并使用了 HyperTransport (HT) 2.0 IP 模块。DaDianNao 在28nm 工艺中使用的 HT2.0物理层接口(PHY)是一个尺寸为5.635mm × 0.5575mm 的长条形区域(带有一个突出部分),因为其通常位于芯片的外围。
DaDianNao 使用简单的2D 网格拓扑结构:
- 每个芯片必须通过四个 HT2.0 IP 块连接到四个相邻芯片(见图9);
- 每个 IP 块具有16个 HT 链路,即16对差分输出信号和16对差分输入信号,频率为1.6 GHz;
- 每个 HT 模块在每个方向上提供6.4GB/s 的带宽。两个相邻节点之间的 HT2.0延迟约为80ns。
- 使用一个128位、4 项深度的异步 FIFO 将 HT 连接到中央 eDRAM。
不过,未来可能会重新评估这一选择,以采用更高效的三维网格拓扑结构。
Router.
DaDianNao 在瓦片的中央模块旁边实现了路由器,参见图5:
- 采用虫孔路由,路由器有5个输入(输出)端口( 4个方向及注入(弹出)端口);
- 每个输入端口包含8个虚拟通道(每个虚拟通道有5个 flit 槽);
- 一个5x5交叉开关用于连接所有输入(输出)端口;
- 路由器有四个流水线阶段:
- 路由计算(RC);
- 虚拟通道分配(VA);
- 交换分配(SA);
- 交换遍历(ST)。
D. Overall Characteristics
架构特性总结在表 III 中:
- 每个节点中实现了16个瓦片;
- 在每个瓦片中,4个 eDRAM 存储体各包含1024行,每行4096位;
- 每个节点的 eDRAM 总容量为
16
×
2
+
4
=
36
16 \times 2 + 4 = 36
16×2+4=36 MB:
- 单个瓦片中的 eDRAM 总容量为 4 × 1024 × 4096 = 2 4 \times 1024 \times 4096 = 2 4×1024×4096=2 MB;
- 每个节点的中心 eDRAM 的大小为 4MB。
- 为了避免异步传输带来的电路复杂性和时间开销, NFU 的时钟频率与28nm 工艺下的 eDRAM 频率相同,即606MHz。
需要注意的是,DianNao 中实现的 NFU 在65nm 工艺下运行频率为 0.98GHz。因此,考虑到 DaDianNao 使用的是28nm 工艺,这一选择是非常保守的。作者把实现更快的 NFU 和使用 eDRAM 的异步通信留给了未来的工作。尽管如此,每个节点:
- 对于16位运算,仍然具有 16 × ( 288 + 288 ) × 606 = 5.58 TeraOps/s 16 \times (288 + 288) \times 606 = 5.58 \text{ TeraOps/s} 16×(288+288)×606=5.58 TeraOps/s 的峰值性能;
- 对于32位操作,由于运算符聚合(请参阅第 V-B3节),峰值性能为 16 × ( 144 + 72 ) × 606 = 2.09 TeraOps/s 16 \times (144 + 72) \times 606 = 2.09 \text{ TeraOps/s} 16×(144+72)×606=2.09 TeraOps/s。
E. Programming, Code Generation and Multi-Node Map-ping
1) Programming, Control and Code Generation:
该架构可以看成是一种系统级 ASIC,因此编程需求较低,主要需要对架构进行配置并输入数据:
- 输入数据(即输入层的值)最初被划分到不同的节点,并存储在中央 eDRAM 存储体中;
- 神经网络配置以节点指令序列的形式实现,每个节点一个序列,由代码生成器生成。
代码生成器为 CLASS2层推理阶段生成的示例输出见表 V。在此示例中,
- 将输出神经元划分为多个256位数据块,每个数据块包含 256 / 16 = 16 256 / 16 = 16 256/16=16 个神经元;
- 每个节点分配到 4096 / 16 / 4 = 64 4096 / 16 / 4 = 64 4096/16/4=64 个输出数据块(同时存储所有输入神经元的四分之一,即 4096 / 4 = 1024 4096 / 4 = 1024 4096/4=1024 个神经元);
- 每个瓦片分配到 64 / 16 = 4 64 / 16 = 4 64/16=4 个输出数据块。
因此每个节点需要4条指令:
- 每条指令将从中央 eDRAM 加载 128 个输入数据块到瓦片中;
- 在前三条指令中,所有瓦片将获取相同的输入神经元,并从其本地 eDRAM 中读取突触权重,然后将输出神经元的部分和写回本地的 NBout SRAM;
- 在最后一条指令中,每个瓦片的 NFU 将完成部分和的最终求和,应用传递函数,并将输出值存储回中央 eDRAM。
这些节点指令本身驱动着每个瓦片的控制;每个节点的控制电路生成瓦片指令并将其发送到每个瓦片。节点或瓦片指令的核心思想是对一组连续输入数据(前向阶段的输入神经元,反向阶段的输出神经元、梯度或突触)执行相同的层计算(例如,分类器层的乘加传递操作)。由于一条指令的数据是连续的,因此只需三个操作数就能描述其特征:
- 起始地址;
- 步长;
- 迭代次数。
控制电路提供两种操作模式:
- 逐行处理;
- 批量学习[48]:同时处理多行数据,即同时评估同一层的多个实例,尽管输入数据不同。
批量学习方法在机器学习中常用于实现更稳定的梯度下降,同时也有助于提高突触的复用率,但代价是收敛速度较慢以及需要更大的存储容量(因为必须存储多个输入和输出实例)。
2) Multi-Node Mapping:
在一层计算结束时,每个节点都包含一组输出神经元值,这些值已存储回中央 eDRAM,见图5。这些输出神经元构成下一层的输入神经元;因此,隐含地,在一层计算开始时,输入神经元以3D 矩形的形式分布在所有节点中,这些矩形对应于一层子集的所有特征图,参见图8。这些输入神经元首先会通过(胖树)内部网络分发到所有节点的瓦片中,参见图5。与此同时,节点控制开始通过网格向其他节点发送输入神经元块。
在通信方面,主要有三种情况需要考虑:
- 首先,卷积层和池化层的特点是局部连通性,由用于采样输入神经元的小窗口(卷积或池化核)定义。由于局部连接,节点间通信量非常低(大多数通信是节点内的),主要发生在映射到每个节点的层矩形边界处,见图8。
- 对于局部响应归一化层,由于在给定位置的所有特征图始终被映射到同一个节点,因此不存在节点间通信。
- 最后,对于分类器层,由于每个输出神经元都使用所有输入神经元(见图8),因此通信量可能很高。同时,通信模式较为简单,相当于广播:
- 由于每个节点以大致相同的速度执行相同数量的计算,并且每个节点必须同时将其输入神经元集广播给所有其他节点,因此采用了一种计算与转发的通信方案[24],这相当于将节点的通信安排为一个规则的环形模式。
- 当节点完成自身计算并发送完上一块输入神经元后,可以立即开始处理新接收到的输入神经元块。因此,这种决策是本地化的,无需全局同步或屏障机制。
VII. EXPERIMENTAL RESULTS
本章首先介绍节点布局的主要特点,然后展示多芯片系统的性能和能耗结果。
A. Main Characteristics
芯片的单元版图如图9所示,面积明细如表 VI 所示:
- 16个瓦片占据了44.53%的芯片面积;
- 26.02%由4个HT IP 占用;
- 11.66%用于中央块(包括4MB eDRAM、路由器和控制逻辑);
- 中心块与瓦片之间的导线占据了8.97%的面积。
总体而言,
- 约有一半(47.55%)的芯片面积被存储单元(主要是 eDRAM)占用;
- 组合逻辑和寄存器分别仅占面积的5.88%和4.94%。
作者使用 Synopsys PrimePower 来估算芯片的功耗。芯片的峰值功耗为15.97W(在悲观的 100%翻转率下),这大约是最先进 GPU卡功耗的5-10%。从架构模块的功耗分布来看:
- 瓦片消耗38.53%的功率;
- 4个 HT IP 消耗了大约一半(50.14%)的功率。
从组件功耗分解来看,总体上,
- 存储单元(瓦片 eDRAM + 中央 eDRAM)占总功耗的38.30%;
- 组合逻辑和寄存器(主要是 NFU 和 HT 协议分析器)分别消耗了37.97%和19.25%的功耗。
B. Performance
在图10中将 DaDianNao 架构的性能与第 VI 节中描述的 GPU 基线进行了比较。由于 CONV1层内存占用较大(神经元和突触的数量),因此需要一个4节点系统。尽管 CONV1是一个共享内核卷积层,但它包含:
- 256个输入特征图;
- 384 个输出特征图;
- 11 × 11的卷积核。
因此,其总突触数量为:
256
×
384
×
11
×
11
=
11
,
894
,
784
256 \times 384 \times 11 \times 11 = 11,894,784
256×384×11×11=11,894,784
即22.69MB(16位数据)。此外,还必须存储该层的所有输入和输出:
- 输入: 256 × 256 × 256 × 2 = 32 MB 256 \times 256 \times 256 \times 2 = 32 \text{ MB} 256×256×256×2=32 MB;
- 输出: 246 × 246 × 384 × 2 = 44.32 MB 246 \times 246 \times 384 \times 2 = 44.32\text{ MB} 246×246×384×2=44.32 MB(由于11 × 11卷积核的边界效应,导致输出神经元数量减少)。
因此,总计需要存储99.01MB,超过了36MB 的节点容量。具有私有内核的卷积层,即 CONV3和 CONV4,需要一个36节点系统,因为它们的内存大小分别为1.29GB 和1.32GB。完整的神经网络包含59.48M个突触,即118.96MB(16位数据),至少需要4个节点。
平均而言,DaDianNao 架构在不同规模下相较于 GPU 基线的加速比为:
- 1节点:21.38倍
- 4节点:79.81倍
- 16节点:216.72倍
- 64节点:450.65倍
性能更高的原因:
- 运算器数量多:每个节点有9216个运算器(主要是乘法器和加法器),而 GPU 只有2496个 MAC;
- 片上 eDRAM:提供了必要的带宽和低延迟访问,从而为大量运算单元提供数据。
然而,不同层的可扩展性差异很大:
- LRN 层扩展性最好(无节点间通信),64节点时加速比高达1340.77倍(LRN2);
- CONV 和 POOL 层的扩展性几乎同样出色,因为它们仅在边界元素上存在节点间通信,例如,CONV1在64节点时实现了2595.23倍的加速比;
- 但 LRN 和 POOL 层的实际加速比低于 CONV 层,因为它们的计算密集度较低;
- CLASS 层扩展性较差,因为节点间通信量大,每个输出神经元使用来自不同节点的所有输入神经元,参见第 V-E2节,例如,CLASS1在64节点时加速比为72.96倍。
图11的时间分解进一步说明了这一点。此通信问题主要是由于采用相对简单的2D 网格拓扑结构造成的,节点数越多,将每个输入块发送到所有节点所需的时间就越长。更复杂的多维环面拓扑结构[4]可能会在很大程度上减少随着节点数量增加的总广播时间,但作者将此优化留待未来工作。
请注意:每个柱状条都是归一化后的执行时间;由于计算与通信重叠,柱状条的总和可能超过 100%。
完整神经网络的扩展性与 CLASS 层类似:
- 4节点:加速63.35倍
- 16节点:加速116.85倍
- 64节点:加速164.80倍
从表面上看,这可能意味着 CLASS 层在整个神经网络中占据主导计算时间,但按层类型进行的细分(见表 VII)表明情况并非如此,相反,CONV 层占主导地位。原因很简单,这个完整的神经网络包含的层对于大型64节点机器来说有点小。例如,有三个 CONV 层的维度为13x13(尽管有256到384个特征图),因此,即使将所有特征图都映射到同一节点,仍然需要为每个节点分配一个最多 2 × 2 2 \times 2 2×2 或 3 × 3 3 \times 3 3×3 大小的 X × Y X \times Y X×Y 区域( 13 × 13 64 = 2.69 \frac{13\times 13}{64} = 2.69 6413×13=2.69),这意味着要么不使用所有节点,要么每次卷积核计算都需要节点间通信。
Training and initialization.
作者使用32位定点运算符(参见 V-B3节)对反向传播和权重预训练阶段(RBM)进行了类似的实验(推理使用16位定点运算符):
- 平均而言,1节点、4节点、16节点和64节点架构分别比 GPU 基准快12.62倍、43.23倍、126.66倍和300.04倍;
- 运算单元聚合导致加速比低于推理阶段,但仍然很高。
如图12所示,对于 CLASS 层,训练阶段的可扩展性优于推理阶段,这主要得益于 CLASS 层在相同的通信量下,其计算量几乎是推理的两倍。RBM 初始化的可扩展性与推理阶段的 CLASS 层非常相似。
C. Energy Consumption
如图13所示,与 GPU 基线相比,能耗分别降低:
- 1节点:330.56倍
- 4 节点:323.74倍
- 16节点:276.04倍
- 64 节点:150.31倍
最小的能耗改进是64节点下的 CLASS1,为47.66倍,而最佳的能耗改进是单节点下的 CONV2,达到了896.58倍。对于卷积层、池化层和 LRN 层,可以观察到随着节点数量的增加,能耗优势保持相对稳定,尽管对于分类器层有所下降。后者是预料之中的,因为平均通信(以及整体执行)时间增加;同样,多维环形拓扑结构应该有助于减少这种能量损失。
从图11的能耗分解中可以观察到,对于单节点架构,NFU消耗了约83.89%的能量。随着节点数量的增加,趋势在很大程度上印证了之前的观察:HT消耗的能耗比例逐渐增加,在64节点系统中平均达到29.32%,特别是由于分类器层中通信量的增加(48.11%)。
Training and initialization.
在训练和初始化方面,相较于 GPU 基线的能耗减少也很显著(见 图 14):
- 1节点:172.39倍
- 4节点:180.42倍
- 16节点:142.59倍
- 64节点:66.94倍
可扩展性与推理阶段类似。
IX. CONCLUSIONS AND FUTURE WORK
论文针对最先进的机器学习算法(CNN 和 DNN)研究了一种定制的多芯片架构,这是因为在面向消费者和行业的复杂服务的大规模部署中,此类算法发挥着越来越重要的作用。在 GPU 和最近提出的加速器上,这些算法分别表现出良好的加速效果和面积节省,但它们仍然在很大程度上受限于带宽。作者研究表明,可以设计一种多芯片架构,在使用64个节点时,其性能最多可比单 GPU 提升450.65倍,能耗最多可降低150.31倍。每个节点在28nm 工艺下的面积为67.73mm2。作者计划从多个方向改进该架构:
- 提高 NFU 的时钟频率;
- 使用多维环形互连来增强大型分类器层的可扩展性;
- 研究以每个节点配备简单 VLIW 核心及相关工具链的形式实现更灵活的控制。
节点芯片的流片计划即将进行,随后将推出多节点原型。
参考资料:
- K8L的咽喉通道!HyperTransport 3.0总线解密
- 6.5.1 HyperTransport总线
- HyperTransport
- DaDianNao: A Machine-Learning Supercomputer
- Cambricon: An Instruction Set Architecture for Neural Networks
- 谈谈含光800芯片的设计缺点与野闻
- 含光800
- Groq多芯片同步方案
- 并行前缀(Parallel Prefix)加法器
- 【硬件算术设计】硬件加法器原理|第3章:并行前缀加法器
- 1.6.3. 加法树(Adder Trees)
- 各位知友,请问如何用Verilog实现在几十个数中快速找到最大值,谢谢啦?
- Simulink 中的传递函数模块Transfer Function
- NVDLA代码学习——CMAC
- 基于 2D Mesh 的 NoC 路由算法设计与仿真
- NoC(Network on Chip)基础 (5):网络路由(Routing)
- 《片上网络》笔记(五):流量控制
- OpenPPL 中的卷积优化技巧
- 卷积算子优化-2 几种卷积算法
- 功耗计算的时候,怎么根据VCD计算出信号的翻转率
- 3.2.2. MTBF计算中的同步器数据翻转速率
- 动态功耗分析笔记(一)
- [求助]如何估计时序电路中信号的toggle rate?
- CUDA-MODE课程笔记 第6课: 如何优化PyTorch中的优化器
- Two ways of TensorRT to optimize Neural Network Computation Graph
- Production Deep Learning with NVIDIA GPU Inference Engine