最近在搞大模型部署,拿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 条这配置看着挺标准的,问题大概率不在max_model_len上。你查过实际KV cache占用没?Qwen2.5的attention实现和vLLM版本兼容性有时候会出幺蛾子,建议先升到最新版试试。另外tensor_parallel_size单卡设1就行,设大了反而浪费显存。swap空间基本不用管,重点看看是不是paged attention没生效,跑起来的时候nvidia-smi盯着显存曲线,如果直接拉满而不是缓慢增长,那就是预分配策略的问题。
顺便问下,你用的是不是最新版transformers?之前有个版本对Qwen2.5的rope缩放处理有bug,会导致KV cache异常膨胀。可以考虑换个旧点的transformers或者手动把rope_scaling配置加上。
同款卡同款模型,我之前也踩过这坑。你先别急着调tensor_parallel_size,单卡这个参数设1就够了,设大了反而浪费显存。重点检查下是不是KV cache分配太激进,试试把gpu_memory_utilization降到0.7,留点余量给CUDA context和碎片。另外可以开一下vLLM的--enable-chunked-prefill,对长并发请求的显存占用能缓解不少。还有个小细节,确认下你装的vLLM版本是不是跟CUDA 12.x匹配,版本不对有时候会多占不少显存。
我怀疑你可能是把max_model_len设成4096但实际请求里带的长文本没被截断?vLLM默认会按max_model_len来预分配KV cache,如果并发数上去了,每路请求的prefill阶段显存峰值会叠起来。你可以试试把--max-num-seqs调小点,比如8或者4,强制限制并行序列数。另外swap空间那事基本不用考虑,vLLM的swap是CPU内存换显存,性能损耗巨大,不如直接看看是不是paged attention的block数被默认值卡住了。
八成是显存碎片化或者KV cache没清干净,试试把gpu_memory_utilization降到0.8再看。
试试把gpu_memory_utilization降到0.85,再把max_model_len调回默认看看,多半是KV cache和并发算岔了。
说实话你这个问题我前两天刚踩过,最后发现是vLLM的KV cache预分配策略在作怪。虽然你设了max_model_len=4096,但并发请求每个都会按最大长度预留显存,如果preemption没开或者block管理默认参数不合适,4K长度乘个8并发也可能爆。你查一下vllm的日志里有没有“Number of blocks”或者“KV cache size”那几行,看看实际分配的显存是不是远超预期。
另外tensor_parallel_size=1应该没问题,除非你模型是FP16加载,7B大概占14G,剩下60多G按理说够跑几百个4K并发,但OOM多半是碎片化或者paged attention的block size没调好。可以试试把gpu_memory_utilization降到0.7,强制触发swap到CPU,虽然慢点但至少不崩,或者直接用--kv-cache-dtype fp8试试能不能省一半显存。
我之前还遇到过是CUDA graph捕获时额外占用了显存,你顺手加个--enforce-eager关掉graph,看报错还复现不。再不行就升级下vLLM版本,0.6.x和0.7.x的显存管理差异挺大的,老版本对Qwen2.5支持有bug。你贴一下完整启动命令和日志尾部,我帮你看看具体是哪块爆的。
同款卡同款模型,我之前也被这问题坑过。你tensor_parallel_size设1就够了,单卡没必要拆,但更关键的是检查下是不是KV cache分配时把显存占满了,vLLM默认会预分配很多块,建议把gpu_memory_utilization调到0.7左右试试。另外确认下Qwen2.5的attention实现是不是用了GQA,如果没走vLLM的paged attention,并发一上来显存直接翻倍。可以开个--enable-prefix-caching看看能不能缓解,实在不行就限流或者把max_num_seqs调小点,别让并发全挤一起。
我之前也遇到过类似情况,后来发现是vLLM的preemption和KV cache管理闹的,你设的gpu_memory_utilization=0.9其实偏高,留给CUDA context和fragmentation的余量不够,试着降到0.85或者0.8看看。另外max_model_len=4096不代表实际每个请求只占4K,如果并发请求的prompt长度波动大,vLLM会按最大长度预分配显存,你可以检查下请求里有没有特别长的输入,或者用--max-num-seqs限制下并发数。还有,别动tensor_parallel_size,单卡设1就行,那个是给多卡用的,设错了反而会分片导致额外开销。我猜你日志里应该有具体哪个tensor分配失败,贴出来可能更好定位。
是不是开了多个并发又把prefill内存撑爆了?试试把max_num_seqs调小点,或者看看是不是显存碎片化。
八成是并发时KV cache涨太快,试试把max_num_seqs调小到4或者8,能立竿见影。
别光盯这两个参数,查下gpu_memory_utilization是不是被pytorch的缓存吃了,调成0.85再配个--enable-chunked-prefill试试。
说实话你这个配置单看参数是没毛病的,A100 80G跑7B模型4K上下文理论上绰绰有余。我怀疑问题出在vLLM的显存分配策略上,0.9的utilization其实已经很高了,但Qwen2.5的KV cache计算方式可能比你预期吃显存,尤其并发请求会放大这个占用。你试试把gpu_memory_utilization降到0.85,同时把max_num_seqs调小一点,比如默认是256,改成64或32,看能不能缓解。另外tensor_parallel_size这个你设的几?单卡的话应该设1,别设成2或4,不然它会尝试把模型切分到多卡,反而增加显存碎片。还有一个坑是vLLM的版本,旧版对Qwen2.5支持不完善,建议升级到最新版,之前我遇到过类似问题,升级后好了。swap空间那个不用管,vLLM默认不启用CPU offload,除非你显存实在不够才考虑,但你这卡应该不至于。你先按我说的调一下,如果还是崩,把启动日志里显存分配那一段贴出来,我帮你看看具体哪里超了。
八成是并发请求堆一起把KV cache撑爆了,试试把max_num_seqs调小点,或者开下enable_prefix_caching。
八成是KV cache和prefill内存分配没算对,试试把gpu_memory_utilization降到0.8再看日志。
检查下max_num_seqs是不是默认值太小,并发请求堆积会把显存吃满,调成256试试。
这配置看着确实不对劲,7B模型4K上下文按理说A100 80G绰绰有余。你检查下是不是加载了多个副本,或者显存碎片化严重,试试把gpu_memory_utilization降到0.85,再开个--enforce-eager看下。另外tensor_parallel_size单卡就设1,别乱加,swap空间那个是给CPU offload用的,不是显存不够的直接解药。之前我遇到过类似情况,最后发现是请求里带了超长system prompt,占用了一部分预留显存,你查查有没有隐藏的token开销。
先查下nvidia-smi看是不是别的进程占了显存,A100跑7B开4K真不至于崩。
先确认下是不是真把显存吃满了,nvidia-smi看下峰值,我怀疑是KV cache的预留和prefill峰值叠加了。max_model_len设4096但并发请求多的话,每个请求的prefill显存是动态分配的,A100 80G理论够但vLLM默认的chunked prefill可能没开,建议试试加--enable-chunked-prefill。另外tensor_parallel_size=1就好,单卡没必要设多。swap空间基本没用,vLLM的CPU offload对性能影响很大,不如把gpu_memory_utilization降到0.85留点余量。之前我跑7B也遇到过类似问题,后来发现是pytorch的缓存碎片,加了--memory-pool-size=0才解决,你可以试试。
遇到过类似的坑,大概率不是tensor_parallel_size的问题,7B单卡根本不用开TP。你先检查下vLLM版本,老版本对Qwen2.5的attention计算有显存碎片问题,升到0.6.3+基本能解决。另外gpu_memory_utilization=0.9看着合理,但如果你同时开了--enable-prefix-caching或者--max-num-seqs默认值太高,实际预留的KV cache会暴涨,试着把max-num-seqs降到64甚至32看看。还有个小坑,确认下是不是加载了多个副本,比如SGLang和vLLM同时占显存,nvidia-smi看下进程就明白了。
我之前也踩过这坑,八成不是tensor_parallel_size的锅,单卡这参数设1就行。你查下是不是Qwen2.5的rope_scaling配置没跟上,或者vLLM版本太旧,老版本对长上下文支持有bug。另外建议把gpu_memory_utilization降到0.85试试,留点余量给CUDA context和KV cache碎片,同时看看是不是并发请求的max_num_seqs没限,默认值有时候会吃爆显存。
建议先检查下vllm的版本和cuda版本匹配,另外把gpu_memory_utilization降到0.8试试,有时候预留少了反而容易崩。
你这配置看着没啥大问题,但OOM大概率不是max_model_len的锅,而是并发时KV cache叠加爆了。A100 80G跑7B按理说很宽裕,建议先查下vLLM版本,老版本对Qwen2.5的显存管理有bug,升级到最新版试试。另外gpu_memory_utilization别拉到0.9,留点给CUDA context和碎片,0.85比较稳。swap空间基本没用,vLLM的CPU offload效率很低,不如把并发数降下来或者用--enable-chunked-prefill。我之前也遇到过类似情况,最后发现是--max-num-seqs默认值太高,手动调成16就好了。