如何准确的估计llm推理和微调的内存消耗

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
简介: 最近发布的三个大型语言模型——Command-R+ (104B参数), Mixtral-8x22b (141B参数的MoE模型), 和 Llama 3 70b (70.6B参数)——需要巨大的内存资源。推理时,Command-R+需193.72GB GPU RAM,Mixtral-8x22B需262.63GB,Llama 370b需131.5GB。激活的内存消耗根据序列长度、批大小等因素变化。文章详细介绍了计算这些模型内存需求的方法,并探讨了如何通过量化、优化器优化和梯度检查点减少内存使用,以适应微调和推理。

Command-R+, Mixtral-8x22b和Llama 3 70b都在最近的几周内发布了,这些模型是巨大的。它们都有超过700亿个参数:

Command-R+: 104B参数

Mixtral-8x22b:具有141B参数的混合专家(MoE)模型

Llama 370b: 70.6B参数

你能在电脑上微调和运行这些模型吗?

在本文中,我将介绍如何计算这些模型用于推理和微调的最小内存。这种方法适用于任何的llm,并且精确的计算内存总消耗。

推理所需的内存

这三个模型都以16位权重发布:Command-R+为float16, Mixtral和Llama 370b为bfloat16。也就是说一个参数消耗16位或2字节的内存。

10亿个参数则将占用20亿个字节,或者说10亿个字节等于1GB,那么1B个参数占用2GB的内存。100B参数就需要占用200GB内存。这是一个近似值,因为1 KB不等于1,000字节,而是1,024字节。我们通过这种简单的方法可以大概评估内存的占用,后面我们还会有详细的计算过程。

要知道一个模型有多少个参数而不需要下载,可以查看模型卡:

如果在GPU上做快速推理,需要将模型完全加载到GPU RAM上。

对于Command-R+: 193.72 GB的GPU RAM

对于Mixtral-8x22B: 262.63 GB的GPU RAM

对于Llama 370b: 131.5 GB的GPU RAM

或者说你将需要2x80 GB的GPU,例如两个h100。

激活的内存消耗

一旦模型被加载,我们需要更多的内存来存储模型的激活,即在推理过程中创建的张量。这些张量从一层传递到下一层。它们在内存中的大小并不容易估计。为了估计这些激活的内存消耗,我使用了《Reducing Activation Recomputation in Large Transformer Models》提出的方法。

我们需要知道以下内容来估计内存消耗:

 s:最大序列长度(输入中的令牌数量)
 b:批大小
 h:模型的隐藏维度
 a:注意头的数量

标准transformer 层由自注意力块和MLP块组成,每个块由两个layer-norms连接。每个组件的内存消耗估计如下。

1、注意力块

注意块由自注意力机制、线性投射和dropout 组成。内存要求包括:

 线性投影保留其输入激活,其大小为2sbh,而dropout 需要占用sbh的掩码。
 线性投影和自注意力输入激活,各需要2sbh。
 查询(Q)和键(K)矩阵需要4sbh。
 Softmax和它的dropout分别需要2as²b和as²b。
 值(V)上应用的注意存储(V)加起来等于2as²b + 2sbh。

所以注意块所需的总内存为11sbh + 5as²b。

这里的sbh等于 s b h,我们下面也会这样简写。

2、MLP块

MLP块包括两个线性层和一个dropout:

线性层存储花费2sbh和8sbh的输入,GeLU非线性也需要8sbh。我们不需要为推理存储GeLU的激活,但我仍然会对它们进行计数,以防某些推理的框架存储这些激活。Dropout存储的掩码大小为sbh。

所以MLP块需要19sbh的空间。

3、layer-norms

每个LN存储它的输入需要2sbh,两层就为4sbh。

4、对于整个层

总内存需求总计为11sbh + 5as²b(来自注意力块)+ 19sbh(来自MLP块)+ 4sbh(来自LN)。

每层激活内存消耗= 34 sbh + 5as²b

如果我们使用16位数据类型,那么需要将这个数字乘以2,因为每个激活参数将需要2字节。

5、总计

这个等式大致近似于实际内存消耗。大多数推理框架都经过优化,通过在张量无用时立即删除它们,所以一般情况下会比这个数值少。但是在推理期间也会创建各种消耗内存的缓冲区。但是通过实验,我发现我们计算的这个数值基本上近似于Hugging Face的Transformers框架。而对于vLLM和TGI等其他优化得更好的框架,内存消耗则会减少。

如果使用FlashAttention、Alibi或RoPE等高级技术,处理长序列的内存消耗也将大大减少。

6、估算用于推理的Command-R+、Mixtral-8x22B和Llama 370b的内存消耗

