2. AI计算基础
理解AI加速器为何与通用CPU走上不同演进路线,必须回到神经网络的计算本质。神经网络并非神秘的黑盒,它的训练与推理过程可以被拆解为一系列高度规律、可量化的数学运算。这些运算的数据规模、访存模式、并行维度与精度需求,共同决定了TPU、NPU、DPU等加速器的架构选择。本节从计算特征出发,逐层剖析矩阵乘法、卷积、激活函数与典型算子,建立“算法—算子—硬件”之间的映射直觉。
一、神经网络的计算特征:为什么它适合专用加速
神经网络的核心计算具有四个鲜明特征,这些特征正是加速器设计的出发点。
- 计算密集与访存密集并存:全连接层和卷积层包含大量乘加运算(MAC),属于计算密集型;而激活、归一化、池化等逐元素操作计算量小,却需要频繁读写张量,属于访存密集型。
- 高度并行:同一层内成千上万个神经元的计算彼此独立,天然适合SIMD、SIMT或脉动阵列等并行结构。
- 数据复用性强:卷积核在输入特征图上滑动时,权重被反复使用;输入像素也被多个输出通道复用。这种复用是降低访存带宽压力的关键。
- 精度容忍度高:推理阶段对数值误差不敏感,INT8、FP16甚至INT4即可满足多数场景,为低比特加速提供了空间。
二、矩阵乘法:AI计算的骨架
无论是全连接层 Y = XW + b,还是卷积展开后的隐式矩阵乘,抑或Transformer中的注意力计算,矩阵乘法(GEMM)都是绝对主力。设矩阵 A 为 M×K,矩阵 B 为 K×N,则输出 C 为 M×N,每个元素需要 K 次乘加。
for i in range(M):
for j in range(N):
acc = 0
for k in range(K):
acc += A[i][k] * B[k][j]
C[i][j] = acc
这段三重循环揭示了优化的三个方向:并行化(i、j维度可并行)、分块(将大矩阵切成适合片上缓存的tile)、数据复用(A的行与B的列在计算C的一个元素时被复用)。TPU的脉动阵列正是把“乘加”固化为硬件单元,让数据像流水一样在阵列中流动,权重驻留、激活流动,从而以极低能耗完成大规模GEMM。
三、卷积:局部连接与权值共享
卷积层通过滑动窗口提取空间特征。以二维卷积为例,输入特征图 H×W×C_in,卷积核 K×K×C_in×C_out,输出为 H'×W'×C_out。每个输出像素是输入局部区域与卷积核的点积。
卷积的高效实现通常转化为矩阵乘法,即im2col + GEMM:把每个滑动窗口展平成一行,形成 (H'×W') × (K×K×C_in) 的矩阵,再与展平的卷积核矩阵相乘。这种转换牺牲了部分内存,却换来了高度规整的GEMM计算,便于硬件加速。另一种思路是Winograd算法,通过变换减少乘法次数,适合3×3小卷积核。
四、激活函数与典型算子
激活函数为网络引入非线性。常见的有ReLU、Leaky ReLU、Sigmoid、Tanh、GELU、Swish等。其中ReLU因计算简单、梯度稳定,成为加速器最友好的选择;GELU和Swish精度更好,但涉及指数或除法,硬件实现成本更高。
除卷积和全连接外,典型算子还包括:
| 算子类别 | 代表算子 | 计算特征 | 硬件关注点 |
|---|---|---|---|
| 池化 | Max Pooling、Average Pooling | 逐窗口归约,访存密集 | 片上缓存、行缓冲 |
| 归一化 | BatchNorm、LayerNorm | 统计量计算+逐元素缩放 | 归约单元、精度 |
| 注意力 | QK^T、Softmax、AV | 矩阵乘+逐元素+归约 | 大矩阵分块、Softmax流水 |
| 逐元素 | Add、Mul、ReLU | 无数据复用,带宽受限 | 向量单元、融合执行 |
五、案例:一次推理的算子流
以ResNet-50的一层残差块为例,其计算流为:Conv3×3 → BatchNorm → ReLU → Conv3×3 → BatchNorm → Add → ReLU。在硬件上,卷积由矩阵乘单元承担,BatchNorm和ReLU由向量单元承担,Add需要读取残差分支。若每个算子单独执行,中间结果反复写回DRAM,带宽成为瓶颈。因此现代NPU普遍支持算子融合,把Conv+BN+ReLU合并为一个内核,中间结果保留在片上,显著降低访存。
六、常见误区与复盘
误区一:只关注峰值算力,忽视访存带宽。很多算子(如逐元素、池化)的瓶颈在带宽而非算力,加速器若缓存设计不足,峰值TOPS无法兑现。
误区二:认为所有算子都能高效映射到矩阵乘单元。Softmax、LayerNorm等含归约和超越函数的算子,需要向量单元配合,否则会成为流水线气泡。
误区三:忽略算子融合的收益。不融合时,中间张量反复进出DRAM,能耗和延迟可能数倍于计算本身。
复盘来看,AI加速器的设计必须围绕“算子画像”展开:先统计目标网络中各类算子的占比、形状、精度与访存需求,再决定矩阵乘单元规模、向量单元能力、缓存层级与融合策略。只有把算法特征翻译成硬件参数,TPU/NPU/DPU才能在真实负载中发挥出应有的效率。