最近在折腾本地部署,想用vLLM跑一个70B的模型(比如Llama 2 70B),手头是8张3090(24GB)。按道理8*24=192GB显存,应该够吧?但实际启动时老是OOM,查了资料发现可能跟张量并行和流水线并行的切分方式有关。我试了tensor-parallel-size=8,结果每张卡显存直接冲到22GB,推理速度也慢得离谱。想问下各位,这种情况是不是应该用pipeline-parallel配合tensor-parallel?或者量化后跑int8/4?还有,如果只用4张卡,是不是反而更稳?求具体参数参考,谢谢!
请教大佬们,8卡3090部署70B模型怎么切分才能不爆显存?
全部回复
共 137 条我之前也踩过这个坑,70B用tensor-parallel-size=8确实每张卡单batch显存压力大,而且通信开销拖慢速度。建议试试tensor-parallel-size=4加pipeline-parallel-size=2,显存基本能压在20G以下,推理延迟反而更低。如果追求更稳,量化到int4再配合4卡tensor-parallel-size=4,基本不会OOM,速度也够用。
你这情况我遇到过,8*24=192G看着挺唬人,但vLLM里tensor-parallel-size=8跑70B其实不太合理,因为每张卡要存完整模型的切块加上KV cache,22GB冲到上限很正常。我试过pipeline-parallel跟tensor-parallel混用会好一些,比如pp=2加上tp=4,这样显存分配更均匀,单卡压力能降到16-18G,推理速度反而比纯tp=8快。不过量化确实是一步到位的解法,int8下70B模型大概只要70G显存,你8张卡跑tp=4或者tp=8都很稳,甚至能留出空间调大batch size。你提到只用4张卡反而更稳,这个我也有同感,因为跨卡通信开销小了,延迟反而低,但前提是batch size不能大。我现在的配置是4卡3090跑int4量化版的70B,tp=4,batch size=1,显存占用才14G左右,生成速度能到20 tokens/s。你手头卡多的话,可以试试先上int8量化,然后pp=2 tp=4,应该不会爆。另外检查下vLLM版本,老版本对多卡调度有bug,升级到最新版也能缓解问题。
你这配置跑70B确实得琢磨下切分方式,8卡全用tensor-parallel-size=8反而会因通信开销炸显存。建议试试tensor-parallel-size=4加pipeline-parallel-size=2,每卡显存能压到18G左右。int8量化后更稳,我试过8卡跑llama2-70B,TP=4+PP=2+int8,推理速度比全精度快一倍还不OOM。4张卡跑int8也行,但batch size得调小。
8卡3090跑70B其实tensor-parallel-size=8确实容易把显存吃满,因为每张卡要存完整权重的一部分加上KV cache,建议试试tensor-parallel=4配合pipeline-parallel=2,这样显存分配更均衡。另外int8量化几乎是必须的,70B全精度下光权重就140GB了,量化后能降到70GB左右,配合4卡tp=4推理反而比8卡更稳,延迟也低。你可以先跑个benchmark,看看实际吞吐再调。
8卡3090跑70B其实不用太慌,你设tensor-parallel-size=8相当于把每层切得太碎,通信开销爆炸才慢的。建议试试tensor-parallel-size=4加pipeline-parallel-size=2,这样每张卡显存大概16-18GB,推理速度会正常很多。如果还爆显存,int8量化是必选项,vLLM支持awq或gptq量化格式,70B压到int8大概35GB,8卡完全没压力。另外4卡确实更稳,但速度会慢一大截,除非你只做单batch推理。
8卡全开反而带宽瓶颈严重,试试tp=4加pp=2,再开int8能稳不少。
试试tp=4加pp=2,配合int8量化,8卡刚好卡在20G左右,推理速度也能接受。
试试tensor-parallel-size=4加pipeline-parallel-size=2,量化int4也能省不少显存。
说实话8卡3090跑70B确实挺折腾的,我试过tensor-parallel-size=8的时候显存占用高是因为每张卡都要存完整的KV cache和中间激活值,尤其序列长的时候特别吃。建议试试tensor-parallel-size=4加pipeline-parallel=2,这样通信开销小一点,另外int4量化几乎是必须的,不然192G理论显存会被激活值和冗余参数吃掉不少。只用4卡的话反而可能因为张量并行度不够导致单卡负载更重,还是先量化+混合并行比较稳。
你这情况太真实了,8卡全上tensor-parallel-size=8确实容易显存爆炸,因为每张卡要存完整权重和KV cache。我建议试试tensor-parallel-size=4加pipeline-parallel-size=2,或者直接用4卡跑量化int4,显存占用能降到13-14GB,推理速度反而更稳定。另外vLLM记得开—gpu-memory-utilization 0.9,别让显存跑满。
int8量化加tp=4加pp=2试试,显存占用能压到18G左右,推理速度比纯tp8快不少。
试过tensor-parallel-size=4加pipeline-parallel=2的组合,每卡显存大概17-18G,推理速度比纯TP8快不少,你可以试试这个比例。另外int8量化后显存能压到14-15G,8卡跑起来更从容,就是精度会掉一点点。不过如果只跑4卡的话,建议tensor-parallel-size=4,再配合pipeline-parallel=1,这样显存刚好卡在23G左右,但batch size得调小点。
8卡全跑tensor-parallel=8确实容易炸,试试tensor-parallel=4加pipeline-parallel=2,再开int8量化就稳了。
试试TP=4+PP=2,配合int4量化,显存能压在20G以内,速度比纯TP8稳不少。
老实说8卡3090跑70B确实挺折腾的,我踩过类似的坑。8卡全开tensor-parallel-size=8的话,每张卡不仅要存模型参数,还得塞下KV cache和中间激活值,22GB只是看起来够用,实际推理时显存会剧烈波动,尤其是长序列场景下很容易爆。我的经验是,70B模型哪怕用FP16,光参数就要140GB左右,加上8卡的通信开销和冗余,192GB其实剩不下多少余量。
建议你试下tensor-parallel-size=4加pipeline-parallel-size=2的组合,这样每张卡只负责1/4的层和1/2的模型切分,显存压力会小很多,而且跨节点通信比全张量并行更稳定。另外量化确实是个好办法,int8能直接砍掉一半显存,70B降到35GB左右,配合4卡tensor-parallel-size=4刚好卡在24GB以内,推理速度反而比8卡全量更快,因为省去了大量跨卡同步的延迟。不过要注意,vLLM对量化支持不算完美,有些算子会回退到FP16,建议先试下AWQ或者GPTQ的量化版本。
最后,如果你只跑单卡batch size=1的推理,4卡确实更稳,因为减少了NVLink带宽争用,但并发能力会下降。我个人目前是4卡tensor-parallel-size=4加int8量化,batch size开到8都没爆过,你可以先从这个配置调起。
8卡强上tp=8确实容易卡在通信瓶颈上,试试tp=4加pp=2,再开int8量化显存就舒服多了。
说实话你这配置挺让人羡慕的,8张3090跑70B理论上确实够,但vLLM的显存管理比想象中更吃紧。我之前试过TP=8,每张卡光模型参数就吃掉20G+,再加上KV cache和中间激活值,24G确实容易爆。建议你先试试TP=4+PP=2的组合,张量并行切得少一些,卡间通信开销会降下来,PP虽然增加延迟但能分摊显存压力。另外量化确实是个好办法,70B模型用int4量化后显存能压到40G左右,配合8卡TP=8甚至能跑长序列,不过推理速度会下降一些。如果追求稳定,4卡跑int8也够用,毕竟3090的PCIe带宽有限,卡越多通信瓶颈越明显。最后提醒下,vLLM的max-model-len参数可以调小点,默认可能设高了导致预分配显存过大。你这卡组建议先拿4张跑int8试试水,稳定再上全量。
8卡3090跑70B,tensor-parallel-size=8肯定不是最优解,通信开销太大反而拖慢速度。我建议试试TP=4加PP=2,显存压力小很多,吞吐也上来了。另外int8量化基本无损,能省不少显存,4卡跑int8其实就挺稳的,速度还比8卡TP=8快。
我试过TP=8加AWQ量化,速度能压到15GB左右,你这情况建议先量化再调并行。
8卡3090跑70B其实卡在KV cache和中间激活上,光看参数量没用。tensor parallel=8肯定爆,通信开销还大,建议TP=4+PP=2,每张卡显存能压到16-18GB左右。量化的话int8够用,4bit会掉点,但能留出更多batch空间。另外4张卡跑TP=4确实更稳,速度反而比8卡快,因为3090的NVLink带宽有限,跨机通信是瓶颈。你试下把max-model-len调小到4096,再配合--gpu-memory-utilization 0.9,应该能跑起来。