在模型的参数和激活都是16位的标准场景下,我们还需要设置解码超参数。

S = 512(序列长度),B = 8(批量大小)

与内存中模型的大小相比,激活的大小可以忽略不计。但是它们的大小会随着批大小和序列长度的增加而迅速增加。

减少推理的内存消耗

大部分用于推理的内存消耗来自模型的参数。最近的量化算法可以显著减少这种内存消耗。他们通过减少大多数参数的位宽来压缩模型,同时尽量保持模型的准确性。

8位量化几乎是无损的,而4位量化只会略微降低性能。4位量化将模型的内存消耗除以4,因为大多数参数都是4位,即0.5字节而不是2字节。我推荐使用AWQ进行4位量化,它运行简单,生成快速模型。

对于超过100B个参数的非常大的模型,精度较低的量化,例如2.5位或3位,仍然可以得到准确的结果。例如,AQLM对Mixtral-8x7B的2位量化表现出良好的性能。但是AQLM的问题在于量化模型的成本非常高。对于非常大的模型,可能需要几个星期的时间。

另一种选择是将模型移动到另一个存储设备,例如,CPU RAM。但是他的缺点和明显,太慢了,特别是在批处理解码时。针对CPU推理进行优化的框架有助于保持推理的合理速度。例如,Neural Speed是使用量化模型在CPU上进行推理的最快框架之一。

如果使用CPU,那么仍然需要大量的CPU RAM来加载模型和存储激活,计算的方法是相同的。

微调所需的内存

对于微调llm,估计内存消耗稍微复杂一些。除了存储模型权重和激活之外,对于所有层,我们还需要存储优化器状态。

优化器状态的内存消耗

AdamW优化器是最流行的微调llm,它为模型的每个参数创建并存储2个新参数。如果我们有一个100B的模型,优化器将创建200B的新参数!为了更好的训练稳定性,优化器的参数为float32,即每个参数占用4字节的内存。

这就是微调比推理消耗更多内存的主要原因。

例如,对于Mixtral-8x22B,优化器创建2*141B = 282B float32参数。它消耗了1053.53 GB的内存,我们必须加上模型本身占用的内存,即262.63 GB。所以总共需要1315.63 GB的GPU内存。这大约是17个80gb的A100 !

并且这还不足以对模型进行微调。我们还需要内存来存储激活。

计算梯度所需的内存

与推理相比,我们只需要在传递给下一层之前存储单个层的激活,微调需要存储前向传播过程中创建的所有激活。这对于计算梯度是必要的,然后用于反向传播误差并更新模型的权重。

为了估计计算梯度所需的内存,我们可以使用用于推理的相同公式,然后将结果乘以层数。

如果L是层数,那么计算梯度所消耗的内存为

 L(34sbh + 5as²b)

估算Llama 3 70b、Mixtral-8x22B和Command R+微调的内存消耗

我们需要估计模型的大小,并添加所有层的激活大小和优化器状态的大小。

我设置了以下超参数进行微调:

S = 512(序列长度)

B = 8(批量大小)

对于优化器状态,我假设它们是float32。

所以得到

这是最坏情况下的内存消耗,也就是说没有使用任何优化来减少内存消耗。幸运的是,我们可以应用许多优化来减少内存需求。

减少微调内存消耗

由于优化器状态消耗大量内存,因此已经进行了大量的研究来减少它们的内存占用,例如:

LoRA:冻结整个模型,并添加一个具有数百万个参数的可训练适配器。使用LoRA,我们只存储适配器参数的优化器状态。

QLoRA: LoRA,但模型量化为4位或更低精度。

AdaFactor和AdamW-8bit:更高效的内存优化器,提供接近AdamW的性能。但AdaFactor在训练期间可能不稳定。

GaLore:将梯度投影到低秩子空间中,这可以将优化器状态的大小减少80%。

内存的另一个重要部分被激活所消耗。为了减少它通常采用梯度检查点。当需要计算梯度时,它会重新计算一些激活。它减少了内存消耗但也减慢了微调速度。

最后,还有一些框架,如Unsloth,在使用LoRA和QLoRA进行微调方面进行了极大的优化。

总结

在本文中,我们介绍了如何估计transformer 模型的内存消耗。这个方法不适用于transformer以外的其他体系结构的模型。例如,曼巴和RWKV的激活记忆消耗明显较低,因为它们不使用注意力机制。

