微调大模型的第一道门槛往往不是算法,是显存。全参数微调时,参数、梯度、优化器状态加激活值,几项叠起来轻松超出单卡上限。好在这笔账可以一项项砍:冻结少训一部分,量化把权重压小,分片把剩余状态撒到多卡。本文按机制层思路,把三板斧各自砍的是哪块、代价是什么讲清楚。
显存都被什么占了
先看账本。训练时显存分四大块:模型参数、参数梯度、优化器状态、前向激活值。以混合精度加 Adam 为例,优化器状态常是最大头,一个参数要摊到十几个字节;激活值随 batch 和序列长度涨,长上下文时甚至能超过参数本身。搞不清哪块是大头就下手,容易白忙。一个简单的自检方法是把四项各估一遍:参数和梯度按参数量乘字节数算,优化器状态按 Adam 的两份动量估,激活值按 batch 乘序列长度乘层数乘隐藏维估,哪项数字最大就先砍哪项。
冻结:少训就少占
第一板斧是冻结。把模型的底层大部分参数设为不更新,只训顶层或指定模块。不更新的参数不需要存梯度和优化器状态,这块直接归零。进来的是完整模型和一份冻结清单,出去的是缩小的可训参数集。代价很直接:可学的新东西变少,任务跨度大时效果有上限。冻哪层也有讲究:通常冻底层保通用,训顶层学任务,中间层可以小步放开做实验。LoRA 一类的轻量适配器是这条路的延伸——原参数全冻,只训新增的小矩阵,显存压力因此小到消费级显卡也能起步。
量化:把权重压小
第二板斧是量化。权重以低比特存储,比如 4bit 或 8bit,加载时省掉一多半参数占用;计算时按需反量化回高精度,保证数值稳定。进来的是全精度权重,出去的是压缩后的权重加反量化配置。代价是加载变慢一点,极端量化可能伤输出质量,通常先小范围试。量化和冻结叠加,是当前最常用的省显存组合。加载慢的问题可以靠预量化权重缓解,模型仓库里常有现成的低比特版本,不用每次自己转。
分片:剩下的分着存
第三板斧是分片。参数、梯度、优化器状态这三样训练状态按 ZeRO 的思路切成分片撒到多卡,用时再取。ZeRO 是怎么省显存的讲了三级的取舍。单卡场景下还有一个常被忽略的招:梯度检查点——前向时不存全部激活,反向到某层再重算,用时间换显存,长序列训练时特别管用。单卡内还有一种省法是换更轻的优化器,减少状态份数,代价是收敛特性变化,要重新调学习率。
三板斧可以叠加:先冻大部分,再量化加载,剩余可训部分上分片。实战动线通常是先跑通最小配置,再按显存余量逐级加码。不同任务的配比和评估,参考微调后的模型怎么评估;具体能训多大的模型,消费级显卡能微调多大模型给了档位视角。日常排查显存爆掉时,可以像用 WPS AI 和讯飞星火分头处理文档那样,把「算账」和「动手」分开:先拿配置表静态估算,再小步试跑验证。
三板斧各自砍哪块、代价是什么,并排看最清楚。
| 板斧 | 砍的是哪块显存 | 具体做法 | 代价 |
|---|---|---|---|
| 冻结 | 梯度与优化器状态 | 底层大部分参数设为不更新,只训顶层或指定模块 | 可学的新东西变少,任务跨度大时效果有上限 |
| 量化 | 参数本身的存储占用 | 权重按 4bit 或 8bit 存,计算时反量化回高精度 | 加载变慢,极端量化可能伤输出质量 |
| 分片 | 参数、梯度、优化器状态三样训练状态 | 按 ZeRO 的思路切成分片撒到多卡,用时再取 | 要撒到多卡,单卡场景使不出 |
| 梯度检查点 | 前向激活值 | 前向不存全部激活,反向到某层再重算 | 用时间换显存 |
- 账本:参数、梯度、优化器状态、激活值,先找大头
- 冻结:不训就不存梯度与状态,代价是可学上限降低
- 量化:权重低比特存,计算时反量化,省一半以上
- 分片:ZeRO 三级切状态,单卡还有梯度检查点兜底
- 动线:先跑通最小配置,再按显存余量逐级加码
换个问法再问微调显存三句
- 三板斧要一起上吗?:不一定,先冻后量再分片,按显存缺口逐级加,一次全上调试成本很高。
- 量化一定伤效果吗?:轻度量化通常几乎无损,极端量化才明显掉质量,拿评估集对比最稳妥。
- 激活值爆显存怎么办?:缩短序列、减小 batch 或开梯度检查点,三招都比砍参数更保能力。


