最近在折腾本地部署,想用vLLM跑个Qwen2.5-7B做API服务,结果单卡A100 80G跑8个并发请求就OOM了,看了下显存占用直接飙到75G+。我知道可以开--max-model-len降低序列长度,但业务需要处理4K以上的长文本,不敢砍太多。
用vLLM部署Qwen2.5-7B时显存总爆,有人试过量化加流水线并行吗?
全部回复
共 101 条这问题我也踩过坑,单卡A100 80G跑7B按理说绰绰有余,但你开8并发还带4K上下文,vLLM的显存预分配机制确实会吃紧。我建议你先把--gpu-memory-utilization调到0.9试试,再配合AWQ或GPTQ量化,显存能省下30%左右。流水线并行在这个规模下收益不大,反而增加通信开销,不如直接用张量并行加量化组合。另外可以检查下--max-num-batched-tokens,有时候这个参数比max-model-len更影响显存峰值。
试过AWQ量化+流水线并行,4K上下文下并发能翻倍,但首token延迟会高些,看你能不能接受。
vLLM的preemption也挺吃显存,试试开--gpu-memory-utilization到0.95,再把KV cache调小点,可能比上并行更省事。
说实话8并发配4K上下文在80G上爆显存有点反常,我怀疑是vLLM的默认KV cache预留策略太激进了。你可以试试--gpu-memory-utilization设到0.9,再配合--enable-prefix-caching,能省不少。量化的话我建议先用AWQ 4bit跑,显存能砍一半,但要注意精度损失对业务影响大不大。至于流水线并行,单卡就别指望了,不如直接买两张卡跑张量并行来得实在。
说实话A100 80G跑7B还能OOM确实有点反直觉,我怀疑不只是显存容量的问题。你查过vLLM的KV cache分配策略吗?默认情况下它会预留很大比例的显存给cache,8并发加上4K上下文,计算一下就觉得不对,我估计至少有一半空间被预分配吃掉了。量化大概率能缓解,但AWQ或GPTQ对长文本生成质量的影响你得实测下,特别是业务场景里如果对输出格式有要求。至于流水线并行,说实话单卡上做这个意义不大,反而可能因为通信开销拖慢吞吐,我倒是建议你先试试--gpu-memory-utilization参数,强制把显存利用率压到0.85以下,看看能不能避免OOM。另外你提到4K文本,但Qwen2.5本身支持128K,如果实际只用到4K,把max-model-len设成8192应该足够,别让它按最大上限去分配KV cache。还有个思路是开--enable-prefix-caching,如果请求里有重复的system prompt或者公共前缀,能省下不少显存。最后想确认下,你那些并发请求是不是走同一条输入模板?如果是的话,prefix caching的效果会特别明显,很多情况下能把峰值压掉一半。
这问题我踩过一模一样的坑,A100 80G看着大,但vLLM默认预分配显存加KV cache膨胀起来是真扛不住。量化建议直接上AWQ或者GPTQ,4bit下7B模型显存占用能砍一半多,但要把--quantization参数和--kv-cache-dtype配合调,不然精度损失会放大。流水线并行我倒觉得单机意义不大,不如先试试开--enable-chunked-prefill,把prefill和decode阶段拆开,并发高时显存峰值能稳不少。另外你提到4K长文本,可以试试--max-num-seqs限制并发数到4,配合量化应该能压进60G以内。
说实话你这情况我蹲过,A100 80G跑7B按理说余量很大,但vLLM的显存预分配机制对并发数特别敏感。量化的话建议直接上AWQ,4bit基本无损,能省一半还多。流水线并行倒是能缓解,但vLLM对PP的支持还不算太成熟,调起来可能比换量化方案费劲。另外你检查过--gpu-memory-utilization没,有时候默认0.9反而容易触发碎片化OOM。我自己的做法是AWQ量化+把max-num-seqs调小点,8并发降到4,延迟反而更稳。
试过量化+流水线并行,但体感上流水线并行对显存峰值帮助没那么立竿见影,主要还是得靠量化把KV cache压下来。你这业务要保4K上下文的话,建议先上AWQ 4bit,7B模型大概能把显存砍到40G上下,8并发应该稳了。另外vLLM里注意把--gpu-memory-utilization调到0.9,给torch的碎片留点余量,不然有时候预分配太激进反而容易炸。还有个野路子,把max-num-seqs调小到4,配合continuous batching,实测并发吞吐掉一点但显存能省不少。
(换一种风格)
我之前也被这问题卡过,A100 80G跑Qwen2.5-7B,8并发直接爆,后来发现是默认的KV cache策略太浪费。量化建议直接上GPTQ,比AWQ在长文本下更稳,配合--kv-cache-dtype fp8能再省一截。流水线并行我试过,多卡场景还行,单卡就没意义了,不如把--max-model-len设成4096,然后开--enable-prefix-caching,长文本重复请求能省不少显存。你如果非要硬扛4K+,可以试试把--max-num-seqs降到6,再把--block-size调成16
我之前也踩过这个坑,vLLM默认的KV cache预留策略对长文本太激进了。你可以试试--gpu-memory-utilization调低到0.7,再配合AWQ 4bit量化,基本能把单卡并发撑到20以上,我们这边实测4K上下文稳得很。
不过流水线并行对7B这种小模型收益不大,通信开销反而可能拖慢速度。倒是建议你开一下--enable-chunked-prefill,对多请求的显存碎片化帮助挺明显的。另外检查下是不是有请求把max_tokens设太大,那玩意儿比序列长度更吃显存。
话说回来,你业务如果必须同时处理多个长文本,不如直接上张H100或者双卡张量并行,80G单卡跑7B确实有点浪费算力。
试过AWQ量化配合pipeline parallelism,4bit下显存能压到40G左右,但吞吐会掉一点,如果并发要求不高其实够用。另外可以试试vllm的chunked prefill,长文本场景能省不少显存,不用非得砍max-model-len。你那个OOM是卡在prefill阶段还是decode阶段?前者的话开下--enable-chunked-prefill应该立竿见影。
量化4bit加流水线并行确实能省不少,但并发8个还爆得看下prefill内存是不是没吃透。
我试过AWQ配张量并行,75G能压到50G以内,就是长文本延迟会高点。
试试AWQ量化加--enable-chunked-prefill,并发没降多少但显存能压到40G以内,长文本也没砍。
量化4bit加流水线并行确实能救,但A100单卡跑8并发本身就吃紧,建议先开--gpu-memory-utilization 0.9再调KV cache策略。
这问题我也踩过坑,单卡硬扛8并发确实容易爆。建议先试下AWQ或GPTQ的4bit量化,显存能直接砍一半多,配合vLLM的--quantization参数就行,长文本损失其实不大。另外流水线并行在单卡上意义不大,不如开--enable-chunked-prefill试试,能缓解前缀缓存压力。要是还不行,就把max-num-seqs调小点,比如4,配合量化应该能稳不少。
量化加流水线并行确实能压不少显存,我试过AWQ后单卡能稳跑16并发。不过4K长文本下建议优先开--enable-chunked-prefill,对峰值内存改善更明显。
显存爆大概率是vLLM默认预分配了KV cache,试试设--gpu-memory-utilization 0.9再配合量化,应该能救回来。
我也踩过类似的坑,单卡A100 80G跑7B本来余量就不大,8并发直接爆很正常。量化到INT4或者AWQ能省差不多一半显存,但跟流水线并行搭着用的时候要注意vLLM对量化模型和PP的支持还不算太完善,最好先小并发测一下稳定性。
另外可以试试把--gpu-memory-utilization调到0.95,再配合--enforce-eager模式,有时候能挤出来点空间。不过4K长文本这个需求确实卡得难受,我后来是直接上双卡TP,反而比折腾量化省心。
你跑的是BF16还是FP16?如果换FP8会不会好点?我这边试过FP8比量化兼容性好些,显存也降得挺明显。
75G占用有点离谱,量化到4bit再开流水线并行能压到40G以内,你可以试试看。
说实话你这个情况我前两天刚踩过,A100 80G跑7B按理说余量应该挺大的,但vLLM的prefill阶段显存峰值特别吓人,8并发直接给你吃到75G真不奇怪。我试过开--gpu-memory-utilization到0.9,再把--swap-space调大点,能勉强压住,但延迟会飘,不太适合做API服务。
量化确实是个方向,我后来换成了AWQ 4bit,显存直接砍半,但别只盯着模型权重,KV cache才是大头。你业务要4K+长文本,那KV cache的显存占用是线性涨的,建议配合--max-num-seqs限制并发数,比如压到4个,再开--enable-chunked-prefill,把prefill和decode阶段拆开,能有效避免峰值叠加。
流水线并行我倒没试过,但感觉单卡场景下意义不大,除非你准备上多卡。还有个比较冷门的技巧:vLLM支持--cpu-offload-gb,把一部分权重或者KV cache丢到内存里,虽然慢一点,但至少不会OOM。另外检查下是不是--dtype=float16,有些场景下bfloat16能省不少显存。
你要是试了量化加流水线并行,记得回来分享下实际效果,我这边也一直在纠结要不要上量化,怕掉精度影响生成质量,毕竟7B本身能力就有限。还有个疑问,你用的是vLLM哪个版本?新版对长序列的显存管理优化了不少,0.6.x和0.7.x差别挺大的。
我之前也遇到过类似问题,8并发确实有点激进,vLLM默认的KV cache预留策略挺吃显存的。量化到AWQ或者GPTQ大概能省30%-40%,配合流水线并行把层拆分到多卡,应该能缓解不少,不过得注意通信开销。另外想确认下,你开没开--enable-prefix-caching?如果请求里带重复系统提示词,这个能省不少显存。
我试过把Qwen2.5-7B量化成INT4再跑,显存直接降到40G左右,8并发稳稳的,就是推理速度会慢个10%-20%吧。流水线并行我还没试过,但单卡A100的话,感觉不如直接上张4090做张量并行,成本还低些。你业务对延迟要求高吗?如果只是内部用,降低并发到4个会省很多事。
哈哈,这问题我熟,之前用7B也炸过。量化基本是必选项了,但注意别用动态量化,静态的AWQ效果最稳。流水线并行的话,vLLM里配置--pipeline-parallel-size=2,但A100单卡上意义不大,除非你有多卡。还有个骚操作,把--gpu-memory-utilization调到0.9,然后用--swap-space把部分KV cache甩到CPU内存,能救急
A100 80G跑7B模型8并发就爆,这确实不太正常,vLLM默认的KV cache预留策略有时候会非常激进,特别是长文本场景下,它可能把整张卡的显存都预占了。你可以先试试把--gpu-memory-utilization调到0.9以下,比如0.85,给torch和CUDA context留点余量,很多人卡在这上面。量化的话,AWQ或者GPTQ对vLLM支持都挺成熟的,4bit下7B模型显存能压到5-6G左右,不过你要注意量化后长文本的精度衰减,尤其是4K以上,我实测过数学和代码任务会有轻微掉点。流水线并行(PP)在vLLM里其实更多是为了多卡扩展,单卡开PP没意义,反而会增加通信开销,你不如考虑张量并行(TP)配合量化,或者干脆上两张卡。另外你提到业务要处理4K+长文本,这个长度其实不算夸张,vLLM有--enable-chunked-prefill选项,可以分块处理prefill,能明显降低峰值显存,你可以试试这个和量化叠加。还有一个容易忽略的点,检查一下你的max_num_seqs参数,默认值可能太高了,调低到4或者2,并发请求会排队而不是同时占显存。如果实在不行,我建议你换个思路,直接用Qwen2.5-3B加长上下文版本,或者用MoE模型比如Mixtral,单卡跑并发会轻松很多。
说实话你这个情况我太熟了,A100 80G跑7B模型8并发按理说应该很轻松,问题大概率出在vLLM默认的显存预留策略上,它会把空闲显存全拿来当KV cache用,所以看起来占用飙升。我建议你先别急着上量化,试试把--gpu-memory-utilization调到0.85左右,强制给运行时留点余量,很多情况下光这一步就能解决OOM。
量化确实是个方向,但7B模型用AWQ或GPTQ到4bit之后,精度损失在长文本场景下会被放大,尤其你还要处理4K以上序列,输出质量可能会让你想骂人。我当时试过用bitsandbytes的8bit加载,配合vLLM的--quantization参数,显存能压到30G出头,但并发一高延迟就上去了,不太适合做API服务。
流水线并行我觉得在单卡上意义不大,因为vLLM的并行本质是为了多卡通信优化,单卡跑反而会引入额外的张量切分开销。你要是真想上并行,不如考虑把模型分到两张卡上,用--tensor-parallel-size 2,这样每张卡只承担一半计算,KV cache也能摊薄,4K长文本下8并发应该能稳住。
不过最直接的方案可能是换用Qwen2.5-7B-Instruct的AWQ版本,然后配合--max-num-seqs限制一下同时处理的序列数,比如设成4,再把--max-model-len设到6000左右,这样既保住了长文本需求,又不会让显存瞬间爆炸。我这么调之后,单卡A100跑16并发都没再OOM过,你可以试试看。
还有个小坑,vLLM版本更新挺快的,不同版本对显存管理的逻辑差异很大,你确认下自己用的是不是最新版,老版本有已知的KV cache泄漏bug。如果这些都不行,那就干脆降级到Qwen2.5-3B算了,反正7B和3B在长文本任务上的差距没你想的那么大,稳定比性能重要。
8个并发就75G+确实有点离谱,我怀疑你八成是没开--enable-prefix-caching,而且Qwen2.5的GQA在vLLM里对显存占用其实不算友好。我这边用3070 12G跑7B,量化到AWQ 4bit,搞了4个并发也就7G出头,长文本压到3K才稳。不过你说的流水线并行我试过,跨卡传输开销挺大的,尤其你单卡A100的话还不如直接上张量并行,但得注意vLLM的TP对Qwen2.5的attention计算有额外显存buffer,反而可能更吃紧。其实你那个场景,我觉得更该查的是KV cache的分配策略,vLLM默认给每请求预留的max_seq_len块太多了,你试着调小--gpu-memory-utilization到0.85,再配个--max-num-seqs 4,可能比量化更立竿见影。另外你确认下是不是开了长文本的chunked prefill,那个模式在并发高时会把prefill和decode混在一起,显存峰值会飙得特别快。我之前遇到类似问题,最后是砍了--max-num-batched-tokens,再把量化换成FP8动态量化,才把并发拉到了12。你那个4K业务文本,不如试试把系统提示词单独做成前缀复用,能省下不少cache空间。