最近在折腾本地部署,想用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 条量化到int4开awq,tp=4加pp=2,8卡刚好卡在边缘但能跑,速度比tp=8快不少。
说实话你这情况我太熟了,8卡3090跑70B看着显存够,实际坑全在KV cache和激活值上,tensor-parallel-size=8的话每张卡要同步通信,3090的PCIe带宽根本扛不住,速度慢很正常。我建议你先试试tensor-parallel-size=4加pipeline-parallel-size=2,这样每张卡压力小很多,而且3090之间用NVLink的话延迟还能接受。另外你肯定得量化,int8是底线,int4的话用AWQ或者GPTQ都能把显存压到15GB左右,这时候TP=8才可能跑得动,但速度也就图一乐。至于4张卡,我之前试过TP=4跑70B int4,虽然每张卡能剩点显存,但batch size稍微调大一点就直接OOM,所以真的不建议。你可以先看下vLLM的官方文档里针对多卡部署的示例配置,我记得有个参数叫gpu-memory-utilization,默认是0.9,你手动调到0.85左右能留出更多余量给碎片。最后提醒下,别光看显存总量,3090的显存带宽跑大模型就是短板,实在不行就换70B的量化蒸馏版,比如Llama-2-70B-Chinese-4bit,效果差不了太多但省心多了。
说实话8卡全上tensor parallel反而会卡在通信瓶颈上,3090的NVLink带宽撑不住70B这种尺寸。我之前试过tp=4加pp=2,显存大概每卡能压在18GB左右,推理速度比tp=8快不少。量化的话int8基本无损,建议先用这个试,4卡跑的话确实更稳但吞吐会掉一半,看你更看重延迟还是并发。
说实话8卡3090跑70B这个配置我折腾过挺久的,你这问题我太熟了。tensor-parallel-size=8确实容易爆,因为每张卡除了要放权重,还得留KV cache和中间激活值,22GB已经顶到物理上限了。我后来是切成tp=4加pp=2,显存大概每卡能压到18-19GB,推理速度反而比tp=8快不少,因为通信开销小了。不过pp=2得注意切层别太随意,我建议把70层左右均匀分两段,中间用pipeline的微批次填满,不然流水线气泡太大照样慢。量化确实是另一条路,int8的话权重直接减半,tp=8也能轻松跑,但你要是追求质量就别上int4,3090的推理效率会打折。用4张卡的话更稳,但我觉得既然有8张就别浪费,试试tp=4、pp=2、再加个gpu-memory-utilization设到0.95,应该能解决。对了,vLLM版本也很关键,老版本对多卡并行支持有bug,你升级到最新版再试,我上次就是版本太旧才一直OOM。
你这配置其实挺典型的,问题不是显存总量不够,而是vLLM默认把KV cache和激活值也算进显存了,8卡全上TP=8的话,每张卡除了模型权重还得塞下完整的中间状态,22GB看着没满但实际已经到瓶颈了。我建议先试TP=4+PP=2,这样每张卡的通信压力小很多,而且3090的PCIe带宽撑不住TP=8的all-reduce,速度慢多半是卡在互联上。量化的话int8基本无损,AWQ或GPTQ都行,4bit能省一大半显存但质量会有轻微下降,看你任务敏感度。只上4张卡确实更稳,因为显存占用和通信开销都线性下降,但吞吐量会减半,如果追求并发还是得8卡。另外记得开vLLM的--gpu-memory-utilization,别让它默认吃满,留个2-3GB给CUDA context,我之前就是没调这个一直OOM。你试过把max-model-len调低吗?有时候长上下文才是显存杀手。
说实话你这情况我太熟了,8卡3090跑70B看着显存够,但vLLM默认会把KV cache和激活全塞进张量并行,每张卡22GB已经接近物理上限,稍微波动就OOM。我建议你先别急着上TP=8,试试TP=4 + PP=2,这样通信压力小一半,而且3090的PCIe带宽扛不住全量张量并行,速度慢大概率是卡间通信瓶颈。量化倒是更直接,AWQ或者GPTQ的4bit版本能让显存占用直接砍到120GB左右,TP=8也能留出余量,不过精度损失得自己评估。至于只用4张卡,我觉得反而更稳,显存足够还能开大batch,推理吞吐不一定比8卡差,毕竟3090的NVLink没有,跨卡同步开销太大。我之前跑过类似配置,TP=4 + PP=2 + int8,启动参数可以试下--tensor-parallel-size 4 --pipeline-parallel-size 2 --quantization awq,batch size设8左右,显存峰值大概16GB,速度能接受。另外注意下vLLM版本,老版本对PP支持不好,升到最新版再试。你用的是哪个量化格式?如果是FP16那确实得切流水线,不然怎么都悬。
8卡3090跑70B硬上TP=8确实容易卡在显存瓶颈上,因为每层权重和KV cache都得整卡复制一遍。我建议试试TP=4+PP=2,把激活值通信压下来,同时用--gpu-memory-utilization 0.9留点余量,速度会比纯TP=8稳不少。另外int8量化其实挺香的,AWQ或者GPTQ加载后显存能省到16G左右每卡,推理吞吐反而上去,你可以先拿4卡配int8试试,说不定比8卡fp16还快。
8卡TP=8的话通信开销太大,建议TP=4+PP=2,量化到int8基本稳。
试试TP=4+PP=2配AWQ量化,显存和速度都能兼顾。
TP=4+PP=2试试,显存占用能压到16G左右,速度比纯TP=8快不少。量化到int8更稳,3090跑70B完全够用。
说实话8卡全上tensor parallel确实容易炸,3090的24G算力够但显存带宽是瓶颈,70B光权重就得140G,加上KV cache和激活值肯定超。建议试试tensor-parallel-size=4加pipeline-parallel-size=2,再把max-model-len调低到2048,应该能压进20G以内。另外int8量化是刚需,fp16基本没戏,AWQ或者GPTQ都行,速度反而比硬撑fp16快不少。你要是只跑推理不用微调,4卡TP4+量化其实最稳,吞吐还高,8卡反而通信开销拖后腿。
TP=8确实容易撞墙,建议TP=4+PP=2,顺便开下vLLM的chunked prefill,速度能救回来。
量化到int8再配TP=4基本稳了,3090的带宽跑70B推理速度还行,别硬上TP=8。
8卡3090跑70B,TP=8确实容易卡在显存带宽上,22GB看着没满但通信开销会拖垮速度。建议试下TP=4+PP=2,把KV cache和activation的峰值压一压,vLLM里还能开--enable-chunked-prefill缓解碎片。量化我觉得int8够用,4bit掉点有点明显,尤其数学推理任务。只用4张卡的话能跑但batch size得压到个位数,吞吐反而不如8卡PP切分。另外别忘了开--gpu-memory-utilization 0.95,给nvlink留点余量。
8卡3090跑70B其实tensor-parallel=8是对的,但OOM大概率是显存碎片化或者KV cache没调好,你可以试试把gpu-memory-utilization设到0.9,再把max-model-len砍到2048,基本能跑起来。速度慢的话建议上AWQ或者GPTQ的4bit量化,显存直接砍半,吞吐能明显上来。至于4卡,能跑但batch size稍微大点就炸,不如8卡量化后稳,我这边实测TP=8加int4是最优解。你用的是哪个版本的vLLM?新版对并行策略优化挺多的,升级下说不定就好了。
8卡全上tensor parallel=8的话,每张卡要存完整权重副本的切片加激活值,22GB确实会顶到瓶颈,而且跨卡通信开销在3090这种没NVLink的卡上特别吃亏。我建议试试TP=4+PP=2,或者干脆TP=4+DP=2,把batch拆开跑,显存压力会小很多。量化的话,int8 AWQ在70B上效果挺稳的,显存能压到14GB左右,4bit更极致但推理速度会掉一点。至于4卡跑,其实更推荐,因为3090的PCIe带宽限制下,8卡同步反而拖慢速度,4卡TP=4配量化后跑70B完全够用,延迟还更低。
说实话你这情况我太熟了,当时我拿8卡3090跑70B也是这么折腾过来的。8卡张量并行确实会炸,因为每层权重和KV cache的通信开销在跨卡时是几何级增长的,22GB看着没满但实际已经触到CUDA memory pool的瓶颈了。我后来试了tensor-parallel-size=4 + pipeline-parallel-size=2的组合,虽然吞吐量会掉一点,但至少每卡显存能压在18GB以下,推理也不至于卡成PPT。不过你提到量化,我建议优先试下AWQ或者GPTQ的4bit,实测70B int4在8卡上能跑到每卡14GB左右,速度还比FP16的4卡并行快不少。至于只插4张卡,我个人不建议,因为3090的NVLink带宽本来就弱,4卡时张量并行反而会把通信延迟放大,不如8卡+量化稳妥。另外记得把vLLM的gpu_memory_utilization调到0.9,默认0.8太保守了,还有swap空间设大点,偶尔能救急。你试过用--max-model-len限制到2048吗?有时候上下文长度设置太大会让KV cache预留暴涨,这个参数改动对显存影响特别明显。
你这情况我上周刚踩完坑,8卡全上tensor-parallel=8确实会炸,因为每张卡还要留KV cache和activation的空间。建议试试tp=4加pp=2,vLLM里直接设pipeline-parallel-size=2,显存能压到16-18G左右。另外int8量化基本无损,能省不少,4卡跑tp=4反而更稳,速度也就慢个两成。
8卡全上反而卡,试试tp=4加int8量化,4张卡跑起来更跟手。
8卡全上tensor parallel的话,通信开销会把显存带宽拖垮,3090的nvlink带宽也撑不住。建议试试tp=4加pp=2,同时开起来,显存占用能压到18G左右,速度比tp=8快不少。量化的话int8配合awq或gptq能稳很多,4bit的话基本可以单卡塞下70B但质量损失明显。4卡跑的话确实更稳,但吞吐量会降一半,看你是要并发还是单请求延迟了。
这题我踩过坑,8卡全上tensor parallel反而会卡在通信瓶颈上,尤其3090的nvlink带宽撑不住70B的all-reduce。建议tensor-parallel-size=4加上pipeline-parallel-size=2,每卡负载能压到13GB左右,速度反而比8卡纯TP快。量化的话int8够用,fp16稍微改下rope和swiglu的显存分配也能塞进去,但别上4bit,掉点太明显。4卡跑确实更稳,但得开offload或者用flash attention省显存,不然batch size一上去照样爆。
实测tp=8通信开销太大,建议tp=4+pp=2,再加awq量化,显存稳得很。