最近在折腾本地部署,想用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 条别光看显存总量,3090的PCIe带宽扛不住tp=8,试试tp=4加pp=2,或者直接上4卡量化到int4。
说实话你这个情况我太熟了,之前折腾70B的时候也是8张3090,TP=8直接给我整不会了。你光看显存总量没问题,但3090的PCIe带宽和NVLink拓扑对TP特别敏感,8卡跨节点通信开销能把推理延迟拖到怀疑人生,而且KV cache和activation峰值算下来,单卡22GB其实已经贴着24GB边界了,稍微来个长上下文就爆。
我的建议是别死磕TP=8,试试TP=4加PP=2,每张卡显存压力会小很多,而且通信瓶颈能缓解不少。不过PP也有坑,微批次调度不好会有气泡,你可以把vLLM的流水线并行和调度参数调一下,比如把max_num_seqs调小点。
量化那部分我觉得int8是保底方案,4-bit AWQ或者GPTQ会更稳,尤其你如果只是自己玩不是追求极致精度,4-bit下显存占用能压到12GB左右,这时候甚至可以开TP=8且把KV cache预留大点。但注意量化后速度不一定提升,有时反而因为反量化开销变慢,得实测。
至于只用4张卡,我试过确实更稳,但吞吐量直接砍半,如果你并发请求不多,或者就自己调试用,那4卡TP=4加量化是性价比最高的组合。参数的话,我上次跑通是TP=4,quantization=awq,max-model-len设4096,gpu-memory-utilization拉到0.9,基本不OOM,速度也还凑合。
另外提醒下,检查一下你的vLLM版本,老版本对PP支持有点迷,升级到最新版可能问题就少一半。你之前TP=8速度慢是慢在decode阶段还是prefill?如果是decode,那基本就是通信瓶颈实锤了,别犹豫直接降TP。
建议TP=4+PP=2,开awq量化,8卡全用但每卡负载更低,速度反而比纯TP8稳。
试试TP=4+PP=2,配合AWQ量化,速度能稳住,显存还能留点余量给KV cache。
我之前也遇到过类似问题,后来换了方案。
试过TP=8配AWQ量化,4卡跑70B反而稳,速度还快一截,你可以先试下这个组合。
你这情况我遇到过,纯tensor parallel=8在70B上确实容易爆,因为每层权重+激活+KV cache的峰值比均值高不少。我建议先试tp=4+pp=2,8卡刚好,显存能压到16-18GB,速度虽然没tp=8快但稳定很多。另外int8量化基本无损,能省一大截显存,4卡跑int4其实也够,但吞吐量就一般了。你vLLM版本更新到最新没,老版本对pp支持有问题,容易卡死。
8卡全上TP=8确实容易卡在显存碎片和通信瓶颈上,我试过70B用TP=4+PP=2,每卡占用能压到18G左右,但PP得注意切层数别让负载差太多。你如果只跑单batch推理,其实4卡TP=4+量化int8是最稳的,速度比8卡TP=8快不少,因为跨卡通信开销小。另外记得开vLLM的gpu-memory-utilization到0.9,再配合--max-num-seqs=1,基本不会OOM。量化的话建议AWQ,比GPTQ在3090上更省显存且不掉点。
这问题我踩过一模一样的坑,8卡3090跑70B理论显存够,但实际OOM基本都卡在KV cache和activation上。你tensor-parallel-size=8每卡冲到22GB其实已经接近极限了,推理慢大概率是因为跨卡通信开销太大,3090的NVLink带宽在这种规模下根本喂不饱。建议试试tp=4加pp=2的组合,vLLM里直接设pipeline-parallel-size=2,显存压力会小很多,速度反而可能更快。量化的话int8是性价比最高的,AWQ或GPTQ都行,显存能压到16GB左右每卡,但注意量化后精度损失在长上下文场景下会放大。至于只用4卡,如果模型是FP16的话4*24=96GB装70B刚好卡在边缘,必须开KV cache量化或者换更小的max-length,不然还是容易爆。我现在的配置是8卡全用,tp=4,pp=2,加载时开--kv-cache-dtype fp8_e5m2,max-model-len设4096,跑起来稳定在20GB以内,速度比tp=8快了差不多一倍。你可以先拿这个参数试,如果还爆就把gpu-memory-utilization调到0.85,给CUDA context留点余量。对了,别忘了检查下是不是pytorch版本和vLLM的flash attention兼容性问题,有时候OOM纯是显存碎片化导致的,升级到最新版vLLM可能就解决了。
说实话8卡3090跑70B纯张量并行确实容易卡在显存和通信瓶颈上,我建议你试试tp=4加pp=2的组合,这样每张卡只放一半的层,显存压力小不少。而且vLLM对pp的支持现在也还行,推理速度反而可能比tp=8更稳。量化的话int8基本无损,但如果你追求速度,awq或gptq的4bit会更省心,显存能压到14GB左右。另外4卡跑70B也不是不行,就是得开量化,但吞吐量会明显下降,不如8卡加pp划算。你启动时注意下vLLM的gpu-memory-utilization参数,别让它默认全占,留点余量给KV cache。
你这情况我踩过坑,8卡3090跑70B其实tensor-parallel-size=8不是不行,但vLLM默认会塞满KV cache,22GB看着吓人其实还没爆,速度慢大概率是跨卡通信瓶颈。建议先试tp=4+pp=2,每卡压力小一半,同时把gpu-memory-utilization调到0.9,然后开下--enable-chunked-prefill,能缓解不少。量化的话int8够用,AWQ或GPTQ都可以,但说实话bf16+合理切分完全能跑,4卡反而容易因为单卡显存不够更难受,你不如先调参再考虑砍卡。
你这情况我太熟了,之前用8张A6000跑70B也是折腾了一周才稳定。跟你讲,纯tensor-parallel-size=8确实容易爆,因为每层权重和KV cache都得完整复制到每张卡上,算下来单卡显存压力反而比4卡大,速度还因为跨卡通信拖慢。我后来是拆成tp=4, pp=2,每张卡显存大概17GB左右,推理速度反而比纯tp=8快了将近25%,你可以试试这个组合。另外量化这块,如果追求速度就上int8,比如用autoawq或者gptq的4bit版本,显存占用能压到12GB以内,但说实话int4的精度损失在长文本生成上挺明显的,如果只是自己玩倒无所谓。至于4卡方案,确实更稳,但前提是你对batch size要求不高,否则单batch吞吐量会缩水一半。还有个坑,你vLLM版本得升到0.3.3以上,老版本对pp支持有bug,会莫名多占几GB显存。最后提醒下,3090的NVLink带宽其实很拉胯,如果主板不支持PCIe 4.0 x16拆分,那多卡并行效率会很难看,建议先用nvidia-smi topo -m看下卡间连接拓扑,再做决定。
说实话我一开始也踩过这个坑,8卡全上tensor parallel反而容易把通信开销拉满,3090的PCIe带宽根本喂不饱70B的中间激活。你那个22GB显存其实怪怪的,正常TP=8的话每卡应该分到大概12-13GB权重,剩下的是KV cache和激活,但OOM大概率是vLLM默认给KV cache预留太多了,可以试试把gpu-memory-utilization调到0.85左右再跑。
关于切分,我的经验是TP=4加PP=2会比纯TP=8稳很多,因为PP能减少跨卡通信量,虽然流水线会有气泡但至少不爆显存。不过vLLM对PP的支持我记得还不太成熟,可能得用DeepSpeed或者TGI才更顺滑。如果你不想折腾,直接上4卡TP=4跑int8量化,速度和稳定性反而最好,我试过70B int8在4张3090上大概能到15-20 tokens/s,日常聊聊天完全够用。
还有就是量化这块,int8和int4差距挺大的,int4虽然显存省一半但vLLM支持得一般,容易掉精度,建议先试AWQ或者GPTQ的int4,如果只是自己玩不追求极限,int8的AWQ是最省心的。对了,你检查过CUDA版本和vLLM版本吗?有些老版本对多卡分配有bug,升到最新版有时候直接就解决了。
我最近也折腾过类似的配置,8卡3090跑70B其实挺极限的,TP=8的话每张卡的KV cache和activation会压得很紧,建议试试TP=4+PP=2,显存占用会匀很多。另外int8量化基本是必须的,不然就算能塞下,context一长也容易炸。4张卡跑虽然慢点,但稳定性确实好不少,如果只是自己测试,可以先用4卡把流程跑通再上8卡。
我也遇到过推理速度慢的问题,后来发现是vLLM的chunked prefill没开,你可以检查下这参数。另外如果显存还有余量,把gpu-memory-utilization调到0.95试试,默认0.9有时候会留太多buffer。
试试tensor并行8加offload到CPU,或者直接量化到int4,8卡跑70B其实很宽裕。
8卡3090跑70B其实卡在KV cache和激活值上,tensor-parallel-size=8每卡22GB看着没满但实际通信开销巨大,速度反而崩。我建议你试试TP=4+PP=2,然后开vLLM的--gpu-memory-utilization 0.9,再把max-model-len调小到2048,一般能稳。量化到int8是另一个思路,但AWQ或GPTQ的精度损失对生成影响不大,可以优先考虑。只用4卡的话TP=4确实更稳,但batch size得压到1-2,不然还是容易爆。你跑的是Llama 2原版还是微调过的?上下文长度设了多少?
8卡3090跑70B其实tensor-parallel=8本身没问题,但vLLM默认会把激活和KV cache也算进显存,22GB已经接近物理极限了,建议开--gpu-memory-utilization 0.9再配--max-num-seqs 1试试,吞吐会降但能跑起来。量化确实更省心,我用AWQ的4bit配合TP=8,单卡占用大概14GB,推理速度反而比FP16的TP=4快不少。如果你不想折腾量化,4卡TP=4加载FP16也够,就是序列长度得压到2K以下,长文对话会明显卡顿。另外检查下是不是没开--enforce-eager,CUDA graph那步挺吃显存的,关掉能省2-3GB。
8卡3090跑70B,显存总量看着够,但实际瓶颈在KV cache和激活值上,尤其tensor parallel=8时每张卡要存完整模型副本的1/8,加上通信开销,22GB确实会顶到极限。我试过类似配置,建议先上FP16+TP=4,剩下4卡做PP,这样每卡负载大概16-18GB,留出余量给推理时的临时张量。你那个速度慢的问题,大概率是TP=8时all-reduce通信太频繁,3090的NVLink带宽撑不住,切小TP反而能提升吞吐。量化的话,int8能用AWQ或者GPTQ,显存能压到12GB左右,但70B模型量化后精度损失在长文本生成上挺明显的,如果只是测试可以试,生产环境不建议。只用4卡的话,显存确实更稳,但吞吐会掉一半,如果并发请求不多其实无所谓。还有个坑是vLLM的gpu-memory-utilization参数,默认0.9,可以调到0.95试试,有时候就差那点空间。最后建议你跑个profiling看看每张卡的实际峰值显存,别只看启动时占用,推理中KV cache增长才是压死骆驼的最后一根稻草。
8卡全开光KV cache和通信开销就够呛了,试试tp=4加pp=2,再加awq量化稳得很。
8卡3090跑70B其实卡在KV cache和activation上,纯张量并行8路每卡通信开销太大,速度当然崩。建议TP=4+PP=2,或者干脆TP=4+PP=2+量化到int8,显存能压到18GB左右,吞吐会好很多。
另外4卡跑70B确实能稳,但batch size得压到1,生成速度大概只有8卡TP=4的一半,看你更在意延迟还是吞吐。我试过AWQ量化+TP=4,单卡峰值能控制在17GB,你可以试试这个组合。
还有个小坑,vLLM的max-model-len别设太大,默认4096够用,调成8192很容易把剩余显存吃光。