根据LLM参数量估算显存/内存占用
✨ Tips:文中“显存”指GPU可使用的内存空间,如有SoC使用
Unified Memory
(如Apple M1~M3系列、Nvidia AGX Orin等)则可简单理解为系统内存。
推理显存
对于一个70亿参数(7B)的模型,以 qwen2-7B 为例,预计需要的显存需求如下:
- FP32浮点精度:28GB
- BF16精度:14GB
- int8精度:7GB
虽然其他因素也在占用显存,但推理期间使用显存的主要是参数量。
比如,qwen2-7B-BF16 模型需要的显存等于参数数量乘以类型大小:70亿参数 x 2字节 = 140亿字节。因此,140亿字节 = 14 x 1,000 x 1,000 x 1,000 / 1024 / 1024 / 1024 ≈ 13 GB(考虑1000/1024)³ ≈ 0.93。
注1:(1000/1024)³ ≈ 0.93,为了估算目的,简单地将此比率视为1。
注2:对于7B-BF16模型,显存需求大约是7 x 2 = 14 GB。上述估算略高于精确计算,但更实用,因为推理需要超出参数之外的额外内存。
假设要估算
llama2-13B
模型的显存需求,对应各种类型的分别是:float:13 x 4 = 52 GB,half/BF16:13 x 2 = 26 GB,int8:13 GB,int4:13 x 0.5 = 6.5 GB
常用模型参数量-显存占用估计统计如下表:
精度&显存占用量(估计值) | 例子(实际值) | |||||
---|---|---|---|---|---|---|
32bit(FP32) | 16bit(FP16/BF16) | 8bit(int8) | 4bit(int4) | |||
参数量 | ||||||
1 | 4byte | 2byte | 1byte | 0.5byte | ||
1B | 4GB | 2GB | 1GB | 0.5GB | ||
2B | 8GB | 4GB | 2GB | 1GB | Gemma_2B_4bit_1.4GB | |
7B | 28GB | 14GB | 7GB | 3.5GB | Llama2_7B_4bit_3.8GB Mistral_7B_4bit_4.1GB | |
13B | 52GB | 26GB | 13GB | 6.5GB | Llama2_13B_4bit_7.3GB | |
32B | 128GB | 64GB | 32GB | 16GB | Qwen1.5_32B 32bit@120GB 16bit@60GB 4bit@15GB | |
70B | 280GB | 140GB | 70GB | 35GB | Llama2_70B_4bit_39GB | |
130B | 720GB | 360GB | 180GB | 90GB | Falcon_180B_16bit_360GB+ |
训练显存
由于反向传播、Adam优化和Transformer架构等因素,保守估计,训练所需的显存是具有相同参数数量和类型的推理显存的四倍(1x 为模型,1x 为梯度,1~2x 为优化器¹)。
注1:使用AdamW优化器,显存需求为2x;使用SGD优化器,显存需求为1x
为了确保训练期间模型收敛,参数类型一般不能是int8或int4。通常使用FP32或量化到BF16。例如,使用浮点精度FP32
训练一个7B模型大约需要112GB(28GB x 4)。
假设要训练Qwen2-7B模型,估算所需的显存:
- 对于float类型:7(10亿参数)x 4(float的字节数)x 4 = 112 GB
- Adam优化实际占用为109.8GB
- 对于half/BF16类型参数:7(10亿参数)x 2(每个BF16参数字节数)x 4 = 56 GB
- Adam优化实际占用为54.88GB
可以看到,估算的显存与实际显存占用相近,实际情况中一般需要预留5%以上的显存空间供其他模块使用,所以估算值略大是合理的。
使用LoRA/QloRA技术的显存使用情况,以LoRA为例:
LoRA涉及在原始模型上运行推理并训练一个较小的模型,以实现与训练原始参数几乎相同的效果。
例如,如果需要微调大小为1024x512的参数,使用LoRA并选择Rank为8,只需要微调以下数量的参数:1024x8 + 512x8。
这个过程需要使用原始参数量运行一次推理(不需要梯度和优化器状态),但在计算过程中仍需要一些显存来存储数据。总显存使用量是这些需求的总和。
根据LLM参数量估算显存/内存占用