根据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)
参数量
14byte2byte1byte0.5byte
1B4GB2GB1GB0.5GB
2B8GB4GB2GB1GBGemma_2B_4bit_1.4GB
7B28GB14GB7GB3.5GBLlama2_7B_4bit_3.8GB Mistral_7B_4bit_4.1GB
13B52GB26GB13GB6.5GBLlama2_13B_4bit_7.3GB
32B128GB64GB32GB16GBQwen1.5_32B 32bit@120GB 16bit@60GB 4bit@15GB
70B280GB140GB70GB35GBLlama2_70B_4bit_39GB
130B720GB360GB180GB90GBFalcon_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参数量估算显存/内存占用

https://cyhasuka.github.io/posts/c87c0f5d/

作者

cyhasuka

发布于

2024-05-24

更新于

2024-07-15

许可协议

评论