最近在搞大模型部署,拿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 条检查下gpu_memory_utilization设太高了,Qwen2.5的kv cache很吃显存,改成0.85试试。
试试把gpu_memory_utilization降到0.85,同时检查下prefill阶段是不是占太多显存了。
检查下vLLM的block大小和前缀缓存,默认参数对7B模型可能吃显存,调小点试试。
看看vLLM的prefill和decode阶段的显存分配比例,默认设置下prefill会吃很多显存,调低gpu_memory_utilization到0.8试试。
说实话这配置单卡A100 80G跑7B模型按说应该很宽裕才对,你max_model_len设4096按理说不会爆,我觉得问题可能出在vLLM的显存预分配机制上。你gpu_memory_utilization设0.9,但实际vLLM会预留给KV cache和中间变量一个固定比例,如果并发请求数没控制好,比如你一次塞太多请求进来,显存瞬间就被打满了。建议你先试试把gpu_memory_utilization降到0.8甚至0.75,同时把max_num_seqs设小一点,比如4或者8,看看单请求能不能跑通。另外tensor_parallel_size单卡设1就行,别动它,设错了反而会导致显存翻倍分配。swap空间基本没用,大模型推理不依赖这个。我怀疑你看到的别人跑32K可能是用了量化或者开启了vLLM的prefix caching功能,你可以检查下自己的启动参数里有没有加--enable-prefix-caching,还有模型是不是FP16加载的。如果还不行,试试把模型用AWQ量化一下再跑,显存压力会小非常多。
单卡A80跑7B模型一般不会这么容易崩,你gpu_memory_utilization设0.9其实不算低,但OOM很可能跟vLLM的预分配策略有关。可以试试把max_num_seqs调小一点,比如设成4或者8,默认值可能太高了,并发请求时每个序列占的KV Cache会瞬间撑爆显存。另外tensor_parallel_size单卡设1就行,设错反而会多占资源。swap空间那个不用管,大模型部署基本不依赖这个。
同样是A100 80G,我跑7B模型也遇到类似问题。你gpu_memory_utilization设0.9其实偏保守了,试试调到0.95甚至0.98,vLLM对显存利用率要求比较高。另外检查下vLLM版本,0.6.0之后对Qwen2.5有专门的优化,旧版本容易爆显存。tensor_parallel_size单卡不用设,设了反而会浪费显存。还有个坑是vLLM默认的block大小,你可以在启动时加个--block-size 16试试,能显著降低KV cache占用。
我也遇到过类似的问题,后来发现是vLLM默认的prefill内存分配策略比较激进。可以试试把gpu_memory_utilization降到0.8甚至0.75,再配合--max-num-batched-tokens参数限制一下预填充阶段的token数,这样能腾出不少显存给并发请求。另外tensor_parallel_size单卡设1就行,设大了反而会浪费显存做通信buffer。你用的vLLM版本是不是比较老?0.6.x以后对Qwen2.5的显存管理优化了不少,建议升到最新版看看。
你这配置按理说跑7B应该稳得很,我怀疑问题出在预填充阶段的内存分配上。vLLM默认会为每个请求预留完整的KV cache空间,如果并发数一多,即使单条长度只有4K,多个请求的缓存加起来也会吃掉大量显存,尤其是A100的80G显存还需要留一部分给模型权重和中间激活值。你可以试试把gpu_memory_utilization降到0.8左右,同时显式设置一下max_num_seqs,比如限制到4或8,这样能避免并发时缓存暴涨。另外tensor_parallel_size=1就够了,单卡没必要设并行,设高了反而会因为通信开销浪费显存。还有个小技巧——检查下是否开了prefix caching,那个功能在某些场景下会额外吃显存,关掉可能有用。最后建议用nvidia-smi看看显存碎片情况,有时连续部署几个模型后会产生碎片,重启容器能释放干净。
这配置按理说跑7B模型应该很宽裕啊,单卡A100 80G拉4K长度就崩确实不太正常。我怀疑问题可能出在vLLM的默认缓存分配上——虽然设了gpu_memory_utilization=0.9,但vLLM的KV cache如果没限制实际占用,可能会把剩下10%的显存也吃掉,尤其Qwen2.5的attention计算比老模型更耗显存。你试过把max_num_seqs调小一点吗?比如先设成2,看单请求能不能跑通,排除并发时的碎片化问题。另外tensor_parallel_size=1就行,7B模型单卡用不上TP,设错反而可能多占显存。swap空间基本不用管,vLLM不支持优雅的cpu offload,内存交换只会更卡。建议先跑一个极简配置:max_model_len=4096、gpu_memory_utilization=0.7、block_size=16,看看还崩不崩。如果稳定了再逐步调高memory utilization。还有个小坑——检查一下系统里是不是有其他进程在抢显存,比如监控工具或者之前残留的推理进程,A100 80G被吃满的话差1GB都可能崩。
你这配置看起来没啥大问题,八成不是tensor_parallel_size的锅,7B单卡根本不用切。先查下vLLM版本,老版本对Qwen2.5的显存预分配有bug,升到0.6.3+再试试。另外max_model_len设4096但实际显存占用会被KV cache放大,你把gpu_memory_utilization降到0.8,留点余量给CUDA context和碎片,说不定就稳了。还有个小坑,如果开了--enable-prefix-caching,并发长prompt会额外吃显存,先关掉跑跑看。
你这配置看着没啥问题,但OOM大概率不是max_model_len的锅,试试把gpu_memory_utilization降到0.7左右,给CUDA context和KV cache留点余量。另外tensor_parallel_size单卡设1就行,设大了反而会多占显存做通信。我之前跑7B也遇到过类似情况,后来发现是并发请求时prefill阶段峰值显存暴涨,可以限制下max_num_seqs或者把--enable-chunked-prefill打开。swap空间基本没用,vLLM这功能还不成熟,别指望它救急。
说实话我觉得你这配置本身看着没问题,A100 80G跑7B模型4K上下文理论上绰绰有余。但有个坑你可能踩了:vLLM的gpu_memory_utilization是包含KV cache和模型权重的总预算,0.9看起来没问题,但如果你的CUDA版本或者vLLM版本和驱动不匹配,显存碎片化会特别严重,建议先看看nvidia-smi里实际占用是不是已经满了。另外tensor_parallel_size=1就行,7B模型单卡完全够,设大了反而会多出通信开销和冗余显存。我怀疑更可能是你的并发请求数量太大,每个请求即使max_model_len=4096,vLLM也会为每个sequence预留完整的KV cache空间,比如一次性来20个并发,4096*20的缓存叠加起来就吃满了。你可以试试把max_num_seqs调小,比如设成8或者4,或者干脆降到gpu_memory_utilization=0.75,给CUDA context和pytorch留点余量。swap空间那玩意儿别碰,vLLM的swap是CPU内存做offload,速度慢得离谱,而且你显存都没用满就崩了,问题肯定不在swap。最后建议你升级到最新版vLLM,之前有个版本对Qwen2.5的attention后端支持有bug,会导致显存分配异常翻倍,更新一下说不定就好了。
八成是并发时KV cache炸了,试试把gpu_memory_utilization降到0.8,再加个--max-num-seqs限制下并发数。
我之前也踩过这坑,八成不是tensor_parallel_size的问题,7B单卡根本用不上那个。你试试把gpu_memory_utilization降到0.85左右,给CUDA context和碎片留点余量,0.9太满了。另外vLLM的prefill和decode会动态分配显存,并发请求多时峰值很容易爆,可以开一下--enable-chunked-prefill,或者把max_num_seqs调小到16试试。还有确认下Qwen2.5的tokenizer是不是真按4K算的,有时候prompt太长被pad也会吃显存。
你这配置按理说跑4K绰绰有余,问题八成不在tensor_parallel_size,单卡也不用设这个。先查下是不是vLLM版本和CUDA没对齐,我之前遇到过类似情况,升到最新版就好了。另外gpu_memory_utilization别怼到0.9,留点给CUDA context和碎片,试试0.7左右,顺便把max_num_seqs调小点看还崩不崩。还有你确认下是不是真的只加载了7B,没被什么环境变量偷偷塞进额外显存占用。
八成是并发请求把KV cache撑爆了,试试把gpu_memory_utilization降到0.7再看下。
这配置按理说不该崩啊,A100 80G跑7B模型4K长度,显存余量应该很宽裕。你检查过vLLM的版本没?我之前遇过类似问题,是旧版vLLM对Qwen2.5的attention backend支持有bug,升级到0.6.3后就好了。另外tensor_parallel_size设1就行,单卡别折腾这个。还有看看是不是pytorch的显存碎片化太严重,可以试试把gpu_memory_utilization降到0.85,留点buffer给CUDA context。如果还不行,把报错日志贴出来看看具体是哪个tensor分配失败,比瞎猜强。
这配置看着挺标准的,但OOM大概率不是max_model_len或者gpu_memory_utilization的锅。你tensor_parallel_size设了1吗?如果是单卡还设了大于1,vLLM会尝试切分模型反而浪费显存。另外看看你是不是开了--enable-prefix-caching,有时候这个开关在长上下文场景会额外吃显存。还有一个坑是并发请求的KV cache预分配,vLLM默认会按max_num_seqs和max_model_len预留空间,你虽然设了4K,但如果max_num_seqs没调低,比如默认是256,那KV cache照样按32K算,直接爆掉。建议先把max_num_seqs降到16或者32试试,同时把gpu_memory_utilization降到0.7,留点冗余看日志里实际KV cache用了多少。另外你确认一下是不是真的跑的是7B而不是量化版本,有时候模型文件不对也会这样。我之前遇到过类似情况,最后发现是--dtype设成了float32,换成auto或者bfloat16瞬间就稳了。你先查这几个点,不行的话贴一下完整的启动命令,大家帮你看看。
八成是并发时KV cache撑爆了,试试把gpu_memory_utilization降到0.8,再把max_num_seqs调小点。