https://avoid.overfit.cn/post/0046a7ef3a47406e9ed98d4ce947a14d

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
2月前
|
机器学习/深度学习 存储 缓存
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
大型语言模型(LLM)的推理效率是AI领域的重要挑战。本文聚焦KV缓存技术,通过存储复用注意力机制中的Key和Value张量,减少冗余计算,显著提升推理效率。文章从理论到实践,详细解析KV缓存原理、实现与性能优势,并提供PyTorch代码示例。实验表明,该技术在长序列生成中可将推理时间降低近60%,为大模型优化提供了有效方案。
188 15
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
|
2月前
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
103 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
2月前
|
人工智能 自然语言处理 测试技术
能够双向推理的LLM!Dream-7B:港大联合华为开源的扩散推理模型,能够同时考虑前后文信息
Dream-7B是由香港大学与华为诺亚方舟实验室联合研发的开源扩散大语言模型,采用独特的掩码扩散范式,在文本生成、数学推理和代码编写等任务中展现出卓越性能。
135 3
能够双向推理的LLM!Dream-7B:港大联合华为开源的扩散推理模型,能够同时考虑前后文信息
|
3月前
|
机器学习/深度学习 人工智能 缓存
英伟达提出全新Star Attention,10倍加速LLM推理!登顶Hugging Face论文榜
英伟达推出的Star Attention技术,旨在解决Transformer模型在长序列推理中的高计算成本与速度瓶颈问题。通过两阶段块稀疏近似方法,第一阶段利用块局部注意力并行处理上下文信息,第二阶段通过全局注意力机制交互查询与缓存令牌,从而显著提升计算效率并减少通信开销。该技术可无缝集成到现有LLM中,将内存需求和推理时间降低多达11倍,同时保持高准确性。然而,其在极长序列处理中可能面临内存限制,并增加模型复杂性。尽管如此,Star Attention为长序列推理提供了创新解决方案,推动了Transformer模型的实际应用潜力。
84 19
|
5月前
|
存储 弹性计算 调度
基于Knative的LLM推理场景弹性伸缩方案
Knative的基于请求弹性配置与大语言模型(LLM)的推理场景高度契合。此外,它的资源降配特性可以显著帮助用户降低成本。本文详细介绍基于 Knative 的 LLM 推理场景弹性伸缩方案。
|
2月前
|
机器学习/深度学习 人工智能 算法
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
RAGEN是一个基于StarPO框架的开源强化学习系统,通过马尔可夫决策过程形式化Agent与环境的交互,支持PPO、GRPO等多种优化算法,显著提升多轮推理训练的稳定性。
186 5
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
|
4月前
|
存储 人工智能 测试技术
跨模态大升级!少量数据高效微调,LLM教会CLIP玩转复杂文本
LLM2CLIP是一种创新方法,旨在通过利用大型语言模型(LLM)的能力来改进CLIP多模态模型。该方法通过对比学习微调LLM,增强其文本判别性,并将其作为CLIP的强教师,从而显著提升CLIP处理长复杂文本和跨语言任务的能力。实验表明,LLM2CLIP在多个基准测试中优于现有模型,特别是在长文本检索任务上性能提升了16.5%。尽管如此,该方法在实际应用中的鲁棒性和资源需求仍需进一步验证。论文链接:https://arxiv.org/pdf/2411.04997。
191 70
|
4月前
|
机器学习/深度学习 存储 缓存
LLM高效推理:KV缓存与分页注意力机制深度解析
随着大型语言模型(LLM)规模和复杂性的增长,高效推理变得至关重要。KV缓存和分页注意力是优化LLM推理的两项关键技术。KV缓存通过存储键值对减少重复计算,而分页注意力则通过将序列分割成小块来降低内存消耗,从而有效处理长序列。本文深入剖析这些技术的工作原理及其在仅解码器模型中的应用,探讨其优势与挑战,并展示其实现示例。
174 16
LLM高效推理:KV缓存与分页注意力机制深度解析
|
5月前
|
人工智能 知识图谱 Docker
KAG:增强 LLM 的专业能力!蚂蚁集团推出专业领域知识增强框架,支持逻辑推理和多跳问答
KAG 是蚂蚁集团推出的专业领域知识服务框架,通过知识增强提升大型语言模型在特定领域的问答性能,支持逻辑推理和多跳事实问答,显著提升推理和问答的准确性和效率。
1326 46
KAG:增强 LLM 的专业能力!蚂蚁集团推出专业领域知识增强框架,支持逻辑推理和多跳问答
|
4月前
|
机器学习/深度学习 人工智能 测试技术
仅7B的模型数学推理能力完虐70B?MIT哈佛推出行动思维链COAT让LLM实现自我反思并探索新策略
Satori 是由 MIT 和哈佛大学等机构联合推出的 7B 参数大型语言模型,专注于提升推理能力,具备强大的自回归搜索和自我纠错功能。
173 6
仅7B的模型数学推理能力完虐70B?MIT哈佛推出行动思维链COAT让LLM实现自我反思并探索新策略