最近在折腾本地部署,想用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卡3090跑70B其实卡在KV cache和激活值上,光看显存总量没用。建议tensor-parallel-size=4加pipeline-parallel-size=2,同时开vLLM的——enable-chunked-prefill,再把max-num-seqs调小到16,基本能稳在18GB左右。量化的话int8比int4省心,AWQ格式配合vLLM兼容性最好,但速度别指望太高。4卡跑会更稳但吞吐掉一半,看你更在意延迟还是吞吐了。
试试tp=4加AWQ量化,8卡dp跑两个实例,单卡占用能压到14G左右,吞吐还更高。
说实话8卡3090跑70B这个配置挺微妙的,显存总量看着够,但实际卡在KV cache和activation上。你直接tensor-parallel-size=8确实容易爆,因为每张卡要存完整的模型副本外加通信开销,22GB已经快到极限了。我自己的经验是tensor-parallel-size=4加pipeline-parallel-size=2会好很多,但得注意vLLM对PP的支持可能没TP那么成熟,有时候反而会慢。另外int8量化基本是必须的,不然就算显存不爆,计算效率也上不去,3090的FP16算力在通信瓶颈下根本发挥不出来。如果你只插4张卡,其实更推荐单独跑4卡TP,显存占用大概在18GB左右,而且省去了跨节点通信,延迟反而低。不过具体还得看你的模型——如果是用GQA的架构,KV cache能省不少,那8卡TP也不是不行,但要把max-seq-len调低,比如4096,再配合vLLM的continuous batching。还有个小坑,检查下你的CUDA版本和驱动,有时候OOM是因为碎片化,设置PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True能缓解。你要是方便的话,可以试试把模型拆成FP16的MLP加INT8的attention,虽然麻烦点但显存能压到19GB左右。最后问下,你的推理请求是长文本还是短文本?这个对显存分配影响挺大的。
8卡3090跑70B其实瓶颈不在显存总量,而在通信开销。TP=8时每层权重分到8张卡,但all-reduce同步太频繁,3090的NVLink带宽撑不住,速度肯定拉胯。建议TP=4+PP=2,每张卡显存占用大概13-14GB,留出KV cache余量,吞吐会好很多。量化的话,int8足够稳,AWQ或GPTQ都行,4bit会掉点但能塞下更长上下文。4卡跑反而更稳这个说法有一定道理,因为PP跨节点通信少,但batch size得调小,不然计算效率上不去。
8卡全上tensor parallel确实容易撞墙,70B光权重就140GB,加上KV cache和激活值,24GB卡单卡分到的余量太紧了。建议先试试tensor-parallel-size=4配pipeline-parallel=2,这样每张卡能省出不少空间给batch和显存碎片。另外int8量化在这种场景下几乎是必选的,AWQ或者GPTQ都能把权重压到70GB左右,速度反而比FP16卡死要快。4卡跑的话理论上更稳,但吞吐会掉一半,看你更在乎延迟还是并发。
试试tensor并行8加offload到CPU,或者直接量化成int4,8卡跑70B其实够用但别全塞显存。
8卡全上tensor parallel的话,通信开销太大,尤其3090那个nvlink带宽撑不住70B的allreduce,速度慢很正常。建议试试tp=4加pp=2,显存能压到18GB左右,吞吐反而比tp=8好。量化的话int8够用,AWQ或者GPTQ都行,4bit会掉点但能塞下更长上下文。4卡跑也不是不行,但得开量化,不然batch size只能设1,实用性差点。你vLLM版本最好升到0.4以上,老版本对pp支持有bug。
建议直接上4卡+int8量化,TP=4跑70B稳得很,8卡反而通信开销大还容易爆。
8卡3090跑70B其实挺尴尬的,张量并行8肯定不行,通信开销太大,而且KV cache一涨就爆。我建议试试TP=4加PP=2,把24GB卡当12GB用,虽然慢点但稳。或者干脆4卡TP=4跑int8,速度和显存都平衡,毕竟70B的int8也就70GB左右,4卡刚好放得下。你那个OOM大概率是没开--gpu-memory-utilization,默认只留了很少的KV cache空间。
说实话你这情况我踩过一模一样的坑,8卡3090跑70B光TP=8确实容易卡在22G边缘,因为每张卡还要留KV cache和activation的空间。建议TP=4+PP=2,或者直接TP=8但开--kv-cache-dtype fp8和--max-model-len压到2048试试,能省不少显存。int4量化其实更省心,AWQ或GPTQ格式在vLLM里支持得很好,速度反而比fp16高,4张卡跑int4完全够,8张卡纯属浪费电。你试试TP=4+int4权重,应该能稳在14G左右每卡,推理延迟还能降一半。
你这配置跑70B其实挺极限的,8卡全上TP=8的话,通信开销会吃掉不少带宽,22GB看着没爆但已经快到瓶颈了。我之前试过TP=4+PP=2,配合AWQ的4bit量化,单卡占用能压到14GB左右,推理速度反而比纯TP=8快。另外建议把vLLM的gpu-memory-utilization调到0.9,留点余量给KV cache。4卡跑int4其实也能稳,但吞吐会低一截,看你是追求并发还是延迟了。
8卡3090跑70B,tensor-parallel-size=8确实容易卡在22GB边缘,因为KV cache和中间激活值会额外吃显存。建议先开int8量化,配合TP=4+PP=2试试,单卡占用能压到18GB左右,速度反而比TP=8快。只上4卡的话,量化后也能跑,但batch size得调小,吞吐上不去。你用的是vLLM哪个版本?新版对PP的支持好不少,老版本容易出问题。
量化到int4吧,8卡全上tensor parallel其实通信开销太大,4卡加量化反而稳得多。
之前我也在8卡3090上踩过这坑,TP=8不是不行,但70B推理时KV cache和中间激活太吃显存了,把max-model-len调小点(比如2048)再配合--gpu-memory-utilization设成0.9会好很多。你试下TP=4+PP=2组合,单卡负载能压到17-18GB,速度比纯TP=8还快,因为跨卡通信开销小。另外int8量化基本是无损体验,AWQ或GPTQ都行,显存直接省一半,4卡跑都稳稳的。
说实话8卡3090跑70B纯张量并行确实容易卡在峰值上,24G看着够但激活值和KV cache一涨就爆。我建议试试TP=4+PP=2的组合,配合vLLM的流水线调度,显存占用能压到单卡18G左右,速度反而比TP=8稳。量化的话int8就够了,AWQ或GPTQ都行,int4质量损失有点大。另外你只跑推理的话,4卡TP=4其实最省心,吞吐差不了太多但显存余量充足,可以开大batch。
8卡3090跑70B光权重就要140GB,加上KV cache和激活值,192GB其实很紧。你TP=8每卡22GB说明已经接近极限了,慢大概率是跨卡通信瓶颈,试试TP=4+PP=2,同时把KV cache比例调低点。int8量化能省一半显存,速度反而可能更快,AWQ或GPTQ都可以试。4张卡跑int8其实挺稳,但吞吐量肯定不如8卡,关键看你要并发还是单流延迟。
70B用FP16光权重就140G了,8张卡均下来每张光权重就17G多,加上KV cache和激活值,24G肯定吃紧。你TP=8速度慢可能是通信开销太大了,3090没有NVLink走PCIe交换很吃亏。建议直接上AWQ或者GPTQ的int4量化,显存能压到40G左右,4张卡跑TP=4都够,速度还快不少。