GPU LLMs 内存需求 部署 #AIGC翻新先锋者征文大赛# 前如何计算与优化
【本文正在介入 AI.x社区AIGC翻新先锋者征文大赛】
作者 | Muhammad Saad Uddin
编译 | 岳扬
将 LLMs 投入消费环境经常使用,会遇到诸多应战,尤其是想要为 LLMs 高效提供所需的计算资源时。有过此类阅历的人或者深有体会,GPU 内存是允许 LLMs 运转的一项关键资源。由于这些模型体积渺小,且推理环节具备灵活性质,因此对 GPU 内存经常使用的布局和优化提出了更高的要求。
Image by Author via DallE
出于以下几个要素,准确预算 GPU 内存的需求至关关键:
但是,计算 LLMs 服务所需的 GPU 内存并非一件便捷的事。模型的大小(model size)、序列长度(sequence lengths)、批处置数量(batch sizes)以及解码算法(decoding algorithms)等多种要素,都会以复杂的形式影响内存经常使用。而且,传统的内存调配方法常因内存碎片和键值(KV)缓存等灵活内存组件的低效治理而形成少量糜费。
在本文中,我将尽或者具体地解释如何计算 LLMs 服务所需的 GPU 内存。我将剖析影响内存经常使用的各局部,并依据模型参数和上班负载特色(workload characteristics),逐渐引见如何预算内存占用大小。同时,我还会讨论 Paged Attention 和 vLLM 等先进的优化技术,这些技术能清楚降低内存消耗并优化处置才干。经过阅读本文,你将能够片面了解如何布局和优化 LLMs 的 GPU 内存经常使用,从而在实践运行中成功高效且低老本的 LLMs 部署。
01 了解 LLM 推理环节中,关键消耗 GPU 内存的几局部
要想把握 GPU 内存的计算方法,最关键的是了解各局部如何占用 GPU 内存的。了解内存的经常使用去向有助于咱们更好地布局与优化资源。在 LLMs 推理环节中,关键消耗 GPU 内存的几局部包含权重(模型参数)、键值缓存内存(Key-Value Cache Memory)、激活值(Activations)与暂时缓冲区(Temporary Buffers),以及系统开支(Overheads)(假设你对并行处置或散布式计算有所钻研,或者对这个概念已有必定的看法)。
1.1 模型参数(权重)
模型参数是神经网络在训练环节中学到的数值(权重(weights)和偏置(biases))。这些参数定义了模型如何处置输入数据生成输入。
模型大小对 GPU 内存的影响
让咱们看看这些模型:
请记住,关于 GPT-3 及其之后的模型,经常使用模型并行化(model parallelism)将模型参数散布到多个 GPU 上是十分必要的。
1.2 键值(KV)缓存内存
KV缓存存储生成序列中每个 token 所需的两边示意。便捷来说,当模型每次生成一个 token 时,它须要记住之前的 tokens 以坚持高低文。KV缓存存储了目前为止生成的每个 token 的键(key)和值(value)向量,使模型能够高效地处置过去的 tokens ,而无需从新计算。
上班原理:
序列长度(Sequence Length)和并发恳求(Concurrent Requests)的影响:
计算每个 token 的 KV 缓存大小
让咱们来剖析一下如何得出每个 token 的 KV 缓存大小:
键向量(每层一个键向量)和值向量(每层一个值向量)
再次以 llama-13b 模型为例,假定模型具备以下特色:
i. 键向量:
ii. 值向量:
iii. 每个 token 的总KV缓存:
如今思索输入内容为2000个 tokens 的状况:
KV缓存随着序列长度和并发恳求数量的参与而线性增长。我从一篇论文[1]中了解到,KV缓存可以消耗多达 30% 甚至更多的GPU内存。
1.3 激活值和暂时缓冲区
激活值(Activations)是指推理环节中神经网络层的输入,而暂时缓冲区(temporary buffers)用于两边计算。激活值缓和冲区通常消耗的内存比模型权重和 KV 缓存要少。
虽然它们的容量较小,但激活值关于模型计算每一层的输入是十分必要的。它们在前向传递环节(forward pass)中被创立和摈弃,但仍须要足够的内存调配。
1.4 内存开支
额外的内存经常使用开支来自于内存调配和经常使用的低效率。上方是对其的简明引见:
内存碎片:
计算环节中发生的两边步骤:
低效内存治理的影响:
示例:假设内存碎片在 40 GB GPU 上糜费了 20 %的内存,那么就有 8 GB 的内存本可以用来处置更多恳求,但是如今被糜费了。
02 计算 GPU 内存需求
既然咱们曾经对关键内容有了足够的了解,那么就不再迁延,间接计算完整的 GPU 内存需求!
逐渐计算:
要计算任何模型的内存需求,简直以下内容都须要:了解模型权重、KV缓存、激活值和暂时缓冲区以及系统内存开支。以 llama-2 13B 模型为例,公式为:
所需内存总量:模型权重 + KV缓存 + 激活值和系统内存开支
关于 13 B 模型来说:
模型权重 = 参数数量 × 每个参数的字节数
总 KV 缓存内存 = 每个 token 的 KV 缓存内存 × 输入序列长度 × 输入序列数量
激活值和系统内存开支 = GPU总内存的 5–10 %
模型权重 = 130 亿 × 2 字节 = 26 GB
总 KV 缓存内存 = 800 KB × 8192* tokens × 10* 并发恳求= 66 GB
激活值和系统内存开支 = 0.1 × (26 GB + 66GB) = 9.2 GB
所需内存总量:26 GB + 66 GB + 9.2 GB = 101.2 GB
所以,运转 llama-2 7B 模型至少须要 3 个 A100 40GB GPU。
假设我想要托管一个 GPT-3 模型(我知道这很疯狂;D),计算方法与此相似,但这次我会假定每次只处置一个恳求,并经常使用 OPT-175B[2] 模型的大小( 96 层和每层 12288 维度)作为参考。
所需总内存:350 GB + 36 GB + 38.6 GB = 424.6 GB 简直须要 11 个 A100