Wink Pings

GPU 算力越堆越高,生成 token 为什么还是慢

CPU、GPU、TPU、NPU、LPU 各自在灵活性、并行度和内存访问上做交换。把架构图放在一起,再回到 LLM 推理,生成速度被内存带宽卡住,峰值 FLOPS 经常不是第一指标。

AI 硬件今天不止一种答案。Daily Dose of Data Science 把 CPU、GPU、TPU、NPU、LPU 五种架构并排画了出来。核心不是谁替代谁,每条路线都在灵活性、并行度和内存访问之间做交换。下面的视频是原帖的架构对比:

CPU 走通用路线。少量强核,深缓存,擅长复杂逻辑、分支、系统任务。数据库、操作系统、决策密集代码都适合它。矩阵乘法这种重复数学不是它的强项。

GPU 反过来。数千个更小的核,同一指令在不同数据上执行。神经网络训练和推理里大量矩阵运算正好映射到这种并行。代价是单线程弱,依赖数据分支会让同一个 warp 里的线程分叉,硬件要串行跑两条路径。

TPU 再往专用走。核心是 MAC 阵列,权重和激活从两侧流入,部分结果在阵列里传播,不必每次都回内存。执行由编译器控制,不是硬件调度。Google 为神经网络工作负载设计了这套结构。

NPU 是边缘版本。神经计算引擎加 MAC 阵列和片上 SRAM,用低功耗系统内存,目标是在个位数瓦特预算下跑推理。手机、穿戴设备、IoT 是它的位置。Apple Neural Engine 和 Intel 的 NPU 属于这个方向。

LPU 来自 Groq,是最近出现的路线。它把片外内存从关键路径里拿掉,权重全部放在片上 SRAM。执行完全确定,由编译器调度,没有缓存 miss,也没有运行时调度开销。代价是每芯片内存有限,服务一个大模型需要数百颗芯片连在一起。延迟优势确实存在。

从 CPU 到 LPU,通用性一步步换成效率。这个取舍比“谁更强”更值得看。

但真实部署里,更常见的困惑发生在 GPU 上:规格表写着接近千万亿次浮点运算,跑 70B 模型生成文本却只有几十 token/s。Akshay 在长文里用一条不对称解释了这个现象:算术便宜,取数贵。算术单元像车间里的工作台,数据在仓库,中间只有一条窄走廊。工作台再多,走廊宽度不变,吞吐就卡在走廊上。这条走廊就是内存带宽。

GPU 不缩短等待,它让等待被其他工作盖住。每个计算单元里驻留大量 warp,一个 warp 等数据时,调度器切换到另一个 ready 的 warp。算术单元保持忙碌。但带宽是硬顶,数据每秒只能过那么多字节,这个没法用切换隐藏。

所以看一个操作能不能吃满 GPU,要算工作每字节,也就是算术强度:做了多少次运算,从主内存取了多少字节。H100 SXM5 的公开规格是 989 TFLOPS 密集 BF16 和 3.35 TB/s 带宽,两者一除约 295 ops/byte。低于这个比值,算力再高也会等内存。高于它,才进入 compute-bound。

LLM 生成 token 恰好落在最差的一侧。70B 模型 16-bit 精度约 140GB 权重。每生成一个 token,要完整读一遍权重,每个权重做一次乘加,约两次运算。1400 亿次运算除以 140GB 流量,约 1 op/byte,比 295 低三百倍。于是 token 速率基本由带宽决定:140GB 除以 3.35TB/s 约 42ms,一秒约 24 个 token。这个下限不靠改代码消失。

预填充阶段相反。prompt 里的多个 token 一起处理,同一个权重被多个 token 复用,工作每字节升高,通常变成 compute-bound。长 prompt 和长输出的瓶颈不同,混在一起谈容易糊涂。

已经出现的优化,大多只在动两个变量:提高每次取数的运算量,或减少取数字节。batching 提高运算量。十个并发请求共享一次权重读取,工作每字节乘十。16-bit 精度下,大约要 300 个并发序列才把生成推过 compute-bound 线。量化减少字节。8-bit 权重把 70B 模型压到约 70GB,单序列理论上限从约 24 token/s 升到约 48 token/s,代价是精度。fusion 和 FlashAttention 减少中间结果往返主内存。这些方法都不神奇,只是把同一笔账算得更划算。

还有一个容易误导的指标:监控里的 GPU 利用率。它常常只说明有工作被调度,不说明算术单元在做有用功。一个 100% utilized 但等内存的 GPU,和一个满吞吐的 GPU,读数可能一样。先看 batch size、精度、KV cache 大小,通常比盯着 FLOPS 有用。

硬件会继续变。H200 和 H100 用同一计算 die,算力仍是 989 TFLOPS,带宽升到 4.8 TB/s,break-even 比值降到约 206 ops/byte。更多工作负载会变成 compute-bound。但形状不变:算术增长快于带宽,减少数据移动的技术会越来越值钱,规格表上的峰值算力经常是最不预测实际性能的数字。

Punit Vara 用一段 Hinglish 说唱解释 CUDA kernel,把 thread、block、GPU 并行讲成故事,视频在这里:https://youtu.be/i_ZBgKXLrtM

看芯片架构图时,先问它把什么放在片上,把什么推给片外。答案往往比 TOPS 或 TFLOPS 更接近真实速度。

发布时间: 2026-11-09 19:28