最近在搞大模型部署,拿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,是我配置有问题吗?
全部回复
共 176 条之前也踩过这坑,你先把gpu_memory_utilization降到0.85试试,vLLM对KV cache的预分配有时候会跟CUDA context抢显存。另外tensor_parallel_size=1就行,7B单卡没必要切分,切了反而每个进程都要吃一块额外的显存开销。还有看看是不是paged attention没生效,可以开个--enable-prefix-caching看下日志里的显存分配详情,OOM前一般会有具体哪块爆掉的提示。
单卡A100 80G跑Qwen2.5-7B按说余量挺大的,你这情况大概率不是tensor_parallel_size的问题,那个设成1就行,设错了反而会报别的错。我比较怀疑是并发上来之后KV cache把显存吃满了,gpu_memory_utilization=0.9只是给模型权重和KV cache划的总预算,但max_model_len=4096配高并发时,每个请求的KV block叠加起来很容易顶爆。你可以先把max_num_seqs调小点试试,默认值有时候偏大,再不行把max_model_len降到2048验证一下是不是长度的问题。另外swap空间那个参数是enable_prefix_caching或者cpu_offload相关的,vLLM里确实有swap_space可以设,但那是把KV cache换到CPU内存,治标不治本,延迟会很难看。别人同配置跑32K可能是单请求或者开了chunked prefill,并发场景完全不是一回事。建议你把启动参数和完整报错贴出来,光看描述不好定位。
单卡A100 80G跑7B还OOM确实有点反常,4K长度按说占用很小。你先确认下是不是把gpu_memory_utilization理解错了,这个0.9是vLLM能用的显存比例,不是预留,KV cache会按这个上限去抢,并发一上来就容易顶满。tensor_parallel_size单卡必须是1,设成别的反而会出问题,这个可以先排掉。另外看看是不是没加--enforce-eager,或者dtype默认成了float32,那显存直接翻倍。还有个坑是max_num_seqs和max_num_batched_tokens,默认值在长上下文下KV cache膨胀很快。建议你把实际启动命令和报错日志贴一下,光看描述很难定位,我上次也是类似情况,最后发现是模型加载时没指定dtype。
单卡A100 80G跑7B按理说4K上下文不应该这么容易OOM,你这配置看着没啥大毛病,但有几个地方得排查下。gpu_memory_utilization=0.9其实挺激进的,vLLM会预分配这90%显存做KV cache,剩下的留给模型权重和临时激活,A100上7B的权重才14G左右,理论上够,但并发一上来KV cache涨得飞快。你说跑几个并发就崩,先看看是不是请求的并发数或者batch size设太大了,vLLM默认的max_num_seqs可能不低。另外max_model_len=4096这个值本身也会影响预分配的KV cache大小,别人能跑32K可能是他们显存利用率和并发控制调得更细。tensor_parallel_size单卡就设1,设错了反而会出问题,检查下是不是手滑写成别的了。swap空间那个是CPU offload,vLLM里对应的是swap_space参数,默认好像是4G,如果并发大可以适当调大,但治标不治本。建议先把gpu_memory_utilization降到0.85,限制下max_num_seqs,再观察显存占用曲线,大概率能定位到是哪块吃爆了。
学到了,感谢分享!
刚入门,这个对我帮助很大。
单卡A100 80G跑7B按理说4K完全无压力,你先看下是不是max_num_seqs默认值太高了,并发一上来KV cache直接爆。另外gpu_memory_utilization=0.9其实偏高了,vLLM还要留空间给activations和CUDA graph,建议降到0.85试试。tensor_parallel_size单卡就别设了,设成1就行。还有你确认下是不是开了enforce_eager,没开的话graph capture也会吃不少显存。
单卡80G跑7B绰绰有余,先看看是不是开了enable_prefix_caching或者并发数太高把KV cache撑爆了。
单卡跑7B按说80G绰绰有余,4K就OOM有点离谱。先看下是不是没加--enforce-eager,vLLM默认走CUDA graph会多吃显存,另外gpu_memory_utilization=0.9其实可以往下调到0.85试试。还有个坑是并发上来后KV cache会动态涨,max_num_seqs默认值可能偏大,限制一下说不定就稳了。tensor_parallel_size单卡不用设,保持1就行,swap那个是CPU offload,性能会掉,先别急着开。
单卡A100 80G跑7B按理说4K上下文不该这么容易炸,你这情况更像是显存被别的东西吃掉了。先确认下有没有设置enforce_eager,vLLM默认会走CUDA graph,加上KV cache预留,实际占用比你想的高不少。还有个坑是gpu_memory_utilization=0.9已经挺激进了,vLLM会按这个比例去预分配KV cache池,如果并发一上来直接顶满就OOM,可以试着降到0.85左右看看还崩不崩。tensor_parallel_size单卡必须设1,设成别的反而会出问题,这个先排除掉。另外swap_space默认是4G,是CPU内存不是显存,跟这个OOM关系不大,别被带偏。建议你把max_num_seqs也压一下,默认256对7B来说并发一高KV cache直接爆,调到32或64试试。如果还不行,贴一下完整的启动命令和日志里那句显存分配的数值,光看描述不太好定位。
单卡80G跑7B按说绰绰有余,你这OOM大概率不是配置写错,而是并发上来后KV cache爆了。gpu_memory_utilization=0.9留的余量本来就不多,max_num_seqs默认又偏大,几个长请求一进来显存直接顶满。建议先把max_num_seqs压到8左右,再开enable_prefix_caching看看,另外确认下是不是没设dtype=half,fp32的话显存直接翻倍。tensor_parallel_size单卡就保持1,设错了反而起不来。
单卡A100 80G跑7B按理说4K长度不至于崩,你这OOM大概率不是模型权重的问题,而是KV cache被并发撑爆了。vLLM默认会按gpu_memory_utilization预分配一大块显存给KV cache,但并发数一上来实际占用会超,建议把max_num_seqs调小点试试,比如设成8或16。另外tensor_parallel_size单卡就别设了,保持1就行,设错了反而会出问题。还有看看是不是没开enforce_eager,有些环境下CUDA graph会多吃显存。
7B模型4K长度OOM不太正常,先确认下有没有其他进程占着卡,nvidia-smi看一眼实际剩余显存。另外max_num_seqs默认好像挺大的,你并发一上来KV cache直接爆了,试试把它压到8或者16。tensor_parallel_size单卡就别动了,设成1就行,swap_space那个是CPU offload用的,治标不治本。
我之前也遇到过类似问题,后来换了方案。
学到了,感谢分享!
单卡A100 80G跑7B按理说4K长度不该这么容易崩,你tensor_parallel_size设的多少?单卡的话必须是1,设成别的反而会出问题。gpu_memory_utilization=0.9其实已经挺激进了,vLLM启动时会把大部分显存预占做KV cache,并发一上来KV cache涨得很快,你可以先降到0.85试试看能不能稳住。另外你max_model_len=4096但有没有注意max_num_seqs这个参数,默认值可能偏大,并发请求一多每个seq都要分KV cache,加起来就爆了。还有检查下是不是开了enforce_eager或者没开chunked prefill,长prompt的prefill阶段瞬时显存峰值很容易顶到天花板。别人同配置跑32K大概率是单请求低并发场景,跟你跑多并发完全不是一回事,别被误导了。建议先用--max-num-seqs 4这种小并发压测,看显存曲线再逐步往上加,swap_space调大点也能缓解但治标不治本。