2024 年 LLM 推理成本下降 10 倍?
“比行业同类产品便宜90%”“两款产品免费”“全线降价”——近日,字节、百度、阿里云、智谱AI等国内大模型领军企业纷纷宣布调降生成式人工智能大模型(以下简称“大模型”)产品和服务使用价格,不少大模型产品价格降幅达50%以上,有的产品价格降幅甚至超过90%。
奥特曼:GPT-3是我们推出时间最长、优化最久的模型,在它推出的三年多时间里,我们已经将其成本降低了40倍……至于GPT-3.5,相信我们已经将其成本降低了近10倍。GPT-4是新产品,所以我们还没有那么多时间来降低成本,但我们会继续努力。我认为,在我所知道的所有技术中,我们的成本下降曲线是最陡峭的。
今年为什么 LLM 成本会下降?这个公网应该很少人完整的聊过。主要是:
- 量化
- Moe、DeepSeek 等 MLA 结构
- KVCache
- Continuous batch 、vLLM 这类
- ...量化这个公网资料特别多。MoE 和 DeepSeek 这个结构为什么会有用?已知:
- 正确的知识提取能力需要在预训练阶段进行学习,而无法仅通过微调阶段来完成。这意味着在预训练阶段必须增加针对知识提取任务的数据增强(Data Augmentation)才能实现。该结论适用于各种模型大小、架构、微调方式、训练方式和超参数。幸运的是,并不需要对所有数据都进行数据增强才能实现知识提取能力的学习。该能力的学习在不同知识上、不同热度的知识上的学习具有可迁移性。由于热门知识在实际数据中经常以多种表达方式存在,因此在这方面我们有一些免费午餐。BERT类双向模型即使通过数据增强也无法学习到这一能力。
- LLM 的知识存储能力只与模型参数量有关,而与模型结构、深度、训练超参数等都无关,甚至即使去掉MLP层也是如此。以 MoE 结构的 Mixtral of experts 为例,https://mistral.ai/news/mixtral-of-experts/:
- 如果我们用 8 个 7B 模型组成一个 MoE 模型,合计参数是 46.7B (有一些公共的层)。那它的知识存储量是 46.7B。
- Mixtral 8x7B的参数总量并非简单的“8 X 7 = 56B”的参数量,但因为实际上独立存在的仅有各个层当中的专家网络,即FFN部分,而其余的例如Attention层则是共享参数,因此实际上只有47B左右的参数总量。
- 实际使用时调用参数量 12.9 B,运算量为知识容量的 27.62%,小学生都能听得懂的话来说既能打得过 46.7 B 以下的模型又只要 12.9 B 的算力。KV Cache,生成式generative模型的推理过程很有特点,我们给一个输入文本,模型会输出一个回答(长度为N),其实该过程中执行了N次推理过程。即GPT类模型一次推理只输出一个token,输出token会与输入tokens 拼接在一起,然后作为下一次推理的输入,这样不断反复直到遇到终止符。在上面的推理过程中,每 step 内,输入一个 token 序列,经过 Embedding 层将输入 token 序列变为一个三维张量[bs, seq_len, embed_dim],经过一通计算,最后经 logits 层将计算结果映射至词表空间,输出张量维度为[bs, seq_len, vocab_size]。当前轮输出 token 与输入 tokens 拼接,并作为下一轮的输入 tokens,反复多次。可以看出第 i+1 轮输入数据只比第 i 轮输入数据新增了一个token,其他全部相同。因此第 i+1 轮推理时必然包含了第 i 轮的部分计算。KVCache 的出发点就在这里,缓存当前轮可重复利用的计算结果,下一轮计算时直接读取缓存结果。简单来说 KV Cache 优化了 Attentions 和 MLP 层的运算,以 MLP 为例,原来是 [1, 序列长度, 向量纬度],使用 KVCache 之后是 [1, 1, 向量维度]。为什么叫 KV Cache?Attention 中有 Q、K、V,但 Q 只用到了最后一个 Token,不需要缓存。效果例子:对于最大长度是 2048 的 LLaMa-7B fp16 模型,服务端每创建 1 个并发,都需要大约 1030MB 显存保存 kv_cache,所以这个作者尝试叠加量化。
KV Cache 的问题是,它很大、老在变。可能用户这次有一样的上文,下次就开个新会话就不需要上次生成的缓存了。人话来说 KV Cache 是显存换速度,但存的不一定有用。
实验证明大约只有 30% 左右的KVcache被用于实际的推理请求服务中。显存的浪费情况极其严重,亟待解决!。vLLM 提出了 PageAttention。相关文章多,不讨论。如下图动画所示:
所以我们可以灵活的根据 block table 来进行相同空间的复用,不同解码分支共享同一前序资源等操作,达到显存占用的减少和服务请求数的提升。Continuous Batching 可以进一步提升吞吐量,数据如下:
vLLM(KVCache 升级版) + Continuous Batching 可以提升 20 倍 +。推理降价的倍数大概就是这么来的。
图表数据等来自于网上,写的时候是当小笔记写的没有留来源,如有侵权或需要备注来源随时联系我。