部署大型语言模型(LLMs)的主要挑战与优化技术
在将大型语言模型(LLMs)部署到生产环境时,主要面临两大挑战:模型参数数量庞大以及需要处理非常长的输入序列以表示上下文信息。Hugging Face 根据其经验,总结了一系列优化技术来应对这些挑战。
降低数值精度
LLMs 需要大量的显存(VRAM),从几十GB(如 bigcode/starcoder)到数百GB(如 Llama、Bloom、GPT3)。首先可以通过将 float32 精度降低到 bfloat16 来优化显存使用:
几乎所有模型现在都以bfloat16精度进行训练,如果 GPU 支持bfloat16,则没有理由以float32精度运行模型。float32不会比训练时使用的精度提供更好的推理结果。
这种方法可以将显存消耗减半,但在许多情况下,所需显存仍然可能过高。更激进的方法是将模型权重量化为 8 位或 4 位,研究表明这不会导致显著的性能损失:
量化在文本生成中尤其有效,因为我们只关心选择最可能的下一个词,而不关心下一个词对数分布的确切值。
这使得较小的模型可以在仅 16GB VRAM 的现成 GPU 上运行,尽管推理时间会略有增加。
使用 Flash Attention
Flash Attention 是一种用于自注意力层的新算法,LLMs 使用该算法来理解输入 token 之间的上下文关系。该算法可以打破自注意力层与输入 token 数量的二次增长关系:
使用 Flash Attention 可以显著减少内存占用,并且由于算法使用更快的 SRAM 而不是 GPU VRAM,推理性能也会得到提升。
该算法通过 softmax 归一化统计和巧妙的数学处理,在仅需要与输入 token 线性增长的内存的情况下,提供相同的输出:
目前,如果可用,没有任何理由不使用 Flash Attention。该算法在数学上提供相同的输出,并且更快、更节省内存。
选择专用推理架构
第三个优化领域是选择适合的架构,以有效处理长文本输入。von Platen 指出,最近的研究可以帮助做出正确选择,特别是两个容易成为瓶颈的组件:位置嵌入和键值缓存。
位置嵌入通过将每个 token 的位置编码为数值表示,为 LLM 提供理解序列顺序的线索。对于需要处理大文本输入的任务,应使用相对位置嵌入,如 RoPE 和 ALiBi:
RoPE 和 ALiBi 位置编码可以外推到训练期间未见过的输入长度,而 ALiBi 的外推效果比 RoPE 更好。
这两种算法已经在许多当前的 LLMs 中实现。
键值缓存用于编码对话的上下文。每次新交互时,键值缓存增加一个元素,这比每次请求时编码/解码上下文的方法更有效。von Platen 详细介绍了两种键值缓存:多查询注意力(MQA) 和 分组查询注意力(GQA),展示了它们的优势。
总结
von Platen 的文章涵盖了比本文总结更多的内容,并提供了实际示例来演示其观点。如需全面了解,建议阅读其完整文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。