刚开始接触AI相关项目时,我特别怕看芯片规格表。同样一块GPU,官网能列出十几个算力参数;同样叫“算力”,有的产品标TOPS,有的标TFLOPS,有的标GFLOPS;FP32、FP16、INT8一排数字摆在面前,不查半天手册根本分不清。后来在端侧推理、云上训练各种场景里反反复复对比参数、实测性能,才把这些指标彻底吃透。这篇就用实际项目里积累的理解,把算力这件事从头到尾拆一遍:TOPS和TFLOPS什么关系,FP32/FP16/INT8为什么会让算力数字成倍变化,以及拿到一个标称算力之后,怎么判断它到底能不能跑你的任务。
1. 别急着背参数,先搞清楚算力究竟在“算”什么
很多人一上来就记“1 TOPS=每秒一万亿次操作”,这没错,但没有触及本质。算力说到底是一个吞吐量概念:芯片在一秒内能完成多少次基本数学运算。问题在于,“一次数学运算”是个可大可小的筐。你可以数一次浮点加法,可以数一次整数乘累加,也可以数一次矩阵里的FMA(乘加指令),口径不同,结果能差好几倍。
这就像问一座港口的“运输能力”,货代关心集装箱量,客运站关心旅客人次,散货码头关心吨位。数据本身都是对的,但口径不一样,放在一起比较就会闹出笑话。CPU、GPU、NPU虽然都在“算”,但它们各自擅长的运算类型、数据宽度完全不同,于是延续了几套不同的算力指标,这就是混乱的根源。
1.1 算力计算的基本盘:核心数×频率×每周期操作数
从最底层看,芯片算力高不高,主要由三件事决定:计算单元的数量、运行频率、以及每个计算单元在一个时钟周期内能完成多少次目标运算。
- 核心数:有多少个可执行计算的核心,GPU里叫CUDA核心/流处理器,NPU里叫MAC阵列。
- 频率:核心每秒跑多少个时钟周期,比如2.5GHz就是一秒25亿个周期。
- 每周期操作数:每个核心每个周期完成几次运算,这跟数据位宽、指令集直接相关。
以CPU举例,一条AVX512指令能一次性处理16个FP32浮点数,如果某个核心每周期能执行一条包含乘加的AVX512指令,那它每周期就是32次浮点操作(16次乘法+16次加法)。一个8核3.5GHz的CPU,如果支持双FMA单元,理论FP32算力大约就是8×32×3.5GHz≈896GFLOPS。这个数字不算小,但和GPU一比又差得远,因为GPU的核心数量是几千上万个,靠“堆核心”换吞吐。算力公式本身并不神秘,所有标称值都能拆成这样。
1.2 FLOPS、TOPS、GFLOPS到底是谁的单位
先做个词源拆解:
- FLOPS = Floating-point Operations Per Second,每秒浮点运算次数。
- OPS = Operations Per Second,每秒操作次数,前面的T(tera)表示10的12次方,所以TOPS=每秒万亿次操作。
- GFLOPS里的G是10的9次方,PFLOPS里的P是10的15次方。
注意一个很容易混淆的写法。严格在大写层面,FLOPS(复数S)是一个速率单位,FLOPs(小写s)常被用来指浮点运算总量,论文里常说“这个模型的FLOPs是多少”,指的是一次推理需要的总运算量,而不是每秒速率。很多工具如thop输出的也是总量。这个历史遗留的混用非常普遍,你只需要在脑子里确认:这个数字后面有没有“每秒”的含义,就能分辨它到底在说什么。
为什么传统芯片爱标TFLOPS,而AI芯片爱标TOPS?因为通用计算和科学计算大量依赖浮点运算,CPU和GPU的浮点能力是核心卖点;而很多AI芯片在做推理时,主要执行的是卷积和矩阵乘,这些运算在端侧被量化成INT8整数运算后,算力高出一大截,用TOPS报数更好看。严格说,TOPS并不等于“AI算力”,它只是把所有整数操作都算了进去,看参数时务必记住这一点。
1.3 不同芯片的算力指标为什么不能直接比
一块标称8TFLOPS的GPU和一块标称8TOPS的NPU,哪一个更强?这问题没有答案,因为前者是每秒8万亿次单精度浮点运算,后者是每秒8万亿次整数运算。即使数字相同,两者处理的数学对象都不一样。
更隐蔽的是“操作”的口径差异。同样是TOPS,A芯片可能每个周期把一次整数乘加算作一次操作,B芯片可能算作两次(乘一次加一次)。用户看到的都是“8TOPS”,实际吞吐差一倍,只有在完整看过芯片的指令集文档后才能发现。所以在看任何算力宣传时,我第一件事是确认它标的是什么单位的什么精度,然后才是数字大小。数字背后口径的统一,比数字本身的差异重要得多。
2. FP32、FP16、INT8:数值精度如何决定芯片的“分档玩法”
FP32、FP16、INT8这几个词,表面上说的是数值格式,实际上是硬件计算单元的设计分档。同一块芯片为什么会冒出FP32算力、FP16算力、INT8算力三个数?因为芯片内部针对不同精度提供了不同的计算路径,这条路能做的运算,比那条路快,也可能慢。搞懂这些格式,才算真正看懂了参数表。
2.1 用尺子做类比,一次看懂四种数值格式
计算机里的数字归根到底是一串0和1,不同格式只是约定用多少位来表示一个数。位数的分配有讲究,主要由符号位、指数位、尾数位三部分组成。
| 数值格式 | 符号位 | 指数位 | 尾数位 | 有效十进制位 | 大致表示范围 |
|---|---|---|---|---|---|
| FP32(单精度) | 1位 | 8位 | 23位 | 约7位 | ±3.4×10^38 |
| FP16(半精度) | 1位 | 5位 | 10位 | 约3位 | 最大65504 |
| BF16(脑浮点) | 1位 | 8位 | 7位 | 约2~3位 | 与FP32范围一致 |
| INT8(8位整数) | 无(补码) | - | - | 整数精确 | -128~127 |
用尺子类比:FP32像一把最小刻度到毫米的钢尺,量什么都踏实;FP16像刻度到厘米的软尺,轻便但细小的部分会被舍掉;INT8则像一排整数计数筹码,只认整数,没有小数概念。BF16比较特殊,它保留FP32的指数位范围,却把尾数大幅砍到7位,量程极大但精度很粗,好处是训练时不容易像FP16那样发生上溢/下溢,现在很多大模型训练已经默认改用BF16。
深度学习为什么敢用这么“糙”的数值?因为神经网络里的权重和激活值,绝大多数分布在很小的区间,而且天然带有容错性。一个参数从1.0000001变成1.0001,对几百万个参数的协同输出来说,影响会被后续层稀释掉。这个“精度够用就好”的观察,是整个低精度计算革命的逻辑起点。
2.2 乘累加单元的面积游戏:为什么低精度算力翻倍
深层原因是硬件层面的。神经网络计算的核心是矩阵乘,矩阵乘的核心是乘累加运算(MAC),一次MAC相当于一次乘法加一次加法,算两次浮点操作。做乘法在硬件里靠乘法器电路,数据位宽越宽,需要的晶体管和芯片面积越大。
假设每个FP32乘法器占一份面积,那么同一块硅片面积里,理论上可以放约两个FP16乘法器或四个INT8乘法器,于是低精度的峰值通量成倍上涨。NVIDIA GPU从Volta架构引入Tensor Core后,用专用矩阵单元做低精度矩阵乘,FP16相对FP32、INT8相对FP16的算力翻倍更加彻底。
但要注意,翻倍不是必然的,比例取决于架构设计。消费级RTX 4090的FP32算力是82.6TFLOPS,Tensor Core的FP16稠密算力约165TFLOPS,INT8稠密算力约330TOPS,基本是1:2:4。有的芯片只把资源砸在INT8上,FP32弱得可怜;有的芯片侧重BF16而不是FP16;还有的芯片支持FP8,端侧新架构里甚至会专门标出FP8算力。同样叫“算力翻倍”,不是每个架构都按同一张剧本走。
2.3 量化和混合精度训练:低精度真正落地的两条路
低精度算力高,但模型不能直接拍脑袋换精度,需要两套工程手段支撑。
- 训练侧:主流方法是混合精度训练。权重主副本始终保存在FP32,前向和反向计算用FP16或BF16加速,每次优化器更新前把FP16梯度转回FP32再更新。为了防止FP16小梯度直接变成0,还会做梯度缩放(loss scaling)。
- 推理侧:主流方法是量化。把训练好的FP32权重通过公式q=round(r/scale)+zero_point映射到INT8整数区间,其中scale是步长,zero_point是零点偏移。用校准数据集统计出权重和激活的分布范围后,就能把模型压缩到原来的四分之一,推理时走INT8计算路径,速度快很多。
理解量化后你就明白,为什么“这个模型在这个盒子上能跑INT8,在另一个盒子上跑不了”——不是算力问题,而是芯片的推理框架和算子库有没有完整支持量化模型。算力是硬件上限,量化工程是把模型塞进这个上限的手段,两者要配套看。
3. 手算一张卡的真实算力:公式、单位换算与常见误区
整篇博文里,这部分我觉得最值得反复看。因为当你真正坐下来要对比两块板卡时,需要的不是“感觉够用”,而是能自己把标称算力拆开,甚至能自己估算。算力公式很简单,但单位换算里有不少坑。
3.1 用最原始的公式估算RTX 4090的FP32算力
先来实际算一遍。RTX 4090有16384个CUDA核心,官方Boost频率约2.52GHz。FP32算力公式是:
FP32 TFLOPS = CUDA核心数 × 每核心每周期浮点操作数 × 频率(GHz) / 1000
每个CUDA核心每周期最多做一次FP32乘加,也就是2次浮点操作,代入就是16384×2×2.52GHz÷1000≈82.6TFLOPS,和官网的82.58TFLOPS完全对得上。这个计算方法在多数GPU上通用,不同架构差异只在“每核心每周期操作数”这个因子。
用Python写出来就是几行:
cuda_cores = 16384 flops_per_core_per_cycle = 2 # 一次FMA算乘和加 boost_ghz = 2.52 tflops_fp32 = cuda_cores * flops_per_core_per_cycle * boost_ghz / 1000 print(f"RTX 4090 FP32峰值约: {tflops_fp32:.1f} TFLOPS") # 输出: RTX 4090 FP32峰值约: 82.6 TFLOPSTensor Core的算力估算更复杂,因为它每个周期能执行的矩阵规模跟代际、形状绑定。H100上的FP16 Tensor算力之所以能到近千TFLOPS,靠的是大量专用矩阵单元。这里就不展开指令集细节了,只说一个通用结论:Tensor Core算力=矩阵单元数量×每个单元每周期能处理的MMC次数×频率。
3.2 TOPS和TFLOPS的“约等号”:产业里最常用的换算惯例
很多人想知道1TOPS等于多少TFLOPS。严格数学上,两者没有转换关系,因为整数操作和浮点操作不是同一种东西。但产业里大量场景需要粗略折算,于是有了一套基于主流芯片设计的经验比例。
| 指标 | 含义 | 同一颗芯片内的典型比例关系 |
|---|---|---|
| INT8算力 | 每秒万亿次整数操作 | 基准,记为X |
| FP16算力 | 每秒万亿次半精度浮点操作 | 约X/2 |
| FP32算力 | 每秒万亿次单精度浮点操作 | 约X/4 |
也就是说,看到一颗芯片标称“100TOPS INT8”,按惯例反推它的FP16能力大约50TFLOPS,FP32大约25TFLOPS。但这个比例只是经验值,前提是芯片完整包含了FP32、FP16、INT8三条计算路径。很多ASIC芯片只做INT8,浮点几乎不可用,硬套这个比例就会失真。
换算关系背后的数学是MAC。深度学习的矩阵乘可以视为大量MAC堆叠,一次MAC=一次乘法+一次加法=2次FLOPs。所以同样通量的硬件,TFLOPS数值通常等于MAC吞吐的两倍。而INT8每个数据只有8位,同样的数据通道宽度能塞下两倍的操作数,于是TOPS又成为FP16 TFLOPS的约两倍。记住这个“MAC翻倍”逻辑,比死记“1TOPS≈0.5TFLOPS”更靠谱。
3.3 算力高不代表跑得快:内存带宽和利用率才是隐形天花板
纸面算力是理论峰值,实际跑任务时,绝大多数系统不会贴着峰值运行。这里有两个关键概念。
- 算术强度与Roofline模型。算术强度=计算量/访存量,单位是FLOPs/Byte。当任务的算术强度低于芯片平衡点时,系统是访存密集型,算得再快也在等数据搬移,瓶颈在内存带宽;只有算术强度足够高,系统才会成为计算密集型,算力标称值才有意义。小batch推理、轻量模型在端侧的很多场景都落在访存密集区,这也是为什么同样标称50TOPS的盒子,跑同一个模型帧率可能差一倍。
- 利用率(MFU/HFU)。数据中心训练一个大模型,MFU能到40%~50%已经算优秀,推理时受小算子启动开销影响,有效吞吐常常只有峰值的三成。也就是说,标称100TOPS的设备,实际能有30TOPS的稳定利用率再正常不过,不要把它当成硬件虚标,这是所有实算系统的物理现实。
所以我的判断习惯是:先用纸面算力粗筛,再用带宽判断瓶颈,最后一定拿真实模型在目标设备上跑一轮benchmark。规格表给的是一个梦,实测结果才是现实。
4. 拿着算力数字判断应用场景够不够用
了解概念之后,最实际的问题是:我的任务需要多少算力?这里没有绝对答案,因为模型结构、输入分辨率、帧率要求各不相同,但我按这些年做项目的经验,整理了一张很有参考价值的量级对照表。
4.1 一张算力需求对照表
| 应用场景 | 典型算力需求 | 参考设备/平台 |
|---|---|---|
| 语音唤醒、传感器识别、简单AI玩具 | 0.5~2 TOPS(INT8) | 低端MCU/NPU |
| 门禁人脸、单路视频结构化、边缘OCR | 3~20 TOPS(INT8) | Jetson Nano/Orin NX等 |
| 多路摄像头分析、复杂检测任务 | 20~100 TOPS(INT8) | Orin AGX/部分国产盒子 |
| 车载辅助驾驶(L2/L3) | 30~100 TOPS(INT8) | Mobileye、地平线芯片等 |
| L4自动驾驶、机器人大脑 | 200~500 TOPS(INT8) | NVIDIA Orin/Thor系列 |
| 大模型训练、大规模推理集群 | 数十~数百PFLOPS | 多卡H100级集群 |
需要注意的是,L4自动驾驶为什么要几百TOPS?因为它同时要跑多个神经网络:目标检测、语义分割、BEV感知、路径规划等模型并行执行,而且帧率要求高。算力需求是多个模型、帧率和分辨率的乘积,不是单一模型能糊弄的。所以判断场景时,不能只问“这个模型的算力需求”,要问“我这个系统里同时跑多少个模型、什么帧率”。
4.2 训练与推理:精度不同,看指标的侧重点完全不同
同样是算力,训练和推理对指标的参考价值截然不同。训练阶段要跑反向传播,数值梯度极其敏感,主流还是FP16/BF16混合精度,看FP16或BF16的TFLOPS才有意义,INT8的TOPS基本不相关。推理阶段则相反,模型已经训练完,量化压缩到INT8后,TOPS这个数字才是主要参考。
这就是为什么你不能拿“INT8 100TOPS”的盒子去评估训练任务,也不能拿“FP32 25TFLOPS”的显卡去评估INT8推理。很多朋友在选型时就是被单一营销数字带偏,没有先想清楚任务属于“训练”还是“推理”,导致买了一台算力规格看起来很高、实际用不上的设备。
4.3 显存容量和带宽:哪些算力发挥不出来的场景
算力再高,数据装不下就是白搭。大模型推理时,模型权重和KV Cache都要常驻显存。RTX 4090算力很强,但24GB显存跑7B模型已经捉襟见肘,如果要在批处理场景下跑13B以上模型,显存容量会先于算力成为瓶颈。数据中心同理,H100 80GB的容量优势有时比它的算力优势更值钱。
还有一个容易被忽略的指标是内存带宽。现在很多芯片标称算力逐年翻倍,内存带宽却往往只涨了30%~50%,导致很多新模型在旧平台上跑,瓶颈悄悄从计算转移到访存。判断一个任务能不能吃满算力,先看它一遍推理需要读多少权重和中间激活,再对比平台的带宽,心里就有数了。顺便提一句,平时调用云端API时,你在终端看到的“延迟”,底层同样受这套带宽和利用率逻辑支配,厂商按token计费的底气也来自算力的调度成本。
5. 挑参数表和跑实测时,我踩过的一些坑
最后分享一些实战经验。看过的规格表越多,越觉得“算力”这个词被用滥了。如果只看厂商宣传页的数字,你很可能会踩进几个非常典型的坑里。
5.1 参数表最常见的三种“文字游戏”
第一个坑是只报单一“AI算力”,不写精度。默认就拿INT8稀疏算力当亮点,甚至不告诉你这个数字带不带稀疏条件。稀疏(sparse)算力通常能达到稠密(dense)算力的两倍,但这个两倍的前提是模型稀疏度足够且硬件能利用稀疏结构,现实中和稀疏相关的快速权重剪枝往往没有宣传页那么理想。
第二个坑是把TOPS和TFLOPS混着说。有的厂商为了数字好看,把浮点算力也包装成“TOPS”,有的则反过来。同一颗芯片,标“INT8 100TOPS”和标“FP16 25TFLOPS”,数字差四倍,描述的是同一件事,只是在用不同精度度量的同一性能。不懂换算的人很容易觉得100比25“强很多”。
第三个坑是峰值频率。规格表里的Boost频率是理想散热条件下的最大频率,到了笔记本、迷你主机、嵌入式平台,受功耗墙和散热限制,持续运行后频率会明显下降。标称100TOPS的盒子,稳定满载时可能只有60~70TOPS,这不是厂商说谎,而是你没有额外看热设计和持续功耗,就默认它可以永远保持峰值。
5.2 我的选型决策流程
现在我做选型,基本会按这个流程走一遍:
- 明确任务类型:训练还是推理,单模型还是多模型并发,目标帧率是多少。
- 估算算力量级:用上述对照表粗筛,再对候选模型做一次FLOPs统计。
- 核对内存带宽和容量:确认带宽不会成为瓶颈,显存装得下目标模型。
- 看生态和工具链:CUDA/TensorRT/ONNX Runtime/厂商自带框架对模型的算子支持是否完整。
- 小规模实测:拿真实模型和真实输入分辨率,在目标设备上跑benchmark,看稳定的持续帧率和功耗。
- 用profiler看瓶颈:确认是计算密集、访存密集,还是后处理在拖后腿。
这套流程能帮你避开绝大多数“看着参数很猛,用起来很拉”的坑。
5.3 一次翻车复盘:瓶颈根本不在算力上
具体说来,我曾经遇到一个边缘盒子,标称INT8算力50TOPS,跑yolov5m 640x640时,我们预期单帧延迟20ms以内,实测却只有45ms。一开始也怀疑是不是算力虚标,后来拿profiler一跑,发现NPU占用率只有30%左右,瓶颈根本不在算力,而在两点:一是内存带宽不够,单帧要从内存搬整个输入和中间特征;二是后处理NMS放在了CPU上,CPU单线程成了另一个短板。
这个案例后来成为我的口头禅:“当你觉得算力不够时,先profile,别急着退货。”很多所谓算力不足,实际上是内存、频率、后处理、框架算子支持度共同造成的。改进后处理阶段把NMS放到GPU或NPU上,帧率几乎翻倍,功耗没多花一分。这也说明,标称算力只是硬件给的上限,它能不能兑现,取决于整个数据通路和软件栈。
还有一个经验是关于云算力平台的。很多人租用云端GPU时看到“单卡4090”就直接下单,结果光环境配置就折腾一天:驱动版本、CUDA、PyTorch、容器镜像不匹配,各种兼容性问题轮番出现。算力规格再高,环境不通,效率就是零。建议选云平台时优先看预置镜像是否适配你的框架版本,先跑通小模型,再上大任务。报错信息里看不懂的“CUDA out of memory”和“Illegal instruction”,绝大多数是环境问题,不是算力问题。
最后再分享一点体会
我现在看一张芯片,已经不指望哪个单一数字能代表全部性能了。算力决定的是理论上限,最终效果取决于四个因素的叠加:算力、带宽、利用率、工具链。FP32、FP16、INT8这些精度,本质上是在告诉你一个道理——在AI计算里,精度不是越高越好,而是够用就好。既然神经网络能接受低精度,硬件就把它兑现成翻倍的算力,这确实是过去几年AI硬件效率提升最核心的一条主线。理解了这条主线,再看任何规格参数,你都能一眼识别它到底在讲什么,而不是被那些漂亮数字牵着走。