最近在折腾本地部署,想用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 条试试8卡但tensor-parallel=4加pipeline=2,再开个量化到int8,速度能稳下来。
说实话你这个情况我太熟了,当初我用8卡3090跑70B的时候也是被OOM折磨得够呛。你直接tensor-parallel-size=8的问题在于,虽然总显存够,但每张卡要同时存下模型权重、KV cache和中间激活值,24GB真的很极限,尤其序列长度一上来就炸。我的经验是别硬刚全量FP16,先上int8量化,显存占用直接砍半,然后用tensor-parallel=4加pipeline-parallel=2,这样每张卡压力小很多,而且通信开销也低。你试过用AWQ或者GPTQ量化过的模型吗?配合vLLM的量化推理,8卡跑70B完全没问题。另外你说4卡更稳,其实有一定道理,因为3090的NVLink带宽有限,8卡全开张量并行的话,all-reduce的通信延迟会明显拖慢速度,我自己的测试是4卡TP+2卡PP比8卡TP快接近20%。建议你先把量化跑通,然后试试TP=4、PP=2,序列长度控制在2048以内,显存大概每卡14-16GB,留出足够余量。还有个坑是vLLM的KV cache比例,默认0.9太高了,调成0.7左右能避免不少OOM。你跑的是什么任务?如果是长文本生成可能还得把max-model-len调低点。
8卡3090跑70B其实卡在KV cache和中间激活值,光看参数量没用。我试过TP=8确实容易OOM,因为allreduce通信开销太大,反而把显存和延迟都拖垮了。建议你试试TP=4+PP=2,同时开vLLM的--swap-space和--gpu-memory-utilization设为0.9,量化用AWQ的int4,推理速度能比FP16快不少。4张卡的话虽然能跑,但batch size稍微大点就吃紧,不如8卡稳。你用的什么量化脚本?有些版本对70B支持有bug。
8卡3090跑70B用TP=8确实容易卡在显存瓶颈上,因为KV cache和中间激活值会吃不少额外空间。我建议试试TP=4+PP=2的组合,这样每张卡压力小很多,而且vLLM对PP的支持现在也还行。另外量化到int8基本是无损的,能省下快一半显存,你可以先不开量化把TP和PP调好,再加--quantization awq试试。只用4张卡的话其实不太推荐,因为模型并行度低了batch size稍微大点就慢,不如8卡跑量化来得稳。
8卡3090跑70B,TP=8确实容易卡在显存带宽上,而且KV cache稍微一涨就爆。建议TP=4+PP=2,每卡显存占用大概能压到18-19GB,推理速度反而比TP=8快,因为跨卡通信少了。int8量化基本无损,可以无脑开,如果追求极致再试int4。4卡的话就别想了,70B int8也要34GB+,除非你肯上AWQ 4bit,但那样速度也就勉强能看。另外记得把vLLM的gpu-memory-utilization设到0.9,给KV cache留点余量。
建议TP=4+PP=2,配合AWQ量化,单卡占用能压到17G左右,速度也稳。只上4卡纯TP确实更省心,但吞吐会掉一截。
这问题我当初也踩过坑,8卡3090跑70B理论显存够,但vLLM的KV cache和激活值才是真正的隐形杀手。你直接tensor-parallel=8,每张卡22GB看着没爆,但一旦序列长度上去或者并发请求多一点,瞬间就OOM了,而且TP=8的通信开销在3090这种PCIe带宽下确实会拖慢速度。
我的建议是优先上量化,FP16换AWQ或GPTQ的4bit,显存占用直接砍半,8卡跑起来余量很大,速度反而比FP16的TP=8快不少。如果不想量化,那就别全上TP,试试TP=4配PP=2,但3090的NVLink带宽有限,PP跨节点通信会有点延迟,得自己调micro-batch大小。
另外你说只用4卡反而更稳,这个我试过,4卡跑70B int4是够的,但吞吐量会低一些,如果只是自己玩或者小团队用,完全够。真要上8卡,我建议先开--max-model-len 2048甚至1024,把KV cache压下来,再配合--gpu-memory-utilization 0.9,然后看日志里实际显存分配,慢慢往上加。
还有个容易忽略的点,vLLM的--dtype如果是auto,可能默认走了FP16,但你可以显式设成--dtype float16或者干脆用--quantization awq,这样显存预算就好算了。你可以先用官方脚本跑个基准测试,看每层占用多少,再决定怎么切,别盲调参数。
8卡3090跑70B,纯张量并行8确实容易卡在通信瓶颈上,而且每卡22GB已经接近24GB物理上限,kv cache稍涨就炸。建议试试tensor-parallel-size=4加pipeline-parallel-size=2,把层切两段,每段4卡并行,显存压力会小很多。另外int8量化基本无损,4卡跑int8其实比8卡跑fp16更稳,推理速度还更快,因为省了跨卡通信。你那个OOM大概率是max-model-len没调小,默认4096太长,改成2048试试。
别光盯着显存总量,3090的NVLink带宽其实撑不起8卡全并行,尤其70B这种大模型,中间激活值传输太吃紧。我实测过4卡tensor并行加AWQ的4bit量化,单卡占用才15GB左右,生成速度反而比8卡fp16快一倍。你可以先试试tensor-parallel-size=4,加--quantization awq,max-model-len设成2048,基本不会爆。要是还想用8卡,那就得上pipeline并行,但切分要注意每层大小均匀,不然卡间等待更严重。
你这问题我踩过坑,8卡全tensor并行是典型误区,70B的中间激活值会翻好几倍,22GB只是静态权重
量化到int4 + TP8就够了,速度比切流水线实在,别纠结显存数字。四卡跑还省心,吞吐差点但稳。
量化到int4加tp=8够跑,但慢多半是卡间通信瓶颈,试试先关掉pipeline只用tp=4。
8卡全上TP=8反而卡,试试TP=4+PP=2,显存和速度都能平衡不少。
说实话8卡3090跑70B这个配置挺尴尬的,显存总量看着够,但单卡24G的带宽和容量瓶颈卡在这儿。你tensor-parallel-size=8直接冲22G其实已经接近极限了,但vLLM的显存碎片和KV cache预留会让你OOM,我建议先把gpu-memory-utilization调到0.9试试,同时把max-model-len砍到2048,这样能挤出不少空间。另外你提到pipeline parallel,这玩意儿在vLLM里对70B这种规模收益不大,因为跨节点通信开销会吃掉大部分加速效果,除非你动手调过微批次大小,否则别指望它能解决爆显存。量化的话,int8 AWQ或者GPTQ我实测过,显存能压到15G左右,但推理速度会掉20%到30%,如果你对精度不敏感可以试试。至于只用4张卡,我反而觉得更稳,因为tensor parallel=4时每卡负载更均衡,而且通信瓶颈小,实际吞吐可能比8卡还高,你不如直接设成tp=4然后开两个模型实例做负载均衡。最后提醒一句,检查下你的vLLM版本,老版本对3090的Ampere架构支持不太好,升级到最新版有时候能白嫖不少显存优化。
8卡全上TP=8确实容易卡在通信瓶颈上,3090的NVLink带宽撑不住70B的all-reduce开销。建议试试TP=4+PP=2,把每张卡的激活显存压到16GB左右,吞吐反而能上来。不过PP的切分点得手动调,不然中间激活值还是会爆。量化的话int8够用,AWQ或者GPTQ都行,4bit会掉点明显,跑推理凑合但别微调。4卡跑的话显存是够,但batch size稍微大点就抖,还是8卡加量化稳。
8卡3090跑70B其实总显存够,但vLLM默认会把KV cache和激活全塞进去,TP=8时通信开销太大反而慢。我建议先试TP=4+PP=2,同时把max-model-len调低到2048或4096,再开gpu-memory-utilization=0.9,基本能稳。如果还爆,直接上AWQ或GPTQ的4bit量化,单卡占用能压到14GB左右,速度反而比硬切快。4卡跑的话得量化后才现实,不然序列长度稍微一长就完蛋。
8卡3090跑70B,纯靠TP=8确实容易爆,因为KV cache和activation占的显存比你算的要多不少。我自己试过TP=4+PP=2,配合AWQ的4bit量化,能稳定跑起来,速度比全精度快很多,你可以试试这个组合。另外你说只用4卡,其实更稳,因为卡间通信开销小了,吞吐反而可能更高,前提是量化后模型能塞进96GB。你vLLM版本是多少?新版对PP支持好很多,老版本建议升一下再调参。
8卡3090跑70B其实卡在KV cache和激活值上,纯张量并行8卡通信开销太大,速度反而崩。建议tp=4加pp=2,把层切两半,每卡负载能压到16-18GB,推理延迟还比纯tp8低不少。量化就别碰int4了,70B掉点太明显,int8配合awq够用。另外记得把gpu-memory-utilization设到0.9,vLLM默认预留太少容易莫名OOM。
说实话你这个问题我当初也踩过坑,8卡3090跑70B看着显存够,但vLLM默认会为每个张量并行rank预留一部分KV cache和activation空间,TP=8时每卡22GB其实是正常的,问题出在显存碎片和预留buffer上,不是单纯容量不够。我试下来最稳的方案是TP=4 + PP=2,这样每卡显存占用能压在16-18GB左右,而且因为3090的NVLink带宽在PP跨机通信上没那么吃紧,推理速度反而比TP=8快不少。至于量化,int8基本无损,AWQ或者GPTQ的4bit能省一半显存,但如果你要跑长上下文,建议还是先试FP16 + TP4/PP2的组合。另外你说只用4张卡,我试过TP=4纯张量并行,70B FP16理论要140GB,4*24=96GB肯定爆,所以4卡必须配合量化或者PP。还有个细节,vLLM里可以调gpu_memory_utilization参数,比如设0.85,别让KV cache把显存吃满,这样启动时不容易OOM。我自己最终是8卡跑TP4+PP2+AWQ4bit,显存占用大概每卡12GB,速度也够用,你可以参考下这个方向再调调。
8卡3090跑70B其实raw显存是够的,但你直接TP=8会触发all-to-all通信瓶颈,而且每卡要预留KV cache和activation空间,22GB看着没满但一跑就炸。建议先试TP=4+PP=2,vLLM里设--pipeline-parallel-size 2,这样每卡负载能降到15GB左右,吞吐比硬怼TP=8稳多了。量化的话int8基本无损,AWQ或GPTQ都能把显存压到12GB内,但3090跑int8推理速度提升有限,主要省显存。如果只上4卡,TP=4确实更省心,但长文本生成还是会吃紧,不如8卡TP=4+PP=2均衡。还有个坑是max-model-len别设太高,默认4096的话KV cache会吃掉好几GB,改成2048能省不少。
TP=8时KV cache和激活值才是大头,试试TP=4+PP=2,或者上AWQ量化,8卡跑4-bit很稳。
quantization是必须的,int8下TP=8勉强能跑,但速度瓶颈在通信,建议TP=4保吞吐。
说实话8卡3090跑70B确实挺极限的,TP=8每卡22GB基本就是卡在KV cache和activation上,vLLM默认预分配太激进了。建议你试试tensor-parallel-size=4加pipeline-parallel-size=2,同时把gpu-memory-utilization调到0.9,这样能留点余量给碎片。另外int8量化在这个规模下几乎是必须的,AWQ或者GPTQ都能把单卡占用压到14GB左右,速度反而比fp16更稳。4张卡确实更省心,但吞吐会掉一半,如果只是自己玩不如直接上量化。