硬件精度与算力
本文用于整理 GPU 算力指标、常见数值精度、Tensor Core 以及它们和大模型训练、推理性能之间的关系。
一句话概括:
算力指标说明硬件在某种精度下的理论计算能力,实际性能还要看显存带宽、算子实现、batch、并发和框架调度。
看 GPU 规格时,不要只看一个最大的 TFLOPS 数字。厂商通常会分别标注 FP32、TF32、FP16、BF16、FP8、INT8 等精度下的峰值性能,这些数字对应的使用场景、软件支持和精度风险都不同。
1. FLOPS、TFLOPS 和 TOPS
FLOPS 表示每秒浮点运算次数,通常用于描述 FP32、FP16、BF16、FP8 等浮点精度下的理论计算能力。
| 指标 | 含义 | 常见用途 |
|---|---|---|
| FLOPS | Floating Point Operations Per Second,每秒浮点运算次数 | 计算能力的基础单位 |
| TFLOPS | 每秒万亿次浮点运算 | GPU 规格表最常见的浮点算力单位 |
| TOPS | 每秒万亿次操作 | 常用于 INT8、INT4 等整数或低比特推理能力 |
简单理解:
- FP16 200 TFLOPS 表示在 FP16 条件下理论上每秒可完成 200 万亿次浮点运算。
- INT8 800 TOPS 表示在 INT8 条件下理论上每秒可完成 800 万亿次整数操作。
- 不同精度的数字不能直接横向比较,必须先确认模型、框架和 kernel 是否真的使用了对应精度。
理论峰值通常是理想条件下的上限。真实 LLM 服务里,prefill、decode、KV Cache 读写、调度、通信和 tokenizer 都会拉低端到端吞吐。
2. 常见数值精度
数值精度决定每个数占用多少空间、计算速度多快,以及模型结果是否稳定。精度越低,通常越省显存、越有机会提高吞吐,但对硬件、量化方法和模型鲁棒性要求更高。
| 精度 | 字节/参数 | 类型 | 常见场景 | 备注 |
|---|---|---|---|---|
| FP32 | 4 | 浮点 | 传统训练、部分优化器状态、数值敏感计算 | 精度高,成本高,LLM 推理较少直接使用 |
| TF32 | 4 | 浮点计算格式 | NVIDIA Ampere 之后的矩阵乘法加速 | 存储仍接近 FP32,计算吞吐比 FP32 更高 |
| FP16 | 2 | 浮点 | 推理、混合精度训练、微调 | 速度快、显存省,但动态范围较小 |
| BF16 | 2 | 浮点 | 训练、微调、推理 | 动态范围接近 FP32,训练更稳定 |
| FP8 | 1 | 浮点 | 新一代训练、推理加速 | 依赖硬件、Transformer Engine 和校准策略 |
| INT8 | 1 | 整数 | 推理量化 | 常见于高吞吐推理,精度损失需评估 |
| INT4 / 4-bit | 0.5 | 整数或低比特量化 | 本地部署、低显存推理 | 显存收益大,但效果和速度高度依赖实现 |
这里的“字节/参数”主要用于估算模型权重显存。实际运行还要额外计算 KV Cache、activation、workspace 和 runtime 开销,详见 显存 和 模型占用显存估算。
3. FP32、TF32、FP16 和 BF16
FP32 是传统单精度浮点格式,数值范围和精度都较好,但显存占用和计算成本较高。现代 LLM 训练通常不会全程只用 FP32,而是使用混合精度。
TF32 可以理解为 NVIDIA 在 Tensor Core 上加速 FP32 矩阵乘法的一种格式。它保留类似 FP32 的指数范围,但降低尾数精度,从而换取更高吞吐。对很多训练任务来说,TF32 可以在较少代码改动下提升矩阵乘法性能。
FP16 和 BF16 都是 16-bit 浮点格式:
| 格式 | 主要优势 | 主要风险 |
|---|---|---|
| FP16 | 吞吐高、显存占用低、推理支持广 | 动态范围较小,训练时更容易溢出或下溢 |
| BF16 | 动态范围接近 FP32,训练更稳定 | 某些老架构或消费级卡支持不完整 |
训练和微调时,BF16 通常比 FP16 更省心,因为它对梯度和激活值的动态范围更宽容。推理时,FP16 和 BF16 都很常见,实际选择取决于模型权重格式、GPU 支持和推理框架。
4. FP8、INT8 和 INT4
低精度的核心收益是减少数据搬运和显存占用,同时让 Tensor Core 或专用矩阵单元发挥更高吞吐。
4.1 FP8
FP8 是 8-bit 浮点格式,通常用于新一代 GPU 上的训练和推理加速。它比 FP16 更省显存和带宽,但需要更精细的缩放、校准和混合精度策略。
FP8 不是“把所有张量都无脑变成 8-bit”。实际系统中常见做法是:
- 权重、激活或部分矩阵乘法使用 FP8。
- 累加、归一化、softmax、loss 等数值敏感部分保留更高精度。
- 通过框架或 Transformer Engine 管理 scale、amax history 和精度切换。
4.2 INT8
INT8 常用于推理量化。它把权重或激活映射到整数范围,配合 scale 和 zero point 还原近似数值。
常见收益:
- 权重显存约为 FP16 的一半。
- 显存带宽压力下降。
- 在支持 INT8 Tensor Core 的硬件上,矩阵乘法吞吐可能提升。
常见风险:
- 校准数据不代表真实请求时,精度可能下降。
- 激活分布变化大的模型更容易量化失败。
- 不是所有算子都支持 INT8,可能出现反量化和格式转换开销。
4.3 INT4 / 4-bit
INT4 常见于本地部署和低显存推理,例如 GPTQ、AWQ、GGUF 等方案。它对显存非常友好,但不一定总是更快。
原因是低比特推理除了矩阵乘法,还涉及解包、反量化、scale 读取和 kernel 适配。如果 GPU、框架或模型结构不匹配,4-bit 可能只是省显存,吞吐未必明显提升。
5. Tensor Core 为什么重要
Tensor Core 是面向矩阵乘法的专用计算单元。Transformer 模型的大量计算集中在矩阵乘法上,例如 attention 的 QKV 投影、MLP、输出投影等,因此 LLM 性能更依赖 Tensor Core 或同类矩阵单元,而不是只看通用 CUDA Core 数量。
对 LLM 来说,关键问题不是“这张卡有没有 Tensor Core”,而是:
- 支持哪些精度:FP16、BF16、TF32、FP8、INT8、INT4。
- 对应精度下的 Tensor Core 峰值是多少。
- 推理框架是否有成熟 kernel 使用这些能力。
- 模型量化格式是否和硬件路径匹配。
- 算子是否会频繁 fallback 到较慢实现。
同一张 GPU 在 FP32、FP16、FP8、INT8 下的峰值可能差很多。选型时要看目标工作负载实际会跑在哪种精度,而不是看规格表里最大的那个数字。
6. 训练和推理的精度需求不同
训练、微调和推理对精度的容忍度不同。
| 场景 | 常见精度 | 关注点 |
|---|---|---|
| 预训练 | BF16、FP16、FP8、局部 FP32 | 数值稳定、吞吐、显存、分布式训练效率 |
| 微调 | BF16、FP16、QLoRA 4-bit | 显存占用、梯度稳定、优化器状态 |
| 在线推理 | FP16、BF16、FP8、INT8、INT4 | 延迟、吞吐、成本、输出质量 |
| 本地推理 | INT4、INT8、FP16 | 显存能否放下、速度、可接受的质量损失 |
训练时不仅有权重,还要保存梯度、优化器状态和中间激活,精度过低容易影响收敛稳定性。推理时不需要反向传播,因此可以更积极地使用量化,但必须评估输出质量、长上下文稳定性和特定任务表现。
7. 理论算力不等于实际吞吐
GPU 规格里的 TFLOPS / TOPS 是峰值,不是线上服务的 token/s 保证。实际吞吐通常由多个环节共同决定:
- 模型结构:层数、隐藏维度、attention 形式、MoE expert 数量。
- 请求形态:输入长度、输出长度、batch、并发、是否流式输出。
- 显存带宽:decode 阶段经常大量读取权重和 KV Cache。
- KV Cache 管理:分页、复用、碎片、量化和迁移。
- kernel 质量:FlashAttention、fused MLP、量化 kernel、采样 kernel。
- 框架调度:continuous batching、prefill/decode 分离、队列策略。
- 多卡通信:tensor parallel、pipeline parallel、expert parallel 的通信开销。
因此,两张卡的理论 FP16 算力接近,不代表 LLM 推理吞吐接近。显存容量、显存带宽、互联、框架支持和量化路径都可能改变结果。
8. 计算瓶颈和访存瓶颈
判断性能问题时,可以先区分是计算瓶颈还是访存瓶颈。
| 瓶颈类型 | 典型表现 | 常见优化方向 |
|---|---|---|
| 计算瓶颈 | GPU compute utilization 高,矩阵乘法耗时占比高 | 使用更低精度、增大 batch、启用 Tensor Core、优化 kernel |
| 访存瓶颈 | 显存带宽接近上限,GPU 利用率不一定高 | 量化权重/KV Cache、提升数据复用、使用更高带宽 GPU |
| 调度瓶颈 | GPU 利用率低,请求排队或 batch 不稳定 | continuous batching、调整队列、减少 CPU/tokenizer 阻塞 |
| 通信瓶颈 | 多卡扩展效率差,跨卡通信耗时高 | 优化并行策略、使用 NVLink/NVSwitch、减少跨卡同步 |
LLM 推理里的 decode 阶段常常偏访存瓶颈,尤其是小 batch、低并发、长上下文场景。此时只堆理论算力未必有效,显存带宽和 KV Cache 管理可能更关键。
prefill 阶段通常更接近大矩阵计算,batch 和输入长度足够大时更容易吃满 Tensor Core。因此同一个模型的 prefill 和 decode 可能有完全不同的性能瓶颈。
9. 不同 GPU 架构的精度支持
不同架构支持的精度路径不同。选型前要确认“硬件支持、驱动支持、框架支持、模型支持”四件事同时成立。
| 架构示例 | 常见关注精度 | 说明 |
|---|---|---|
| Volta / Turing | FP16、INT8 | 较早 Tensor Core 架构,现代 LLM 新特性支持有限 |
| Ampere | TF32、FP16、BF16、INT8 | A100 等数据中心卡常用于训练和推理,BF16 支持较关键 |
| Ada Lovelace | FP16、BF16、INT8、部分 FP8 路径需看型号和软件 | L4、L40S、RTX 40 系列常用于推理和视觉任务 |
| Hopper | FP16、BF16、FP8、INT8 | H100/H200 常用于 LLM 训练和推理,FP8 与 Transformer Engine 更成熟 |
| Blackwell | FP8、更低精度和 Transformer 加速 | 面向更大规模训练和推理,具体能力以型号和软件栈为准 |
对非 NVIDIA 加速卡,也要做同样检查:硬件矩阵单元支持哪些精度,编译器和运行时是否支持目标模型,推理框架是否已有稳定后端。
10. 选型时怎么看算力
选型不要从“哪张卡 TFLOPS 最高”开始,而要从任务反推。
| 任务 | 优先确认 |
|---|---|
| 单机开发 | 显存容量、FP16/BF16 支持、驱动和框架兼容 |
| 小规模推理 | 显存容量、显存带宽、INT8/INT4 量化支持 |
| 高并发在线推理 | 显存容量、带宽、FP8/INT8 路径、KV Cache 管理、服务框架 |
| 长上下文推理 | 显存容量、KV Cache 精度、显存带宽、调度策略 |
| 微调 | BF16 支持、显存容量、优化器状态、梯度检查点 |
| 多卡训练 | BF16/FP8 能力、GPU 互联、网络、分布式框架 |
建议按下面顺序检查:
- 模型权重和 KV Cache 能不能放下。
- 目标精度是否被 GPU 和框架稳定支持。
- prefill 和 decode 分别会卡在计算、访存还是调度。
- 量化是否会影响业务任务质量。
- 单卡压测结果是否能线性或接近线性扩展到多卡。
11. 常见误区
| 误区 | 更准确的理解 |
|---|---|
| FP32 算力高就适合 LLM | LLM 更常用 FP16、BF16、FP8、INT8 等路径 |
| INT4 一定比 FP16 快 | INT4 通常省显存,但速度取决于 kernel 和反量化开销 |
| 理论 TFLOPS 可以直接换算 token/s | token/s 还受显存带宽、KV Cache、batch、调度和采样影响 |
| 支持某种精度就代表可生产使用 | 还要看框架、模型、kernel、量化方案和稳定性 |
| 显存够就能高并发 | 高并发还需要 KV Cache 管理、调度、带宽和延迟控制 |
12. 快速判断清单
看到一张 GPU 或一套推理方案时,可以快速问这些问题:
- 目标模型计划用 FP16、BF16、FP8、INT8 还是 INT4。
- 该 GPU 在目标精度下的 Tensor Core / 矩阵单元吞吐是多少。
- 推理框架是否有对应精度的成熟 kernel。
- 权重、KV Cache 和运行时开销是否能放进显存。
- 当前 workload 是 prefill 多,还是 decode 多。
- 瓶颈更像计算、显存带宽、通信,还是调度。
- 量化后是否做过目标任务评测,而不只是看通用 benchmark。
- 多卡场景下通信是否会抵消算力收益。
一句话总结:算力指标要和精度一起看,精度要和模型质量一起看,最终还要用真实请求形态压测验证。