1. Eyeriss 架构概述:从 DNN 加速需求出发
大家好,欢迎来到《Eyeriss 架构实战全流程解析》的第一章。
咱们直接开门见山。深度学习火了之后,大家发现一个很现实的问题:算力需求涨得比火箭还快,但功耗墙和存储墙却死死卡住了传统芯片的脖子。GPU 虽然通用性强,但跑起 DNN 来功耗动不动就几百瓦,边缘设备根本扛不住。FPGA 灵活,但能效比又上不去。
这时候,学术界和工业界都在想同一个问题:能不能设计一种专用芯片,既能把 DNN 算得飞快,又能把功耗压到极低?
Eyeriss 就是在这个背景下诞生的。它来自 MIT 的 Vivienne Sze 团队,是 DNN 加速器领域绕不开的经典架构。我个人觉得,理解 Eyeriss 是理解整个 DNN 加速器设计思路的“第一块拼图”。
核心观点: Eyeriss 不是最快的加速器,也不是能效最高的加速器,但它把“数据流”这个设计维度讲透了。后来的很多加速器,包括工业界的产物,都能看到 Eyeriss 的影子。
1.1 DNN 加速到底难在哪?
先聊聊痛点。DNN 的核心计算是卷积和全连接,说白了就是大量的乘加运算。但真正让芯片头疼的,不是计算本身,而是数据搬运。
我举个例子。你想想看,一个典型的卷积层,输入特征图可能有几百个通道,权重参数也有几百个。计算一次乘加,需要从 DRAM 里把输入和权重都搬进计算单元。搬一次数据消耗的能量,比做一次乘加运算高出两个数量级。
这就是所谓的“存储墙”和“功耗墙”。
- 存储墙: 内存带宽跟不上计算单元的需求。计算单元经常饿着肚子等数据。
- 功耗墙: 数据搬运消耗了绝大部分能量,真正用于计算的能量占比很低。
我在早期做 FPGA 加速的时候,就踩过这个坑。当时把卷积核展开成矩阵乘法,算得确实快,但数据来回倒腾,板卡温度直接飙到 85 度。后来我才意识到,问题的关键不在于怎么算,而在于怎么让数据少搬家。
1.2 Eyeriss 的设计理念:数据流优先
Eyeriss 的设计团队想得很清楚:与其在计算单元上堆料,不如在数据流上做文章。他们的核心理念是——让数据尽可能在片上流动,减少对片外存储的访问。
具体怎么做呢?Eyeriss 提出了一个非常巧妙的概念:Row-Stationary(行固定)数据流。
传统的加速器数据流,要么是“权重固定”(Weight Stationary),要么是“输入固定”(Input Stationary),要么是“输出固定”(Output Stationary)。每种都有各自的优缺点。
我整理了一个对比表格,方便你看清楚:
| 数据流类型 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| 权重固定 (WS) | 权重存在 PE 里不动,输入和输出流动 | 权重复用率高 | 输入和输出搬运开销大 |
| 输入固定 (IS) | 输入存在 PE 里不动,权重和输出流动 | 输入复用率高 | 权重搬运开销大 |
| 输出固定 (OS) | 部分和存在 PE 里不动,输入和权重流动 | 减少部分和回写 | 输入和权重复用率低 |
| 行固定 (RS) | 卷积核的一行权重固定,输入行和输出行在 PE 阵列中流动 | 平衡复用,减少全局搬运 | 控制逻辑稍复杂 |
我的建议: 如果你刚开始接触 DNN 加速器,不要急着看 RS 的细节。先理解 WS、IS、OS 这三种经典数据流,它们各自的优缺点,是理解 RS 为什么更优的基础。
1.3 Row-Stationary 数据流:核心创新点
Row-Stationary 到底是怎么工作的?我尽量用大白话讲清楚。
假设你有一个 3x3 的卷积核,要在一个大的输入特征图上滑动计算。传统做法是把整个卷积核加载到 PE 里,然后让输入数据流过来。但 RS 的做法是:把卷积核拆成一行一行的。
每个 PE 只负责卷积核的一行权重。比如 PE0 存第一行权重 [w00, w01, w02],PE1 存第二行 [w10, w11, w12],PE2 存第三行 [w20, w21, w22]。
然后,输入特征图也按行组织,在 PE 阵列中流动。每个 PE 计算自己那一行的乘加,产生部分和。最后,把三个 PE 的部分和累加起来,就得到了一个完整的输出像素。
这样做的好处是什么?
- 权重复用: 一行权重可以在多个输入行上重复使用,直到这一行对应的所有计算完成。
- 输入复用: 同一行输入数据可以被多个 PE 共享(因为不同 PE 的权重行不同,但输入行可能相同)。
- 部分和本地化: 部分和在 PE 之间直接累加,不需要频繁写回全局缓存。
说白了,RS 数据流是在权重复用、输入复用、部分和复用三者之间找到了一个平衡点。它不像 WS 那样极端追求权重复用,也不像 IS 那样极端追求输入复用,而是让三种数据都在片上高效流动。
注意: RS 数据流的控制逻辑确实比传统数据流复杂。你需要精心设计 PE 阵列的互联网络和调度逻辑。我在项目中就遇到过因为控制信号时序没对齐,导致部分和累加出错的 bug。调试了整整两天才找到原因。
1.4 Eyeriss 的整体架构
理解了 RS 数据流,Eyeriss 的整体架构就比较好懂了。它主要由以下几个部分组成:
- PE 阵列: 核心计算单元,每个 PE 包含一个乘加器、本地寄存器文件和一个小型 SRAM,用于存储权重行。
- 全局缓冲区 (Global Buffer): 片上的 SRAM,用于缓存输入特征图和权重。它比 DRAM 快,但比 PE 本地存储慢。
- NoC (Network-on-Chip): 片上网络,负责在全局缓冲区和 PE 阵列之间、以及 PE 与 PE 之间传输数据。Eyeriss 的 NoC 是专门为 RS 数据流设计的。
- 主控 (Controller): 负责生成控制信号,调度数据流和计算流程。
下面这张图展示了 Eyeriss 的核心架构和数据流关系:
从这张图你可以看到,数据从 DRAM 出发,经过全局缓冲区和 NoC,最终到达 PE 阵列。PE 阵列内部,数据按照 RS 数据流的方式在 PE 之间流动。主控则负责整个流程的调度。
1.5 Eyeriss 的学术与工业地位
Eyeriss 在 2016 年首次提出,发表在顶级会议 ISSCC 和期刊 JSSC 上。它的影响力有多大?我简单说几点:
- 学术引用: 截至 2024 年,Eyeriss 的相关被引用超过 3000 次。几乎所有后续的 DNN 加速器,都会引用 Eyeriss 作为相关工作。
- 数据流分类: Eyeriss 提出的 RS 数据流,以及它对 WS、IS、OS 的对比分析,已经成为 DNN 加速器教科书级别的知识点。你去看任何一本讲 AI 芯片的书,几乎都会提到这个分类。
- 开源生态: Eyeriss 团队开源了架构模拟器,很多研究者用它来做算法-架构协同设计。我自己就用这个模拟器做过一些数据流优化的实验,确实很方便。
- 工业影响: 虽然 Eyeriss 本身没有直接商用,但它的设计思想——尤其是对数据搬运的重视——深刻影响了后来的工业级加速器,比如 Google 的 TPU、华为的昇腾、以及各种 NPU。
一句话总结: Eyeriss 是 DNN 加速器领域的“里程碑”式工作。它把数据流设计从“经验主义”提升到了“系统方法论”的高度。如果你想深入理解 AI 芯片,Eyeriss 是绕不开的一课。