大模型-训练推理 模型大小与硬件GPU 选取的大致关系-05

0. 计算公式

重点:显存大小 = 模型参数占用 + 梯度占用 + 优化器占用 + CUDA kernel占用 + 中间计算结果
每个神经元节点 不仅仅有自身的权重值
在进行反向传播的时候还有梯度的累计值

1. 市面上常见的显卡

英伟达GPU
3060 12G
3090 24G
4090 24G
A100 80G / 40G

2. 训练

LlaMa-7B 为例

  • 模型参数:等于参数量每个参数所需内存。
    对于 fp32,LlaMa-7B 需要 7B4 bytes = 28GB内存
    对于 int8,LlaMa-7B 需要 7B
    1 byte = 7GB

  • 梯度:同上,等于参数量每个梯度参数所需内存。
    对于 fp32, LlaMa-7B 需要 7B4 bytes = 28GB内存
    对于 int8, LlaMa-7B 需要 7B
    1 byte = 7GB

  • 优化器参数:不同的优化器所储存的参数量不同。
    对于常用的 AdamW 来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。
    对于fp32 的 LLaMa-7B,AdamW 需要 7B8 bytes = 56 GB
    对于int8 的 LLaMa-7B,AdamW 需要 7B
    2 bytes = 14 GB

  • CUDA kernel也会占据一些 RAM,大概 1.3GB 左右

  • 中间计算结果
    layers * batch_size * sequence_length * (layers * sequence_length + 5 * dim(隐藏状态维度))
    32 * 1 * 2048 * ( 32 * 2048 + 5 * 4096 )
    对于int8 的 LLaMa-7B:32 * 1 * 2048 * ( 32 * 2048 + 5 * 4096) * 1 byte / 1024^3 = 5.25GB

综上,int8 精度的 LlaMa-6B 模型部分大致需要:

注意以上是int8精度的 float32还得乘以4

3. 推理

推理阶段只有一个forwar过程没有梯度更新 以及 优化器
LlaMa-7b-hf float32为例

  • 1b(10亿)个模型参数,约占用4G显存 (实际大小:10^9 * 4 / 1024^3 ~= 3.725 GB)
  • LlaMa的参数量为7b
  • 中间计算结果: layers * batch_size * sequence_length * (layers * sequence_length + 5 * dim(隐藏状态维度))
    32 * 1 * 2048 * ( 32 * 2048 + 5 * 4096 )
    32 * 1 * 2048 * ( 32 * 2048 + 5 * 4096) * 4 byte / 1024^3 = 21GB

总共:3.725 * 7 + 21GB = 47.075 GB

posted @ 2024-11-05 00:13  jack-chen666  阅读(60)  评论(0编辑  收藏  举报