4、神经网络加速器设计原理:基于数据流(Dataflow)的加速器架构
神经网络加速器的核心任务是将卷积神经网络(CNN)中的大量乘加运算(MAC)高效映射到硬件资源上。然而,同样的卷积计算,采用不同的数据流(Dataflow)策略,会导致片上数据复用率、存储访问次数、能耗和性能产生数量级的差异。数据流决定了在计算过程中,权重(Weight)、输入特征图(IFMap)和输出特征图(OFMap)三者中,哪一个被“固定”在片上寄存器或处理单元(PE)中,从而最大化数据复用,减少对片外DRAM的访问。本章将深入剖析权重固定(Weight Stationary)、输出固定(Output Stationary)和行固定(Row Stationary)三种主流数据流架构的原理、性能影响及适用场景。
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中,通过行间流水实现数据复用。
4.2 判断方法:如何选择合适的数据流策略
选择数据流策略需要综合考虑网络结构、硬件资源和能耗目标。以下是系统化的判断流程:
- 分析网络层特征:统计各层的卷积核大小、输入/输出通道数、特征图尺寸。对于3×3卷积(ResNet、VGG),权重总量为9×C_in×C_out,输入特征图为H×W×C_in,输出为H×W×C_out。
- 计算数据复用潜力:权重复用次数 = 输出特征图尺寸 / 卷积核尺寸;输入复用次数 = 卷积核尺寸 × 输出通道数。若权重复用次数远大于输入复用次数,优先考虑WS。
- 评估片上存储容量:WS需要存储整个权重集,OS需要存储输出特征图的部分和。对于大通道数网络(如ResNet-50的最后一层,C_out=2048),OS需要2048×H×W×4字节的存储,可能超出片上SRAM容量。
- 考虑数据精度与带宽:低精度(INT8)下,数据搬运能耗占比更高,应优先选择复用率高的策略。高带宽场景(HBM)下,数据流选择对性能影响相对减小。
| 网络层类型 | 推荐数据流 | 原因 |
|---|---|---|
| 3×3卷积,C_in=C_out=64 | WS | 权重复用率高,存储需求适中 |
| 1×1卷积(Pointwise) | OS | 权重极小,输出复用为主 |
| 7×7卷积,C_in=3 | OS | 大卷积核,输入通道少 |
| 全连接层 | 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%。
4.4 常见误区与设计复盘
误区一:认为WS总是最优。WS在权重主导的网络中表现优异,但在深度可分离卷积或1×1卷积中,权重极小,WS的优势荡然无存。例如MobileNet的深度卷积层,权重仅3×3×C_in,而输入特征图巨大,此时OS或RS更合适。
误区二:忽视部分和累积的能耗。OS架构虽然减少了输出访问,但部分和在PE间的传递需要额外的互连和缓冲。在大型PE阵列中,部分和传递的能耗可能占总能耗的15%-20%。设计时需权衡输出固定带来的存储节省与部分和传递的能耗开销。
误区三:静态选择数据流。现代网络(如EfficientNet)包含多种层类型,单一数据流无法在所有层中达到最优。先进加速器(如NVIDIA A100)采用动态数据流切换,根据层特征实时调整PE配置。这需要硬件支持灵活的路由和存储分配,增加了设计复杂度。
数据流设计没有银弹,必须结合具体应用场景、网络结构和硬件约束进行系统级优化。理解三种基本数据流的原理与权衡,是设计高效神经网络加速器的第一步。在实际项目中,建议通过RTL仿真和FPGA原型验证,量化不同数据流在目标 workload 下的性能与能耗差异,再做最终决策。