AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


如何简单计算LLM推理和训练所需的GPU资源
发布日期:2024-09-11 16:18:28 浏览次数: 2738 来源:Bear实验室


Meta不久前刚发布了Llama 3.1的一系列开源模型,在多项基准测试中,超越了GPT-4o和Claude 3.5 Sonnet等闭源的商业大模型。开源大模型性能越来越强,可以满足很多私有化部署的业务场景。不同于商业模式的服务调用模式,需要自己搭建环境,部署模型。有些时候还要自己微调模型,以更好适应特有的场景。
LLM 的特点是计算要求非常高,具有数十亿个参数,并且需要对数 TB 的数据进行训练。这得益于过去十年计算能力的最新进步以及新的优化技术和架构。尽管取得了这些进步,但由于计算限制和专有模型,LLM 仍远未普及。例如,训练 GPT-4 的成本估计约为 1 亿美元。
虽然微调 700 亿个参数的模型可能仍需要大量计算资源,但成本已大幅降低,让像我这样的技术爱好者可以在本地运行其中一些模型。
本文用简单的方式总结LLM对部署环境的GPU显存的要求,以及大致的计算原理。面向那些想要在本地使用 LLM 且通常没有强大的 GPU 或不想在添加优化技术上浪费太多时间的人。介绍在本地运行 LLM 的基本内存要求,仅提及可以进行的基本优化。

简单总结原则,粗略的预估
推理:参数数量 * 精度(通常为 2 或 4 个字节)
训练:4-6倍推理资源
10亿个参数则将占用20亿个字节,或者说10亿个字节等于1GB,那么1B个参数占用2GB的内存。100B参数就需要占用200GB内存。这是一个近似值,因为1 KB不等于1,000字节,而是1,024字节。我们通过这种简单的方法可以大概评估内存的占用。

以Huggingface上meta-llama/Meta-Llama-3.1-70B-Instruct为例,70.6B,16位精度,那大概是130多G的GPU内存,也就是说两个80G的H100就可以。

推理
执行推理需要资源来加载模型权重并存储 KV 缓存和激活内存。模型大小是最主要的参数,比其他参数要大得多。
总推理内存 = 模型大小 + KV 缓存 + 激活
下面我们看看 模型大小、KV 缓存、激活 这些内存计算怎么得到

模型大小
第一个也是最重要的内存需求是加载模型所需的内存。这取决于模型的参数数量和所需的精度。一种常见的优化技术称为量化。量化包括以较低的精度加载模型权重。虽然它会影响性能,但效果并不明显,而且比选择具有更高精度的较小模型更可取。
模型大小 = 参数数量 * 精度
单一模型参数,在 32 位全精度下,由 4 个字节表示。因此,一个 10 亿参数的模型需要 4 GB 的 GPU RAM,才能以全精度将模型加载到 GPU RAM 中。通过将模型权重从 32 位全精度量化为 16 位或 8 位精度,您可以快速将 10 亿参数模型的内存需求减少 50% 至仅 2 GB,甚至减少 75% 至仅 1 GB 的加载内存需求。
精度计算
  • 4 个字节: FP32 / 全精度 / float32 / 32 位
  • 2 个字节: FP16 / float16 / bfloat16 / 16 位
  • 1 字节: int8/8 位
  • 0.5 字节: int4/4 位

KV 缓存
在 Transformer 中,解码阶段会在每个时间步骤生成一个 token,具体取决于之前的 token 张量(tensors)。为了避免重新计算这些张量,它们被缓存在 GPU 内存中。
KV 缓存 = 2 * 批次大小 * 序列长度 * 层数 * 隐藏大小 * 精度
批次大小、序列长度 、层数 、隐藏大小、精度包括后面需要用来计算内存的, 这些参数大部分情况下都可以从模型的Model card看到,如果Model card没有展示,就要从其他地方去查找,一般都是可以找到的。

激活
在模型的前向传递过程中,必须存储中间激活值。这些激活值表示数据在模型中向前传播时神经网络中每一层的输出。它们必须保存在 FP32 中,以避免数值爆炸并确保收敛。
激活内存 = 批次大小 * 序列长度 * 隐藏大小 * (34 + (5 * 序列长度 * 注意力头数量) / (隐藏大小))

并发
对于并发调用的情况,‌需要同时运行多个模型实例,‌那么总的内存需求将是单个模型层的内存需求乘以并发调用的数量。‌这是因为每个并发调用都需要独立的模型实例来处理,‌而这些实例将共享或占用相同的内存资源。‌
此外,‌需要注意的是,‌实际的内存消耗可能会因为推理框架的优化而有所不同。‌例如,‌一些优化得更好的框架可能会减少内存消耗,‌而使用高级技术如FlashAttention、‌Alibi或RoPE等也可以显著减少处理长序列时的内存消耗

