4、神经网络加速器设计原理:基于数据流(Dataflow)的加速器架构

神经网络加速器的核心任务是将卷积神经网络(CNN)中的大量乘加运算(MAC)高效映射到硬件资源上。然而,同样的卷积计算,采用不同的数据流(Dataflow)策略,会导致片上数据复用率、存储访问次数、能耗和性能产生数量级的差异。数据流决定了在计算过程中,权重(Weight)、输入特征图(IFMap)和输出特征图(OFMap)三者中,哪一个被“固定”在片上寄存器或处理单元(PE)中,从而最大化数据复用,减少对片外DRAM的访问。本章将深入剖析权重固定(Weight Stationary)、输出固定(Output Stationary)和行固定(Row Stationary)三种主流数据流架构的原理、性能影响及适用场景。

三种数据流架构对比:数据复用与存储访问策略 权重固定 (WS) 权重驻留PE,输入/输出流动 PE阵列 权重 累加器 IFMap 权重固定 OFMap • 权重复用率极高 • 适合小卷积核、大通道 • 权重存储开销小 • 输入/输出频繁访问 输出固定 (OS) 输出特征图驻留PE,权重/输入流动 PE阵列 输出 部分和 IFMap 输出固定 权重 • 输出复用率极高 • 适合大卷积核、小通道 • 减少部分和读写 • 权重/输入频繁访问 行固定 (RS) 行数据驻留PE,行间流动 PE阵列 行缓冲 行累加 行数据 行固定 行间流动 • 行数据复用均衡 • 适合任意卷积核 • 平衡权重/输入/输出 • 硬件复杂度较高 数据流对比总结 维度 权重固定 (WS) 输出固定 (OS) 行固定 (RS) 主要复用 权重 输出特征图 行数据 存储访问 输入/输出频繁 权重/输入频繁 均衡 适用场景 小卷积核、大通道 大卷积核、小通道 通用场景 硬件复杂度 低 中 高 能耗效率 权重主导时优 输出主导时优 综合最优

4.1 核心原理:数据流如何决定加速器效率

神经网络加速器的本质是数据搬运与计算的平衡。在CNN中,一次卷积操作涉及三维数据:输入通道(C)、卷积核高度(R)和宽度(S)。以3×3卷积为例,每个输出像素需要9次乘加运算,而每个输入像素可能被多个输出像素复用。数据流策略的核心目标就是确定数据在PE阵列中的移动方式,以最大化复用、最小化DRAM访问。

从硬件角度看,数据流决定了三个关键指标:数据复用率(每个数据从DRAM加载后被使用的次数)、部分和累积方式(在PE内累积还是跨PE传递)以及片上存储容量需求。权重固定(WS)将权重预加载到PE的寄存器中,输入特征图在PE间广播或流水传递,输出部分和在PE内累积。这种方式下,权重只需从DRAM加载一次,但输入和输出需要频繁访问。输出固定(OS)则相反,将输出特征图固定在PE中,权重和输入在PE间流动,每个PE负责计算一个或多个输出像素的所有通道累积。行固定(RS)是Eyeriss项目提出的折中方案,将一行输入和一行权重固定在PE中,通过行间流水实现数据复用。

关键洞察:数据流的选择本质上是存储层次与计算模式的匹配问题。WS适合权重远大于输入的场景(如全连接层),OS适合输出特征图较小的场景(如大卷积核),而RS试图在两者间取得平衡。实际设计中,现代加速器(如TPU、NVIDIA Tensor Core)往往采用混合数据流,根据层类型动态切换策略。

4.2 判断方法:如何选择合适的数据流策略

选择数据流策略需要综合考虑网络结构、硬件资源和能耗目标。以下是系统化的判断流程:

  1. 分析网络层特征:统计各层的卷积核大小、输入/输出通道数、特征图尺寸。对于3×3卷积(ResNet、VGG),权重总量为9×C_in×C_out,输入特征图为H×W×C_in,输出为H×W×C_out。
  2. 计算数据复用潜力:权重复用次数 = 输出特征图尺寸 / 卷积核尺寸;输入复用次数 = 卷积核尺寸 × 输出通道数。若权重复用次数远大于输入复用次数,优先考虑WS。
  3. 评估片上存储容量:WS需要存储整个权重集,OS需要存储输出特征图的部分和。对于大通道数网络(如ResNet-50的最后一层,C_out=2048),OS需要2048×H×W×4字节的存储,可能超出片上SRAM容量。
  4. 考虑数据精度与带宽:低精度(INT8)下,数据搬运能耗占比更高,应优先选择复用率高的策略。高带宽场景(HBM)下,数据流选择对性能影响相对减小。
