1. Eyeriss架构概览:从CNN加速器到数据流设计的演进之路
做AI芯片的朋友,应该都听过Eyeriss这个名字。2016年MIT的这篇ISSCC,说实话,改变了很多人对CNN加速器的认知。我当年第一次读到它时,心里就一个感觉:原来数据流可以这样设计。
今天这第一讲,咱们先不急着抠细节。我想先带你看看,Eyeriss到底解决了什么问题,它跟之前的加速器有什么不同,以及——为什么数据流设计会成为整个架构的灵魂。
1.1 为什么需要专门的CNN加速器?
你想想看,一个典型的卷积层,输入特征图可能是112×112×64,卷积核3×3×64×128,算下来一次卷积就要做上亿次乘累加。CPU做这个,慢;GPU做这个,功耗高。
所以业界开始思考:能不能做一个专用的硬件,既快又省电?
这就是CNN加速器的初衷。但问题来了——
核心矛盾:CNN的计算模式是高度并行的,但存储带宽是有限的。你算得再快,数据搬不过来,也是白搭。
我在2015年做过一个FPGA加速器项目,当时用的还是传统的“逐层处理”方式。结果呢?计算单元大部分时间都在等数据,利用率不到30%。说白了,瓶颈不在计算,在数据搬运。
1.2 从“计算为中心”到“数据流为中心”
传统的加速器设计思路,是先把权重和输入数据全部加载到片上,然后一股脑算完。这种方式的优点是控制简单,但缺点也很明显:
- 数据重用率低——同一个数据只被用一次就扔了
- 片上存储压力大——要同时放下整个特征图和所有权重
- 外部带宽需求高——每层都要大量读写DRAM
Eyeriss的团队换了个思路。他们问了一个关键问题:数据能不能在片上多待一会儿?
嗯,这就是数据流设计的起点。不是让数据被动地被计算单元消费,而是主动设计数据的流动路径,让同一个数据被尽可能多的计算单元复用。
1.3 Eyeriss的三大设计原则
我个人习惯把Eyeriss的设计哲学总结为三条:
| 原则 | 说明 | 我的理解 |
|---|---|---|
| 数据重用最大化 | 让每个输入数据在片上被尽可能多的PE复用 | 说白了就是“榨干”数据的每一次访问价值 |
| 存储层次化 | 用多级存储结构匹配不同粒度的数据重用 | 全局缓冲、行缓冲、寄存器,各司其职 |
| 数据流可配置 | 支持多种数据流模式,适应不同层的特点 | 不是一套方案打天下,而是按需切换 |
一个小提示:这三条原则不是Eyeriss独有的,但它是第一个把这三条系统性地融合到一个架构中的。这也是为什么它后来成为经典。
1.4 Eyeriss的整体架构
来看一下Eyeriss的顶层结构。我画了一张图,帮你快速建立整体认知:
这张图里,你看到的是三级存储层次:DRAM → 全局缓冲 → 行缓冲 → PE阵列。每一级都在做一件事:让数据离计算单元更近,让数据被更多次复用。
我刚开始看这个架构时,觉得它跟其他加速器差不多嘛,不就是多级缓存吗?后来仔细研究才发现,真正的精髓不在存储层次本身,而在数据怎么在这些层次之间流动。
1.5 数据流:Eyeriss的灵魂
什么是数据流?简单说,就是数据在时间和空间上的调度策略。
Eyeriss支持三种数据流模式:
- 权重固定(Weight Stationary)——权重留在PE里,输入数据流过来
- 输入固定(Input Stationary)——输入数据留在PE里,权重流过来
- 输出固定(Output Stationary)——部分和留在PE里,不断累加
每种模式适合不同的层。比如卷积层,权重固定模式效果好;全连接层,输入固定模式更优。
注意:千万不要以为数据流只是“调度策略”这么简单。它直接影响PE利用率、存储带宽、功耗,甚至芯片面积。我见过一个团队,架构设计得很好,但数据流没选对,结果PE利用率不到40%。
1.6 为什么Eyeriss能成为经典?
我个人觉得,Eyeriss最大的贡献不是某个具体的数字,而是它系统性地展示了数据流设计的方法论。
在它之前,大家做加速器更多是“拍脑袋”选数据流。在它之后,大家开始有意识地去分析:
- 这个层的数据重用模式是什么?
- 哪种数据流能最大化利用片上带宽?
- 存储层次怎么配合数据流?
我曾经在一个项目里,直接套用了Eyeriss的数据流分析方法,把PE利用率从55%提到了82%。说实话,当时挺有成就感的。
1.7 本章小结
这一讲,我们建立了Eyeriss的整体认知:
- CNN加速器的核心矛盾是计算 vs. 带宽
- Eyeriss的解决思路是以数据流为中心
- 架构上采用三级存储层次,配合三种数据流模式
- 数据流设计是Eyeriss的灵魂,也是你后续学习的重点