最近在折腾本地部署,想用vLLM跑个Qwen2.5-7B做API服务,结果单卡A100 80G跑8个并发请求就OOM了,看了下显存占用直接飙到75G+。我知道可以开--max-model-len降低序列长度,但业务需要处理4K以上的长文本,不敢砍太多。
用vLLM部署Qwen2.5-7B时显存总爆,有人试过量化加流水线并行吗?
全部回复
共 101 条我之前也遇到一模一样的情况,A100 80G看着挺大,但vLLM的显存管理有点激进,默认会预分配KV cache,8并发直接给你吃满。量化确实能救急,但建议优先试试--enable-chunked-prefill,这个参数能把长文本的prefill阶段拆成小块,显存峰值能降不少,代价是首token延迟稍微高一点。至于流水线并行,7B模型单卡就能塞下,跨卡反而引入通信开销,除非你要同时跑多个模型共用显存池,不然意义不大。另外,你检查下--gpu-memory-utilization是不是设了0.9以上,可以降到0.7左右,给torch的临时算子留点余量。还有个偏门做法:把Qwen2.5-7B换成量化版的AWQ或GPTQ,4bit下显存直接砍半,但长文本下的质量损失你要自己测,尤其是4K+的上下文,有些量化模型在长距离依赖上会飘。最后忍不住问一句,你业务真的需要同时8个长文本请求吗?如果QPS不高,把max-num-seqs调小一点,比如2-4,比折腾并行实在多了。
我也遇到过类似的情况,8并发确实容易爆,vLLM的显存预留机制有时候比想象中激进。量化的话建议试试AWQ,4bit下显存能省三分之一左右,效果损失对7B来说还能接受。不过你提到的流水线并行我倒没试过,单卡上开这个会不会反而增加通信开销?感觉可以先从--gpu-memory-utilization和--max-num-seqs这两个参数下手调调看,有时候是并发批处理分配太保守了。
A100 80G跑8并发还OOM确实有点反常,我怀疑不光是序列长度的问题,vLLM默认会为每个请求预留KV cache,并发一多就吃满。量化到INT8或者AWQ能省不少显存,但会牺牲一点精度,你可以先试试只量化KV cache,配合流水线并行把层拆到多卡上,这样长文本和并发都能兼顾。另外检查下是不是开了--enable-prefix-caching,有时候这个反而会加大显存压力。
说实话你这个配置挺反常的,A100 80G跑7B模型8并发应该很轻松才对,我怀疑是不是vLLM默认给每个请求预留了太多KV cache,或者你开了--enable-prefix-caching导致显存碎片化。我之前用AWQ 4bit量化加张量并行(2卡)跑同尺寸模型,长文本吞吐能稳在2000 tokens/s,显存占用直接砍半,你可以试试先量化再开流水线并行,但注意vLLM对PT的调度开销比TP大,并发高时反而可能更慢。另外检查下是不是PagedAttention的block size没调好,默认16对长序列不友好,改成32试试,我这边改完OOM频率低了很多。
我之前也遇到过类似情况,单卡塞满长文本并发确实容易爆。量化到INT8或者INT4再配合流水线并行能明显缓解,不过A100上INT4的吞吐会掉一些,得看你对延迟的容忍度。另外建议把KV cache的复用打开,vLLM的--enable-chunked-prefill对长文本场景也很有帮助,能省不少显存。你这边QPS要求高吗?如果只是内部用,其实可以试着限制最大并发数,比硬扛显存省心多了。
我试过类似组合,Qwen2.5-7B用AWQ量化后配合流水线并行,单卡压力确实小不少,但并发一高还是会抖。你那个OOM主要可能是KV cache吃得太狠,试着把--gpu-memory-utilization调到0.9,再给每个请求单独限制下max-num-seqs,会比单纯砍序列长度灵活点。另外你这业务要真吃4K+,建议直接上双卡张量并行,流水线并行对单卡延迟反而没多大帮助,毕竟瓶颈在显存不在计算。量化精度损失做RAG场景基本无感,但代码生成或数学推理就得掂量下了。
量化到4bit能省不少,但流水线并行对单卡没用啊,得上多卡才有效果。
8个并发直接爆很正常,建议先试下AWQ量化,4bit能省一半显存,再加流水线并行应该能撑住。
量化加并行确实能缓解,不过得注意下vLLM对Qwen2.5的量化算子支持,建议先测下吞吐再上生产。
试试AWQ量化加tensor-parallel-size=2,8并发能压到40G左右,4K上下文完全够用。
说实话你这个情况我太有共鸣了,A100 80G看着挺大,但vLLM默认的显存管理策略有时候就是很激进,尤其并发一上来,KV cache直接把你吃穿。我之前试过把--gpu-memory-utilization调到0.85,然后配合--enable-prefix-caching,能稍微缓解一点,但也没根治。
量化加流水线并行这个思路我觉得靠谱,不过得注意你用的量化格式。AWQ或者GPTQ对7B模型来说精度损失其实不大,但vLLM对这两种格式的支持有时候会跟某些算子冲突,尤其是长文本场景下,可能反而拖慢推理速度。流水线并行的话,除非你有多卡,不然单卡上开这个基本没意义,反而增加通信开销。
我目前用的比较稳的组合是:模型量化成FP8(如果你卡支持的话),然后--max-model-len设成8192,再把--max-num-seqs调低比如4,这样虽然并发降了,但单请求吞吐反而更稳定。你那个4K长文本需求,其实可以试试把输入分成chunk处理,或者用vLLM的continuous batching特性,让每个请求的decode阶段错开,而不是一次全塞进显存。
另外你查过是不是pytorch的CUDA memory fragmentation问题吗?有时候显存峰值高是因为碎片化,不是真的存不下。跑之前设一下PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True,能省出不少空间。我这边现在7B模型跑8并发,峰值能控制在60G左右,你可以试试这个环境变量再配合轻量化。
同款问题,我试过AWQ量化后显存能压到40G左右,但并发一高还是容易抖。流水线并行对单卡没啥意义,vLLM里不如直接调--gpu-memory-utilization到0.9,再配个--enable-prefix-caching试试。另外8个并发如果QPS不高,可以限制下--max-num-seqs,别让vLLM一次性塞太多请求进显存。你长文本场景的话,建议把--max-model-len设成4096,剩下的靠chunked prefill顶上,实测比硬扛满序列稳定。
A100 80G跑7B模型8并发能飙到75G+,这数字看着确实离谱,但仔细想想可能不全是显存问题。我怀疑是vLLM默认的KV cache预留策略太激进了,你试试加个--gpu-memory-utilization参数压到0.85左右,同时把--max-num-seqs调小到4,说不定单卡就能扛住。不过量化加流水线并行的思路我觉得方向对,但7B模型做流水线并行有点大材小用,张量并行反而更实际,毕竟卡间通信开销在这么小的模型上会吃掉不少收益。你要真想长文本4K以上,建议直接上量化到INT4,AWQ或GPTQ都行,配合vLLM的--quantization参数,显存能砍一半还不怎么掉点。我之前用类似配置跑过同系列模型,INT4下2500 token上下文8并发大概稳定在30G左右,你参考下。另外你确认过是不是因为PagedAttention的block管理碎片化导致的峰值暴涨吗?有时候把--block-size调成32或64能缓解不少,别光盯着量化。
A100 80G单卡跑8并发确实有点极限,Qwen2.5-7B的KV cache在长文本下吃显存很凶。量化加流水线并行理论上能缓解,但我试过AWQ量化后精度掉得有点明显,尤其在代码生成任务上。你不如先看看是不是vLLM的pre-allocated显存设置太保守,调一下gpu_memory_utilization到0.9可能就够用了。另外,如果业务能接受,把并发降到4个,配合continuous batching,实际吞吐未必差太多。
我试过AWQ量化+流水线并行,显存直接降了40%,吞吐还稳,你可以试试。
这个OOM我太熟了,之前用vLLM跑同尺寸模型也被搞到怀疑人生。其实你光看显存占用75G+,大概率是KV cache加prefill阶段峰值叠加导致的,单纯靠量化不一定能根治,因为AWQ或者GPTQ对显存释放的贡献主要在下半场,长文本场景下峰值还是卡在prefill那块。流水线并行(PP)倒是能摊薄单卡压力,但vLLM里开PP要小心,因为它会切分模型层,如果没配合好张量并行(TP),通信开销反而可能拖慢吞吐,尤其你只有单卡A100的时候,PP其实意义不大——它主要是给多机多卡设计的,单机单卡上不如直接砍max-num-seqs。我建议你先试试把--gpu-memory-utilization调到0.9,然后开--enable-chunked-prefill,这个能大幅降低prefill阶段的显存尖峰,实测能把并发从8拉到12左右。另外可以开--kv-cache-dtype fp8_e5m2,对Qwen2.5效果不错,精度损失很小。如果还不行,就上量化但别用AWQ,用GPTQ的4bit加--quantization gptq,配合--max-model-len 8192,我这边跑4K长文8并发基本能稳在50G以内。你试完回来告诉我结果,我很好奇A100上chunked-prefill的实际收益。
我最近也踩过这个坑,单卡A100跑7B按理说不该这么容易炸,但vLLM的显存分配策略确实激进,它默认会预分配很大一块给KV cache,哪怕你并发不高也照吞不误。你这个情况我建议先别急着上量化,试试把--gpu-memory-utilization调到0.85或者更低,留出一点余量,再配合--max-num-seqs限制一下内部调度,很多时候光这两项就能把OOM压下来。
量化的话,AWQ或者GPTQ对7B模型效果还不错,但如果你用的是在线API服务,要小心量化后推理速度下降和精度损失,尤其是长文本场景下,有些token的分布会变怪。流水线并行倒是能分摊显存压力,但vLLM对多卡并行的支持我一直觉得有点别扭,你要确认自己用的是tensor parallel还是pipeline parallel,前者在单机多卡上更好用,后者通信开销大,有时候反而拖慢吞吐。
另外4K长文本这个需求,你可以考虑开--enable-prefix-caching,如果业务里有多轮对话或者相似query,缓存命中后显存占用能降一大截。我自己的经验是,先跑个压力测试看下实际峰值显存,别靠猜,用nvidia-smi盯几轮请求,把batch size和max-model-len调到一个甜点值,比你直接上并行方案更省事。你试过开--quantization awq之后再用同样的并发压测吗?数值上应该会好看很多,但延迟和首token时间要重新评估一下。
试过AWQ量化加tp=2,显存能压到45G左右,并发还能再提一档,你可以试试。
我试过类似配置,量化到INT8能省不少显存,但并发上去还是会涨。流水线并行对单卡意义不大,更建议先把KV cache的--gpu-memory-utilization调到0.9然后配合--enable-chunked-prefill试试。另外8个并发对于7B确实有点激进,vLLM的continuous batching在长文本下显存峰值就是会高,不如限流到4个并发,吞吐其实差不了太多。你用的什么量化方式,AWQ还是GPTQ?
我之前也遇到过类似情况,其实不一定要上流水线并行,可以先试试把量化开到AWQ或者GPTQ,4bit下显存能省接近一半,8并发基本能稳住。另外vLLM的--gpu-memory-utilization可以调到0.9,给KV cache留更多空间,长文本反而更稳。你如果非要用流水线并行,得注意张量并行和它叠加时的通信开销,7B模型可能反而拖慢速度,不如先调prefill和decode的chunk大小试试。
我也踩过这坑,量化到int8加流水线并行能压到40G左右,但并发高了还是紧张,建议先开下--gpu-memory-utilization试试。
试试AWQ量化加张量并行吧,我这边4K上下文稳定跑16并发,显存峰值也就55G,比你那情况好多了。