最近在试着微调一个7B的LLM,用的LoRA,单张4090(24G)。一开始以为LoRA显存占用会很小,结果实际跑起来batch size开到2就OOM了,序列长度也就1024。查了挺多资料,有人说用DeepSpeed ZeRO-3能把优化器状态分片,也有人说直接上两张卡用FSDP更省事。
PyTorch跑大模型总爆显存,换DeepSpeed还是直接上多卡?
全部回复
共 27 条7B模型LoRA在24G上开batch2就OOM,大概率不是优化器状态的问题,先看看是不是梯度检查点没开,或者dataloader那边有额外开销。ZeRO-3确实能省显存,但单卡用ZeRO-3意义不大,它主要是跨卡分片的。如果手里只有一张4090,先把gradient checkpointing和flash attention打开试试,序列1024其实不算长,调完这些batch2应该能跑起来。真要上多卡的话FSDP比DeepSpeed配置简单不少,但两张4090走PCIe通信效率也就那样,不如先压榨一下单卡。
单卡4090跑7B LoRA,seq 1024 batch 2就OOM有点不太对劲,正常情况不该这么吃紧。你可以先检查下是不是跑在fp32上,或者有没有开gradient checkpointing,这两点影响特别大。DeepSpeed ZeRO-3确实能省显存,但它对单卡的收益其实有限,分片主要是多卡场景才明显。如果手上就有两张卡,我更推荐直接上FSDP,PyTorch原生支持,配置比DeepSpeed清爽不少,踩坑也少。
单卡4090跑7B的LoRA按理说不至于这么惨,bs=2 seq=1024就OOM有点不太对劲,建议先检查一下是不是哪里没配好。比如base model是不是用了fp32加载?gradient checkpointing开了没?还有LoRA的target modules如果设成all-linear,参数量其实不小。另外优化器如果用adamw,fp32的optimizer state对7B来说虽然LoRA只更新一小部分,但DeepSpeed ZeRO-3分片的收益在单卡上其实没啥意义,它本来就是为多卡设计的。FSDP两张卡确实能省显存,但通信开销和配置复杂度你得考虑进去,尤其4090没有NVLink,走PCIe会拖速度。我自己的经验是先把gradient checkpointing和8bit adam打开,再把batch size降到1配合gradient accumulation,大概率能跑起来。真要上多卡,FSDP比DeepSpeed在PyTorch生态里更顺滑一些,但调试成本也不低。
7B LoRA在24G上batch size只能到2确实有点紧,不过seq长度1024也不算特别夸张。其实可以先试试梯度检查点和把LoRA的target modules加全一点,有时候显存大头在中间激活值上。DeepSpeed ZeRO-3单卡也能跑,但通信开销不小,如果只是单卡微调,优先考虑优化器换成8bit或者用flash attention可能更直接。多卡FSDP确实省心,但两张4090走PCIe的话带宽会拖后腿,建议先确认下主板通道再决定。
单卡24G跑7B的LoRA,seq 1024 batch 2就OOM有点不对劲,正常配置下这个规模不该这么吃显存,建议先查查是不是把base model也放进优化器了,或者gradient checkpointing没开。ZeRO-3确实能省,但单卡场景下分片收益有限,反而通信开销会拖速度,不如先把offload和checkpointing调好。FSDP多卡确实更省心,但两张4090之间没有NVLink,走PCIe通信效率会打折扣。真要上多卡的话,建议先确认下你的瓶颈到底在显存还是别的地方,不然加了卡可能还是卡。
我前段时间用单卡A100 40G微调7B的LoRA也踩过类似的坑,序列长度1024、batch size一上去就炸,后来发现显存大头其实不在LoRA权重上,而是activations和优化器状态。LoRA虽然冻结了主干,但前向的中间激活值还是得存,序列一长就是平方级增长,这块用gradient checkpointing能省不少,你可以先试试这个,成本最低。DeepSpeed ZeRO-3确实能分片优化器状态和参数,但单卡场景下分片没什么意义,反而多了通信开销,它更适合多卡。真要省显存,优先考虑ZeRO-2加offload到CPU,或者直接上QLoRA把基座量化成4bit,显存能砍一大截,7B在24G上跑起来会舒服很多。至于多卡,FSDP确实比DeepSpeed配置简单,但两张4090走NVLink的话还行,走PCIe通信瓶颈会拖速度,而且FSDP对LoRA的支持不如全参微调那么顺,得注意wrap策略。我的建议是先别急着加卡,把checkpointing、QLoRA、batch累积这几个组合拳打一遍,大概率单卡就能跑起来,实在不够再考虑多卡。
你这个问题挺典型的,7B LoRA按理说不该这么吃显存,先检查下是不是梯度检查点没开,或者优化器用的还是Adam全量状态。单卡24G跑seq 1024、batch 2理论上够用,除非你还开了flash attention之外的额外缓存。DeepSpeed ZeRO-3对单卡意义不大,分片省的是多卡间的冗余,单卡上反而多一堆通信开销。如果手头有第二张卡,FSDP确实更省心,跟PyTorch原生集成好,配置比DeepSpeed清爽不少。