1. Eyeriss架构概述:诞生背景、核心设计理念与对比优势
1.1 为什么需要Eyeriss?——从一次痛苦的部署经历说起
我记得2016年那会儿,团队接了个边缘端的视觉项目。模型不大,MobileNet v1,大概就几兆参数。我们兴冲冲地在GPU上调好了精度,然后往嵌入式设备上一放——完蛋。功耗直接飙到15瓦,散热片烫得能煎鸡蛋。更离谱的是,帧率只有3帧,连幻灯片都算不上。
你想想看,GPU在云端跑大模型确实猛,但到了边缘端,它那套「通用计算+大缓存+高带宽」的设计思路,反而成了累赘。CPU就更别提了,串行执行卷积,一个3×3的窗口要拆成9次乘加,效率低得让人抓狂。
说白了,当时的痛点就三个:功耗墙、带宽墙、延迟墙。传统架构是为「通用计算」设计的,不是为「神经网络推理」设计的。这就催生了Eyeriss——一颗从骨子里为CNN推理而生的芯片。
核心矛盾:通用处理器(CPU/GPU)的「存储墙」问题在CNN推理场景下被急剧放大。数据搬运消耗的能量,比计算本身高出2~3个数量级。Eyeriss的诞生,就是为了解决这个「搬数据比算数据更费电」的荒唐局面。
1.2 核心设计理念:数据流才是王道
Eyeriss的设计哲学,我总结成一句话:让数据尽量待在原地,别乱跑。
传统GPU怎么干?它把输入特征图、权重、输出全部塞进全局显存,计算时再一股脑拉到计算单元。每次搬运都耗电,而且带宽就那么宽,迟早会卡脖子。
Eyeriss换了个思路——它设计了一套叫「行固定数据流」(Row-Stationary Dataflow)的调度方式。什么意思呢?
- 空间架构:芯片内部排布了一个16×14的PE(处理单元)阵列,每个PE都有自己的寄存器文件。数据在PE之间流水传递,而不是每次都去全局缓存里取。
- 行固定策略:每个PE负责计算输出特征图的一行。权重和输入特征图在PE阵列里「滑」过去,像流水线一样。这样,同一个数据可以被多个PE复用,大大减少了对全局缓存的访问次数。
- 近存计算:每个PE旁边就是本地存储,计算完的结果直接留在本地,等下一层需要时再传出去。
我在做另一个加速器项目时,试过类似的数据复用思路。当时没Eyeriss这么彻底,只做到了权重复用,输入特征图还是得频繁搬运。结果功耗只降了30%,离目标差得远。Eyeriss这套「行固定」把输入、权重、输出三者的复用都考虑进去了,效果确实不一样。
我的经验:设计数据流时,别只盯着计算单元利用率。你算算数据搬运的次数,那才是功耗的大头。Eyeriss的里有个数据:在AlexNet上,它的数据搬运能耗只有GPU的1/5到1/10。这个差距,就是数据流设计带来的。
1.3 与传统GPU/CPU的对比优势
光说概念不够直观,我们直接拉个表格看看。
| 对比维度 | CPU | GPU | Eyeriss |
|---|---|---|---|
| 设计目标 | 通用计算,低延迟单线程 | 通用并行计算,高吞吐 | CNN推理专用,极致能效 |
| 计算单元 | 几个到几十个ALU | 数千个CUDA核心 | 168个PE(14×12阵列) |
| 存储层次 | L1/L2/L3缓存 + 主存 | 共享内存 + 全局显存 | PE本地寄存器 + 全局缓冲区 |
| 数据复用 | 几乎无,每次计算都取新数据 | 有限复用(依赖线程块调度) | 行固定数据流,三重复用 |
| 能效(TOPS/W) | 约0.01~0.1 | 约0.1~1 | 约1~10(实测可达3~5) |
| 典型功耗 | 15~150W | 75~300W | 0.3~1W |
看到没?Eyeriss的能效比GPU高了一个数量级,功耗却只有它的百分之一。为什么会这样?
我举个例子。你在GPU上跑一个3×3卷积,输入是32×32×64。GPU的做法是:先把64个通道的输入特征图从显存搬到共享内存,然后每个线程算一个输出像素。算完再写回显存。这一来一回,数据搬运了至少两次。而Eyeriss呢?它把输入特征图的一行存在PE本地,权重也在本地复用,输出也累加在本地。只有等到整行算完,才写一次全局缓冲区。
数据搬运次数少了,功耗自然就降下来了。
注意:Eyeriss不是万能的。它的优势集中在CNN推理,尤其是小批量、低延迟的场景。如果你要训练模型,或者跑Transformer、LSTM这类非卷积网络,Eyeriss的专用架构反而会成为瓶颈。选型时一定要看清楚应用场景。
1.4 Eyeriss的整体架构概览
说了这么多,我们来看看Eyeriss芯片到底长什么样。下面这张图是我根据和实际部署经验整理的架构框图。
这张图里,最核心的就是那个PE阵列和全局缓冲区(GLB)之间的配合。GLB相当于一个「数据」,但它不像GPU的显存那样什么都往里塞。Eyeriss的设计原则是:GLB只存那些「不得不存」的数据,比如跨PE共享的权重、需要回写的输出特征图。能放在PE本地算的,绝不让它进GLB。
我曾经在一个FPGA加速器上试过类似的「本地优先」策略。当时我把卷积的权重全部缓存在BRAM里,输入特征图也尽量流水传递。结果资源利用率上去了,但布线变得极其复杂。Eyeriss的NoC设计就聪明得多——它用了一个2D mesh网络,每个PE只跟上下左右的邻居通信,数据流动路径短,布线也规整。
1.5 小结:Eyeriss到底解决了什么问题?
总结一下,Eyeriss的核心贡献就三点:
- 数据流创新:行固定数据流让输入、权重、输出三重复用,把数据搬运次数降到最低。
- 架构匹配:PE阵列+近存计算,完美适配CNN的局部性和复用性。
- 能效突破:在0.3~1W的功耗下,实现了接近GPU的推理性能,能效比提升10倍以上。
嗯,这里要注意一点。Eyeriss是2017年的芯片,用的是65nm工艺。放到今天来看,它的算力并不高(大概几十GOP/s)。但它的设计思想——数据流驱动架构、近存计算、专用化——直接影响了后来的几乎所有边缘AI芯片,包括Google的TPU Edge、华为的昇腾310、寒武纪的MLU系列。
所以,学Eyeriss不是为了复刻一颗老芯片,而是为了理解那些「放之四海而皆准」的加速器设计原则。后面的章节,我们会一步步拆解它的数据流、PE设计、编译映射,最后落地到实际的部署方案上。