显存不足时大模型训练的切分策略,核心思路是把模型、数据或优化状态拆到多张卡上,用通信换容量,具体选哪种取决于你的卡数、显存大小和网络带宽。
大模型训练卡在显存上,几乎是每个炼丹人都会撞上的墙,你以为加张卡就能解决,结果发现通信开销比训练还慢,别急,这条路不是只有一条走法,下面按实用程度和适用场景,把切分策略拆开讲清楚。
大模型训练显存不够怎么办?先搞懂显存去哪了
训练一个模型,显存占用主要来自四个部分:模型参数、梯度、优化器状态(比如Adam里的动量和方差)以及中间激活值,参数量上亿之后,光是参数加梯度就是好几份权重的大小,以7B模型为例,用Adam优化器训练,优化器状态就要占掉大概56GB(按每个参数8字节算),加上参数和梯度,单卡至少要120GB才跑得起全精度训练,这就是显存告急的根本原因。
切分策略就是在不同维度把这些数据拆开,让每张卡只负责一部分,行业共识认为,没有一种策略是万能的,必须结合硬件环境选。
显存不足时的主流切分策略详解
目前实战中常用的切分方式,按维度分为数据并行、张量并行、流水线并行和ZeRO优化,它们不是互斥的,大项目通常是组合拳。
数据并行:最简单但显存没省多少
数据并行把训练数据切成多份,每张卡持有一份完整模型副本,每轮前向反向之后,各卡之间同步梯度,这种方式的优点是实现简单,通信量相对可控;缺点是每张卡都要装下完整模型和优化器状态,显存压力没有本质缓解。
适用场景:单卡能装下模型,只是训练太慢,如果你的问题是“单卡能跑,但速度不满意”,数据并行是首选。
张量并行:把一层拆开,适合单机多卡
张量并行把每一层的权重矩阵按行或按列切分到多张卡上,计算时通过All-reduce通信合并结果,业内专家指出,张量并行是GPT系列训练时常用的一招,因为它能把超大网络的一层拆得很细,显存占用随卡数线性下降。
但它对通信带宽要求极高,跨卡通信发生在前向和反向的每一层,如果走PCIe而非NVLink,性能会很难看,所以张量并行通常只在单机8卡甚至4卡内使用,跨机基本不碰。
实操小建议:用Megatron-LM做张量并行时,先把--tensor-parallel-size设为2或4,配合--pipeline-model-parallel-size

一起调整,比单开张量并行灵活得多。
流水线并行:纵向切层,省显存但有空转
流水线并行把模型按层切成多段,每张卡负责其中一段,比如一个32层的模型,切成4段,每张卡跑8层,显存占用立刻变成原来的四分之一,缺点是存在“气泡”,也就是某些卡在等上游数据时处于空闲状态。
为了减少气泡,现代实现普遍采用微批量(micro-batch)切分,把一个大batch拆成多个小batch依次灌入流水线,让各卡尽量保持忙碌,具体操作中,--num-micro-batches的取值要尽量大于流水线深度,比如4段流水线配8个微批量,气泡占比就能从接近50%降到10%左右。
适用场景:模型层数特别深(比如百亿参数以上),且你有多台机器可以串成长链路。
ZeRO优化:最省心的显存救星
ZeRO全称是“零冗余优化器”,核心思想是把数据并行中冗余存储的模型参数、梯度、优化器状态,按维度切分到不同卡上,它有三个级别:
- ZeRO-1:只切分优化器状态。
- ZeRO-2:切分优化器状态和梯度。
- ZeRO-3:把参数也切了,每张卡只保留一部分权重。
ZeRO-2是目前深度学习显存不足时切分策略的“标准答案”,因为它在通信量和显存节省之间平衡得最好,实测一个7B模型,用ZeRO-2在8张24GB卡上就能跑起来,而纯数据并行至少要4张80GB卡。
具体到代码,用DeepSpeed只需要在启动命令里加一句话:
deepspeed --num_gpus=8 train.py --deepspeed ds_config.json
配置文件里设置"zero_optimization": {"stage": 2}即可,如果你想更进一步,stage 3配合offload_optimizer把优化器状态放到CPU内存,单卡显存占用能再降一半,代价是训练速度明显变慢。
多卡训练切分策略怎么选?按场景对号入座
没有最好的策略,只有最合适的,下面这张表帮你在动手前快速判断。
| 硬件环境 | 显存缺口 | 推荐策略 | 备注 |
|---|---|---|---|
| 单机8卡,NVLink互联 | 模型能装下,想加速 | 数据并行 + ZeRO-1/2 | 通信开销小,最省事 |
| 单机8卡,模型单卡装不下 | 差20%-50% | 张量并行 + ZeRO-2 | 注意卡间通信效率 |
| 多机多卡,百亿参数以上 | 差一倍以上 | 流水线并行 + ZeRO-3 | 网络带宽要保证 |
| 单卡显存很小(如24GB) | 想跑7B模型 | ZeRO-3 + 卸载 | 速度慢,但能跑 |
如果你用的是Hugging Face Transformers,不想深度定制代码,可以直接用accelerate库的配置工具,执行:
accelerate config
然后按提示选择多卡训练、混合精度、ZeRO级别,它会自动生成分布式配置文件,省去手动调参的麻烦。
混合策略实战:从32GB单卡到4卡跑通13B模型
很多人的实际处境是手里有几张卡,单张装不下,全用张量并行又怕通信慢,这里给出一条经过验证的操作路径。
假设你有4张32GB显卡,目标是训练一个13B参数的模型,粗略估算:13B全精度参数占52GB,Adam状态占104GB,加上梯度和激活值,总计奔着200GB去了,4张卡总显存128GB,仍然不够,怎么办?
第一步:用ZeRO-3把参数、梯度、优化器状态全部分片。 每张卡只需要保存约13GB的参数分片、26GB的优化器分片,加上部分梯度,整体控制在60GB以内。
第二步:开启混合精度训练。 用FP16存储梯度和中间激活,显存再省一半,注意保持FP32的权重副本用于更新,避免精度崩掉。
第三步:调整微批量大小。 把每张卡的batch size设为1,然后打开梯度累积,这样激活值占用降到最低,同时通过累积步数保持全局batch size不变。
第四步:观察GPU利用率。 用nvidia-smi或htop监控显存和算力,如果显存占用低于80%,说明切分太碎,可以增大张量并行度;如果GPU利用率长期低于70%,优先检查通信瓶颈,看看是不是流水线气泡太长。
这套组合下来,13B模型在4卡上完全跑得动,只是每秒吞吐量会比8卡低一些,多数情况下,先跑通再调优比一开始就追求最优配置更实际。
切分训练常见坑与调优建议
坑一:过度切分导致通信瓶颈
显存是省下来了,但每层计算都要跨卡通信,比如张量并行度设为8,一个All-reduce操作就要同步8张卡,带宽不够时通信时间比计算还长,解决办法是减少张量并行度,改用流水线和ZeRO分担压力。
坑二:激活值偷偷吃满显存
模型本身切开了,但中间激活值在长序列训练时依然很占地方,可以在代码里调用torch.utils.checkpoint来用计算换显存,开启后,前向传播不保存激活值,反向时重算一遍,显存占用下降约60%,代价是训练时间增加20%-30%。
坑三:数据加载跟不上GPU
切分策略解决了显存,但CPU预制数据太慢会让GPU空转,用

