前阵子帮朋友选深度学习主机,他丢给我一张显卡参数表,上面密密麻麻写着“算力 82.6 TFLOPS”“AI TOPS 1321”“FP16 330 TFLOPS”,看得人一头雾水。这其实是个很典型的问题:市面上的宣传册和评测文章,都喜欢把算力数字写得越大越好,但很少有人讲清楚这些数字到底是怎么算出来的,又是在什么条件下测出来的。更坑的是,如果你拿 FP16 的算力去对比 INT8 的算力,或者拿稀疏算力去对比稠密算力,那结论基本就是错的。
我接触过不少搞 AI 部署和模型训练的朋友,说实话,能把这几个指标真正理解透的人并不多。今天这篇就把算力、TOPS、TFLOPS、FP32/FP16/INT8 这些概念彻底拆开揉碎,讲清楚它们各自代表什么、之间怎么换算、在实际选型中应该怎么用,最后再附上一些我在实际调参和压测过程中踩过的坑。内容不复杂,但很实用。
1. 算力的本质:到底在算什么东西
1.1 先搞清楚“算力”二字的物理含义
算力,英文叫 Compute Capability,说人话就是“单位时间内能完成多少次数学运算”。这里的数学运算,在 AI 场景下绝大多数是“乘加运算”(Multiply-Accumulate,简称 MAC)。神经网络里的卷积、全连接、注意力机制,本质就是一堆矩阵乘法,而矩阵乘法最终会被拆成无数个“先乘后加”的原子操作。
比如算一个长度为 4 的向量点积:a1×b1 + a2×b2 + a3×b3 + a4×b4,这里面就有 4 次乘法、4 次加法。在 GPU 的硬件设计里,乘法和加法通常被打包成一个 FMA(Fused Multiply-Add,融合乘加)指令,一次 FMA 指令完成一次乘法和一次加法。所以在算“算力”的时候,业界习惯把一次乘加(即 2 次浮点操作)作为基础计数单位。
这就引出一个关键概念:算力公式 = 运算单元数量 × 时钟频率 × 每周期每单元执行的运算次数 × 精度系数。
举个例子,一块 GPU 有 128 个流处理器,每个流处理器每个时钟周期能跑 2 次浮点运算(注意,是浮点运算 FLOPs,不是 FMA),核心频率是 1.5GHz,那么它的理论峰值算力大约是 128 × 2 × 2 × 1.5GHz = 768 GFLOPS。为什么这里要乘两个 2?因为“每周期每单元执行的运算次数”取决于硬件设计,有些单元支持 FMA,一次算 2 次操作;另外精度不同,支持 FP16 的 Tensor Core 一个周期能算的 FMA 次数远高于 FP32 的 CUDA Core。
只有理解了公式,你才能看懂为什么同一块芯片在不同精度下算力差异巨大——因为精度决定了运算单元是否满负荷工作、是否能走专用加速路径。
1.2 从 CPU 到 GPU,再到 NPU/TPU
很多人对算力的理解还停留在 CPU 时代,觉得主频高就是算力强。但 AI 计算的特点是大规模并行、高吞吐、对单个任务的延迟要求相对宽松。CPU 的设计思路是“低延迟、复杂控制”,单个核心很强,但核心数量不可能做到上千个;GPU 的设计思路是“高吞吐、简单控制”,核心数量动辄几千个,虽然单核能力弱,但合在一起处理矩阵运算的效率碾压 CPU。
到了 NPU、TPU 这类 AI 专用芯片,干脆砍掉了很多通用计算逻辑,把大量晶体管直接用在做矩阵乘法的 MAC 阵列上。以 Google TPU v4 为例,其片上矩阵乘法单元(MXU)可以在一拍内完成 128×128 的矩阵乘加,这种设计让它在特定精度下的算力远超同功耗的 GPU。
这里有个特别容易忽略的点:CPU、GPU 的算力通常用 FLOPS(每秒浮点运算次数)来表示,而 NPU、端侧芯片、自动驾驶芯片更爱用 TOPS(每秒万亿次整数运算)。背后的原因是:AI 推理阶段为了速度和显存占用,模型权重经常被量化成 INT8 甚至 INT4 整数格式,整数算力更容易宣传、数字也好看。但训练阶段几乎必须用浮点(FP32、FP16、BF16),所以 GPU 的浮点算力指标更通用。
2. TOPS 与 TFLOPS:一对容易混淆的亲兄弟
2.1 单位换算背后的精度鸿沟
TOPS 全称 Tera Operations Per Second,即每秒万亿次操作;TFLOPS 全称 Tera Floating-point Operations Per Second,即每秒万亿次浮点操作。只看字母,两者就差一个“F”,但背后的精度要求完全不同。
TOPS 测量的通常是 INT8 整数运算,TFLOPS 测量的是 FP16/FP32 浮点运算。由于整数运算没有浮点运算复杂的对齐、舍入逻辑,同样的硬件做 INT8 的速度往往比 FP32 快 4 倍、比 FP16 快 2 倍。这就导致了一块 GPU 产品的 TOPS 数值(指 INT8 算力)看起来是 TFLOPS(指 FP16 算力)的 2 倍左右。
那么 TOPS 和 TFLOPS 能不能直接换算?可以粗略换算:TOPS(INT8)= TFLOPS(FP16)× 2,或者以操作次数为单位看,1 TFLOPS 的 FP16 在单位换算成 OPS 时等于 2 TOPS。听起来有点绕,我给你一个例子:
NVIDIA A100 显卡:
- FP32 算力:19.5 TFLOPS
- FP16/TF32(Tensor Core)算力:312 TFLOPS(FP16 稠密)/ 624 TFLOPS(稀疏)
- INT8(Tensor Core)算力:624 TOPS(稠密)/ 1248 TOPS(稀疏)
看到这里你应该明白了,A100 的 FP16 算力 312 TFLOPS 对应 INT8 算力 624 TOPS,正好是 2 倍关系。因为 FP16 一个操作占 2 字节,INT8 一个操作占 1 字节,理论上同样的带宽和处理单元,INT8 的吞吐就是 FP16 的 2 倍。
2.2 为什么自动驾驶芯片爱标 TOPS
你在看智能驾驶域控制器时,一定会看到类似“总算力 254 TOPS”的宣传话术。这个数字怎么来的?以一颗常见的自动驾驶芯片为例,它内置了 CPU、GPU、NPU 三种计算单元,宣传的 254 TOPS 一般指的是 NPU 在 INT8 精度下的峰值算力,不含 CPU 和 GPU。
自动驾驶的场景有个特点:模型训练好之后需要部署到车端做实时推理,输入的是摄像头图像、激光雷达点云,输出的是目标框、可行区域。推理阶段的数据格式,经过量化后基本以 INT8 为主,所以用 TOPS(INT8)来衡量端侧芯片性能是合理的。而且自动驾驶对功耗有硬约束,一颗芯片往往限制在 30W-50W 的功耗区间,用 TOPS/W(每瓦算力)对比各芯片能效更科学。
但你要是拿它和 A100 这类数据中心 GPU 比“谁算力高”,就属于关公战秦琼了。A100 标称 624 TOPS(INT8)时功耗是 400W,而一颗车规芯片标称 254 TOPS 时功耗可能只有 30W。二者面向的场景、支持的精度、可用框架完全不重叠。
所以我的建议是:不要只记住一个数字,一定要问清楚“这个算力是哪个精度、稠密还是稀疏、什么功耗下测出来的”,这才是专业做法。
3. FP32、FP16、BF16、INT8:精度决定算力天花板
3.1 各种精度格式的本质区别
浮点数在计算机里的表示遵循 IEEE 754 标准,由符号位、指数位、尾数位组成。以 FP32(单精度浮点)为例,1 位符号 + 8 位指数 + 23 位尾数,总共 32 位。它可以表示约 7 位有效十进制数字,范围大致在 ±3.4×10^38。
FP16(半精度浮点)是 1 位符号 + 5 位指数 + 10 位尾数,总共 16 位。有效十进制数字约 3 位,范围在 ±65504 左右。
BF16(Brain Floating Point)是 Google 在 TPU 上力推的格式:1 位符号 + 8 位指数 + 7 位尾数,总共 16 位。它的指数范围与 FP32 一致,但尾数精度比 FP16 还低。好处是做混合精度训练时不容易溢出或者下溢,对梯度更新比较友好。
INT8(8 位整数)就是总共 8 位,能表示 -128 到 127(有符号)或 0 到 255(无符号)。没有指数,表示范围很窄,需要做“量化”,也就是把浮点权重映射到整数区间。
那么精度的不同如何影响算力?核心原因是硬件资源利用率。同一个运算单元,处理 FP32 需要完整的 32 位通道,处理 FP16 可以塞进两个 16 位通道,处理 INT8 可以塞进四个 8 位通道。加上 Tensor Core 这类专用矩阵单元在不同精度下支持的乘加次数不同,算力就出现了倍数级差异。
为了直观,我列一张常见精度格式的参数对比表:
| 格式 | 总位数 | 指数位 | 尾数位 | 十进制有效位 | 典型应用 | 与FP32算力比 |
|---|---|---|---|---|---|---|
| FP32 | 32 | 8 | 23 | 约7位 | 传统科学计算、CPU训练 | 1x |
| TF32 | 32 | 8 | 10 | 约3位 | 混合精度训练的过渡格式 | 8x(Tensor Core) |
| FP16 | 16 | 5 | 10 | 约3位 | 混合精度训练、推理 | 2x |
| BF16 | 16 | 8 | 7 | 约2位 | 大模型分布式训练 | 2x |
| INT8 | 8 | 无 | 无 | — | 推理部署、量化加速 | 4x |
| INT4 | 4 | 无 | 无 | — | 极限推理优化、端侧部署 | 8x |
这张表只是近似关系,不同架构的 GPU、NPU 实际倍数略有差异,但总体规律一致:精度越低,硬件可并行的数据量越大,算力越高。
3.2 混合精度训练:为什么 FP16 能当主力
很多同学训练模型时有个误区:怕精度下降,只敢用 FP32。实际上从头训练深度神经网络时,权重分布基本在 -1 到 1 之间,FP16 的 10 位尾数完全够用。但 FP16 的范围窄(最大 65504),梯度在反向传播时容易溢出。解决方法是混合精度训练(Mixed Precision Training):
- 前向和反向计算时,权重、激活值用 FP16;
- 梯度更新时用 FP32 的“主权重副本”;
- 损失缩放(Loss Scaling):在反向传播之前,把损失值放大一定倍数(比如 1024 倍),避免小梯度在 FP16 下被舍入为 0,更新完权重后再缩回去。
这套方案已经是 PyTorch 里的标准操作了,你用 torch.amp 或者英伟达的 AMP(自动混合精度)包就能轻松开启。实际跑起来,FP16 相比 FP32 训练不仅能把速度翻倍(因为算力翻倍),显存占用也会降一半左右,对大模型训练和加大 batch size 都有明显收益。
判断该不该用混合精度,主要看你的模型对数值精度是不是敏感。卷积神经网络(CNN)一般非常稳,用 FP16 几乎无损;超大词表的语言模型、一些强化学习场景,需要人工检查梯度分布,必要时在部分层保持 FP32。这需要在实践中慢慢积累手感。
3.3 Tensor Core 和 CUDA Core:专用电路带来的算力跃升
提到精度就绕不开 Tensor Core。从英伟达 Volta 架构开始,GPU 内部除了通用 CUDA Core,还多了一组专门做矩阵乘法的 Tensor Core。CUDA Core 是一个时钟周期做一次 FP32 乘加,而 Tensor Core 一个时钟周期能做 4×4 矩阵的乘加操作,相当于 64 次 FMA。
以 A100 为例,它每个 SM(流处理器)里有 4 个 Tensor Core,专门服务 FP16/BF16/INT8/INT4 这类低精度矩阵运算。当模型跑 FP16 时,Tensor Core 火力全开;跑 FP32 时 Tensor Core 反而帮不上忙(A100 引入了 TF32 精度的 Tensor Core 支持,但这也是一种截断格式)。这就是为什么 A100 的 FP16 算力是 FP32 的 16 倍、INT8 是 FP32 的 32 倍——大数来自 Tensor Core 的专用加速。
数据中心 GPU 和消费级 GPU 的差距也体现在这里。消费级卡也有 Tensor Core,但规模和显存带宽差了一大截,导致实际训练和推理时的影响远不止纸面算力差异。选卡时不能只看 FLOPS 数字,还要看 Tensor Core 规模、显存带宽、互联速度,这几点我后面会详细讲。
4. 查算力表、选卡、买算力云的实操指南
4.1 看懂显卡算力表与厂商的宣传口径
厂商发布算力指标时,一般会给出多行数据,告诉你 FP32、FP16、INT8 分别是多少。以几款常见卡为例,整理成表:
| 显卡/芯片 | 功耗 | FP32 (CUDA Core) | FP16 (Tensor Core) | INT8 (Tensor Core) | 备注 |
|---|---|---|---|---|---|
| NVIDIA RTX 4090 | 450W | 82.6 TFLOPS | 165 TFLOPS(稀疏) | 330 TOPS(稀疏) | 消费卡,游戏+轻量AI |
| NVIDIA L20 | 275W | 40.6 TFLOPS | 119 TFLOPS(稠密) | 238 TOPS(稠密) | 准专业AI推理卡 |
| NVIDIA A100 40GB | 400W | 19.5 TFLOPS | 312 TFLOPS(稠密) | 624 TOPS(稠密) | 上一代数据中心主力 |
| NVIDIA H100 SXM | 700W | 67 TFLOPS | 989 TFLOPS(稠密) | 1979 TOPS(稠密) | 当前高性能训练主流 |
| 某自动驾驶芯片 | 30W | — | — | 254 TOPS | 车规级NPU算力 |
看见没?旗舰游戏卡 RTX 4090 的 FP32 算力(82.6 TFLOPS)比 A100(19.5 TFLOPS)还高,但如果你拿它做大规模模型训练,显存、稳定性、互联都会被 A100 按在地上摩擦。游戏卡和计算卡的分野,从来不只是算力高低,而是硬件的可用性、多卡扩展和规模化部署能力。
厂商宣传还有个常见花招:用“稀疏”(Sparse)算力标榜最大性能。稀疏算力假设模型里一半的权重是零,利用硬件跳过零值计算,从而在理想情况下达到稠密算力的 2 倍。但没有任何模型能真正让权重有一半精确为零,即使用了剪枝技术,实际加速也远达不到 2 倍。所以对比时一定要认准稠密算力,或者干脆自己用工具实测。
4.2 实测压测:拿真实任务算算需要多少算力
理论算力只是上限,实际应用能跑到理论值的 30%-60% 就不错了。有一个很实用的估算方法,估一次训练或一次推理要多久,反向推算需要的算力规模。
比如我想跑一个 70 亿参数的大语言模型微调,LoRA 方案下实际需要参与计算的参数量可能只剩 1 亿左右(大部分层被冻结)。训练数据是 100 万条文本,每条平均 512 个 token,那么总 token 数 = 1,000,000 × 512 = 5.12 亿。粗略估算训练总浮点操作数 = 6 × 模型参数量 × token 数 = 6 × 100,000,000 × 512,000,000 = 307,200,000,000,000,000 ≈ 307 PFLOPS(PetaFLOPS,10^15 次方)。
如果我用一张 H100(FP16 稠密算力约 989 TFLOPS),假设实际效率是 45%,那么每秒有效算力约 445 TFLOPS,训练时长 = 307 / 445 ≈ 0.69 秒?这显然不对,因为大模型训练要做大批次、多轮 epoch,307 PFLOPS 只是单 epoch 的前向计算量,真实训练时长还要考虑反向传播(乘 2~3 倍)、日志记录、数据加载、梯度同步等待等开销。通常 7B 模型用 1 张 H100 做 LoRA 微调,100 万条数据跑 3 个 epoch,实际耗时在 20~40 小时之间。这里我只是演示算力估算的逻辑:先算出理论 FLOPs,再除以实际有效算力,最后乘上 3~5 倍的工程开销系数。
推理场景也可以用类似方法估算。假如一个 7B 模型在 A100 上用 FP16 推理,输入输出总 token 数为 2000。前向计算量约 2 × 模型参数 × token 数 = 2 × 7,000,000,000 × 2000 = 28 TFLOPS。A100 单卡 FP16 算力 312 TFLOPS,实际利用率按 30% 算约 93.6 TFLOPS,那么一次推理的理论耗时约 0.3 秒。这个估算结果和常见的 7B 模型单卡推理首 token 时延是吻合的。如果换成 INT8 量化模型,A100 的 INT8 算力 624 TOPS,对应百万 token 吞吐量会明显提升。
4.3 算力云怎么选、API 密钥权限怎么管
实际工作中,不是每个人都有几张 A100 放在家里。更多人用的是算力云平台或者大模型的 API 接口。这里有几个实操层面的体会:
一是租卡看“可用算力”别只看“标称算力”。很多云平台标注“RTX 4090 算力增强型”,但实际多用户共享时,可能拿到的是碎片化算力。租卡之前先跑一下nvidia-smi看显卡是否被独占、显存是否真实可用,或者直接跑一个 10 分钟的小模型压测,计算实际吞吐量。
二是 API 接口调用时,密钥权限管理经常被忽视。我见过不止一次公司内部把 API Key 硬编码在代码仓库里,或者团队成员共用一个超级权限 Key。这样做不仅埋下安全风险,还可能导致误操作超额计费。比较规范的做法是:
- 用环境变量或密钥管理服务(KMS)存储 Key,不要在代码里写死;
- 按项目申请不同的 Key,分配最小必要权限,例如只读模型、可写、可调训练任务等分离开;
- 设置调用限额和费用告警,避免测试脚本不小心把几百万 token 刷完;
这块虽然和“算力指标”本身无关,但算力好不好用、贵不贵,很多时候取决于怎么合理地申请和调度资源。把权限控制好,成本至少省 20%。
5. 常见问题与踩坑实录
5.1 算力对比时最容易踩的坑
踩坑一:用稀疏算力对比稠密算力。厂商宣传页上写着“FP16 750 TFLOPS”,你以为这张卡是所有场景都能跑满这个数,其实那是稀疏模式。对比必须看小字。比如你需要实打实的稠密 FP16 计算,直接找表格里标着“Dense”的那一行,没有就默认它是 Sparse。
踩坑二:混淆 TOPS 和 TFLOPS 的基准精度。有人拿一张卡的“INT8 300 TOPS”对比另一张卡的“FP16 150 TFLOPS”,然后得出前者算力强一倍。换算一下,FP16 150 TFLOPS 的 INT8 算力约 300 TOPS,两者实际同一水平。所以对比之前先统一精度。
踩坑三:忽略显存带宽的限制。我之前跑一个视觉大模型,标称算力足够,但推理速度就是上不去。后来定位发现瓶颈在显存带宽:模型的权重从显存搬到计算单元的速度,远远慢于计算速度。这就好比一个厨师刀工再好,但备菜员递菜太慢,整体出餐速度也上不来。高算力卡一定要配高带宽显存,比如 H100 的 HBM3 带宽达到 3.35TB/s,而 RTX 4090 的 GDDR6X 只有 1TB/s 左右。跑大模型吞吐量的差距,带宽影响甚至超过计算单元。
踩坑四:拿 TFLOPS 判断游戏性能。显卡的游戏表现主要看光栅化、纹理填充、几何处理等图形管线能力,这些都在 FP32 的 CUDA Core 上运行,但不同代际架构执行效率差异极大。比如 AMD 和 NVIDIA 的显卡 FP32 数字接近,游戏帧率却差很多。所以游戏选卡看评测帧率,不要看算力表。
5.2 精度切换后的异常定位思路
一次我在做模型量化时,从 FP16 切到 INT8 后准确率突然掉了 8%。排查步骤供参考:
- 第一步,检查量化校准数据集是否足够有代表性。用 100 张图片做校准和用 10000 张图片做校准,量化参数差别很大,后者明显更稳。
- 第二步,查看激活值分布。如果某些层的激活值范围极宽,属于 Hard Outlier,这时候 INT8 量化会严重失真。解决办法是采用混合精度,只把容易量化的层切到 INT8,敏感层保持 FP16。
- 第三步,确认有没有开启量化感知训练 QAT。常规的 PTQ(训练后量化)方便,但效果不如 QAT 稳。如果是上线模型,尽量提前把 QAT 流程加进训练阶段。
这些思路适用于所有“从高精度降到低精度”的迁移场景。核心原则就是:哪里有问题,就把它切回高精度,逐步定位,不要一次全量切。
5.3 一份实用的选型自检清单
综合以上所有内容,我把选型时该问的问题整理成清单,照着回答一遍基本不会买错:
- 我的核心任务是训练还是推理?训练选 FP16/BF16 算力高的卡,推理优先看 INT8 算力和显存带宽;
- 模型参数量多大?7B、13B 这种模型,A100 40GB 能跑单卡推理,70B 就得考虑多卡并行或量化到 4bit;
- 是否需要多卡互联?多卡训练必须关注 NVLink 带宽和拓扑结构,光看单卡算力没用;
- 单卡功耗和散热能否承受?一台机器塞 8 张 450W 的显卡,散热设计和电源都得重新规划;
- 预算能覆盖多少?有时候租云比买整机更划算,特别是临时跑实验的情况下。
这套清单换成算力云也一样适用:你先确认自己需要的卡型、显存、卡数,再对比不同平台的实际算力产出,而不是单纯看“1 张卡多少钱一小时”。
我个人在实际操作中最深的体会是:算力指标最大的价值不是用来横向 PK 谁强谁弱,而是帮你在有限预算和功耗约束下,估算出“这个任务到底需要什么规模的资源、大约要跑多久”,从而做出更理性的决策。看不懂这些数字,你只能被宣传文案牵着走;理解了精度和算力的关系,你就掌握了按需选配的主动权。
最后再分享一个小建议:下次拿到一张新卡或者开通一个算力实例,不要只盯着标称参数,先跑一个标准 benchmark 模型(比如 ResNet-50、BERT-base),记录下 FP32、FP16、INT8 三种精度的真实吞吐量。把这组数据存在自己的小本子上,用不了多久,你就会形成一套属于自己的“算力感知”,以后再谈选型部署,心里就有底了。