最近在折腾本地部署,想用vLLM跑个Qwen2.5-7B做API服务,结果单卡A100 80G跑8个并发请求就OOM了,看了下显存占用直接飙到75G+。我知道可以开--max-model-len降低序列长度,但业务需要处理4K以上的长文本,不敢砍太多。
用vLLM部署Qwen2.5-7B时显存总爆,有人试过量化加流水线并行吗?
全部回复
共 101 条这问题我上个月刚踩过坑,单卡A100跑7B确实容易卡在KV cache上,8并发直接爆不奇怪。量化我个人建议先试AWQ,4bit下显存能压到20G左右,但要注意vLLM对Qwen2.5的AWQ支持得看版本,太老的可能有兼容问题。流水线并行的话,你得把模型切成两半放两张卡,但通信开销在7B这个规模上可能不划算,除非你正好有双卡闲置。另外我试过把--gpu-memory-utilization调到0.9,配合--swap-space再加个CPU offload,虽然吞吐会掉,但至少不OOM。你那个4K长文本需求,其实可以试试动态序列长度,vLLM新版本支持按请求实际长度分配,不用全按max-model-len预留。还有个小技巧,把--max-num-seqs调低到4,并发请求排队,显存峰值能降不少。最后问下你用的vLLM版本?0.6.x和0.7.x的显存管理策略差别挺大的,升级说不定直接解决。
我也踩过类似的坑,A100 80G看着大但跑7B带长文本并发确实紧。量化+流水线并行我试过,AWQ 4bit能省不少显存,但流水线并行对单卡场景其实帮助不大,更像多卡时的优化手段。你不如先看看是不是vLLM的KV cache和prefill阶段吃得太狠,调低--gpu-memory-utilization留点余量,或者开--enable-prefix-caching试试,可能比强行上量化更稳。
我之前也卡在这,量化到4bit后并发直接翻倍,可以试试GPTQ加流水线并行。
试过4bit AWQ量化,显存能压到40G左右,但并发一高延迟就上去了,流水线并行倒是没试过,蹲个优化方案。
我之前也卡在8并发这个坎上,后来发现vLLM默认会给每个请求预留整个模型权重加KV cache的空间,实际峰值比预期高不少。试试开--gpu-memory-utilization 0.9同时把--max-num-seqs调小到4,配合AWQ量化,8B模型能压到20G左右。流水线并行对这种单卡场景帮助不大,反而是把tensor并行关掉让单卡专注推理更稳。你如果必须保留长文本,建议量化后把--max-model-len设到5000,实测能扛住6并发不OOM。
我最近也在调vLLM,单卡A100 80G跑7B理论上不该这么脆,你检查过--gpu-memory-utilization和--swap-space的分配没?我之前默认值下并发高也会爆,后来把utilization压到0.85,再配合--enable-prefix-caching,峰值降了快20%。量化到INT8的话,模型本身省不了太多,主要是KV cache占大头,流水线并行其实对显存峰值帮助有限,不如试试把max-num-seqs调小到4,或者开--disable-log-requests减少临时张量,长文本4K真没必要动max-model-len。
说实话你这个情况我太熟了,A100 80G看着大,但vLLM默认的prefill和decode显存分配策略其实挺激进的,8并发直接爆很正常。量化确实能救急,AWQ或者GPTQ的4bit版本大概能把权重从14G压到5G左右,但你要留意激活值这部分,长文本下KV cache才是大头,4K上下文加上8并发,光这个就轻松吃掉30G+。流水线并行倒是能分摊,不过vLLM里pipeline parallel更多是给多机场景设计的,单卡上开反而可能因为通信开销拖慢吞吐,我试过效果一般。
更推荐的思路是调下--gpu-memory-utilization,比如留10%给CUDA context和碎片,再配合--max-num-seqs限制一下并发数,比如改成4,然后开--enable-prefix-caching,如果业务里有重复前缀能省不少显存。另外你确认下是不是没开--kv-cache-dtype fp8?A100支持fp8的话KV cache能再砍一半,这个容易忽略。
还有个野路子,如果你能接受稍微损失点精度,试试把Qwen2.5-7B换成量化版+--quantization awq,同时把--max-model-len设成4096,再配合--max-parallel-load-workers调下加载逻辑,实测能撑住10个并发不OOM。不过你业务要4K以上,建议还是先跑个benchmark,看看实际峰值显存到底卡在哪个环节,有时候是tokenizer或者调度器的问题,未必全是模型本身的锅。
我之前也踩过这坑,7B模型在vLLM里默认prefill和decode共享显存,并发一高直接爆。你可以试试把KV cache的预留比例调低点,或者用--gpu-memory-utilization压到0.85,我这边能省出10G左右。量化方面AWQ配合流水线并行确实有用,但注意别把tensor parallel和pipeline parallel混着开,容易导致通信开销反而变慢。另外检查下--max-num-seqs是不是默认值,8个并发可能只是连续请求堆积,调成4或者2会稳很多。长文本4K其实还好,把--max-model-len设成4608留点余量就行,不用砍太多。
量化到4bit再开流水线并行,瓶颈会转到显存带宽,但你这并发量建议先查下prefill占用峰值。
我之前也卡在这问题上,Qwen2.5-7B的KV cache和中间激活吃显存比想象中狠。建议先试试AWQ或GPTQ的4bit量化,能省下近一半显存,配合--gpu-memory-utilization调到0.9,8并发应该能稳住。流水线并行对单卡意义不大,除非你打算上多卡,不然瓶颈还是在KV cache上。另外可以看看vLLM的--enable-prefix-caching,如果请求里有重复前缀,能省不少显存。
量化加流水线并行确实能压不少显存,但4K长文本下并发别开太高,我这用GPTQ加两卡拆分才稳。
我之前也遇到过类似情况,最后发现是vLLM默认给每个请求预留的显存太多了,尤其是长文本场景下。你可以试试把--gpu-memory-utilization调到0.9,再配个FP8量化,我这边同样模型跑16并发都没炸过。另外流水线并行对单卡其实帮助不大,如果真想省显存,不如把--max-num-seqs调小点,配合连续批处理看看效果。
同款问题,我试过AWQ 4bit量化配合流水线并行,显存峰值能压到40G左右,但吞吐会掉一些。不过你这80G单卡都爆,感觉更像是vLLM的显存预分配策略太激进,试试设--gpu-memory-utilization=0.6,然后配合--enable-chunked-prefill,可能比直接上并行更有效。另外确认下是不是开了--enable-prefix-caching,那个在长文本场景下会额外吃不少显存。
说实话我也踩过类似的坑,vLLM默认的显存预留机制有时候挺激进的,尤其并发上来之后KV cache占用会超预期。你试试开--gpu-memory-utilization调到0.85,再配合--enable-prefix-caching,应该能缓解不少。量化的话我建议先试AWQ,4bit精度下7B的显存能压到6G左右,但得注意vLLM对量化模型的支持版本,太旧了会有兼容问题。流水线并行在这个规模下收益不大,因为单卡都能塞下,反而增加通信开销,不如先用张量并行加量化组合看看效果。
我之前也卡在这问题上,单卡A100跑7B确实容易爆,后来发现vLLM默认会预分配显存给KV cache,光这个就吃掉不少。量化的话AWQ或者GPTQ都试过,4bit能压到30G左右,但并发一高还是会涨。
流水线并行我倒没试过,感觉对单卡场景帮助有限,不如直接调下--gpu-memory-utilization,把利用率降到0.85以下,留点余量给调度。另外你可以看看是不是max_num_seqs没设,默认256会疯狂预分配,改成16或32能缓解很多。
4K长文本确实不敢砍,但你可以试试把前缀缓存开起来,或者用chunked prefill,实测能省不少峰值显存。要是还不行,干脆上8bit加多卡张量并行,反正现在多卡也不贵。
我之前也遇到过类似情况,8并发确实容易爆,后来发现vLLM的continuous batching对显存分配挺激进的,可以试试把gpu_memory_utilization调低到0.85,给KV cache留点余量。量化的话建议用AWQ,4bit下精度损失不大,但吞吐能提升不少,配合流水线并行(虽然单卡用不上)更稳。另外你业务要4K上下文,建议直接开--enable-chunked-prefill,对长文本首token延迟友好很多,显存也能省个10%左右。最后问下,你用的是最新版vLLM吗?0.6.x之后显存管理优化挺明显的。
这问题我也踩过坑,单卡A100跑7B其实不用上流水线并行,量化先搞起来效果最直接。我试过AWQ 4bit,显存能压到40G以内,8并发稳得很,就是推理速度会稍微掉一点。另外你检查下vLLM的--gpu-memory-utilization,默认0.9有时候会预分配太多,调到0.85配合量化基本能解决。长文本这块,如果4K是硬需求,建议看看PagedAttention的分配策略,或者把KV cache的精度降到8bit试试。
我最近也踩过这个坑,vLLM默认的KV cache分配策略挺激进的,尤其多并发时显存跟不要钱似的。你试过--gpu-memory-utilization调低到0.7左右吗?再配合AWQ或GPTQ量化,4K上下文应该能压到40G上下。流水线并行我倒没试过,但听说对单卡场景帮助有限,不如先看看--max-num-seqs这个参数,把并发token数限制住。另外你用的vLLM版本是多少,新版对Qwen2.5的显存优化明显一些。
我最近也踩过这个坑,vLLM默认的显存预留策略挺激进的,建议先试下--gpu-memory-utilization调到0.9以下,再配合--enable-prefix-caching,能省不少。量化的话4bit确实能降一半多显存,但7B模型上如果追求输出质量,还是建议先用AWQ而不是GPTQ,跑长文本时数值更稳。流水线并行对单卡场景没意义,不如直接上多卡张量并行,vLLM对TP的支持比PP成熟多了。你试过把--max-num-seqs限制到4或者6吗?有时候并发高不一定是显存不够,而是KV cache分配太激进。
说实话我最近也被这个折腾得够呛,vLLM默认的显存预留机制太激进了,你试试设个--gpu-memory-utilization 0.9再配合量化,AWQ的4bit能省不少。不过流水线并行对单卡没意义,那个主要吃多卡通信,单卡A100建议直接上量化加--enable-chunked-prefill,我之前把并发压到4个就稳了。另外你确认下是不是max_num_seqs默认值太高,这个参数比max-model-len更影响并发显存峰值。