大语言模型的生产部署存在两个主要的挑战,一个是需要大量的参数,一个是需要处理非常长的用于表示上下文信息的输入序列。Hugging Face 基于他们提供大模型服务的经验分享了一些克服这些障碍的技术。
Patrick von Platen 在文中介绍的 Hugging Face 研究的三种技术是 降低数值精度 、使用一种叫作 Flash Attention 的注意力算法,以及使用 专门的推理架构 。
大语言模型需要大量的 VRAM 来加载,从几十(bigcode/starcoder)到数百 GB (Llama、Bloom、GPT3)。第一个优化手段是从切换到精度:
这可以使总体内存消耗减少一半,但可惜的是,在许多情况下仍然需要很大的内存。一种更激进的方法是将模型权重量化为 8 位或 4 位,这已经被证明不会导致显著的性能下降。
这将进一步减少所需的内存,使得在只有 16GB VRAM 的 GPU 上运行较小的模型成为可能,尽管代价是推理时间稍长。
von Platen 写道,使用Flash Attention是另一相关键的优化,它是大语言模型用来理解输入标记上下文关系的自注意力层的一种算法,有可能打破输入标记数量的二次增长。
因为该算法太过复杂,无法在这里描述,但可以这么说,它利用了 softmax 规范化统计数据和一些数学手段,在 只需要随输入标记线性增长的内存 的情况下提供相同的输出。推理性能也得益于算法使用了更快的 SRAM 而不是更慢的 GPU VRAM。
Here recent research can help to make the right choice with two components that quickly become bottlenecks, says von Platen, _positional embeddings_ and the _key-value cache_.
在生产环境中部署大语言模型的第三项优化措施是选择正确的架构,让它们能够有效地处理长文本输入。von Platen 写道,最近的研究有助于我们如何对两个很快成为瓶颈的组件做出选择——一个是_位置嵌入(positional embeddings)_,一个是_键值缓存_。
位置嵌入通过将每个标记的位置编码为数字表示来帮助语言大模型理解序列顺序。对于需要处理大型文本输入任务的大语言模型,应该使用和等相对位置嵌入技术进行训练。
目前的许多大语言模型中已经在使用这两种算法。
键值缓存可以作为对对话上下文进行编码的一种方法。键值缓存在发生每个新交互时增加一个元素,这比为每个请求编码/解码上下文的方法要有效得多。von Platen 详细介绍了两类键值缓存,即Multi-Query-Attention (MQA)和Grouped-Query-Attention(GQA)。
von Platen 的文章所涵盖的内容不只有本文所概述的这些,他的文章中还提供了实际的例子来证明他的观点,所以请不要错过他的文章。
原文链接 :