最近在搞大模型部署,拿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的问题,是prefill阶段显存峰值爆了。你可以试试把gpu_memory_utilization降到0.8以下,或者开一下vLLM的--enable-chunked-prefill,能把长输入拆开算,峰值能降不少。另外tensor_parallel_size单卡设1就行,别瞎改,swap空间基本帮不上忙,那玩意儿是给CPU offload用的。我之前跑同模型也遇到过,后来把max_num_seqs调小到16就稳了,你查下这个参数。
这配置崩了大概率不是参数问题,查下vLLM版本和CUDA版本匹配不,我之前升级后就好了。
这配置看着挺标准的,但OOM大概率不是max_model_len的锅。你检查下是不是Qwen2.5的默认KV cache分配策略跟vLLM版本不匹配,或者attention backend选了paged attention但block大小没调对。我之前遇到过类似情况,把gpu_memory_utilization降到0.85,再加个--enable-chunked-prefill试试,瞬间稳了。另外tensor_parallel_size设1就行,单卡没必要拆。swap空间那玩意儿在vLLM里基本是给offload用的,你显存没满的话先别碰。
同款卡同款模型,我之前也踩过这坑。你检查下是不是max_model_len设的是4096但实际请求里没传这个参数,vLLM有时候会按默认的更大值去预分配KV cache,直接吃满显存。另外gpu_memory_utilization=0.9不代表一定能用到90%,如果模型加载本身占得多,剩下的空间算KV cache可能不够几个并发分。我最后是把max_num_seqs调小到16,再把block_size设成16,让显存按块分配而不是整体预留,基本就好了。还有你tensor_parallel_size单卡就设1,别改,那个是给多卡用的。swap空间不用管,vLLM的CPU offload对7B来说反而更慢。
你这配置按理说真不该崩,7B模型在A100上就算4K长度占用也就20来G,0.9利用率还留了8G余量。我怀疑问题不在max_model_len和tensor_parallel_size,后者你单卡设1就行,设多了反而报错。你查下是不是vLLM版本太老,老版本对Qwen2.5的MLA注意力支持有bug,显存预分配会异常膨胀,建议升到0.6.3以上试试。另外确认下是不是把--enable-prefix-caching或者--enable-chunked-prefill这类参数开了,有时候这些选项会额外吃显存,尤其并发请求多的时候。还有个坑,你有没有同时加载多个LoRA adapter?或者请求里带了特别长的system prompt,那部分也会算进context长度里,跟max_model_len叠加后实际超了。最后实在不行,把gpu_memory_utilization降到0.85,留出更多给CUDA context和碎片,我遇到过类似情况,降一点反而稳定。swap空间那个参数是给CPU offload用的,A100没必要开,开了更慢。你先按这几个方向排查下,大概率是版本或者隐藏参数的问题。
八成是KV cache算错了,你试试把gpu_memory_utilization降到0.7看下,另外确认下max_num_seqs是不是设太小了。
你八成是忘了给每个并发请求单独算显存,4096只是单条上限,并发一多照样爆。试试把gpu_memory_utilization降到0.7,再开个swap分区兜底。
这配置看着挺标准的,但OOM大概率不是tensor_parallel_size的问题,7B单卡根本不需要设这个。你查过vLLM的日志里有没有提示“KV cache size”或者“max_num_seqs”的参数吗?我之前也遇到过类似情况,后来发现是并发请求时prefill和decode的显存峰值叠加了,你试着把gpu_memory_utilization降到0.8,再调小max_num_seqs到8左右看看。另外确认下CUDA_VISIBLE_DEVICES是不是真的只指向了那一张卡,有时候环境变量没生效会偷偷用多卡。
你这配置按理说跑4K长度绰绰有余啊,A100 80G单卡喂Qwen2.5-7B,gpu_memory_utilization调到0.9其实挺激进的,我怀疑不是长度问题,是并发请求时KV cache的预分配炸了。vLLM默认会按max_model_len预留整块显存,但如果你没设max_num_seqs或者max_num_batched_tokens,它可能为每个请求都按最大长度来分配,几个并发就把显存吃满了。你可以先试试把gpu_memory_utilization降到0.7,然后显式设max_num_seqs=4或者更小,看还崩不崩。另外tensor_parallel_size单卡就别设了,设成1就行,设错反而会触发额外的显存开销。swap空间那个是给CPU offload用的,你显存够大根本用不到,除非你开了enable_prefix_caching或者某些优化选项。我之前跑类似模型也遇到过这情况,最后发现是vLLM版本太老,升级到最新版之后显存管理好很多。你查下日志里有没有具体的OOM发生在哪个tensor,有时候是attention机制的临时buffer爆了,那就要调block_size。建议你先把并发压到1,确认单请求能稳定跑32K,再慢慢加并发找阈值,别一上来就用0.9的利用率。
这配置看着挺标准的,但OOM多半不是max_model_len的锅,你检查下vLLM的版本和CUDA driver匹配吗?我之前遇到过类似问题,后来发现是P2H带宽爆了,把gpu_memory_utilization降到0.8反而更稳。另外tensor_parallel_size就单卡设1就行,设大了纯浪费显存。你试试把并发数压到2看还崩不崩,如果还崩就得看下是不是prefill阶段峰值显存超了,改下--enable-prefix-caching试试。
说实话你这配置单看是没问题的,A100 80G跑7B模型4K长度绰绰有余,问题大概率出在vLLM的显存分配逻辑上。你设了gpu_memory_utilization=0.9,但如果没调max_num_seqs或者max_num_batched_tokens,默认值可能让KV cache预留得特别激进,并发一上来就把显存挤爆了。我之前也踩过这个坑,后来把max_num_seqs从默认的256降到32,再配合--kv-cache-dtype auto,瞬间就稳了。另外tensor_parallel_size=1就行,7B单卡没必要张量并行,设多了反而浪费显存做通信。swap空间这块,vLLM确实支持--swap-space,但本质是CPU offload,性能掉得厉害,不建议优先考虑。你可以先跑一下vllm的benchmark脚本,看看到底是prefill阶段还是decode阶段OOM,这样能定位得更准。还有个小细节,Qwen2.5的tokenizer里有个特殊占位符,如果你输入里带了很多系统提示词,实际序列长度可能比你预期的高不少,建议用tokenizer数一下真实长度。我怀疑你日志里虽然写着max_model_len=4096,但实际KV cache是按最大可能batch算的,所以并发一多就炸,你可以试试把max_model_len先设成2048跑一下,排除模型本身的问题。
你这配置看着没啥毛病,但OOM大概率不是max_model_len的锅。可以试试把gpu_memory_utilization降到0.7左右,给KV cache留点余量,另外确认下是不是开了多个并发时每个请求都预分配了完整4096的显存。我之前遇到过类似情况,是vLLM版本和CUDA版本不匹配导致的碎片化,升级到最新版就好了。还有,tensor_parallel_size设1就行,单卡别折腾这个,swap开了反而更慢。
我估计大概率不是tensor_parallel_size的问题,单卡A100跑7B根本用不着张量并行,设成1就行,设大了反而可能因为通信开销和显存碎片化搞出幺蛾子。你gpu_memory_utilization=0.9其实已经挺激进了,但vLLM的显存分配是预占式的,它会按max_model_len去预留KV cache的空间,你虽然设了4K,但并发请求数上去了,每个请求的prefill和decode阶段都会动态吃显存,尤其如果输入长度参差不齐,峰值可能远超你预期。可以试试把max_model_len调回2048或者把gpu_memory_utilization降到0.7左右,看还崩不崩,先排除是不是预留空间和实际峰值冲突。另外你日志里如果能看到“Prompt length exceeds max_model_len”之类的警告,那就说明有请求长度超了,但你说4K崩,那更可能是你没限制并发数,vLLM默认会尽量塞满batch,建议用--max-num-seqs限制一下,比如8或者16。swap空间那个是CPU offload用的,A100 80G跑7B根本不需要开,开了反而慢。还有个坑是Qwen2.5的attention实现,新版vLLM有些版本的flash-attn和Qwen2.5的GQA不兼容会有bug,你试试加--enforce-eager关掉图模式跑一下,有时候图编译阶段的显存缓存会虚高。如果还不行,用nvidia-smi盯着看是不是显存被别的进程占了,或者你实际加载的权重是不是fp16但没走bitsandbytes量化,7B fp16大概14G,但加上激活和KV cache,4K长度单并发可能都到30G了,多并发很容易顶满。
这个报错我之前也踩过,大概率不是tensor_parallel_size的问题,7B单卡不用设那个。你先看看是不是max_model_len和gpu_memory_utilization叠加后,KV cache预留空间不够,试试把utilization降到0.85,再把max_model_len调成2048跑一下看还崩不崩。另外vLLM版本和CUDA版本不匹配也会触发假性OOM,你查下日志里有没有pytorch的警告。如果还不行,开一下--enable-chunked-prefill,能省不少显存。
这问题我前几天刚踩过,大概率不是tensor_parallel_size的锅,单卡本来就不用设那个。你试试把gpu_memory_utilization降到0.85以下,vLLM默认会预留一部分KV cache,但显存碎片化也会导致实际可用比预期少。另外检查下是不是请求里带了过长的system prompt,或者并发时总token数超了max_model_len*并发数。实在不行开个swap空间兜底,虽然慢点但至少不崩。
你这配置按理说跑4K不该崩,感觉不是tensor_parallel_size的问题,单卡就别设那个了。先查下是不是Qwen2.5的attention实现默认开了长上下文优化,把max_model_len设成实际请求长度的两倍试试。另外vLLM现在对KV cache的预分配挺激进的,0.9利用率可能留的buffer不够,降到0.85再配合--max-num-seqs限制下并发数看看。我之前遇到过类似情况,最后发现是请求里带了超长system prompt没算进max_model_len里,你可以抓下实际输入长度对比下日志。
看你这配置按理说4K长度不该炸,八成不是max_model_len的事。先确认下是不是请求并发时显存碎片化严重,试试把gpu_memory_utilization降到0.85,或者给vLLM加个--enforce-eager参数关掉CUDA graph,能省不少显存。另外tensor_parallel_size单卡就设1,别瞎改,swap空间那个是CPU内存的事,跟OOM关系不大。我之前也遇到过类似情况,最后发现是vLLM版本太旧,升到0.6.x就稳了,你可以先看看版本。
八成是并发时显存碎片化或者prefill内存峰值爆了,试试把gpu_memory_utilization降到0.8,再开个—enable-chunked-prefill。
我之前也踩过这坑,max_model_len设的是单序列长度,但并发请求会叠加显存占用,4096×并发数才是实际峰值,你试下把并发压到1看看还崩不崩。另外vLLM的KV cache是预分配的,0.9利用率其实挺激进,建议先降到0.7跑通再往上调,顺便检查下Qwen2.5的attention是不是用了GQA,这个对显存影响不小。tensor_parallel_size单卡就设1别动,swap空间是给CPU offload用的,不是救命稻草。
同款配置,我之前也踩过这坑。你先别急着怀疑tensor_parallel_size,单卡部署根本不用设这个,设了反而可能触发额外的显存分片逻辑。我怀疑是max_model_len和gpu_memory_utilization一起搞的鬼,vLLM预分配KV cache是按你设的max_len来的,但0.9利用率在A100上实际会预留一部分给CUDA context和激活值,你并发一上来,临时张量一挤就爆了。可以试试把gpu_memory_utilization降到0.8,然后max_model_len先砍到2048跑通,再逐步往上加。另外查一下你vLLM版本,老版本对Qwen2.5的attention backend支持有问题,会额外吃显存,升级到0.6.3+基本能解决一半这类OOM。swap空间那个参数是给CPU offload用的,你显存这么充裕没必要开,开了反而拖慢速度。还有个小技巧,启动时加--enforce-eager,跳过CUDA graph捕获,能省下1-2G临时显存,虽然吞吐略降但稳。先按这个顺序排查,大概率是版本和预分配比例的问题,跟模型本身关系不大。