最近 Groq 推理芯片以 500 token/s 的大模型输出速度刷屏了。

一句话来说,这个芯片就是玩了个用空间换时间的把戏,把模型权重和中间数据都放在了 SRAM 里面,而不是 HBM 或者 DRAM。

这是我 8 年前在微软亚洲研究院(MSRA)就做过的事情,适用于当时的神经网络,但真的不适合现在的大模型。因为基于 Transformer 的大模型需要很多内存用来存储 KV Cache。

Groq 芯片虽然输出速度非常快,但由于内存大小有限,batch size 就没法很大,要是算起 $/token 的性价比来,未必有竞争力。

Groq 需要几百卡的集群才能跑 LLaMA-2 70B 模型

上图:Groq 推理芯片的 spec上图:Groq 推理芯片的 spec

从 Groq 的 spec 不难看出,一个 Groq 芯片只有 230 MB 的 SRAM,带宽高达 80 TB/s,没有 HBM 或者 DRAM。作为对比,H100 有 96 GB HBM 内存,带宽是 3.35 TB/s。也就是说,Groq 的内存容量只有 H100 的 1/400,但它的内存带宽是 H100 的 25 倍。

Groq 的 int8 算力高达 750 Tops,fp16 算力高达 188 Tflops。作为对比,H100 的 tensor fp16 算力 989 Tflops,也就是 Groq 的算力是 H100 的 1/5。

Groq 用的是相对落后的 14nm 工艺,但也有 215W TDP,不算一个小芯片了,芯片制造成本肯定比 H100 低很多,但不可能比 H100 便宜 10 倍。

一个 LLaMA-2 70B 模型,就算做 int8 量化,也有 70 GB,就算不考虑中间状态的存储,那也需要 305 块 Groq 卡才能放下。

**Groq 还没有公布售价,如果按照跟 H100 的 fp16 算力比例估算售价,一张卡就要 $6,000,那么这个集群需要 $1,800,000。**有人会说这张卡 TSMC 的造价不会超过 $1,000,那我还要说 H100 的造价只有 $2,000 呢,芯片和软件生态的研发成本也是钱啊。

如果做 int8 量化,同样不考虑中间状态存储,一张 H100 就可以放下 LLaMA-2 70B,只需要 $30,000。当然,单块 H100 的吞吐量(token/s)干不过上述 Groq 集群。

**那么,Groq 集群和 H100 哪个性价比更高呢?**要回答这个问题,首先要搞清楚大模型是怎么拆成小块放进 Groq 卡的。

我在 MSRA 的空间计算探索

2016 年,我在微软亚洲研究院(MSRA)就搞过这种空间换时间的把戏,也就是把模型权重和中间状态全部放进 SRAM。我的博士回忆文章《MSRA 读博五年(二)自己主导的第一篇 SOSP》里面就讲了这段故事,在此摘录如下。

**微软把 Catapult FPGA 部署到数据中心的每台服务器,用于加速网络虚拟化之后,Catapult 团队就开始探索这些 FPGA 是否也能用来加速 AI。**学术界将 FPGA 用于 AI 训练和推理的文章已经连篇累牍,因此我们考虑的重点是如何利用高速网络来加速 FPGA AI。

当时,微软 Bing 搜索的排序算法是一个 DNN 模型。FPGA 做 DNN 推理有一个很大的局限,就是内存的带宽。当时我们的 FPGA 还没有 HBM 这么高速的内存,只有 DDR4 内存,两个通道加起来的带宽只有 32 GB/s。

大多数现有工作的做法是把模型放在 DRAM 里面,然后把模型分块,每一块都从 FPGA 片外的 DRAM 加载到 FPGA 片上的 SRAM(又称 Block RAM,BRAM),然后再在片上做计算。因此,数据搬移的开销就成了 FPGA 的主要瓶颈。编译器的工作就是优化分块形状和数据搬移,这也是我博士毕业后在华为 MindSpore 的第一个项目。

上图:我的 SIGCOMM 2016 ClickNP 论文对 FPGA 计算特征的总结上图:我的 SIGCOMM 2016 ClickNP 论文对 FPGA 计算特征的总结

