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 的核心架构和数据流关系:

Eyeriss 核心架构与数据流 Eyeriss 核心架构与数据流 片外 DRAM 全局缓冲区 (Global Buffer) 片上网络 (NoC) PE 阵列 (Row-Stationary 数据流) PE0 (权重行0) | PE1 (权重行1) | PE2 (权重行2) | ... 主控 数据流方向 DRAM → Global Buffer → NoC → PE Array 部分和在 PE 间流动

从这张图你可以看到,数据从 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 是绕不开的一课。