第一章 AI算力版图:通用与专用加速的范式之争
第一章 AI算力版图:通用与专用加速的范式之争
2012 年 AlexNet 以 60M 参数和 1.5 GFLOPs 的算力击败传统计算机视觉方法时,它运行在两块 NVIDIA GTX 580——一款为游戏渲染设计的 GPU 之上。十年后,支撑 GPT-4 训练的数万台加速器,无论是 NVIDIA H100、Google TPU v5p 还是 Trainium 2,在硅片形态上都已与 GPU 渐行渐远。这场"压缩了十年"的演进背后,是一个朴素但代价巨大的工程判断:深度学习工作负载与通用计算工作负载之间,存在数量级的能量效率鸿沟,而通用架构无法跨过这条鸿沟。
本章要回答三个层层递进的核心问题:
1. AI 工作负载到底"长什么样"——即它的算术强度、访存模式、操作多样性与稀疏度如何分布? 2. 为什么 CPU 与 GPU 在某些场景下"够用但不够好"——通用性、能耗、面积之间存在怎样的三角权衡? 3. 在 GPU、ASIC、FPGA、Reconfigurable Dataflow 之间,应如何为给定负载做出架构选择?
我们将在最后把这些判断压缩到一张 Mermaid 决策图中,并引出贯穿全书的母题:如何在矩阵维度、向量维度与标量维度之间分配硅片面积。
1.1 从 CPU 到 TPU:一个被压缩了十年的演进史
理解今天的 AI 芯片版图,需要先回看一段历史——但不是技术史,而是经济学史:每一个架构拐点,都是单位算力成本(cost per FLOP 或 cost per useful inference)跨越下一个数量级的时刻。
CPU 时代(~2010 之前)。深度学习的雏形——受限玻尔兹曼机、深度信念网络——主要在 CPU 集群上完成。CPU 的设计哲学是低延迟单线程性能:深度流水线、乱序执行、大容量缓存、复杂的分支预测,所有这些晶体管开销服务于"让单条指令尽快完成"。但对一个 224×224 输入的卷积层而言,每一次乘加只是一个 3×3×C 的小规模矩阵运算,CPU 的"指令调度艺术"在这里变成了一种浪费:花在解码、分支、寄存器重命名上的能耗,远高于实际算术操作本身。一个粗略的数量级:x86 CPU 的典型能效比约为 0.5–5 GFLOPS/W(FP32),其中超过 60% 的能耗消耗在控制逻辑与缓存层次结构上,而非浮点单元本身。
GPU 时代(2012–2017)。AlexNet 证明了 CUDA 路径的正确性:把上千个简单 ALU 组织成 SIMT(Single Instruction Multiple Threads)阵列,把高延迟、高复杂度的控制流换成了高吞吐、低复杂度的数据流。这是一次"用控制流换数据流"的范式转换。GPU 的能效比跃升到 20–50 GFLOPS/W(FP32),并且在 FP16/INT8 路径上继续提升。然而 GPU 仍然保留了"通用加速器"的设计:它要兼容图形渲染、稀疏访存、任意控制流,于是片上面积仍有相当比例用于通用寄存器、调度器与缓存层级。
TPU 与 DSA 时代(2016–至今)。2017 年 Jouppi 等人在 ISCA 上发布的论文 *In-Datacenter Performance Analysis of a Tensor Processing Unit* 给出了一组至今仍被反复引用的对比:相对当时的 Intel Haswell CPU,TPU v1 的 TOPS/W 在推理场景下提升约 30–80 倍;相对当时的 NVIDIA K80 GPU,提升约 10–30 倍。注意这里的"TOPS/W"是领域专用意义上的——TPU v1 砍掉了所有对张量运算无用的硬件:没有乱序执行,没有分支预测,没有大缓存,没有图形管线;留下的只有 256×256 的脉动阵列(systolic array)、24 MB 片上 SRAM,以及一套为矩阵乘设计的精简指令集。
关键洞察:CPU 到 GPU 的演进,是把"控制流密集"换成"数据流密集"的胜利;GPU 到 TPU 的演进,则是再进一步——把"通用数据流"换成"张量专属数据流"的胜利。每一次跃迁,通用性都被主动让渡给效率,让渡的代价是失去对非张量工作负载的支持。
需要强调的是,这并非 GPU 的失败——恰恰相反,GPU 仍然占据 AI 训练市场的最大份额,原因我们将在 1.4 节讨论。真正的判断是:没有一种架构能在所有 AI 场景下同时取胜,"专用化是否必然"这个问题必须放在具体的负载画像中回答。
1.2 AI 工作负载的四个维度画像
如果说第一节讲的是"为什么",这一节就要回答"凭什么"——凭什么说 AI 负载与通用计算负载有本质差异?我们用四个维度来量化刻画任何一项 AI 任务,这四个维度也是后续章节每一次架构决策都要回看的参照系。
1.2.1 算术强度(Arithmetic Intensity)
定义:单位内存访问所对应的浮点(或整数)运算次数。Roofline 模型中用 $\text{AI} = \text{FLOPs} / \text{Bytes}$ 表示,单位是 FLOPs/Byte。
典型 AI 负载的算术强度区间(以 FP16 / INT8 推理、单样本 batch=1 为例):
| 负载 | FLOPs | 激活/权重内存 | 算术强度 (FLOPs/Byte) | |------|-------|---------------|-----------------------| | ResNet-50 (224×224) | $3.8 \times 10^9$ | ~10 MB | ~380 | | BERT-base (seq=128) | $2.2 \times 10^{10}$ | ~50 MB | ~440 | | GPT-2 small (seq=1024) | $4.8 \times 10^{11}$ | ~600 MB | ~800 | | 单层 Conv 3×3, 64→64, 56×56 | $1.8 \times 10^{8}$ | ~800 KB | ~225 | | 单层 Attention (seq=2048, d=64) | $2.7 \times 10^{8}$ | ~2 MB | ~135 |
注意几个反直觉的事实:
- **算术强度并非越高越好**。高算术强度意味着计算单元将成为瓶颈(compute-bound),这通常意味着你买到了一台"满载 GPU";但低算术强度(<10 FLOPs/Byte)则意味着内存带宽成为瓶颈(memory-bound),你需要的是更大的 HBM 而不是更多的 FLOPs。AI 负载的算术强度**随 batch size、序列长度、模型结构而剧烈变化**——同一个模型,batch=1 与 batch=256 的算术强度可以相差两个数量级。
- **Transformer 的算术强度比 CNN 高**。注意力机制中的矩阵乘维度 $O(L^2 d)$ 在长序列下主导计算量,使 GPT 类模型的算术强度可以轻松突破 1000 FLOPs/Byte;而卷积层因为权重重用(weight reuse)的存在,通常停留在 100–500 FLOPs/Byte 区间。
- **访存模式不是单一的**。一个完整的 ResNet-50 推理中,既有算术强度约 3800 FLOPs/Byte 的全连接层,也有算术强度仅 50 FLOPs/Byte 的早期卷积层。**任何只看"峰值算术强度"的设计都会在前几层失速**。
1.2.2 访存模式(Memory Access Pattern)
AI 工作负载在访存上有三个显著特征:
(1) 高度的规则性与可预测性。卷积的滑窗访问、矩阵乘的分块(tiling)、注意力的全对全(all-to-all)通信,都可以在编译期或运行期被精确预测。这与通用计算的指针追逐(pointer chasing)、链表遍历、哈希表查找形成鲜明对比。可预测的访存是 DSA 能够设计激进缓存策略的物理基础。
(2) 权重重用(Weight Reuse)。在 CNN 中,每个卷积核权重被使用 $H \times W$ 次;在 GEMM 中,每个矩阵元素被使用 $N$ 或 $K$ 次。重用率越高,访存开销越低——这也是为什么大 batch 训练天然是 compute-bound,而 batch=1 推理更容易陷入 memory-bound。
(3) 数据复用拓扑(Data Reuse Topology)。这是一个更精细的概念:
- **卷积**具备**卷积复用**(convolutional reuse):输入特征图与卷积核在二维网格上滑动,每个输入像素被多个输出像素共享;
- **矩阵乘**具备**行/列复用**(row/column reuse):一行 A 乘以多列 B;
- **注意力**具备**二次复用**(quadratic reuse):Q、K、V 矩阵在序列维度上反复投影。
理解这些"重用拓扑"对设计片上存储层级至关重要——什么样的拓扑,就该配什么样的片上存储。我们将在第三章"张量访存与片上存储"中展开。
1.2.3 操作多样性(Operation Diversity)
通用 CPU 至少支持数百条不同的指令;GPU 支持 SCALAR、向量、纹理、图形等数十种操作类型。而现代 AI 加速器真正需要的"操作类型"可以被压缩到非常小的集合:
- **稠密矩阵乘(GEMM / GEMV)**:深度学习的 95% 以上计算量
- **逐元素操作(elementwise)**:ReLU、GELU、add、multiply
- **归约操作(reduction)**:softmax、LayerNorm、BatchNorm
- **数据搬运(data movement)**:tile reshape、transpose、concat
- **少数特殊算子**:embedding lookup、sparse attention
这种操作多样性的"坍缩",是 DSA 之所以可行的核心前提。如果 AI 工作负载需要一百种不同的硬件单元,那么"领域专用"就退化为"通用"了。正是这种坍缩,使得我们可以用脉动阵列、数据流引擎、固定函数单元等"窄而深"的结构替代"宽而浅"的 CPU 流水线。
1.2.4 稀疏性(Sparsity)
稀疏性有两个层面:
(1) 模型稀疏性(Model Sparsity):权重矩阵中零值的比例。通过剪枝(pruning)可达 70%–95% 的稀疏度。
(2) 激活稀疏性(Activation Sparsity):通过 ReLU 等非线性引入的零值比例,典型为 40%–70%。
稀疏性的承诺非常诱人:理论上 50% 的稀疏度可以带来 2× 的算力节省。但现实是结构化稀疏才有效。非结构化随机稀疏要求硬件支持任意位置的零值跳过,硬件开销大、利用率低;而结构化稀疏(如 2:4、4:8)则要求算法与硬件协同设计。NVIDIA A100 引入的 2:4 结构化稀疏使 Tensor Core 在该模式下能达到 2× 吞吐,但这一加速依赖编译器与算子库的同时支持。
判断:稀疏性是 AI 加速器"未来三到五年最大的设计变量"之一,但目前没有公认的"赢家架构"。我们将在第十章"稀疏张量加速"中详细讨论。
1.2.5 把四个维度装进一张图
把上述四个维度综合起来,可以得到一个二维的"负载空间":
- **横轴**:算术强度(FLOPs/Byte)
- **纵轴**:操作多样性(操作种类数的倒数)
大模型 Transformer 推理(高 batch、高 FLOPs/Byte、低操作多样性)落在右下角;小模型边缘推理(低 batch、低 FLOPs/Byte、低操作多样性)落在左上角;强化学习中的环境交互(高算术强度、高操作多样性)落在右上角。架构选择,本质上是在这个二维平面上寻找映射——每个架构都有其"舒适区",超出舒适区的负载会付出指数级增长的代价。
1.3 通用架构的能耗天花板:CPU 与 GPU 为什么"够用但不够好"
理解了 AI 负载的四个维度,我们现在可以回答第二个核心问题:通用架构的"能耗天花板"究竟在哪里?它的物理极限由什么决定?
1.3.1 CPU 的极限:控制流的能量代价
回到 Roofline 模型:
$$T_{\min} = \max\left(\frac{N_{\text{FLOP}}}{P_{\text{peak}}}, \frac{N_{\text{mem}}}{B_{\text{peak}}}\right)$$
其中 $T_{\min}$ 是完成计算所需的最小时间,$P_{\text{peak}}$ 是峰值算力,$B_{\text{peak}}$ 是峰值带宽,$N_{\text{FLOP}}$ 和 $N_{\text{mem}}$ 分别是所需 FLOPs 与访存字节数。
对 ResNet-50 推理($N_{\text{FLOP}} \approx 3.8 \times 10^9$, $N_{\text{mem}} \approx 10^7$):
- **CPU (Xeon 8280)**:$P_{\text{peak}} \approx 1$ TFLOPS, $B_{\text{peak}} \approx 100$ GB/s → compute 时间 3.8 ms, memory 时间 0.1 ms → **受计算限制,但计算能力太低**。
- **GPU (V100)**:$P_{\text{peak}} \approx 125$ TFLOPS (FP16), $B_{\text{peak}} \approx 900$ GB/s → compute 时间 0.03 ms, memory 时间 0.011 ms → **理论可压缩到 0.03 ms 量级**。
但这是理论值。实际测得的 ResNet-50 batch=1 推理延迟是:
| 设备 | 实际延迟 | Roofline 预测 | 利用率 | |------|----------|---------------|--------| | Xeon 8280 (1 socket) | ~30 ms | 3.8 ms | ~13% | | NVIDIA V100 | ~2.5 ms | 0.03 ms | ~1.2% (因 batch=1) | | TPU v2 | ~3 ms | ~0.03 ms | ~1% |
注意 batch=1 时 GPU 的利用率仅约 1%,原因是 GPU 的 SM(Streaming Multiprocessor)需要足够多的 warp 来隐藏访存延迟,单样本推理时 warp 数量严重不足。这不是 GPU 的设计错误,而是通用架构与单样本推理场景的范式不匹配。
1.3.2 GPU 的极限:通用性的边际收益递减
GPU 在 batch 大(≥32)时能达到 30–50% 的峰值利用率,但在 batch=1 时跌到 1–5%。这意味着 GPU 的"通用性"付出了巨大代价:
- **SIMT 调度开销**:每个 warp 32 个线程共享一条指令,线程分歧(thread divergence)会强制串行化所有分支路径。对 AI 推理中常见的条件分支(如 early exit、dynamic shape),这一开销可达 2–5×。
- **寄存器文件与共享内存的通用性折衷**:GPU 必须支持任意张量形状、任意 stride、任意数据类型;这种通用性要求寄存器文件具备足够大的容量与端口数,代价是面积与功耗。
- **图形管线的存在**:尽管现代 GPU 已经大大弱化图形专用单元,但硬件布局与 ISA 设计仍受图形传统影响。
更关键的是能量效率的物理极限。一份被广泛引用的研究(Horowitz, "Computing's Energy Problem", 2014)给出了不同操作的能耗数量级:
| 操作 | 能耗 (pJ) | |------|-----------| | 8-bit 整数加法 | 0.03 | | 8-bit 整数乘法 | 0.2 | | 32-bit 浮点加法 | 0.9 | | 32-bit 浮点乘法 | 3.1 | | 32-bit SRAM 读取 (8 KB) | 5 | | 32-bit DRAM 读取 | 640 |
注意 一次 DRAM 读取的能耗相当于 7,000 次 8-bit 整数加法。这意味着 AI 加速器设计的最深逻辑不是"如何让乘法更快",而是"如何让 DRAM 读取尽量少"。这正是数据流(dataflow)架构与存内计算(compute-in-memory)兴起的根本动因。
1.3.3 一个具体的能耗对比:ResNet-50 推理
借用 Jouppi et al. (2017) 与后续 NVIDIA、Google 公布的实测数据(数值为公开数据,单位按原论文):
| 平台 | 工艺 | 峰值算力 | 实际延迟 (batch=1) | 能耗/推理 (J) | TOPS/W (实测) | |------|------|----------|---------------------|---------------|---------------| | Intel Haswell (CPU) | 22nm | 1.3 TFLOPS FP32 | ~123 ms | ~6.2 | 0.6 | | NVIDIA K80 (GPU) | 28nm | 8.7 TFLOPS FP32 | ~28 ms | ~2.7 | 3.2 | | TPU v1 | 28nm | 92 TOPS INT8 | ~6.7 ms | ~0.34 | 34 |
关键数字:TPU v1 相对 Haswell 的 TOPS/W 提升约 57 倍,相对 K80 提升约 10 倍。这就是 DSA 的"数量级优势"——不是 10% 或 50% 的渐进式优化,而是十倍以上的范式跳跃。
但请注意:这些数字是特定负载(ResNet-50 INT8 推理)下的快照,不能简单外推到所有场景。CPU 在 batch=1、控制流密集的小模型推理上仍有竞争力;GPU 在训练、图神经网络、动态 shape 场景下不可替代;TPU 在稳定的大规模 CNN/Transformer 推理上占优。每一项架构都有其"应答区",问题是你的负载落在哪个区。
1.4 DSA:领域专用架构的兴起与三角权衡
现在