最近在试着把Qwen2.5 32B部署到公司的一台A100(80G)上做推理服务。按照官方文档配了vLLM,结果一加载模型就报OOM,看了下日志说是显存不够分配。我理解32B全精度肯定不行,所以试了AWQ 4bit量化版,但启动时还是卡在显存分配上。有人说是vLLM的KV cache默认开太大了,也有人建议用FlashAttention或者调低max_num_seqs。我这边服务QPS要求不高,主要是想把它先跑起来做内部demo。想问问大家,除了换小模型或者多卡,还有没有其他配置方法能把这个模型塞进单卡?比如调整vLLM的gpu_memory_utilization或者改用动态批处理?先谢谢了!
用vLLM部署Qwen2.5 32B时显存爆炸,求大佬指点优化方向
全部回复
共 139 条我之前也遇到过类似情况,gpu_memory_utilization确实值得先调,设到0.9甚至0.85试试,给KV cache留点余量。另外max_num_seqs别贪多,我这边压到8就稳了,反正你QPS要求不高。还有个小坑,确认下AWQ版本和vLLM是不是完全兼容,有时候是kernel没匹配上导致额外吃显存。
我之前也踩过这个坑,A100 80G跑32B AWQ其实够用,问题大概率出在vLLM默认把KV cache预留太多了。你可以试试把gpu_memory_utilization调到0.85以下,同时把max_num_seqs砍到16甚至8,这样能省出不少显存给权重和激活值。另外如果还不稳,可以开一下enable_prefix_caching,对demo场景的重复请求效果挺明显。FlashAttention在vLLM里一般默认就是启用的,不用特意调,重点还是先把那两个参数试出来。
调低gpu_memory_utilization到0.7,再配合--max-model-len限制长度,AWQ版应该能跑起来。
我试过把max_num_seqs改成4,KV cache立马就下来了,显存瞬间够用。
我之前也踩过这个坑,A100 80G跑32B AWQ其实够用,问题多半出在vLLM默认把KV cache预留给太多了。你试着把gpu_memory_utilization调到0.85左右,同时把max_num_seqs降到16或者8,基本就能挤进去。另外FlashAttention在vLLM新版里是默认开的,不用额外配,但你可以确认下版本是不是太老。如果还卡,可以加个--enforce-eager参数跳过CUDA graph优化,虽然慢一点但能省不少显存,跑demo足够用了。
gpu_memory_utilization确实值得先试,我上次跑13B模型默认设0.9也炸了,手动调到0.7就好了,代价只是吞吐稍微降点。另外你用的是AWQ的话,记得确认下vLLM版本是不是支持这种量化格式,之前有个老版本对AWQ支持有bug会多占显存。还有max_num_seqs调低到64甚至32能省不少KV cache预留,QPS不高完全够用。FlashAttention在A100上收益挺明显的,开着不亏,但别跟其他优化同时上,容易互相干扰。
我之前也踩过这坑,A100 80G跑32B AWQ其实是够的,你先把gpu_memory_utilization调到0.85左右,然后max_num_seqs设成16或者更低,KV cache预留量就会小很多。另外可以试试把--enable-prefix-caching关掉,有时候长prompt的缓存也挺吃显存的。启动时加个--max-model-len限制到4096或8192,别让它默认拉到32K,基本就能稳进去了。你QPS不高的话,甚至可以不用vLLM,直接上TGI或者SGLang,对显存控制更灵活。
实测把gpu_memory_utilization调到0.85,再加--max-num-seqs 64能跑起来,AWQ配A100挺稳的。
gpu_memory_utilization确实得先调,我之前跑13B都遇到过这问题,直接设0.9看看,另外max_num_seqs砍到16或者8,QPS不高完全够用。AWQ版本理论上应该能塞下,但vLLM对量化格式的显存预分配有时很迷,可以试试--quantization awq --kv-cache-dtype fp8_e5m2,这个组合能省不少。FlashAttention在vLLM里默认开的,但如果你用的老版本可能没生效,建议升级到最新版再试。还有个土办法,先不加载AWQ,用原始bf16启动,把--max-model-len设短点比如4096,能跑起来再慢慢加。
把gpu_memory_utilization调到0.85,再配合--max-model-len砍到4096,基本能塞进去。
试过把max_num_seqs调成8,KV cache用FP8,A100上跑32B AWQ很稳。
把gpu_memory_utilization调到0.85,再关掉KV cache的自动分配试试,之前这么弄跑过70B。
试下把max_num_seqs砍到64,然后开--enable-prefix-caching,A100上这么调能多挤点空间出来。
看到你说用AWQ还是爆显存,可以试试把gpu_memory_utilization设到0.85以下,给CUDA context和torch留点余量,A100 80G理论够但实际分配有碎片。另外max_num_seqs调到8或者4,配合--enable-prefix-caching,能省不少KV cache峰值。我跑34B模型时还发现vLLM默认会预分配连续显存,改成--kv-cache-dtype fp8能再挤点空间出来。先别上动态批处理,那个反而增加显存压力,把这两个参数调了应该能跑起来。
我之前也踩过这个坑,A100 80G跑32B AWQ其实够用,问题基本出在vLLM默认把KV cache预留空间算得太激进。你可以先试试把gpu_memory_utilization调到0.85以下,同时把max_num_seqs压到32左右,这俩参数一改大概率能救回来。另外注意下是否开了--enable-prefix-caching,这个也会多占不少显存,demo阶段可以先关掉。FlashAttention在vLLM里是默认开的,不用手动折腾,主要是别让它和量化版冲突就行。要是还卡在加载阶段,可以看看是不是tokenizer或者权重文件路径有问题,有时候不是显存的事。
把gpu_memory_utilization调到0.85左右,再顺手把max_num_seqs砍到32,基本就能塞进去了,AWQ下跑demo够用。
调低gpu_memory_utilization到0.85,配合max_num_seqs=128,AWQ版基本能稳进,我这边跑过类似的。
试试把gpu_memory_utilization调到0.85,再把max_num_seqs压到32,基本就能塞进去了。
我这么配过7B,稳得很,你那个32B的KV cache再砍一半应该也够跑demo了。
我之前也踩过这个坑,A100 80G跑32B AWQ其实够用,问题大概率出在vLLM默认把KV cache预留得太狠。你可以先把gpu_memory_utilization调到0.85左右,同时把max_num_batched_tokens和max_num_seqs都往小了压,比如512和16,这样能腾出不少空间。另外如果你用的是最新版vLLM,记得确认一下是否启用了PagedAttention,老版本有时候会浪费显存。还有个小技巧,把--enable-prefix-caching关掉,对demo场景影响不大但能省点缓存。跑通之后可以再慢慢调吞吐。
我之前也踩过这个坑,gpu_memory_utilization别用默认值,直接设成0.85左右试试,给KV cache留点余量但别太贪。另外max_num_seqs调到64甚至32,对demo场景完全够用,能省不少显存。你用的是AWQ版的话,记得确认下vLLM版本是不是支持,老版本对量化支持有bug会额外吃显存。还有个野路子,把--enforce-eager打开,跳过CUDA graph的预分配,虽然慢一点但启动时能省下好几个G。
试试把gpu_memory_utilization调到0.85,再加个--max-model-len砍到4096,基本能稳。
AWQ版本还爆的话,八成是KV cache没控住,设个--max-num-seqs 16就够了。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说容量是够的,问题大概率出在vLLM默认把KV cache预分配得太狠了。你可以试试把gpu_memory_utilization从默认的0.9往下调,比如0.6或0.7,给模型权重和激活留出余量,同时把max_num_seqs改小到8或者4,这样能显著降低峰值显存占用。另外,如果不用前缀缓存,可以把enable_prefix_caching关掉,有时候这个功能也会吃掉不少显存。还有个思路是开FlashAttention,虽然AWQ本身已经加速了,但配合vLLM的flash-attn后端能减少中间张量的显存开销,记得把vLLM升级到最新版,老版本对量化模型的内存管理优化差很多。我这边跑过类似配置,最终是设了0.65的utilization、max_num_seqs=4、加上flash-attn,才稳定跑起来,但QPS大概只有个位数,做demo完全够用。动态批处理其实对显存帮助不大,它主要提升吞吐,你不如先试试前面几个参数组合,如果还OOM,建议看看是不是模型文件加载时碎片化太严重,可以用export VLLM_WORKER_MULTIPROC_METHOD=spawn试试,有时候能绕开一些内存分配问题。
我之前也踩过这个坑,A100 80G跑32B AWQ其实是够的,问题多半出在vLLM默认把gpu_memory_utilization设成0.9,再叠加KV cache的预分配就直接爆了。你可以先把它调到0.7左右,同时把max_num_seqs降到16或者8,这样能省出不少显存。另外FlashAttention在vLLM里默认是开的,不用额外配置,倒是可以试试把--max-model-len设小一点,比如4096或2048,对demo来说完全够用,显存占用会立刻降下来。还有个小技巧,如果只是内部测试,可以加上--enforce-eager禁用CUDA graph,虽然慢一点但能再挤出几个G。跑起来之后记得看下nvidia-smi,如果实际峰值只用到60多G,再逐步往上调利用率,别一次给太满。