DataLoader时设置num_workers=8和prefetch_factor=4,把数据准备和训练重叠起来。
坑四:忽视梯度累积的顺序
ZeRO-3下,梯度分片是动态通信的,如果同时开梯度累积,要确保每个微批次都同步梯度,否则累积梯度不完整。
2026年值得留意的趋势
随着模型规模继续膨胀,显存不足的常态不会消失,目前业界在推序列并行和上下文并行,专门处理长序列带来的激活值爆炸,这类策略把注意力头或序列维度也切分到多卡上,结合稀疏注意力机制,可以让训练窗口进一步拉长。
另一条路线是异构内存扩展,通过统一内存池把CPU内存、NVMe SSD和GPU显存整合起来,训练时自动调度冷热数据,看起来在单卡上跑超大模型会变成可能,但访问速度差异仍是瓶颈。
显存不够但模型必须训练?记住这个排序
如果只能选一条最核心的建议,那就是:先用ZeRO-2,不行再上ZeRO-3,再不行加卸载,最后才考虑张量并行。 这条路径从简单到复杂,显存节省从少到多,但通信开销也从小变大,对于绝大多数人来说,ZeRO系列已经是深度学习显存不足切分策略里的“性价比之王”。
最后唠叨一句:切分策略不是越多越好,多机训练时,先跑一个小规模的基准测试,用10分钟实测吞吐量和显存峰值,再决定要不要加流水线并行,数据和试错,永远比网上流传的默认配置靠谱。
显存不足时大模型训练的切分策略相关问答
问:ZeRO-3和张量并行能同时开吗?
能,实际上很多大模型训练框架允许你同时启用两者,典型做法是:节点内用张量并行处理层内计算,节点间用ZeRO-3处理参数和优化器分片,注意通信会叠加,最好先用小模型跑通验证性能。
问:本地只有一张24GB显卡,想微调7B模型,用什么切分方式?
单卡没法和别人切分,只能靠混合精度加梯度检查点,把模型以FP16加载,开启gradient_checkpointing,同时把batch size设为1,7B模型可以在24GB显存的极限状态下跑起来,速度慢是必然的,但能出结果。
问:流水线并行和ZeRO-3相比,哪个省显存更明显?
如果模型层数极深,流水线并行把每层完整放在单卡上,省得非常直接,但张卡之间空闲时间会拖慢速度,ZeRO-3是更细粒度的分片,显存利用更均匀,也更容易配合数据并行使用,实操中用ZeRO-3的情况远远多于流水线并行。