2016 年,我想到,**能否利用多块 FPGA 组成的集群,把深度神经网络模型拆分成若干块,使得每一块都能放进 FPGA 内部的 SRAM 高速缓存?**这样,需要通过网络传递的就是各块之间的中间结果。由于 FPGA 芯片之间有高速的互联网络,经过计算,对于我们使用的模型,传输这些中间结果所需的带宽并不会成为瓶颈。

我兴奋地把这个发现报告给我们硬件研究组的主管徐宁仪老师,他说,我想到的方法叫做 “模型并行”。在一些场景下,这种 “模型并行” 的方法确实相比传统的 “数据并行” 方法能取得更高的性能。尽管这并不算是一个理论创新,但徐宁仪老师说,把整个模型都放进 FPGA 内部的 SRAM 高速缓存这个想法是有点意思的。这就像是把很多块 FPGA 利用高速网络互联,当成了一块 FPGA 来用。

为了跟数据仍然放在 DRAM 里的传统模型并行方法相区分,我们把这种所有数据都放在片上 SRAM 内的模型并行方法叫做 “空间计算”(spatial computing)

**空间计算这个名词听起来很高大上,但其实是最原始的。**我们搭建一个逻辑门组成的数字电路来完成特定的任务,这就是空间计算。基于图灵机理论的微处理器诞生之后,时间计算就成为主流,微处理器在不同的时刻执行不同的指令,这样只需要一套硬件电路,就可以完成各种各样的任务。但从体系结构的角度看,微处理器是用效率换取了通用性。

上图:用流水线把计算逻辑完全流水线化,就是空间计算上图:用流水线把计算逻辑完全流水线化,就是空间计算

**在 FPGA 和 ASIC 的世界里,为了效率,空间计算仍然是主流。**在 FPGA 高层次综合(HLS)中,循环次数固定、不包含任意跳转的代码(编译领域的学名叫做 SCoP,Static Control Part,静态控制区域),可以进行完全的循环展开和函数内联,进而转换成一块组合逻辑,在合适的地方插入寄存器后,就变成一条完全流水线化的数字逻辑了。这样的数字逻辑每个时钟周期都可以接受一个输入的数据块。

搞分布式系统的都知道,多台机器组成的集群难以实现线性加速比,也就是说机器多了,通信和协同的代价高了,平均每台机器的产出就少了。但这种 “空间计算” 的方法在 FPGA 数量足够多到能够在片上 SRAM 容纳下整个模型时,可以实现 “超线性” 加速比,也就是模型并行中每个 FPGA 的平均产出相比单个使用数据并行方法的 FPGA 更高。

解决了访问模型的内存带宽问题,FPGA 的算力就可以充分释放出来。我们做了一个思想实验:微软 Azure 数据中心每台服务器都部署了一块 FPGA,**如果把整个数据中心的 10 万块 FPGA 的算力都像一台计算机一样集中调度起来,只需要不到 0.1 秒,就可以翻译完成整个维基百科。**它也在微软的一场官方发布会上作为一个业务场景做了演示。

上图:微软发布会上用 FPGA 加速机器翻译的 demo,如果把整个数据中心 1 Exa Ops 的算力都用起来,只需要不到 0.1 秒就可以翻译完整个维基百科上图:微软发布会上用 FPGA 加速机器翻译的 demo,如果把整个数据中心 1 Exa Ops 的算力都用起来,只需要不到 0.1 秒就可以翻译完整个维基百科

大模型做空间计算的 KV Cache 困境

空间计算的故事是不是听起来很美好?但问题在于今天基于 Transformer 的大模型并不是当年我们做的 DNN 模型。

DNN 模型的推理过程中需要存储的中间状态很少,比权重小很多。但 Transformer 的 decode 过程中需要保存 KV Cache,而且这个 KV Cache 的大小与上下文(context)长度成正比。

