`谈到 AI 算力,最常见的数字是 FLOPS:某张 GPU 每秒能做多少万亿次浮点运算,一个训练集群又有多少 EFLOPS。这个数字重要,但它只描述了机器在理想条件下的计算上限。
真实系统里,模型还要读取权重、搬运激活、交换梯度、等待网络、处理批次波动。AI 算力不是一块芯片的峰值,而是一条从数据到结果的完整流水线。
看懂 AI 算力的关键,不是记住更多 GPU 型号,而是判断当前工作负载究竟受计算、容量、带宽还是通信限制。
先分清训练与推理
训练和推理都会执行矩阵乘法,但优化目标完全不同。
| 场景 | 主要目标 | 常见约束 |
|---|---|---|
| 预训练 | 最大化长期吞吐 | GPU 数量、互联、稳定性、数据管线 |
| 微调 | 控制成本与迭代速度 | 显存容量、参数高效方法、任务数据量 |
| 在线推理 | 低延迟与稳定并发 | 首 Token 延迟、KV Cache、显存带宽 |
| 离线推理 | 单位成本最低 | 批处理、量化、调度、吞吐率 |
训练需要保存中间激活并计算梯度,显存占用远高于只做前向传播的推理。在线推理则更在意用户等待时间,不能无限增大 batch 来换吞吐。
💡 先问工作负载
“需要多少算力”不是完整问题。更有用的版本是:模型多大、上下文多长、并发多少、延迟目标是什么、使用什么精度?
FLOPS 描述了什么
FLOPS 是每秒浮点运算次数。训练大模型时,核心操作通常是矩阵乘法,可以粗略理解为大量乘加。
以一个线性层为例:
Y = XW
X: [batch × tokens, hidden]
W: [hidden, output]
一次乘加通常按两次浮点操作计算,因此该层前向计算量约为:
2 × batch × tokens × hidden × output
Transformer 还包含注意力、MLP、归一化与输出层。工程估算中常用一个更粗的训练公式:
training FLOPs ≈ 6 × parameters × training tokens
系数 6 来自前向、反向和权重梯度的近似开销。它适合做数量级判断,不应替代真实 profiling。
峰值不等于有效算力
如果一张卡标称 1 PFLOPS,但训练过程中只有 45% 的时间让 Tensor Core 满载,那么有效吞吐只有约 0.45 PFLOPS。利用率损失通常来自:
- 小矩阵或不规则 shape,计算单元无法铺满;
- 算子之间频繁同步;
- 数据加载赶不上 GPU;
- 多卡梯度通信阻塞;
- 显存带宽无法及时供应数据;
- 动态 batch 或长短不一的序列带来 padding 浪费。
常见指标 MFU(Model FLOPs Utilization)用模型理论计算量除以硬件峰值能力。它比“GPU 利用率 100%”更接近真实训练效率。
精度为什么会改变算力
同一张 GPU 对不同数据类型的吞吐差距很大。
| 精度 | 每个元素大小 | 常见用途 |
|---|---|---|
| FP32 | 4 字节 | 数值敏感计算、传统训练 |
| FP16 / BF16 | 2 字节 | 主流混合精度训练 |
| FP8 | 1 字节 | 新一代低精度训练与推理 |
| INT8 | 1 字节 | 量化推理 |
| INT4 | 0.5 字节 | 大模型低成本部署 |
低精度同时减少计算成本和数据搬运量,但不是无损压缩。训练中需要处理溢出、舍入和累积误差;推理量化则需要校准不同层对精度的敏感度。
⚠️ 不要只比较 TOPS
厂商可能在不同稀疏率、精度和功耗条件下宣传峰值。比较硬件时必须确认数字对应 FP16、FP8 还是 INT4,是否依赖结构化稀疏。
显存容量决定模型能不能放下
一个 70B 参数模型,仅权重就需要大约:
FP16: 70B × 2 bytes ≈ 140 GB
INT8: 70B × 1 byte ≈ 70 GB
INT4: 70B × 0.5 byte ≈ 35 GB
训练时还需要梯度、优化器状态和激活。使用 Adam、混合精度训练时,每个参数的综合占用可能达到十几字节。模型并行、ZeRO、梯度检查点等技术,本质上都在重新安排这些状态放在哪里、何时计算和何时通信。
推理还要保存 KV Cache。它会随 batch、上下文长度和层数增长:
KV Cache ∝ batch × sequence length × layers × hidden size × bytes
因此,同一个模型在 4K 上下文可以承载很多并发,换成 128K 上下文后显存可能主要被 KV Cache 占据。
显存带宽决定数据喂得多快
计算单元做一次运算前,需要先拿到数据。如果每读取一个权重只做很少几次运算,工作负载就容易受带宽限制。
Roofline 模型用“算术强度”描述这个关系:
arithmetic intensity = operations / bytes moved
attainable performance = min(peak FLOPS, bandwidth × arithmetic intensity)
大 batch 矩阵乘法会重复使用权重,算术强度高,容易接近计算上限。单用户逐 Token 解码时,每一步都要扫描大量权重,却只生成少量结果,更容易受显存带宽限制。
这解释了一个看似反直觉的现象:推理阶段换用更低比特权重,即使计算单元并没有变快,吞吐仍可能明显提高,因为每次从显存搬运的数据更少。
多卡系统的瓶颈在互联
单张卡放不下模型或训练时间太长时,就要并行扩展:
- 数据并行:每张卡放完整模型,处理不同 batch,再同步梯度;
- 张量并行:把单层矩阵拆到多张卡;
- 流水线并行:把不同层放到不同设备;
- 专家并行:MoE 中不同专家分布在不同卡上。
并行并不会免费增加算力。张量并行需要频繁 all-reduce,流水线并行会出现气泡,专家并行依赖 all-to-all。卡间 NVLink、机内交换和跨机网络的带宽与延迟,直接决定扩展效率。
假设 8 张卡单卡吞吐为 100,理想总吞吐是 800。如果实际只有 620,扩展效率就是:
scaling efficiency = 620 / 800 = 77.5%
继续增加 GPU 时,如果通信量增长得比有效计算更快,买更多卡只会让更多设备互相等待。
推理要同时看延迟和吞吐
大模型推理通常分为两个阶段:
- Prefill:一次处理全部输入 Token,矩阵较大,更偏计算密集。
- Decode:逐个生成 Token,矩阵较小,更偏带宽和调度限制。
常见指标包括:
- TTFT:Time To First Token,用户多久看到第一个 Token;
- TPOT:Time Per Output Token,后续 Token 的生成间隔;
- Tokens/s:单位时间总吞吐;
- 并发数:在延迟目标内可服务多少请求;
- 每百万 Token 成本:最终商业效率。
Continuous Batching 会在每个解码步动态组合请求,提高 GPU 利用率;Paged Attention 则减少 KV Cache 碎片。它们没有改变模型数学公式,却能显著改变系统吞吐。
一套更实用的算力评估流程
面对一个 AI 项目,可以按以下顺序估算:
- 模型与精度:参数量、激活精度、权重量化方式。
- 上下文与 batch:决定激活和 KV Cache 规模。
- 容量预算:模型、优化器、激活、缓存能否放入显存。
- 计算预算:训练 Token 或推理 Token 对应多少理论 FLOPs。
- 带宽判断:算术强度是否足够,尤其是 decode 阶段。
- 并行策略:通信是否会吞掉扩展收益。
- 目标指标:延迟、吞吐、稳定性和成本谁优先。
- 真实基准:使用目标模型、目标长度和目标 batch 压测。
ℹ️ 最终判断
算力规划不是选“最快的卡”,而是找出瓶颈后购买最匹配的资源。计算受限看 Tensor Core,容量受限看显存,带宽受限看 HBM,多机扩展看互联,在线服务还要看调度软件。
结语
AI 系统的速度由最慢的环节决定。FLOPS 告诉我们芯片理论上能算多快,显存容量决定问题能不能装下,带宽决定数据能否及时抵达,互联决定多卡能否协同,软件栈则决定这些硬件能力能被兑现多少。
所以,下次看到“某集群拥有多少 EFLOPS”时,可以继续追问:使用什么精度?MFU 是多少?显存和网络配置如何?目标是训练吞吐还是在线延迟?
这些问题比单一峰值数字,更接近 AI 算力的真实世界。 `