更小、更快、更安全:大规模运行Kimi和GLM
Workers AI在靠近用户的Cloudflare数据中心的GPU上运行一些世界上最优秀的开放模型的推理。Moonshot的Kimi K系列和Z.ai的GLM是两个最有能力、需求最高的模型。它们是大型的、长上下文的、混合专家模型,使用起来非常出色。然而,由于内存限制,它们的有效服务非常困难。我们之前写过关于如何在Workers AI上提供大型模型以及如何分离推理的预填充和解码阶段以更好地利用每个GPU的内容。本文探讨了我们在此基础上叠加的三种技术,以便将这些模型适配到内存中并保持快速:量化KV缓存、压缩模型权重,并且由于这两者都能在共享硬件上处理更多请求,保护这些请求共享的缓存。这些优化使我们能够以更低的成本支持更多客户,并且不影响模型的准确性。我们所有的实验和生产流量都是在SGLang上运行和基准测试的,SGLang是一个开源推理服务框架。我们发现SGLang提供了市场上最佳的性能,我们与SGLang团队紧密合作,上游补丁和新增功能,以便我们的工作能够为开源社区所用。 量化KV缓存 当模型生成文本时,它会在一个名为KV缓存的结构中存储每个已处理标记的注意力键(K)和值(V)。缓存使得模型能够在没有重新读取每个新标记的整个上下文的情况下延续长对话。对于长上下文模型,它迅速增加,通常是KV缓存,而不是模型的权重,首先填满GPU内存。默认情况下,缓存以16位精度(BF16)存储。我们改为以8位浮点数(FP8, e4m3)存储,这使其大小减半。在Kimi K2.6上,这使得我们能够将内存中可以持有的上下文量从大约686,000个标记提升到约1.37百万,是其两倍。值得精确说明受益的来源,因为这不是原始速度。量化缓存每个标记增加了一小部分工作,因为FP8注意力内核在读取值时必须进行转换。它改变的是我们可以同时保持的请求数量。以下测量是针对Kimi K2.6在分离的H200部署上解码时的,直接比较注意力内核: 并发请求 BF16 KV缓存(标记/秒) FP8 KV缓存(标记/秒) 1 137 125 8 731 689 16 1,106 1,028 32 1,558 1,489 64 内存不足 2,192 在任何单一的并发级别上,BF16每个标记快几个百分点。但是,BF16在32个并发请求时耗尽缓存,无法容纳第33个请求,而FP8可以继续支持到64个,请求速度可以达到2,192个标记每秒,约41%高于BF16的峰值,每个标记的成本约低30%。由于我们将预填充和解码作为独立的池,因此我们可以将这一策略应用到帮助最多的地方:预填充是计算受限而非内存受限,因此我们在此将缓存保持为BF16,以保持其稍微更高的吞吐量。所有这些都无关紧要,如果它改变了模型的答案,所以我们进行了检查。在我们的评估套件中,FP8和BF16缓存无可区分: 基准 BF16 KV FP8 KV GSM8K 94.24 94.09 ARC-Easy 89.06 89.14 ARC-Challenge 66.72 67.49 MMLU 89.11 89.04 MMLU-Pro 80.29 79.29 mcxams(内部基准)61 / 63 61 / 63 工具调用有效性 92.2% 92.6% 压缩模型权重 KV缓存是对GPU内存的一个需求;模型的权重则是另一个。对于GLM 5.2,我们将权重从8位浮点压缩到4位整数(INT4),且没有准确性损失。检查点从705 GB缩小到421 GB,约40%,而8路张量并行部署中的每GPU内存从约88 GB下降到52 GB,这为同一硬件上的约1.18百万个标记的KV缓存留出了空间。根据我们的评估套件,INT4和FP8权重无可区分: 基准/能力 模式 FP8 INT4 GSM8K 精确匹配 94.39% 93.56% GSM8K 灵活 94.24% 93.48% ARC-Easy 准确性 86.62% 86.15% ARC-Easy 精确度(规范) 84.51% 85.19% ARC-Challenge 准确性 64.93% 64.85% ARC-Challenge 精确度(规范) 67.24% 66.64% MMLU 平均 86.60% 86.54% MMLU-Pro 精确 80.80% 80.47% mcxams(内部基准) 通过 62 / 63 62 / 63 较小的权重使得解码阶段更快,原因明确:生成每个标记意味着从GPU内存中流出模型的权重,因此解码速度受到内存带宽的限制。移动更少的数据,每个标记的到达时间都会更早。在低并发的情况下,效果最大,因为每个请求的延迟影响最大: 并发请求 GLM FP8(标记/秒) GLM INT4(标记/秒) INT4增益 1 60 92 +55% 8 425 513 +21% 16 683 825 +21% 32 994 1,267 +27% 64 1,672 1,933 +16% 预填充的表现有所不同。它是计算受限的,INT4权重必须在模型能够进行乘法运算之前扩展,因此这一步骤使得预填充速度变慢而不是变快,GLM在FP8中维持大约10,160个标记每秒的预填充,而在INT4中为8,660。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