假设我们不做任何 batching,那么对于 LLaMA-2 70B 模型(int8 量化),假设输入和输出的上下文 token 数量达到了最大的 4096,80 层的 KV Cache 一共需要 2 (K, V) * 80 (layers) * 8192 (embedding size) * 4096 (context length) * 1B / 8 (GQA 优化) = 0.625 GB。(感谢好几位朋友指出我第一版文章中的错误,忘记考虑 GQA 优化了,导致认为 KV Cache 的存储开销过大)

相比 70 GB 的权重,0.625 GB 看起来不多吧?但如果真的不做 batching,价值 $1,800,000 的 300 多张 Groq 卡就只能达到 500 token/s 的吞吐量,这么大的集群只能服务一个并发用户,按照每 token 的价格计算,就是 $3,600 / (token/s)。

那么 H100 的每 token 价格怎么样呢?

H100 每张卡的吞吐量(token/s),来源:Perplexity AIH100 每张卡的吞吐量(token/s),来源:Perplexity AI

根据 Perplexity AI 的数据,对 LLaMA-2 70B,在 batch size = 128 的时候,8 卡 H100 机器平均每张卡的 int8 推理性能大约是 425 token/s。按照每张 H100 卡 $30,000 计算,那就是 $70 / (token/s)。价格相差 50 倍!

为了让我们昂贵的 Groq 集群也能多服务几个并发请求,我们就需要增加 batch size,比如增加到跟 8 卡 H100 机器的典型设置 batch size = 128 相同。KV Cache 的大小是跟 batch size 成正比的,一个样本是 0.625 GB,128 个样本就是 80 GB。

注意,模型本身只有 70 GB,KV Cache 这些中间状态有 80 GB,这 150 GB 内存至少需要 652 张 Groq 卡来放下。这个集群的成本高达 $3,912,000,只是前面 batch size = 1 的 2 倍。128 个并发请求是 128 * 500 = 64,000 token/s,那么就是 $61 / (token/s),价格比 H100 还稍低一些。

我们知道 H100 本身已经有很高的溢价了,很多人都在想着用 4090 集群来做推理,比 H100 至少便宜一半。(如何用 4090 集群跑 70B 模型是另外一个问题,这里就不讨论了。)现在来了个跟 H100 性价比差不多的芯片,还只能做 Transformer,能不能跑 diffusion model 还不一定呢,你说买不买?

那么其他 batch size 是否存在甜点呢?batch size 每增加 1,就要存储 0.625 GB 的 KV Cache,这就需要 3 张 Groq 卡。其他 AI 芯片一般都是算力或者内存带宽瓶颈,Groq 的瓶颈却是内存容量。也就是说每个并发请求,或者说每 500 token/s,都需要增加价值 $18,000 的 3 张卡,每 token 价格不可能低于 $36 / (token/s) ,虽然比 H100 便宜,但是仍然达不到 4090 的水平。(Groq 每张卡的 TDP 是 215W,跟 4090 一样 token/W 比较低,电力成本比较高)

Groq 不需要给 NVIDIA 贡献利润

有人会问,为啥 Groq 宣称他们的推理服务价格比使用 NVIDIA 芯片的 Anyscale、Together AI 等公司还低呢?这是因为 Groq 自己就是做芯片的,没有 NVIDIA 这个中间商赚差价。

对于 Groq 来说,估计售价 $6,000 的芯片自己的成本可能还不到 $1,000。如果按照每张 Groq 卡 $1,000 来核算成本,那 batch size = 128 的集群成本就只要 $652,000,每 token 价格就是 $10.2,比 H100 便宜 7 倍。 当然,这里都没有考虑电力成本、主机成本和网络设备成本,在芯片都用成本价来算的时候,电力成本可能反而成了大头了,就像挖矿一样。

但是如果 NVIDIA 自己也用 H100 的成本价 $2,000 来提供推理服务,那每 token 价格就直接降低到 1/15,每 token 只要 $4.7,比 Groq 按成本价核算还便宜一半。由此可以看到 NVIDIA 的利润空间有多大了。

