最近在折腾本地部署,想用vLLM跑个Qwen2.5-7B做API服务,结果单卡A100 80G跑8个并发请求就OOM了,看了下显存占用直接飙到75G+。我知道可以开--max-model-len降低序列长度,但业务需要处理4K以上的长文本,不敢砍太多。
用vLLM部署Qwen2.5-7B时显存总爆,有人试过量化加流水线并行吗?
全部回复
共 101 条我之前也踩过这坑,8并发直接爆显存太真实了。后来我试了awq量化加tensor_parallel_size=2,同样长度下显存能压到45G左右,吞吐还稳了不少,你可以试试。不过量化后精度确实有点掉,如果业务对输出质量敏感,建议先用gptq量化跑几轮对比下。还有个思路是搞个简单的请求排队机制,把并发压到4,配上限流,虽然慢点但至少不OOM。
你这个场景我太懂了,7B上vLLM默认prefill和decode的显存分配策略挺激进的,尤其并发一上来KV cache直接吃满。量化的话AWQ或GPTQ能把权重压到4bit,显存能省个十几G,但长文本下KV cache才是大头,建议配合--kv-cache-dtype fp8试试,能再挤点空间。流水线并行对单卡没啥用,那是多卡的事,你不如检查下--gpu-memory-utilization和--max-num-seqs,把这两个参数调低点,再给每个请求设个--max-num-batched-tokens限制,可能比量化更直接解决问题。
8个并发就75G确实有点夸张,我怀疑是vLLM默认给每个请求预留了完整的KV cache空间,你可以试试把--gpu-memory-utilization调到0.85以下,再配合--max-num-seqs限制并发数,比直接上量化更稳。量化的话AWQ对7B效果还行,但流水线并行在单卡上没啥意义,除非你拆成多卡,不然通信开销反而更大。我之前用4张4090跑Qwen2.5-14B,就是靠限制seqs加FP8才勉强撑住,要不你先把max-num-seqs降到4看看?
A100 80G跑7B模型8并发还能OOM,这有点反常了,我怀疑不只是显存容量的问题。你检查过vLLM的preemption和KV cache管理策略没,有时候默认配置在长文本场景下会疯狂预分配显存,实际利用率根本没上去。我自己用4090跑过类似模型,量化到4bit后并发反而比FP16稳很多,虽然吞吐会降一点,但至少不爆。你试过AWQ或GPTQ量化配vLLM吗,官方文档说支持得挺好了,而且Qwen2.5对量化敏感度不高,4K长文本下质量损失基本可忽略。至于流水线并行,单卡场景其实没必要,vLLM在多卡下才真正受益于PP,反而会增加调度开销,不如先试试把--gpu-memory-utilization调到0.9,再加--enforce-eager模式绕过CUDA graph缓存。另外8个并发请求如果每个都带独立KV cache,那显存肯定线性增长,你可以考虑用continuous batching的批次大小上限控制一下,比如--max-num-seqs设成4,配合量化应该就能压住。还有个思路是开--enable-prefix-caching,如果业务里有多轮对话或相似前缀,能省不少显存。你现在的OOM报错是纯显存不足还是有碎片化警告?如果是后者,加个--swap-space参数可能更有效。
我之前也遇到过类似情况,A100 80G跑7B按理说很宽裕,但vLLM的预分配机制加上长文本确实容易爆。量化到INT4能省不少显存,但精度损失得自己评估下,尤其对生成质量敏感的场景。流水线并行我试过,多卡部署确实能缓解单卡压力,不过要留意通信开销和负载均衡,不然吞吐反而可能掉。建议先开个--gpu-memory-utilization调到0.9,再把KV cache的预留调小点,有时候比直接上并行更立竿见影。你那边业务对延迟敏感吗?如果允许,可以试试把并发拆成两个进程分别跑,效果可能更稳。
A100都扛不住?试试awq量化加pipeline并行,显存能省一半,长文本也能保住。
80G单卡跑7B还OOM,这不太正常,vLLM默认的显存预留比例有时候会卡得很死。我试过把--gpu-memory-utilization调到0.9,再把--max-num-seqs压到4,并发虽然降了但至少不炸。量化的话,AWQ 4bit效果不错,长文本下精度损失能接受,但流水线并行在单卡上没用,得先确认是不是显存碎片化的问题。你那个OOM日志里有没有显示是KV cache还是权重占大头?如果是前者,试试开--enable-prefix-caching,能省不少。
A100 80G都能爆,你这业务场景有点狠啊,8并发确实不是小数目。我试过类似配置,但用的是量化到INT4的AWQ版本,显存占用直接砍半,不过精度损失在长文本生成上能感觉到,尤其是数字和代码场景。流水线并行我倒没在vLLM里试过,感觉它更偏向张量并行,你如果有多卡不如直接开--tensor-parallel-size 2,把模型切到两张卡上,比流水线并行省心,显存压力也能摊薄。另外你提到4K上下文不能砍,我建议试试--enable-chunked-prefill,这个能缓解预填充阶段的显存峰值,我开了之后OOM频率低了不少。还有个细节,vLLM默认会为每个请求预留KV cache,你可以手动调--gpu-memory-utilization到0.9,再配合--max-num-seqs限制并发数,比如设成4,让请求排队而不是同时挤爆显存。说到底,量化加并行是两条路,但单卡场景下先把KV cache和调度参数调明白,可能比上并行更立竿见影,你现在的报错日志里有没有提示是预填充还是解码阶段爆的?
我最近也踩过这个坑,单卡A100跑7B其实有点浪费,但显存管理不当照样爆。量化到INT4的话显存能压掉一半左右,配合流水线并行把层切到两张卡上,8并发应该稳很多。不过要注意量化后长文本的精度损失,建议先在4K序列上测下困惑度再上生产。另外可以试试vLLM的continuous batching调大点,有时候OOM是调度问题不是容量问题。
我之前也遇到过类似情况,vLLM的prefill阶段显存峰值特别吓人。你可以试试把量化打开,比如AWQ或者GPTQ的4bit,显存能省接近一半,8并发应该就稳了。另外流水线并行感觉对这个规模帮助不大,反而可能增加通信开销,不如先调一下--gpu-memory-utilization和--swap-space试试,有时候把KV cache的预留空间收紧点就够用了。
8个并发对于7B来说不算多,你要是长文本场景多,建议看看是不是max-num-seqs设太高了,调低到4或者2能明显缓解峰值压力。还有个思路是配合--enable-chunked-prefill,把长prompt切成块处理,显存曲线会平缓很多。我这边用类似配置跑到16并发都没爆,主要就是靠量化加chunked策略。
A100 80G跑8并发就爆?我试过AWQ量化加流水线并行,显存能压到40G出头,吞吐还稳。
量化后精度损失可以接受,但流水线并行调度得调好,不然延迟反而上去了。
单卡80G跑7B模型8并发直接爆,这数字有点夸张了,我怀疑是vLLM默认预分配了KV cache加上PagedAttention的碎片化问题。量化到INT4大概能省一半显存,你可以先试下AWQ,但流水线并行对这种单卡场景没啥用,得走张量并行才有效。另外你检查过--gpu-memory-utilization的设置没?默认0.9,如果业务必须4K长文本,建议把这值降到0.7再配max-num-seqs=4,并发压到6个试试。
这情况我遇到过,不是模型本身大,是vLLM给每个请求预留的KV cache太狠了。你试试开--enable-prefix-caching,重复请求能省不少显存。量化的话GPTQ比AWQ在这模型上更稳,但别全量量化,只量化attention层就行。流水线并行真没必要,单卡A100的带宽瓶颈在PCIe,多卡反而拖慢速度。我建议先调max-num-batched-tokens,比如设成4096,比砍序列长度更直接。
我最近刚踩完这坑,A100 80G跑Qwen2.5-7B,8并发就爆确实反常。先别急着量化,查下是不是开了--enable-lora,那玩意会额外吃显存
我之前也踩过这个坑,单卡跑7B真别硬刚并发。量化到INT4的话显存能降差不多一半,配合流水线并行把层拆到多卡上,实测同样8并发能压到40G左右。不过要注意vLLM对量化+并行的支持版本有坑,最好先用最新版跑个benchmark。另外你确认下是不是decode阶段显存暴涨,有时候把--gpu-memory-utilization调到0.9反而能避免碎片化OOM,比无脑降序列长度靠谱。
遇到过类似的坑,A100 80G看着大但跑7B并发上来一样吃紧。量化这块我建议直接上AWQ或者GPTQ的4bit,显存能砍一半左右,配合vLLM的--quantization参数就行,不用改代码。流水线并行我倒没试过,但听说对延迟有影响,如果你主要是API服务可能得权衡下。另外可以看看--gpu-memory-utilization,把预留比例调高一点,有时候默认值挺浪费的。
75G确实离谱,我跑同样配置开fp8量化后显存能压到40G出头,流水线并行倒没必要。
我之前也踩过这个坑,A100 80G看着大但并发一上来照样爆。量化建议直接上AWQ,4bit下显存能省一半还多,配合vLLM的GPTQ接口挺稳的。流水线并行我倒没试过,但看你这个场景,感觉先量化再加--max-num-seqs限制下并发数,可能比上并行更直接。另外检查下是不是有长上下文缓存没清,vLLM有时候会把KV cache撑得特别满,手动调下--gpu-memory-utilization到0.85试试看。
我之前也遇到过类似情况,A100 80G跑7B模型8并发确实有点极限,主要问题出在KV cache上,长文本下占用特别夸张。量化方案我试过AWQ,显存能降个30%左右,但精度损失得自己权衡下。流水线并行感觉对单卡场景帮助不大,不如试试vLLM的--enable-chunked-prefill,配合量化把并发降一半,长文本还能保住。你业务如果真需要4K以上,建议把max-model-len设成8192,实测比默认值省不少显存。
我之前也遇到过类似情况,单卡A100跑7B按理说余量挺大,但并发一上来显存就吃紧。量化到INT4或INT8确实能省不少,不过要留意推理速度的下降,我们实测INT8下吞吐掉了大概15%,但换来了更稳的显存占用。流水线并行我试过,配合vLLM的tensor parallel其实效果还行,就是配置起来有点绕,得注意每个stage的batch size分配。另外你查过KV cache的预留没?有时候是默认配置太保守,手动调一下--kv-cache-dtype和gpu-memory-utilization能挤出不少空间。
单卡A100 80G跑8并发就75G+确实有点离谱,我怀疑你八成是没开--enable-prefix-caching,vLLM对共享前缀的缓存优化在长文本场景下能省不少显存。量化的话我建议直接上AWQ,4bit下Qwen2.5-7B的困惑度损失基本可以忽略,配合gptq_model参数能压到40G以内,但你要注意量化后vLLM的投机采样会失效。流水线并行我试过,2卡tensor并行比pipeline并行省心得多,pipeline的micro-batch调度在vLLM里调起来太蛋疼,尤其你还要处理4K上下文,跨卡通信的显存开销反而可能更大。另外一个坑是KV cache比例,默认的0.9在长文本下会炸,手动设到0.7试试,配合--max-num-seqs限制并发数到4,单卡跑到6K上下文是没问题的。如果你业务允许,我建议把输入截断到3K,再挂个RAG做外部知识补充,本地部署没必要死磕全量长文本。最后提醒下,别用flash-attn的旧版本,vLLM 0.6.x配flash-attn 2.6.1有显存泄漏的已知bug。
这问题我踩过坑,单卡A100跑7B其实不用上流水线并行,量化到INT4或者AWQ能把显存砍掉一半多,75G能压到40G左右。不过你要注意vLLM的量化推理对长文本的精度影响,4K以上场景建议先拿验证集测一下。另外并发8个的话,试着调一下--gpu-memory-utilization到0.9,再把--max-num-seqs调小点,可能比并行更直接。流水线并行在单卡上就是个摆设,多卡才会有效果。