创作不易,可以一键三连支持一下哦,某书联系作者可以:核桃苹果肉桂卷
上一期讲解了大模型推理部署所需显存,链接在估计大模型推理部署所需显存(含KV cache讲解)(一)-CSDN博客
这一期讲解一下如何估计大模型微调所需显存,其影响因素可以概括为:模型本身参数+梯度参数+优化器状态+激活值+其他
模型本身参数
显存计算公式为:参数量 x 参数精度。常用的参数精度有FP32(4字节)、FP16(2字节)、BF16 (2字节)。对于大语言模型,模型参数通常采用FP16或BF16。因此,以参数精度为FP16,参数量为32B的模型为例,其所需显存为:
梯度参数
在模型训练的反向传播过程中,需要为模型参数计算梯度,梯度的数量与待训练的参数数量相同。大语言模型中通常采用2字节的精度存储梯度,还是以32B的模型为例,所需显存为
微调方法 | 训练机制 | 适用场景 | 32B,FP16 |
---|---|---|---|
全参数微调 | 需要训练的参数与模型本身参数相同 | 算力充足的高精度需求 | 64GB |
LORA | LoRA微调将冻结原始模型参数,仅训练低秩矩阵,其待训练的参数取决于模型结构和低秩矩阵的大小,通常约占模型总参数量的0.1%~1% | 低资源适配特定任务 | 0.64GB |
QLoRA(量化 + LoRA) | 将预训练模型压缩为4-bit或8-bit,使用LoRA微调模型,并引入双重量化与分页优化器,进一步减少显存占用,待训练参数通常约占模型总参数量的0.1%~1% | 超大规模模型微调 | 0.64GB |
优化器状态
在训练过程中还需保存优化器的状态,状态值的数量与待训练参数数量相关,此外,模型通常会采用混合参数精度训练,即模型参数、梯度采用2字节存储,优化器状态采用4字节存储,此做法是为了确保在参数更新过程中保持高精度,避免因FP16/BF16的有限动态范围导致数值不稳定或溢出
优化器类型 | 参数更新机制 | 额外存储需求 | 适用场景 | 全参 | LORA | QLORA |
---|---|---|---|---|---|---|
SGD | 只用当前梯度 | 0(无额外状态) | 小模型或实验 | 0 | 0 | 0 |
SGD + Momentum | 带动量项 | 1个浮点数(动量) | 稳定性更好 | 128GB | 1.28GB | 1.28GB |
RMSProp | 自适应学习率 | 1个浮点数(二阶矩) | 非凸优化 | 128GB | 1.28GB | 1.28GB |
Adam/AdamW | 动量 + 自适应学习率 | 2个浮点数(一阶+二阶矩) | 大模型常用 | 256GB | 2.56GB | 2.56GB |
SGD
SGD+Momentum
RMSProp
Adam
激活值
训练时还需存储前向传播过程中产生的中间激活值,以便在反向传播时计算梯度。
关系式可以表示为:激活值显存∝b×s×h×L×param_bytes
-
b(batch size):单次请求批量大小,在作为在线服务时通常为1,作为批处理接口时不为1
-
s(sequence length):整个序列长度,包括输入输出(token数量)
-
h(hidden size):模型隐藏层维度
-
L(Layers):模型Transformer层数
-
param_bytes:激活值存储的精度,一般为2字节
同样以参数精度为FP16,参数量为32B的模型为例,激活值所占显存可以大致按照10%的模型所占显存进行估算
即:64GB*0.1=6.4GB
其他
当前批次的输入数据、CUDA核心、PyTorch/TensorFlow深度学习框架本身等也会占用一些显存,通常为1~2GB
据此,一个32B的模型,模型推理部署最低需要显存约为:
微调训练方式 | 模型本身所需显存 | 梯度所需显存 | Adam优化器状态 | 激活值 | 其他 | 总计 |
---|---|---|---|---|---|---|
全参 | 64GB | 64GB | 256GB | 6.4GB | 6.4GB | 396.8GB |
LORA | 64GB | 0.64GB | 2.56GB | 6.4GB | 6.4GB | 80GB |
QLoRA(8-bit量化 + LoRA) | 32GB | 0.64GB | 2.56GB | 6.4GB | 6.4GB | 48GB |
QLoRA(4-bit量化 + LoRA) | 16GB | 0.64GB | 2.56GB | 6.4GB | 6.4GB | 32GB |