NVIDIA 高达一半以上的净利润率,营收还快赶上阿里了,这样赚钱的垄断生意要有航母才守得住。难怪 Sam Altman 看不下去了,OpenAI 辛辛苦苦做模型赚的钱都喂给 NVIDIA 了,因此要组个 7 万亿美金的局,从沙子开始,重塑整个芯片行业。

模型越大,空间计算的网络挑战越大

如果我们要推理的不是 70B 的 LLaMA-2,而是号称 1,800B 的 GPT-4,又会怎么样?

单是放下所有这些参数,哪怕用 int8 量化,都需要 7,826 张卡。这还不算 KV Cache。

在这么大的规模下,空间计算的网络互联会有很大的挑战。

7,826 张卡就算是把流水线并行做到极致,Transformer 每层一个流水级,假设 GPT-4 也是 80 层,每个流水级都需要 100 张卡做张量并行(tensor parallelism),这 100 张卡需要很高性能的 all-to-all 通信。为了维持 2 ms/token 的高吞吐量,网络通信延迟也必须在微秒级别。在万卡的规模下,这对网络互联的挑战是非常大的。

因此我猜测 Groq 做的可能不是一个基于交换机的互联网络,而是一个点对点的互联拓扑,每张卡互联周围的若干张卡,就像超算里面常见的 2D/3D Torus 一样。微软的 Catapult FPGA 一开始也是想搞这种类似超算的点对点拓扑,虽然数学上很漂亮,但最后发现通用性不强,还是改成了依靠基于标准交换机的 fat-tree 网络。当然 Catapult FPGA 的互联带宽不可与 NVLink 和 Groq 同日而语。

如果 Groq 能把 GPT-4 也做到 500 token/s 的输出速度,我真的会很佩服他们。

此外,上 TB/s 的网络互联既然都做出来了,为什么不用它互联 HBM 内存?

虽然用 SRAM 做 HBM 内存缓存的想法不太靠谱(Transformer 每个参数都要访问,没有局部性),但有了 HBM 至少可以做持久化 KV Cache 这些优化,比如把上百 K token 的 prompt prefill 进去,把 KV Cache 放到 HBM 里面,需要的时候再加载进来,这样就省去了很多重新计算 KV Cache 的 prefill 成本。

用过 OpenAI API 的都知道,大多数场景下 API 最烧钱的是输入而非输出。输入包括 prefill prompt(背景知识和指令)和 conversation(历史对话),输入长度经常动辄数十 K token(本文计算 KV Cache 内存容量时假设最长 4K token),但输出长度却很少超过 1K token。虽然每输入 token 比每输出 token 便宜,但输入的成本仍然一般高于输出。如果能够降低 KV Cache 重新计算的开销,功莫大焉。

结论

Groq 的优点是:通过把所有数据放进 SRAM,达到很高的内存带宽,进而实现很高的单请求 token/s,不管用多少块 H100 都很难达到 500 token/s 的输出速度。对输出速度要求很高的应用场景,以 Groq 为代表的空间计算是很有前景的。

Groq 的缺点是:每块卡的 SRAM 容量有限,KV Cache 占用的内存很大,需要很大的集群规模。因此:

  1. 如果 Groq 跟 NVIDIA GPU 类似,按照算力来对芯片定价,那么推理成本跟 H100 相当。
  2. Groq 集群的门槛高,最低配置都要 300 张卡,$1.8M 的投资,它的性能太差;如果要性价比高,就要 1000 张卡,$6M 的投资。相比之下,8 卡 H100 的 $0.3M 太便宜了。

其实我有个大胆的猜测,Groq 的架构可能是为上一代 DNN 而非 Transformer 设计的,当时还没有想到 KV Cache 会占这么多内存,空间计算是个很漂亮的 idea,就像我们当年在微软也是这么做的。这两年 Transformer 火了,但芯片设计不那么容易改动,就用 “地表最快 token 输出速度” 这个技术指标,一下子搞了个大新闻。

Transformer 是个很干净、通用的架构,对芯片来说,就是拼算力、内存容量、内存带宽、网络带宽这些硬指标,没有什么可玩花招的。

Comments