所属: 基础设施层。本页边界: 不同处理器怎样执行张量计算,以及为什么 LLM 主体依赖加速器。
#核心公式
#技术要点
- CPU 擅长控制流、低延迟和复杂分支。
- GPU 以大量线程和 SIMT 提升规则张量吞吐。
- TPU/NPU 以矩阵阵列或数据流提高乘加复用。
- 峰值 FLOP/s 不是实际吞吐;访存、形状和通信决定有效性能。
- 大模型的发展直接驱动了加速器的三条演进主线:精度下沉(FP32 → TF32 → FP16/BF16 → FP8 → FP4)、内存带宽扩张(HBM 代际迭代 + NVLink 代际翻倍)、以及专用矩阵单元从“可选配件”变为“核心计算单元”。
#原理与演进
#计算怎样落到硬件
| 部件 | 主要工作 | 关键限制 |
|---|---|---|
| CPU | 数据装载、控制流、请求编排 | 大矩阵吞吐有限 |
| GPU | 大量相同指令处理张量;矩阵单元完成乘加 | 访存、线程占用率与核函数形状 |
| TPU/NPU | 面向矩阵乘的数据流与片上复用 | 算子覆盖和编译映射 |
- 实际耗时至少由计算和数据搬运两条路径中较慢者决定;上式中的 是实测有效吞吐,不是宣传的峰值。
- 训练通常有较大的矩阵乘,可聚合成大批量;自回归解码每步处理少量 token,更容易受权重读取与访存限制。
- 因此同一设备的“训练快”“首 token 快”“每秒生成 token 多”不能由一个 FLOP/s 指标推出。
#大模型如何驱动硬件演进
大模型训练需求的增长不是线性的。不同统计窗口、模型口径和硬件代际会得到不同倍率,不能把“模型参数每两年增长 750 倍”视为普适定律;稳定结论是模型规模与训练计算量在一段时期内增长得比单卡算力、显存带宽和互联带宽更快。这一剪刀差决定了大模型硬件演进的三条主线:
- 计算:从通用并行到专用矩阵单元。 Transformer 的计算核心是矩阵乘。CPU 的少量通用核心无法提供足够并行度;GPU 的 SIMT 提供大规模并行,但通用 CUDA 核心执行矩阵乘的乘加效率仍然有限。于是从 Volta 开始,GPU 内置了专为矩阵乘加设计的 Tensor Core;TPU/NPU 则从一开始就把脉动阵列或矩阵计算单元作为核心。
- 精度:从 FP32 到 FP4 的持续下沉。 权重位宽每缩小一半,显存占用减半,单次显存读取可加载的参数量翻倍。这直接缓解了推理的内存墙。大模型训练中,低精度格式的引入使得同一硬件在相同时间内能处理更大的批量或更深的模型。
- 互联:从 PCIe 到 NVLink 域。 模型参数和激活的规模增长使得单卡显存无法容纳,必须多卡并行。卡间通信带宽成为扩展性的关键瓶颈。NVLink 从每 GPU 80 GB/s(P100)增长到 900 GB/s(H100)再到 1.8 TB/s(B200),而机架级 NVLink 域(如 NVL72)将 72 块 GPU 连成统一互联域。
这三条主线不是独立发生的:精度下沉减少了单卡显存需求,但也要求 Tensor Core 原生支持低精度格式;矩阵单元的效率依赖于数据能否及时从内存层次供给;互联带宽决定了多卡并行时计算单元是否会因等待通信而空闲。
继续阅读: 存储层次解释数据搬运;Roofline判断实际瓶颈。
#1. 从模型运算推到硬件需求
Transformer 中消耗大量计算的是矩阵乘。对 :
- 常与批量和 token 数有关; 与隐藏维度有关。
- 同一个 被 行输入反复使用。 大时,加载一次权重可做多次乘加; 小时,计算单元会等待权重。
- 只看 不能预测速度,还要看权重、输入与输出搬运量 。粗略算术强度为:
其中 是各张量每元素字节数;此式假设每个张量只从目标内存层读写一次,实际分块复用会改变 。
#2. CPU:控制强,密集乘加吞吐有限
- CPU 核心以复杂控制流、分支预测和低延迟缓存访问为优势。数据解析、tokenization、请求调度、网络协议和不规则预处理适合放在这里。
- 大模型层内矩阵乘含大量相同乘加。仅靠少量高性能核心难提供与大规模并行加速器相同的吞吐。
- CPU 并非“只负责辅助”:如果数据解码或采样跟不上,GPU 会等待;系统吞吐由最慢的串行或流水阶段决定。
- CPU 推理在小模型、小批量或设备约束下仍有价值;应比较端到端延迟与资源限制,不能只比较理论算力。
#3. GPU:SIMT、矩阵单元与利用率
#3.1 SIMT 执行模型与占用率
- SIMT(单指令多线程)把大量线程组织为执行组(warp)。规则张量计算易并行;分支发散会使同组线程不能同时完成有效工作。
- 并发线程数受寄存器、片上共享内存与线程块资源共同限制。提高每线程局部复用可能增加寄存器占用,反而降低可同时驻留的线程组(即降低 occupancy)。
- 全局内存访问若能按相邻地址合并,传输效率较高;不规则索引和小算子会增加事务与启动开销。CUDA 编程指南
#3.2 Tensor Core 的代际演进
Tensor Core 是 NVIDIA GPU 中专门用于加速矩阵乘加运算的硬件单元,自 2017 年 Volta 架构引入。它一次处理一个 16×16 或更大的矩阵块,而非单个标量,其核心运算如下:每一代架构的 Tensor Core 能力变化直接对应大模型训练与推理中可用的精度和吞吐:
| 架构 | 年份 | Tensor Core 代际 | 新增精度支持 | 对大模型的关键影响 |
|---|---|---|---|---|
| Volta | 2017 | 第一代 | FP16 矩阵乘加 | 首次将矩阵乘加从 CUDA 核心卸载到专用单元 |
| Turing | 2018 | 第二代 | INT8、INT4 | 低比特推理加速,量化模型可在硬件上原生执行 |
| Ampere | 2020 | 第三代 | BF16、TF32、2:4 结构化稀疏 | BF16 成为大模型训练默认精度;稀疏支持允许跳过零元素 |
| Hopper | 2022 | 第四代 | FP8(E4M3 / E5M2)、Transformer Engine | FP8 使万亿参数模型训练性能比 FP16 提升约 6 倍 |
| Blackwell | 2024 | 第五代 | FP4(NVFP4)、MXFP8 微缩放格式 | 权重位宽进一步减半,推理显存占用显著下降 |
FP8 的两种格式:E4M3(4 位指数、3 位尾数)动态范围较小但精度较高,适合前向传播中的权重和激活;E5M2(5 位指数、2 位尾数)动态范围更大但精度较低,适合反向传播中的梯度。训练中通常混合使用两种格式,由 Transformer Engine 自动管理缩放因子。
Transformer Engine:Hopper 引入的软件-硬件协同层,自动将线性层的输入和权重转换为 FP8 精度进行矩阵乘,同时维护 FP32 主权重副本以保持训练稳定性。关键机制是延迟缩放(Delayed Scaling) :由于 FP8 的动态范围可能无法覆盖输入张量的最大值,TE 根据历史张量的最大绝对值计算缩放因子,延迟一步应用到当前张量。Blackwell 进一步将缩放粒度从“每张量一个因子”细化到“每 32 个元素一个因子”(MXFP8),减少量化误差。
#3.3 内存墙与大模型推理
内存墙指处理器计算速度与内存数据供给速度之间不断扩大的差距,导致计算单元长期处于闲置状态,等待数据传输。在大模型推理场景中,这一问题尤为突出:自回归解码每步仅处理少量 token,算术强度常低于 10 FLOPs/字节,性能由参数读取和 KV Cache 传输速度决定,而非计算单元本身。
这意味着:推理速度的上限往往不是 Tensor Core 的峰值算力,而是显存带宽。 以 H100 为例,其 FP8 Tensor Core 峰值约 1,979 TFLOPS,但 HBM3 带宽为 3.35 TB/s。当算术强度低于约 590 FLOPs/字节时,系统受带宽限制而非算力限制。大模型解码的算术强度远低于此阈值,因此 HBM 带宽的翻倍(如 H200 从 3.35 TB/s 提升到 4.8 TB/s)对推理吞吐的提升效果往往比 Tensor Core 算力提升更直接。
NVIDIA 通过两条路径应对内存墙:HBM 代际迭代(HBM2e → HBM3 → HBM3e,带宽从约 2 TB/s 提升到 8 TB/s)和 Chiplet 封装(B200 由两颗 Die 通过 10 TB/s 片间互连缝合,共享 192 GB HBM3e 显存)。
关键区分: 加速器“计算单元空闲”可能来自访存、同步、输入供应不足或张量形状,不必然意味着设备数量不够。
#4. TPU/NPU:为数据流做专门设计
#4.1 脉动阵列:TPU 的核心计算引擎
脉动阵列(systolic array)是 TPU 的核心计算架构。它将大量乘加单元(MAC)组织成二维网格,数据从边缘流入,在每个时钟周期沿相邻单元流动,权重在单元中预先加载并保持不动。每个 MAC 单元每周期执行一次乘加,数据复用率高,减少了从远端存储重复取数的需求。
TPU 的脉动阵列设计面临一个根本取舍:阵列尺寸固定(如 256×256),只有矩阵形状与阵列维度匹配时才能达到峰值利用率。当矩阵维度不是阵列尺寸的整数倍时,需要填充零元素,有效利用率下降。这就是 TPU/NPU 对算子形状比 GPU 更敏感的原因。
#4.2 TPU 的代际演进
| 代际 | 年份 | 定位 | 关键架构变化 | 对大模型的意义 |
|---|---|---|---|---|
| TPU v1 | 2015 | 推理专用 | 256×256 脉动阵列,INT8,28nm | 为 AlphaGo 提供推理算力 |
| TPU v2 | 2017 | 训练+推理 | 增加 FP16/BF16 训练能力,HBM 显存 | 首次成为完整训练平台 |
| TPU v3 | 2018 | 训练+推理 | 液冷,更高带宽,支持更大 Pod | 支撑 BERT 级模型训练 |
| TPU v4 | 2021 | 训练+推理 | OCS 光电路交换,3D Torus 互联,4096 芯片 Pod | 解决大规模集群的互联瓶颈 |
| TPU v5e/v5p | 2023 | 推理/训练分线 | 2D Torus Mesh,性价比优化 | 适配不同规模的工作负载 |
| TPU v6e | 2024 | 推理 | 硅光引擎,能效比提升 | 大规模推理部署 |
| TPU v7 (Ironwood) | 2025 | 训练+推理 | 3D 环面网络,9216 芯片 Pod | 面向万亿参数 MoE 模型 |
| TPU Pod 是 Google 将大量 TPU 芯片通过专用高速网络互连而成的大规模计算集群 |
OCS 光电路交换是 TPU v4 引入的关键互联创新。与传统的无损网络交换机不同,OCS 不读取数据包头、不进行光电转换,仅作为物理层面的“光线反射镜”,在光信号层面直接建立端口间的连接路径。这使得 TPU Pod 可以动态重组互联拓扑:训练中的 AllReduce 通信模式可以利用 OCS 建立临时的全连接或环形连接,减少交换机层数带来的延迟和功耗。
#4.3 华为昇腾:达芬奇架构与 3D Cube
华为昇腾系列芯片采用自研的达芬奇架构,其核心是 3D Cube 矩阵计算单元。与 TPU 的二维脉动阵列不同,3D Cube 在一个时钟周期内可以完成两个 16×16 矩阵的乘法运算,即 4096 次乘加操作。
AI Core 中包含三种计算单元:Cube Unit(矩阵计算,支持 INT8/FP16/INT4)、Vector Unit(向量计算,支持 FP16/FP32)和 Scalar Unit(标量计算与流程控制)。数据流路径为:输入矩阵存入 Buffer L0A 和 L0B,Cube 计算后的结果存入 Buffer L0C。这种存储层次的划分使得权重和激活值在 Cube 计算前已完成片上加载,减少了重复的全局内存访问。
#4.4 寒武纪 MLU:张量运算与 Chiplet
寒武纪思元系列采用 MLUarch 架构,最新一代 MLUarch03 拥有新一代张量运算单元,内置 Supercharger 模块提升卷积效率,并采用多算子硬件融合技术减少算子执行时间。思元 370 是寒武纪首款采用 Chiplet(芯粒)技术的 AI 芯片,最大算力 256 TOPS(INT8)。
如果说 Pod 是“机架级模块化”,那 Chiplet(芯粒)就是“封装级模块化”。它不把整个系统做成一整块大芯片(Monolithic SoC),而是把大芯片拆成多个小芯片(裸片/die)
#4.5 通用规律
- 专用矩阵数据流提高规则运算的能效,但非规则算子、动态控制流和新算子需要编译器把计算映射到受支持的原语。
- NPU 是一类神经网络加速器的泛称,不对应统一微架构;具体能力应按算子集合、精度、内存层次、编译器和互联描述。
- GPU 与 TPU/NPU 的差别不是“通用/专用谁一定快”;同一模型的实际速度取决于算子覆盖、形状、数据布局和软件实现。
#5. 低精度计算:大模型硬件的精度下沉
#5.1 为什么低精度对大模型至关重要
大模型训练和推理受两个相互关联的约束:显存容量和显存带宽。权重、激活、梯度和优化器状态都占用显存。以 Llama 3 405B 为例,仅模型权重(FP16)就需要约 810 GB 显存,加上优化器状态(Adam 需要额外两份 FP32 副本)和梯度,总显存需求超过 2.5 TB。单卡无法容纳,必须多卡并行。
低精度格式通过减少每个数值的位宽来降低显存占用。FP32 → FP16/BF16 将权重显存减半;FP16 → FP8 再减半;FP8 → FP4 继续减半。同时,位宽降低意味着从显存读取相同参数量所需的时间减少,直接缓解推理的内存墙。
#5.2 主要低精度格式
| 格式 | 位宽 | 指数位 | 尾数位 | 典型用途 | 硬件支持 |
|---|---|---|---|---|---|
| TF32 | 19 | 8 | 10 | 训练中替代 FP32 做矩阵乘 | Ampere+ |
| BF16 | 16 | 8 | 7 | 训练默认精度,动态范围与 FP32 一致 | Ampere+ |
| FP16 | 16 | 5 | 10 | 训练和推理,精度高于 BF16 但动态范围小 | Volta+ |
| FP8 E4M3 | 8 | 4 | 3 | 前向权重和激活 | Hopper+ |
| FP8 E5M2 | 8 | 5 | 2 | 反向梯度 | Hopper+ |
| NVFP4 | 4 | 2 | 1 | 推理权重,极低带宽场景 | Blackwell+ |
| MXFP8 | 8 | 4/5 | 3/2 | 分块缩放 FP8,每 32 元素一个缩放因子 | Blackwell+ |
#5.3 低精度训练的挑战与解决方案
低精度训练的核心挑战是量化误差累积。FP8 的尾数位仅为 3 位(E4M3),表示精度远低于 FP16 的 10 位。如果直接对所有张量使用统一的缩放因子,小数值会被量化为零,大数值可能溢出。
解决方案是分块缩放:不再对整个张量使用一个缩放因子,而是将张量划分为固定大小的块(如 32 个元素),每块独立计算缩放因子。Blackwell 的 MXFP8 格式在硬件层面支持这种微缩放(microscaling)操作,缩放因子的计算和应用不引入额外指令开销。
PyTorch 的 torchao 库将 float8 量化训练作为主要训练工作流,同时提供 MXFP8 稠密模型、MXFP8 MoE 和 INT8 稠密模型的原型工作流。
低精度不是“免费加速” :量化误差会导致模型收敛变慢或精度下降,需要在训练中持续监控损失曲线和梯度范数。部分层(如 LayerNorm、Softmax)仍需要 FP32 精度以避免数值不稳定。
#6. 训练、Prefill、Decode 的硬件画像
| 阶段 | 典型计算形状 | 权重复用 | 常见瓶颈 |
|---|---|---|---|
| 训练前向/反向 | 大批量矩阵乘与梯度计算 | 高 | 算力、激活容量、通信 |
| Prefill | 多个输入 token 并行处理 | 较高 | 矩阵计算、长序列注意力 |
| Decode | 每步新增少量 token | 较低 | 权重与 KV 读取、串行依赖 |
激活容量指的是神经网络前向传播时,每一层都会产生中间结果,比如线性层输出、注意力分数、MLP 中间张量、归一化前后的值,这些中间结果叫 激活(activation) 。因为反向传播算梯度时,要用到前向过程中这些中间值。所以训练不能像推理那样算完一层就全扔掉,很多激活必须暂存在显存里,等反向传播用。batch 太大、序列太长、激活太多、碎片太多,就会 OOM = Out Of Memory,也就是内存/显存不够用了。
常用缓解方法:activation checkpointing / 梯度检查点、减小 micro-batch、梯度累积、序列并行、ZeRO、offload 等。
prefill 是 prompt 编码到第一个 token 输出的过程,decode 是后面的。
- Decode 必须等待上一步 token 才能决定下一步,不能像训练那样把整个输出序列一次算完。
- 增大并发批量可改善权重复用,但会增加 KV 占用和请求排队;这是服务调度的核心取舍。
#7. 因果式技术演进
| 原问题 | 技术变化 | 解决了什么 | 新瓶颈 |
|---|---|---|---|
| CPU 密集乘加吞吐不足 | GPU 大规模并行 | 提高规则计算吞吐 | 内存带宽、数据布局 |
| 通用并行单元乘加效率有限 | 矩阵专用单元/阵列 | 提高乘加密度与复用 | 算子适配、形状约束 |
| 大模型参数超出单卡显存 | 多卡并行 + NVLink | 扩大容量和计算 | 互联带宽与同步延迟 |
| 峰值算力已高但仍慢 | 分块、融合、低精度 | 减少搬运或提高有效吞吐 | 精度、寄存器和实现复杂度 |
| 推理受内存墙限制 | HBM 代际迭代 + FP4/NVFP4 | 降低权重读取量 | 量化误差与硬件支持 |
| 万亿参数 MoE 路由不均 | All-to-All 负载均衡、OCS 光交换 | 缓解尾延迟与拥塞 | 调度复杂度和编译映射 |
判别顺序: 先确认工作负载的矩阵形状与计算量,再判断数据移动、设备占用和通信;峰值 FLOP/s 只能给出计算上界。完整判别式见Roofline 模型。