想把开源模型微调成自己领域的版本,第一步往往不是写代码,而是发现显存不够——训练框架刚加载完权重就 OOM,或者刚跑两步就爆。这篇不聊算法细节,只给你一套可执行的估算顺序:先看权重本身占多少,再看微调方式带来的额外开销,最后对照手上的卡决定是换卡、换档还是改配置。
想把开源模型微调成自己领域的版本,第一步往往不是写代码,而是发现显存不够:框架刚加载完权重就 OOM,或者刚跑两步就爆。这篇不聊算法细节,只给你一套可执行的估算顺序——先看权重本身占多少,再看微调方式带来的额外开销,最后对照手上的卡决定是换卡、换档还是改配置。
核心心法只有一句:显存不是「一个数」,而是权重、梯度、优化器状态、激活值四笔账的和,微调方式决定了后面三笔账要不要记、记几份。所以别急着背某个模型的「标准显存」,先把自己的档位和卡对上,数字都会随配置浮动。
先把权重那笔账算清
显存大头是权重本身,算法很朴素:参数量乘以每个参数占的字节数。半精度和全精度差一倍,量化后又能再砍一截。所以第一件事是确认你打算用哪个参数量级、跑哪个精度档,这两个一确定,权重占用就有了一个数量级上的锚点,后面的溢出空间也才好判断。
- 参数量决定底数,先按「亿」和「十亿」两个量级心里分档,不要混着比。
- 精度档决定系数,同一模型换一个精度档,占用可能直接翻倍或腰斩。
- 量化会引入精度损失,能不能接受要看你的任务对细节的敏感程度。
- 拿不准当前框架和精度的换算系数,到 部署测算(/models/deploy) 里按实际模型跑一遍更稳。
训练比推理多出来的部分才是真正的变量:梯度、优化器状态、激活值。全量微调时这三块加起来常是权重的数倍,而激活值跟批大小和序列长度直接相关,序列拉长时增长比权重更快,这是很多人估完之后仍然 OOM 的原因。
| 开销项 | 由什么决定 | 什么时候会突然变大 |
|---|---|---|
| 权重 | 参数量 × 精度字节数 | 换更大模型或换更高精度档 |
| 梯度 | 是否可训练、几份副本 | 从冻结主体改成全参微调 |
| 优化器状态 | 优化器类型与是否分片 | 用带一阶二阶动量的优化器 |
| 激活值 | 批大小 × 序列长度 | 拉长上下文或加大批 |
不同微调方式的开销差在哪
微调方式真正的分水岭是「主体权重要不要跟着动」。只调适配器一类的方法,主体通常保持冻结,显存里基本只有单份权重;全参数微调要把梯度、优化器状态也放进显存,通常是需求最陡的一档。这两者之间不是差一点点,而是差一整档硬件门槛。
- 单份权重
- 主体冻结、只训练少量附加参数时,显存里主要就这一份,压力最小。
- 多份副本
- 主体参与更新后,梯度与优化器状态各自还要占位,份数越多数越大。
- 梯度检查点
- 用重算换显存,占用降下来但训练变慢,是典型的以时间换空间。
- 部分层放 CPU
- 把不常用的层挪到内存,单卡能跑更大的模型,但数据搬运会拖慢节奏。
- 确认是否冻结主体翻你的训练配置,看可训练参数列表里有没有主体权重。只有附加参数,显存按单份权重估;有主体,就按多份估。
- 确认单卡还是多卡一张卡跑通和多卡分片是两条完全不同的路,配置写法、通信开销、故障排查都不一样,先定路线再调参数。
- 确认能否接受变慢梯度检查点和层卸载都会换来回合速度下降,先想清楚你是要「跑得快」还是「跑得起来」。
判断标准可以简单点:如果你的目标只是让风格、格式、术语对齐,优先选冻结主体的方式;如果是要模型真正吸收一批新知识,再考虑全参数路线,同时提前接受硬件门槛上浮。
动手前的五步估算流程
下面这套顺序建议照着走一遍,每步都写下数字,别在脑子里估。它的价值不在精确,而在于让你知道钱和卡到底花在哪一档上,也方便后面调参时有方向。
- 确认参数量与精度档写下模型参数量和你能接受的精度档位,先把权重占用记成一个数。
- 确认微调方式判断主体是否参与更新,确定需要几份权重副本,是单份还是多份。
- 按序列长度估激活值用你实际要用的序列长度和小批大小估激活,先按小批起步,再往上试。
- 相加并留余量把以上相加,额外留一部分给框架自身、缓存和临时张量,别卡着边界跑。
- 对照显卡决定动作对照手上的卡型号与显存,不够就按「调参、换档、换卡」三种手段依次试,先便宜的后贵的。
卡规格记不清就查 加速卡规格库(/compute/gpus),别凭印象。显存、互联能力、是否支持分片这些都会影响你能不能真的把配置跑起来,纸面够用和实际够用经常不是一回事。
哪些情况下这套估算不适用
这套估算针对的是「自己拿卡跑训练」这一条路。只要你的执行方式变了,结论就跟着变,硬套反而误导。下面几类情况要么换指标,要么必须实测。
- 用托管式微调服务时,显存不归你管,你该关心的是计费口径和额度上限。
- 多机多卡张量并行、流水线并行下,单卡显存和总显存不是简单相加关系。
- 超长序列或特殊结构模型,激活值占比可能远超经验比例,必须实测。
- 租卡下单前顺手看一下 几张卡够用(/compute/sizing) 的口径说明,避免按单卡经验误判整机方案。
- 做的是推理或评测而非训练时,别拿训练的估算套过去,两者开销结构不同。
最稳的做法是粗估定档、实测收口:先用这套流程把方案缩到两三个候选,再拿最小的可用配置跑几步,看真实占用落在哪。指标类的数字,比如各卡的显存容量、带宽、租赁口径,到 加速卡规格库(/compute/gpus) 核对当时的数字,不要用记忆里的值。
下一步把候选卡型和目标模型规模拿到规格库里对一遍,再决定是调参、换档还是换卡,比反复试错省时间。→常见问题
是不是买一张显存大的卡就一定能微调?
不一定。显存只是门槛之一,还要看微调方式、序列长度和框架支持。同一张卡换个方式可能就跑得动,反过来显存够了但算力太低,训练时间会长到没法用。建议先按小配置跑通,再决定要不要升级硬件。
LoRA 一定比全量微调省显存吗?
多数情况下省,但省的是「要更新的参数」那一部分,主体权重照样要加载进显存。如果模型本身大到权重就装不下,换成 LoRA 也救不了,得靠量化加载、多卡分片或者换更小的基座。
估算出来的数字和实际跑起来差很多怎么办?
很正常,激活值和框架开销最容易估偏。先按最小批、短序列跑一次,看实际峰值,再往上加。如果怎么调都压不下去,说明该换档位或换卡了,别在原配置上反复试。