大模型微调所需显存计算(二)

创作不易,可以一键三连支持一下哦,某书联系作者可以:核桃苹果肉桂卷

上一期讲解了大模型推理部署所需显存,链接在估计大模型推理部署所需显存(含KV cache讲解)(一)-CSDN博客

这一期讲解一下如何估计大模型微调所需显存,其影响因素可以概括为:模型本身参数+梯度参数+优化器状态+激活值+其他

模型本身参数

显存计算公式为:参数量 x 参数精度。常用的参数精度有FP32(4字节)、FP16(2字节)、BF16 (2字节)。对于大语言模型,模型参数通常采用FP16或BF16。因此,以参数精度为FP16,参数量为32B的模型为例,其所需显存为:

\frac{32*10^9*2}{10^9}=64GB

梯度参数

在模型训练的反向传播过程中,需要为模型参数计算梯度,梯度的数量与待训练的参数数量相同。大语言模型中通常采用2字节的精度存储梯度,还是以32B的模型为例,所需显存为

微调方法训练机制适用场景32B,FP16
全参数微调需要训练的参数与模型本身参数相同算力充足的高精度需求64GB
LORALoRA微调将冻结原始模型参数,仅训练低秩矩阵,其待训练的参数取决于模型结构和低秩矩阵的大小,通常约占模型总参数量的0.1%~1%低资源适配特定任务0.64GB
QLoRA(量化 + LoRA)将预训练模型压缩为4-bit或8-bit,使用LoRA微调模型,并引入双重量化与分页优化器,进一步减少显存占用,待训练参数通常约占模型总参数量的0.1%~1%超大规模模型微调0.64GB

优化器状态

在训练过程中还需保存优化器的状态,状态值的数量与待训练参数数量相关,此外,模型通常会采用混合参数精度训练,即模型参数、梯度采用2字节存储,优化器状态采用4字节存储,此做法是为了确保在参数更新过程中保持高精度,避免因FP16/BF16的有限动态范围导致数值不稳定或溢出

优化器类型参数更新机制额外存储需求适用场景全参LORAQLORA
SGD只用当前梯度0(无额外状态)小模型或实验000
SGD + Momentum带动量项1个浮点数(动量)稳定性更好128GB1.28GB1.28GB
RMSProp自适应学习率1个浮点数(二阶矩)非凸优化128GB1.28GB1.28GB
Adam/AdamW动量 + 自适应学习率2个浮点数(一阶+二阶矩)大模型常用256GB2.56GB2.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优化器状态激活值其他总计
全参64GB64GB256GB6.4GB6.4GB396.8GB
LORA64GB0.64GB2.56GB6.4GB6.4GB80GB
QLoRA(8-bit量化 + LoRA)32GB0.64GB2.56GB6.4GB6.4GB48GB
QLoRA(4-bit量化 + LoRA)16GB0.64GB2.56GB6.4GB6.4GB32GB
### 大模型微调所需显存的估算 大模型微调所需的 GPU 显存主要由以下几个因素决定:模型大小、微调方法以及优化策略。对于较大的模型,全量微调通常需要较高的显存支持,而高效的微调方法可以显著降低这一需求。 #### 1. **全量微调** 当进行全量微调时,模型的所有参数都会被更新,因此需要足够的显存来存储模型权重、梯度和优化器状态。例如,一个具有数十亿参数的大模型可能需要几十 GB 的显存才能完成训练[^1]。然而,在资源有限的情况下,这种方法并不现实。 #### 2. **高效微调方法** 为了适应低资源配置环境,研究者开发了一些高效的微调方法,这些方法能够大幅减少显存消耗: - **LoRA (Low-Rank Adaptation)** LoRA 方法通过引入低秩矩阵分解的方式调整模型的关键部分,而不是直接修改原始权重。这种方式只需要额外存储少量新增加的小规模参数,从而极大地降低了显存需求。即使是在较小的显卡上(如拥有 4GB 显存的 GTX 960),也可以尝试使用此技术实现简单的微调操作[^1]。 - **QLoRA** 结合量化技术和 LoRA 的优势,QLoRA 能够进一步压缩模型尺寸并减少显存用。尽管如此,具体表现仍依赖于目标应用领域的要求及其对精度损失容忍程度如何评估[^1]。 #### 3. **量化与精度控制** 除了改变微调方式外,还可以通过对模型进行量化处理来减小其体积进而节约更多空间。比如从 FP16 或 BF16 进一步降到 INT8 精度水平,则理论上可以使每张卡片上的可用有效工作区域扩大近两左右。不过需要注意的是,这样做可能会带来一定程度的质量折损[^2]。 #### 4. **分布式训练方案** 针对极端受限条件下的场景,还有多种分布式的解决方案可供选择: - **数据并行(Data Parallelism):** 将批量样本拆分成若干份分别交给不同节点独立计算后再汇总结果;但是这种做法无法缓解单机内部件间竞争激烈所带来的压力——即每个单独使用的装置依旧面临相同的高峰时期内存瓶颈问题[^3]。 - **零冗余优化(Zero Redundancy Optimizer, ZeRO Stage 3):** 它不仅实现了跨设备共享参数副本的功能而且还允许动态加载那些当前迭代过程中需要用到的部分而非一次性全部载入内存之中,最终达到既缩短整体耗时时长又能充分利用现有硬件设施的目的. - **张量切片(Tensor Sharding/Slicing):** 把原本属于同一个张量对象的内容按照一定规则分开存放至各个处理器单元里头去执行相应的运算任务,这样做的好处是可以让每一个参与协作过程中的成员只负责维护属于自己那一份额度范围内的变量集合即可[^3]. - **管道级联(Pipeline Parallelism):** 此种模式把神经网络结构纵向切割成数段之后再分配给不同的计算实体各自承担其中一段职责所在的工作流程环节,虽然说这样的安排有助于减轻局部负载过重的现象发生几率可是同时也伴随着更多的消息传递成本开支增加的风险存在[^3]. 综上所述,即便面对像只有 4GB 显存容量这么局限性的条件下也并非完全没有希望达成某些特定类型的预训练语言模型定制化改造作业的目标可能性。只是在实际操作之前务必要充分考虑到各种潜在影响因子之间的相互作用关系以便做出更加合理科学的选择决策而已。 ```python import torch from transformers import LlamaForCausalLM, BitsAndBytesConfig # 使用 Quantization 减少显存用 bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16 ) model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b", quantization_config=bnb_config) ``` 以上代码片段展示了如何利用 `BitsAndBytes` 库来进行四比特量化以适配较低规格的 GPU 设备。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值