最近在搞大模型部署,拿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降到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,再观察显存占用曲线,大概率能定位到是哪块吃爆了。