最近在试着微调一个7B的LLM,用的LoRA,单张4090(24G)。一开始以为LoRA显存占用会很小,结果实际跑起来batch size开到2就OOM了,序列长度也就1024。查了挺多资料,有人说用DeepSpeed ZeRO-3能把优化器状态分片,也有人说直接上两张卡用FSDP更省事。
PyTorch跑大模型总爆显存,换DeepSpeed还是直接上多卡?
全部回复
共 11 条单张4090跑7B LoRA还爆显存,其实挺常见的,问题不一定在优化器状态,而是中间激活值和KV cache在作祟。我之前试过把batch size压到1,序列长度砍到512,勉强能跑起来,但loss波动特别大,效果也不理想。DeepSpeed ZeRO-3确实能把优化器状态和梯度分片,但单卡场景下收益有限,它更多是为多机多卡设计的,单卡上反而可能因为通信开销拖慢速度。FSDP倒是更贴近你的需求,两张卡就能把参数、梯度和优化器状态全部分片,而且PyTorch原生支持,配置起来比DeepSpeed直观很多,就是得注意把模型先load到CPU再wrap,不然照样OOM。不过说实话,如果你的目标是微调而不是从头训练,与其折腾这些分布式方案,不如先把LoRA的rank降到8或者4,同时用gradient checkpointing把激活值重新计算,这俩组合拳往往能省出好几G显存。另外你序列长度1024的话,可以检查下attention是不是用了flash-attention,这个优化对显存和速度的提升都特别明显。要是还不行,那就上两张4090跑FSDP吧,但记得sharding策略选full shard,别用gradient shard,后者反而更吃显存。最后问一句,你的LoRA是只挂在attention层还是也挂了MLP层?有时候挂载层数太多也会让显存涨得厉害。
4090就跑7B还是有点勉强,建议先查下是不是activation占大头,把gradient checkpointing开了再说。
单卡24G跑7B LoRA开2就爆,多半是context长度问题,DeepSpeed对单卡提升有限,不如直接上双卡FSDP省心。
单卡24G跑7B LoRA确实紧,ZeRO-3分片优化器状态挺对症,但FSDP用起来更省心。
4090跑7B LoRA本来就很极限,ZeRO-3分片能救,但不如直接两张卡FSDP省心。
4090跑7B LoRA爆显存太正常了,先查下是不是梯度检查点没开,这比换框架省事多了。
双卡FSDP确实更省心,但先查下是不是LoRA没开gradient checkpointing,那个省显存立竿见影。
说实话LoRA在7B上batch=2还爆显存,大概率是没开gradient checkpointing,这玩意儿能直接砍掉一大半激活内存。我之前在3090上跑13B的QLoRA,开了之后batch=4都稳得很,你先试试这个再决定上不上DeepSpeed。至于ZeRO-3和FSDP,单卡其实都用不上,多卡的话FSDP确实更省心,PyTorch原生支持不用改代码,DeepSpeed配置调起来反而容易踩坑。不过两张4090互联带宽一般,跑7B可能通信开销比计算还大,不如先优化一下数据加载和显存碎片。
4090上LoRA跑7B,batch size开到2就爆其实挺正常的,24G看着大但光权重加激活就吃掉不少。我个人建议先别急着上多卡,DeepSpeed ZeRO-3在这种单机场景下配置起来有点折腾,反而FSDP跟PyTorch原生集成更好调,两张卡就能把显存压力摊掉一大半。不过你序列长度才1024的话,也可以试试把gradient checkpointing开了,再把LoRA的r值压到8,大概率能塞下batch size 4。要是之后真要多卡,记得留意下通信开销,NVLink和PCIe的差距在微调时能明显感觉到。
说实话7B+LoRA在24G上爆显存有点不太正常,你检查下是不是梯度检查点没开,或者transformer库版本太老导致activation没释放。我之前用QLoRA加4bit量化,同样配置能塞下batch size 4,序列长度还是2048。DeepSpeed和FSDP在这个规模都显得有点重,单卡先把bitsandbytes和gradient checkpointing调好,大概率能解决。真要上多卡的话,FSDP配置起来比DeepSpeed省心不少,而且PyTorch原生支持,不用改太多代码逻辑。不过你序列长度才1024就爆,感觉还是哪里没优化到位,建议先看看是不是把padding开得太大了。
说实话24G跑7B的LoRA,batch size开到2确实有点紧,但OOM可能不光是显存总量的问题,序列长度和梯度检查点开关影响也很大。我试过把gradient_checkpointing打开,再配合ZeRO-3,单卡能勉强塞下batch size 4,不过速度会慢不少。如果你手头能借到第二张卡,我个人更推荐FSDP,配置起来比DeepSpeed简单,而且不用调一堆stage相关的参数,省下的时间够你多跑几次实验了。
4090跑7B LoRA确实紧,建议先查下是不是activation峰值爆了,ZeRO-3比FSDP配置省心点。
单卡24G开batch2就炸,多半是梯度检查点没开,FSDP要改的地方比DeepSpeed多不少。