最近在搞大模型部署,拿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 条同样用vLLM跑过Qwen2.5-7B,单卡A100 80G,按说7B模型不应该这么脆弱。你报OOM大概率不是tensor_parallel_size的问题,单卡设这个参数默认1就行,设错了反而会多占显存。我怀疑是vLLM的预分配机制在搞鬼,它默认会为每个请求预留一个完整的KV cache块,如果你并发数高,即使每个请求只生成很短内容,也会瞬间吃掉大量显存。你可以试试把gpu_memory_utilization降到0.8甚至0.7,同时把max_num_seqs设小一点比如4或8,这样能限制同时处理的请求数。另外检查一下是不是用了--enable-prefix-caching,这个功能在某些场景下反而会增加显存开销。至于别人跑32K,可能他们用的是量化版本或者batch size控制得更严格,你可以先换成AWQ量化试一下,显存占用能降一大截。swap空间就别折腾了,vLLM走GPU显存交换到CPU内存效率极低,不如直接调低memory utilization。
7B模型吃不了80G,八成是prefill阶段显存峰值没控制住,试试把max_num_batched_tokens调小点。
你这配置单卡跑7B其实应该够用的,试试把gpu_memory_utilization降到0.8以下,或者先不设max_model_len跑一次看它自动分配多少显存,可能是预分配策略太激进了。另外tensor_parallel_size单卡设成1就行,设错了反而会多占显存。如果还崩的话,可以检查下是不是有个别请求sequence长度超了4K,vLLM会按最大请求长度预留空间。
老实说你这配置按理说跑4K长度不应该崩的,A100 80G喂Qwen2.5-7B绰绰有余。我怀疑问题出在gpu_memory_utilization=0.9这个参数上,vLLM默认预留的KV cache可能跟你实际显存分配有冲突,尤其并发请求时每个请求的显存碎片会快速堆积。可以试试先降到0.7或者0.8,看看会不会稳定一些。另外tensor_parallel_size=1就别动了,单卡不需要设置这个,设错了反而可能触发奇怪的显存分配逻辑。还有你检查过vLLM版本没?我记得0.4.x之后对Qwen2.5有过显存优化补丁,老版本可能有bug。swap空间别开,那个是给CPU用的,对GPU没卵用还拖慢推理速度。最后提醒个细节:max_model_len设4096但实际输入长度可能被tokenizer自动padding到固定值,你查一下请求的input_length是不是真的被截断了。
这种情况我上周刚踩过坑,A100 80G理论上跑7B模型4K长度不可能爆的,问题大概率出在vLLM的显存分配逻辑上。你设了gpu_memory_utilization=0.9,但vLLM的预分配机制会吃满这部分显存,而Qwen2.5的KV cache对长序列很敏感,如果max_num_batched_tokens或者max_num_seqs没调,默认值可能会在并发时炸开。建议你先看看启动日志里实际分配的显存是多少,然后试着把gpu_memory_utilization降到0.75左右,同时调小max_num_seqs到2-4,这样能留出余量处理并发。另外检查下你是不是开了tensor_parallel_size=2——单卡千万别设这个,写了等于没写,反而会触发额外的显存开销。至于swap空间,vLLM的offloading不太成熟,7B模型没必要走这步,重点还是先把batch size压下来。如果还不行,试试最新版vLLM,0.6.x对Qwen2.5的显存管理有优化补丁。
单卡A100 80G跑7B模型按理说4K长度不至于OOM,我怀疑你gpu_memory_utilization设0.9可能偏高了,vLLM实际预分配会留一些余量,试试降到0.8或者0.85。另外检查下有没有不小心开了tensor_parallel,单卡默认设1就行,多卡才需要调。还有一个常见坑是vLLM的prefill阶段会占用额外显存,你把max_num_seqs设小一点,比如2或4,看看并发请求时能不能稳住。
这问题我上周刚踩过坑,大概率不是tensor_parallel_size的问题,单卡A100跑7B模型根本用不上这个参数。我怀疑你那个gpu_memory_utilization设成0.9其实没生效,vLLM在计算显存分配时还会被其他因素干扰,比如max_num_seqs和max_num_batched_tokens这两个参数你没贴出来。默认情况下vLLM会预留一部分显存给attention和调度,但Qwen2.5的架构对KV cache消耗比想象中大,尤其并发请求多了以后。建议你把gpu_memory_utilization降到0.85试试,同时把max_num_seqs显式设成4或8,减少同时处理的请求数,这样能避免显存碎片化。另外检查下是不是用了HuggingFace的旧版本tokenizer,Qwen2.5的tokenizer在vLLM里有已知的显存泄漏bug,升级到最新版能缓解。至于别人跑32K长度,可能是他们开了vLLM的swap到CPU功能(设置swap_space参数),但那个对延迟影响很大,如果你追求稳定性不如先调低并发。最后确认下你的CUDA版本是不是12.1以上,老版本对vLLM的显存管理支持不好。
这配置按理说跑7B模型应该稳的,OOM大概率不是tensor_parallel_size的问题,单卡不用设那个。你看看是不是vLLM默认的prefill chunk大小或者max_num_batched_tokens没调,这两个参数对显存影响挺大的,尤其是并发请求多的时候。另外gpu_memory_utilization可以试着降到0.85,给kv cache留点余量,swap空间对显存帮助不大,主要还是优化内存分配策略。
单卡A100 80G跑7B模型按理说显存是够的,我怀疑问题出在vLLM的预分配策略上。你设了gpu_memory_utilization=0.9,但vLLM会预留一部分显存给KV cache的预填充,如果max_model_len设得保守但实际请求的输入长度参差不齐,预分配会按照最大可能长度来占空间,反而容易崩。可以试试把gpu_memory_utilization降到0.8或0.85,留点余量给并发请求的临时张量。另外tensor_parallel_size=1就行,单卡不用开多卡并行,开了反而因为通信开销占显存。如果还不行,检查下vLLM版本,旧版本对Qwen2.5的support有bug,我遇到过类似问题,升级到0.6.3后解决了。swap空间理论上不直接解决显存OOM,但可以开vLLM的--enable-prefix-caching或者调低--max-num-batched-tokens,减少批处理占用的显存峰值。最后确认下你的Python环境里是不是有其他进程在吃显存,比如同时开了transformers的模型加载。
你这配置单看没啥问题,A100 80G跑7B模型按理说绰绰有余。不过我怀疑问题可能出在vLLM的显存预留机制上,gpu_memory_utilization设0.9其实只留了10%给KV cache以外的开销,但Qwen2.5的attention计算和中间激活值有时候比预想的大,特别是并发请求多的时候显存碎片化严重。我试过把max_model_len先降到2048,如果OOM消失,那就说明是长度和并发数叠加后把显存吃光了——这时候可以试着把gpu_memory_utilization提到0.95,或者减少max_num_seqs(比如设成4),让vLLM少预分配一些slot。至于tensor_parallel_size,单卡没必要开,设成1就行,开了反而因为通信开销多占显存。swap空间的话,vLLM现在还没原生支持CPU offload,你得用vLLM的swap_space参数调一下,但那个主要是给缓存用的,不能解决真正的显存不足。另外检查下是不是用了flash_attn?没开的话显存消耗会翻倍,加上--enable-prefix-caching也能省点重复计算的显存。最后建议去vLLM的issue区搜一下“Qwen2.5 OOM”,我记得有人提过类似问题,说是某些版本的vLLM对Qwen2系列的分词器预分配有问题,升级到0.6.4以上可能就解决了。
说实话你这个配置按理说不该崩的,单卡A100 80G跑7B模型哪怕是满负载也不至于4096就爆显存。我怀疑问题可能出在vLLM的默认prefill和decode阶段显存分配策略上,尤其是你设了gpu_memory_utilization=0.9,但它实际预留的KV cache可能比你想的大很多。建议你先试试把max_num_seqs调小一点,比如从默认的256降到64,因为并发请求多的时候每个序列的KV cache会叠加,很容易把显存撑爆。另外tensor_parallel_size设成1就行,单卡用不着多卡并行,设错了反而会额外占用通信缓冲区。swap space这个别碰,vLLM的swap是给CPU offload用的,你显存都没用完就去offload只会更慢。还有个坑是Qwen2.5的attention实现,vLLM最新版对它的支持可能还有bug,你可以降级到0.6.0或者切到flash_attn后端试试。最后检查下你的请求里有没有特别长的输入,就算设了max_model_len,实际prompt长度接近上限时显存占用会暴涨。你跑个简单的单请求压力测试,把gpu_memory_utilization降到0.8再观察下,应该能找出瓶颈。
你这配置按理说不该OOM,7B模型用A100 80G跑4K长度绰绰有余。建议先查下vLLM的版本,老版本对Qwen2.5的显存管理有bug,更新到0.6.0以上试试。另外tensor_parallel_size单卡设1就行,设多了反而浪费显存。还有gpu_memory_utilization可以降到0.85,给kv cache留点余量。如果还崩,检查下是不是偷偷加载了多个模型副本。
这配置按理说跑7B模型不会这么惨,A100 80G给满0.9利用率的话,光模型权重也就占15G左右,剩下60多G够塞不少KV cache了。我觉得问题可能出在max_model_len和gpu_memory_utilization的组合上——你设了4096但显存利用率只有0.9,vLLM会按0.9去预分配显存,但实际每个请求的KV cache是按max_len动态分配的,如果并发数多或者请求长度超过预设,预分配的那块空间不够用就会崩。另外tensor_parallel_size单卡设1就行,设多了反而白占显存。你可以试试先把gpu_memory_utilization调到0.95甚至0.98,同时把max_num_seqs设小一点比如4或8,先压住并发量看看还崩不崩。swap空间那个基本没用,大模型推理走的是显存,swap到系统内存会慢到怀疑人生。还有就是检查下vLLM版本,之前有个版本对Qwen2.5的attention计算有显存泄漏bug,升到0.6.3以上或者直接用最新版试试。
你这配置按理说跑7B应该稳的,问题可能出在vLLM的预分配机制上。gpu_memory_utilization设0.9对于Qwen2.5的kv cache来说其实偏保守了,可以试试拉到0.95,但更关键的是检查一下是不是装了flash-attention或者用到了动态batch导致显存碎片化。另外建议把max_num_seqs调低到2或者4,先排除并发请求数量的问题。如果还不行,可以贴一下启动命令和完整日志,大家一起看看。
试试把gpu_memory_utilization降到0.8,同时开个preemption模式,可能能缓解并发时的显存抖动。
我前两天刚踩过这个坑,单卡A100跑7B其实没必要设tensor_parallel_size=2,设成1试试,否则反而会多占显存。另外gpu_memory_utilization别超过0.85,给推理和缓存留点余量,0.9太极限了。还有你检查下是不是偷偷加载了量化或lora权重,有时候模型文件里带额外参数也会占显存。
讲真你这个配置按理说跑7B应该很宽裕的,我怀疑问题可能出在预填充阶段的内存峰值上。vLLM默认用的是连续批处理,但并发请求一多,每个请求的prefill显存开销会叠加,特别是Qwen2.5的attention计算对KVCache要求不低。你可以试试把gpu_memory_utilization降到0.85看看,或者手动限制一下max_num_seqs,比如设到8或16,别让它一次性吞太多请求。另外tensor_parallel_size设1就行,单卡没必要开TP,开了反而可能因为通信开销多占点显存。swap space这块我倒是没调过,但vLLM本身有CPU offload选项,你可以在启动时加个--cpu-offload-gb 8,把部分KV缓存挪到内存,代价是推理速度会慢一些。还有就是检查下Qwen2.5实际需要的max_model_len是不是你设的4096,有时候HuggingFace的config里默认值会比文档标的大。
这个现象挺常见的,建议先检查下vLLM的版本,老版本对Qwen2.5的显存管理有bug,更新到0.6.6以上试试。另外你max_model_len设4096但实际显存占用可能远高于计算值,因为Qwen2.5的attention和kv cache跟模型结构有关,可以尝试把gpu_memory_utilization降到0.8,同时加个--enforce-eager参数禁用图编译,虽然会慢点但能验证是不是显存碎片问题。tensor_parallel_size单卡设1就行,设错反而会多占显存。
这个配置单看确实挺标准的,不过OOM不一定只是max_model_len的问题。Qwen2.5-7B本身KV Cache占显存就挺猛,你设了gpu_memory_utilization=0.9,但vLLM默认prefill阶段还会额外吃一部分显存,如果并发请求的prompt长度差异大,动态显存分配可能直接爆掉。建议先试试把gpu_memory_utilization降到0.85甚至0.8,看看能不能稳住。另外tensor_parallel_size单卡设1就行,设错了反而会多占显存。swap空间在CUDA层面基本没用,除非你开vLLM的offload功能,但那会拖慢推理速度。还有个小坑:vLLM的max_num_seqs默认是256,并发多的时候每个序列的中间状态积压起来也很可观,可以尝试改小到64或者32看看。我同样用A100跑7B模型,设max_model_len=8192、gpu_memory_utilization=0.88、max_num_seqs=32,能稳定跑4个并发。你那个32K长度的别人可能是用了量化或者开启了vLLM的prefix caching,或者直接跑的单请求低并发,别被表面参数骗了。
这配置按理说跑7B应该很宽裕才对,问题可能不在tensor_parallel_size,单卡不用设那个。建议先检查下vLLM版本,旧版对Qwen2.5的memory management有bug,升级到最新版试试。另外gpu_memory_utilization可以降到0.85,给推理留点余量,有时候vLLM预分配的kv cache比你想象的大。还有确认下是不是启用了什么额外的特性比如prefix caching,那个也挺吃显存的。