大模型-训练推理 模型大小与硬件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 需要 7B1 byte = 7GB -
梯度:同上,等于参数量每个梯度参数所需内存。
对于 fp32, LlaMa-7B 需要 7B4 bytes = 28GB内存
对于 int8, LlaMa-7B 需要 7B1 byte = 7GB -
优化器参数:不同的优化器所储存的参数量不同。
对于常用的 AdamW 来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。
对于fp32 的 LLaMa-7B,AdamW 需要 7B8 bytes = 56 GB
对于int8 的 LLaMa-7B,AdamW 需要 7B2 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