网络层类型推荐数据流原因
3×3卷积,C_in=C_out=64WS权重复用率高,存储需求适中
1×1卷积(Pointwise)OS权重极小,输出复用为主
7×7卷积,C_in=3OS大卷积核,输入通道少
全连接层WS权重矩阵巨大,需最大化权重复用
深度可分离卷积RS通道独立,行数据复用均衡

4.3 案例拆解:Eyeriss的行固定架构与TPU的权重固定架构

为了深入理解数据流对性能与能耗的影响,我们对比两个经典设计:MIT的Eyeriss(行固定)和Google的TPU(权重固定)。

Eyeriss(RS架构):Eyeriss采用108个PE组成的阵列,每个PE包含一个乘加单元和本地寄存器文件。其核心创新在于行固定数据流:每个PE负责计算输出特征图的一行,权重和输入数据以行形式在PE间流水传递。在运行AlexNet时,Eyeriss实现了约45%的能耗降低(相比无数据流优化的设计),DRAM访问减少了约2.5倍。关键参数:PE阵列频率200MHz,片上SRAM 108KB,在28nm工艺下功耗仅278mW。

TPU(WS架构):TPU采用256×256的脉动阵列,权重预加载到PE中,输入特征图从左侧流入,部分和从下方流出。这种设计在矩阵乘法中实现了极高的权重复用。在运行ResNet-50时,TPU的MAC利用率达到85%以上,但代价是输入特征图需要反复从DRAM加载。TPU的功耗约40W(28nm工艺),其中DRAM访问功耗占比超过30%。

实战对比:在相同卷积层(3×3,C_in=256,C_out=256,H=W=14)上,Eyeriss的RS架构需要约1.2MB的片上存储,DRAM访问次数为2.1M;TPU的WS架构需要约0.8MB存储,但DRAM访问次数为3.4M。RS架构在存储效率和能耗上更优,但WS架构在硬件实现上更简单,时钟频率更高。

4.4 常见误区与设计复盘

误区一:认为WS总是最优。WS在权重主导的网络中表现优异,但在深度可分离卷积或1×1卷积中,权重极小,WS的优势荡然无存。例如MobileNet的深度卷积层,权重仅3×3×C_in,而输入特征图巨大,此时OS或RS更合适。

误区二:忽视部分和累积的能耗。OS架构虽然减少了输出访问,但部分和在PE间的传递需要额外的互连和缓冲。在大型PE阵列中,部分和传递的能耗可能占总能耗的15%-20%。设计时需权衡输出固定带来的存储节省与部分和传递的能耗开销。

误区三:静态选择数据流。现代网络(如EfficientNet)包含多种层类型,单一数据流无法在所有层中达到最优。先进加速器(如NVIDIA A100)采用动态数据流切换,根据层特征实时调整PE配置。这需要硬件支持灵活的路由和存储分配,增加了设计复杂度。

设计复盘:在某AI芯片项目中,团队最初采用纯WS架构,在运行YOLOv3时发现DRAM带宽成为瓶颈。通过分析发现,YOLOv3的3×3卷积层权重复用率虽高,但输入特征图(416×416×3)的重复加载导致带宽不足。最终方案改为WS与OS混合:前几层用WS,深层用OS,整体性能提升了1.8倍,能耗降低了22%。

数据流设计没有银弹,必须结合具体应用场景、网络结构和硬件约束进行系统级优化。理解三种基本数据流的原理与权衡,是设计高效神经网络加速器的第一步。在实际项目中,建议通过RTL仿真和FPGA原型验证,量化不同数据流在目标 workload 下的性能与能耗差异,再做最终决策。