最近在搞大模型部署,拿vLLM跑Qwen2.5-7B,单卡A100 80G,按照文档设了max_model_len=4096,gpu_memory_utilization=0.9。但跑几个并发请求就报CUDA out of memory,查日志说显存不足。我看别人同配置能跑32K长度,我这才4K就崩了。是不是我tensor_parallel_size设错了?或者需要调什么swap空间?求大佬指点,现在一头雾水,谢了!
大佬们,vLLM部署Qwen2.5服务老报OOM,是我配置有问题吗?
全部回复
共 164 条这配置看着挺标准的,但OOM八成不是max_model_len直接导致的。你查过实际显存分配没?pytorch碎片化有时候比想象中严重,特别是并发上来以后。另外gpu_memory_utilization设0.9可能太激进了,vLLM预留的KV cache加上激活值会顶爆,降到0.8试试。tensor_parallel_size单卡设1就行,这个参数不是瓶颈。还有个小坑,Qwen2.5的attention实现选paged_attention时,如果没开enable_prefix_caching,长上下文碎片会特别夸张。你可以先跑个单请求压测,在日志里看下峰值显存,再决定要不要调swap。
说实话这个配置报OOM挺诡异的,A100 80G跑7B模型哪怕塞满32K上下文理论上都绰绰有余。你gpu_memory_utilization设0.9没问题,但max_model_len=4096反而可能是个坑——vLLM的显存预分配是按max_model_len算的,如果你实际请求的prompt+output长度远超4K,或者并发时每个请求都占了完整4096的KV cache,那预分配额度可能直接被撑爆。我建议你先看看启动日志里实际分配的KV cache大小,再对比nvidia-smi的显存占用,确认是不是预分配就占了90%以上。另外tensor_parallel_size对单卡来说设1就行,设成2反而会触发跨卡通信额外吃显存。还有个小技巧,可以试试把gpu_memory_utilization降到0.85,给CUDA context和碎片留点余量,有时候0.9看起来留了10%,但vLLM自己还要占一部分,实际可用反而更少。swap空间那个是给CPU offload用的,你显存够大根本不需要开,开了可能更卡。最后建议你检查下是不是Qwen2.5的attention实现和vLLM版本不兼容,有些老版本有显存泄漏bug,升级到最新版再试试。
你这配置跑4K崩大概率不是长度问题,看看是不是并发时显存碎片化或者KV cache没释放,试试把gpu_memory_utilization降到0.8加个--swap-space。
你这配置按理说跑4K不该崩,先查下是不是vLLM版本和CUDA版本不匹配,之前我遇到过类似问题,升级下vllm就好了。另外gpu_memory_utilization设0.9有点激进,建议降到0.8试试,给CUDA context留点余量。还有tensor_parallel_size单卡就设1,别乱设。如果还不行,看看是不是Qwen2.5的rope_scaling默认值在vLLM里没生效,导致实际分配了32K的KV cache。
遇到过一模一样的坑,后来发现是vLLM默认把KV cache的预留空间算得太满,加上并发请求的显存峰值叠加才崩的。你可以先把gpu_memory_utilization降到0.75试试,同时看看max_num_seqs是不是默认值太大,改成8或者4会稳很多。另外tensor_parallel_size单卡设1就行,这个不是瓶颈,swap空间对OOM帮助不大。我之前还试过把Qwen2.5的tokenizer里的bos_token_id显式设一下,偶尔能省点显存,你可以对照着查查。
看了下你的配置,问题大概率不在max_model_len上,vLLM实际显存占用还跟block大小、KV cache预留策略有关,4096长度理论上远不该爆。你试试把gpu_memory_utilization降到0.8以下,同时检查下是不是装了多个GPU但tensor_parallel_size设成了1,导致单卡压力过大。另外确认下vLLM版本,老版本对Qwen2.5的显存管理有bug,升到0.6.3以上可能直接就好了。我之前跑32K也遇到过类似情况,最后发现是并发请求的prefill阶段峰值显存没算进去,可以试着限制下max_num_seqs。
你这配置单看没啥毛病,A100 80G跑7B按理说挺宽裕的。不过OOM大概率不是tensor_parallel_size的问题,单卡这个参数设1就行,设大了反而会走分布式路径增加额外开销。我怀疑是vLLM的KV cache预分配策略搞的鬼,你把gpu_memory_utilization降到0.7试试,留点显存给激活和临时张量,有时候跑长序列时临时显存峰值会突然冲高。另外确认下你用的vLLM版本,0.4.x和0.5.x的显存管理差异挺大的,新版加了paged attention的优化,老版本可能还是静态分配。swap空间那块不太关键,vLLM的CPU offload主要是给超长上下文用的,7B模型4K长度根本用不到。你还可以开一下--enable-chunked-prefill,对并发请求的显存碎片化有改善。最后查下是不是有别的进程占了显存,nvidia-smi看一眼,我上次就是被一个僵尸python进程坑了,清掉立马就稳了。
我之前也踩过这个坑,单卡A100 80G跑7B按理说余量很足,但问题多半不在max_model_len上。你gpu_memory_utilization开到0.9,但vLLM的KV cache是动态分配的,并发请求一多,每个sequence的显存占用会飙升,尤其Qwen2.5的attention实现里有chunked prefill,如果没开enable_chunked_prefill,长prompt加并发很容易瞬间爆掉。建议先把这个参数打开,再把max_num_seqs调小,比如默认256改成64或32,给KV cache留出喘息空间。
另外tensor_parallel_size=1就行,单卡不需要设别的,设错了反而会尝试切分模型导致额外开销。swap空间确实可以开,设个--swap-space 16,把部分KV cache offload到CPU内存,但注意这会让速度降不少,适合调试。还有个隐蔽点:你检查下CUDA_VISIBLE_DEVICES环境变量,有时候vLLM会默认把所有显存都预分配,但实际只用了单卡,导致别的进程看着像OOM。我后来直接看nvidia-smi对比空闲显存,发现是系统里其他残留进程占着,kill掉就好了。
你估计是刚上手,别急着追32K,先把4K并发跑稳。试着把max_model_len降到2048,同时把gpu_memory_utilization降到0.85,看报错是不是消失,如果消失就是预留空间不够。另外确认下你用的是最新版vLLM,0.6.2之前对Qwen2.5的支持有bug,更新后显存管理逻辑变了不少。最后建议开个--enforce-eager,不用CUDA graph,虽然慢点但能省不少显存,排查问题的时候很有用。
八成是Qwen2.5的attention实现没走vLLM的paged attention,老版本对7B支持有坑,试试升到最新版。
显存碎片化也可能,把gpu_memory_utilization降到0.85,再开个--enable-chunked-prefill试试。
别急着调tensor_parallel_size,7B单卡根本用不到这个,设了反而可能触发额外的显存分配。你这OOM大概率是max_model_len和gpu_memory_utilization一起坑的,0.9留的余量太少了,再加上vLLM默认的KV cache预分配策略,4K长度下并发一多就直接爆。建议先把gpu_memory_utilization降到0.75试试,同时把max_model_len拆成两档,比如先设2048跑通流程再慢慢往上加。另外查一下你是不是开了—enable-prefix-caching,那个对显存占用影响也很明显。
说实话你这配置本身没啥问题,7B在80G上跑4K不该OOM。先检查下是不是多卡环境变量没设对,tensor_parallel_size=1单卡就够,设大了反而会额外占显存。另外看下vLLM版本,老版本对Qwen2.5的KV cache管理有bug,升到0.6.3以上大概率就好。还有个小坑,如果开了--enable-prefix-caching,并发长prompt会吃爆显存,关掉试试。我之前也踩过这坑,排查半天结果就是版本太旧。
八成是并发时KV cache暴涨,试试把max_num_seqs调小到16或者8,别死磕gpu_memory_utilization。
这配置看着没问题,但OOM多半不是max_len的锅。你查下是不是Qwen2.5的默认rope_scaling没适配,长上下文会吃额外显存。另外gpu_memory_utilization=0.9在A100上有点激进了,建议先降到0.7试下,同时开--swap-space给个16G,让CPU兜底。还有你tensor_parallel_size设1就行,单卡不需要切分,切了反而多份KV cache开销。我之前也踩过这坑,最后发现是--max-num-batched-tokens设太小,并发请求全挤在一个batch里,你查下这个参数。
你确认下vLLM版本是不是最新,老版本对Qwen2.5的attention后端支持有bug,会异常分配显存。另外max_model_len=4096但输入如果带system prompt,实际token数可能超了,你打印下请求的token数看看。swap空间别乱调,先看下nvidia-smi里进程占了多少,是不是有其他程序占着显存。我试过把--gpu-memory-utilization改成0.85,然后加--enforce-eager关掉CUDA graph,内存瞬间稳定,你可以试试。
单卡7B配32K没问题,但你这OOM
我刚开始玩vLLM的时候也踩过这个坑,后来发现多半不是tensor_parallel_size的问题,7B模型单卡根本不需要设这个。你gpu_memory_utilization拉到0.9其实挺激进的,vLLM还要预留CUDA context和KV cache的管理开销,尤其并发请求上来后显存碎片化会特别严重。建议先降到0.7试下,另外max_model_len设4096不代表实际占用就小,Qwen2.5的attention计算会按最大长度预分配内存,你试试把block_size调小一点,比如16或者32,能显著减少显存浪费。还有,检查下是不是开了--enforce-eager,没开的话默认用CUDA graph也会吃不少显存,可以关掉对比下。swap空间那个参数是给CPU offload用的,A100 80G真没必要碰,反而拖慢速度。如果还崩,就开--max-num-seqs限制并发数,先跑到稳定再慢慢往上加,别一上来就压满。你日志里有没有具体的显存分配失败信息?贴出来大家更好帮你定位。
检查下是不是开了多个并发把KV cache撑爆了,max_model_len设小点或调低gpu_memory_utilization试试。
我上次也这样,把--max-num-seqs调成2立马就好了,你试下这个参数。
说实话你这配置单看没啥毛病,A100 80G跑7B按理说绰绰有余,问题八成不在tensor_parallel_size,那个是给多卡用的,你单卡设了反而可能触发一些奇怪的显存分配逻辑。我怀疑是vLLM的KV cache预分配太激进了,gpu_memory_utilization=0.9意味着它会把90%显存全锁给缓存,但加上模型权重和CUDA context,实际可用空间就紧张了,尤其并发请求多的时候KV cache会动态增长,一下就把剩余显存撑爆。你可以试试把利用率降到0.75左右,或者显式设个max_num_seqs,限制同时处理的序列数,别让vLLM自己放飞。另外确认下是不是用了最新的vLLM版本,老版本对Qwen2.5的attention计算有显存浪费,更新到0.6.x以上可能有改善。还有个骚操作是开enable_prefix_caching,但那个吃CPU内存,不一定治本。我上次跑同模型碰到类似情况,最后是把max_model_len降到2048再加了--swap-space 16才稳住,虽然长度短了但至少不崩,你可以先用这法子验证下是不是缓存策略的问题,再慢慢调优。
你这配置按理说跑4K长度不该炸的,A100 80G喂7B模型绰绰有余。我怀疑问题不在tensor_parallel_size,单卡根本不用设那个,设成1就行,设大了反而可能触发额外的显存分配逻辑。你查过vLLM的日志里有没有提示“max_num_seqs”或者“block_size”相关的参数吗?我遇到过类似情况,默认max_num_seqs是256,并发请求一多,每个序列的KV cache预留就会暴涨,即使实际输入没到4K也会把显存占满,你试试把它调到64或者32。另外gpu_memory_utilization=0.9看起来合理,但vLLM实际会预分配全部KV cache池,如果模型权重+激活态本身就占了不少,剩下空间可能不够分配,你可以先降到0.8跑跑看,或者用nvidia-smi观察一下启动时显存占用是不是瞬间就到顶了。swap空间那个基本不用管,vLLM的CPU offload对性能影响很大,一般不是OOM的解法。我怀疑还有个坑是Qwen2.5的attention实现默认可能开了GQA的某些优化,导致显存碎片化,你可以试试注释掉config里的“head_dim”或者升级到最新vLLM版本,之前有人反馈旧版对Qwen2.5支持有bug。你先改max_num_seqs和tensor_parallel_size,再不行直接看启动时的模型加载日志,里面会打印实际申请的显存大小,对比一下就知道是不是配置没生效。
按说7B在A100 80G上跑4K长度不该OOM,你这配置看着挺常规的,但问题可能出在vLLM的显存预留机制上。gpu_memory_utilization=0.9不是让你把90%显存全塞给KV cache,它还要留一部分给模型权重和激活值,Qwen2.5-7B光权重就占14G左右,加上CUDA context和碎片,实际能用的KV cache空间比你想的小得多。我怀疑你并发数开太高了,vLLM默认会按max_num_seqs和max_model_len预分配所有可能用到的显存块,如果没调低max_num_seqs,哪怕实际只有几个请求也会把所有块都占满。你可以试着把max_num_seqs设成16或者32,然后看一眼日志里实际分配的KV cache大小,再对比一下nvidia-smi里空闲显存。另外tensor_parallel_size一般单卡就别设,设成1或者干脆不传,这参数对单卡没意义,反而可能触发额外的显存分配。至于swap空间,vLLM的CPU offload和swap功能本身会消耗额外显存做管理,7B小模型没必要开,除非你跑32K超长上下文才考虑。你先把max_num_seqs和block_size调小试试,比如block_size=16,同时把gpu_memory_utilization降到0.85留点余量,大概率能解决。
我之前也踩过类似的坑,A100 80G跑7B理论上4K绰绰有余,问题大概率不在tensor_parallel_size,那个单卡设1就行。你可以先看下是不是vLLM版本太老,有些版本的显存碎片化特别严重,换个0.6以上版本试试。另外检查下是不是Qwen2.5的tokenizer把长文本padding搞出额外显存开销,或者你并发的时候max_num_seqs设大了,试着调小到2-4看看。swap空间基本不用管,vLLM那个是CPU offload,开了反而更慢,优先排查显存分配。
你这配置单卡跑7B按理说绰绰有余,问题大概率不在max_model_len上。先检查下vLLM版本,老版本对Qwen2.5的attention后端支持有bug,升到0.6.3以上能解决很多显存异常。另外tensor_parallel_size设1就行,单卡不用开,但可以试试把gpu_memory_utilization降到0.85,给CUDA context留点余量。还有个小坑,如果开了--enable-prefix-caching,并发时显存碎片会暴涨,关掉再试试。swap空间基本用不上,vLLM的cpu offload对7B来说反而拖慢速度。