训练
由于优化器和梯度状态,训练所需的资源比推理多。这些是训练模型所必需的,并且会显著增加所需的内存资源。
总内存 = 模型大小 + KV 缓存 + 激活 + (优化器状态 + 梯度)* 可训练参数数量
这些附加组件导致每个模型参数需要大约 12-20 字节的额外 GPU 内存。例如,要训练一个 10 亿参数的模型,您将需要大约 24 GB 的 32 位全精度 GPU RAM,这是模型推理所需的 4 GB GPU RAM 的六倍。

微调
由于优化器和梯度状态的计算,训练需要额外的内存资源。为了减少可训练参数的数量,通常采用参数高效微调 (PEFT) 技术,例如低秩自适应 (LoRA) 和量化低秩自适应 (QLoRA)。

优化器状态
优化算法需要资源来存储参数和辅助变量。这些变量包括 Adam(2 个状态)或 SGD(1 个状态)等优化算法使用的动量和方差等参数。这取决于优化状态的数量及其精度。
  • AdamW(2 个状态):每个参数 8 个字节
  • AdamW(bitsandbytes 量化):每个参数 2 个字节
  • SGD(1 个状态):每个参数 4 个字节

梯度优化
梯度值是在模型反向传递过程中计算的。它们表示损失函数相对于每个模型参数的变化率,对于在优化过程中更新参数至关重要。作为激活,它们必须存储在 FP32 中以保持数值稳定性。

减少微调内存消耗
由于优化器状态消耗大量内存,因此已经进行了大量的研究来减少它们的内存占用,例如:
  1. LoRA:冻结整个模型,并添加一个具有数百万个参数的可训练适配器。使用LoRA,我们只存储适配器参数的优化器状态。
  2. QLoRA: LoRA,但模型量化为4位或更低精度。
  3. AdaFactor和AdamW-8bit:更高效的内存优化器,提供接近AdamW的性能。但AdaFactor在训练期间可能不稳定。
  4. GaLore:将梯度投影到低秩子空间中,这可以将优化器状态的大小减少80%。
内存的另一个重要部分被激活所消耗。为了减少它通常采用梯度检查点。当需要计算梯度时,它会重新计算一些激活。它减少了内存消耗但也减慢了微调速度。
还有一些框架,如Unsloth,在使用LoRA和QLoRA进行微调方面进行了极大的优化。

LLM内存需求计算器
Github:https://github.com/manuelescobar-dev/LLM-System-Requirements
只需要选择模型,系统就可以根据默认参数和上面的公式计算出推理和微调所需的内存。也可以修改默认参数,按自己的实际情况填写。如果没有所需的模型可选,可以参考项目的默认模型的参数格式提供自己的参数就好。模型参数需要自己想办法查找到。
{"model_size":8,"architectures": ["LlamaForCausalLM"],"attention_bias": false,"attention_dropout": 0.0,"bos_token_id": 128000,"eos_token_id": 128001,"hidden_act": "silu","hidden_size": 4096,"initializer_range": 0.02,"intermediate_size": 14336,"max_position_embeddings": 8192,"model_type": "llama","num_attention_heads": 32,"num_hidden_layers": 32,"num_key_value_heads": 8,"pretraining_tp": 1,"rms_norm_eps": 1e-05,"rope_scaling": null,"rope_theta": 500000.0,"tie_word_embeddings": false,"torch_dtype": "bfloat16","transformers_version": "4.40.0.dev0","use_cache": true,"vocab_size": 128256}
例如Llama3 70B,推理需要142.51GB

训练需要924.82GB, Percentage of trainable parameters 表示可训练参数的数量占模型中参数总数的比例。不同优化器所需内存差异还是比较大的。


了解一下量化
量化通过降低模型权重的精度来减少加载和训练模型所需的内存。量化将模型参数从 32 位精度转换为 16 位精度,甚至是 8 位或 4 位。量化将一组较高精度的浮点数源投影到一组较低精度的目标数中。量化机制利用源和目标范围,首先计算缩放因子,进行投影,然后以较低的精度存储结果,这样需要的内存更少,最终提高训练性能并降低成本。

投影后精度有所损失,因为现在小数点后只有六位。`fp16`的值`pi`现在是3.140625,通过将值存储在 中就已经损失了精度。

LLM的量化技术在减少内存需求和提高推理速度方面具有显著优势,但也需要权衡其对性能和效果的影响。通过采用合适的量化策略和优化方法,可以在保证模型精度的同时实现高效的推理性能。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询