最近在搞开源大模型本地部署,想用vLLM跑Qwen2.5 7B做API服务。我机器是RTX 4090 24G,按官方文档设置max_model_len=8192,结果一启动就报OOM,连单次推理都跑不了。试了调低max_num_batched_tokens到512,还是不行,显存直接冲到22G+。看网上说用FP16或者量化,但我试了AWQ 4bit,速度反而变慢了,而且输出质量下降明显。是不是我参数设置有问题?或者这个模型根本不适合单卡部署?有没有大佬分享下实际部署时的显存优化trick?比如gpu_memory_utilization、swap_space这些参数到底怎么调才合理?先谢过!
vLLM部署Qwen2.5 7B遇到显存爆炸,求大佬分享优化经验
全部回复
共 152 条同款4090踩过坑,你这情况大概率不是参数问题,是vLLM默认会把KV cache预分配撑满,试试gpu_memory_utilization调到0.8左右,给CUDA留点余量。另外swap_space别用默认的4G,设成0或者256MB就行,不然显存和CPU内存来回倒腾反而更慢。AWQ慢可能是没开vLLM的量化推理优化,得在启动命令里加--quantization awq,不然就是纯用CPU跑权重。最后检查下CUDA和vLLM版本,老版本对Qwen2.5的attention优化不行,升到0.6.6+基本能稳定跑16K上下文。
4090 24G跑7B按理说绰绰有余,你这个问题大概率不是显存不够,而是vLLM的显存分配策略太激进了。gpu_memory_utilization默认是0.9,相当于把21.6G全锁给KV cache,但Qwen2.5 7B的权重本身就要占14G左右,剩下那点空间根本不够塞长序列的注意力缓存,所以一启动就OOM。我建议你直接把这个参数调到0.75到0.8之间,给权重和激活值留出冗余,swap_space设成4到8G,让超出部分走CPU offload,虽然慢点但至少能跑起来。另外max_model_len别死磕8192,先降到4096试试,很多应用根本用不到那么长的上下文,长度减半KV cache直接少一半,效果立竿见影。关于AWQ变慢,你看下是不是没装对应kernel,vLLM对量化模型有专门的优化路径,如果用的通用算子反而比FP16还慢,去官方文档确认下有没有针对你显卡的预编译wheel。还有个野路子,把模型换成Qwen2.5 7B Instruct的GGUF量化版,配合llama.cpp的flash attention,虽然不如vLLM吞吐高,但单卡跑长文本会稳很多。
我之前也是4090跑vllm,24G看着够用但实际很紧,你试试把gpu_memory_utilization设到0.85左右,别让它全占,然后swap_space留个2G,这俩参数直接影响显存分配策略。AWQ变慢大概率是vllm版本对量化支持不完善,换个0.6.3或0.7.2试试,官方经常修这块。另外max_model_len别硬顶8192,实际业务里4096基本够用,7B模型对KV cache很敏感,长度砍一半显存压力骤降。单卡部署完全可行,我这边跑Qwen2.5 7B还同时挂了两个LoRA,关键是别让vllm把显存吃死,留点余量给CUDA context和碎片。
4090跑7B其实完全够用,你这问题大概率是vLLM默认把KV cache预留得太激进了,试试把gpu_memory_utilization调到0.85左右,同时把swap_space设成4-8G,给显存留点余量。另外max_model_len别硬顶8192,实际业务用4096就差不多了,显存占用直接省一大截。AWQ慢可能是没开vllm的量化内核优化,检查下是不是用了旧版本,或者试试GPTQ,有时候反而快一些。
试试把gpu_memory_utilization设到0.85,swap_space留1G,另外别用AWQ,直接用FP16加vLLM的--enable-chunked-prefill试试。
同款4090,我一开始也被这玩意搞懵了,后来发现vLLM默认会预分配显存,你可以试试把gpu_memory_utilization设到0.85左右,给CUDA context留点余量,别用默认的0.9。另外max_model_len其实不用设到8192,如果业务场景没那么长上下文,砍到4096能省下不少KV cache,这比调batch size管用多了。AWQ变慢大概率是没开--quantization awq_marlin,或者是小batch下反而不如FP16快,可以对比下vLLM 0.6.3以后版本的chunked prefill,有时候能救回来。swap_space别乱调,默认4G就行,设大了反而拖慢速度。
4090跑7B按理说够用,试试把gpu_memory_utilization调到0.9,swap_space留1G,别开前缀缓存。
4090跑7B按理说绰绰有余,先试试gpu_memory_utilization调到0.9,再把swap_space设成4,多半能救回来。
4090跑7B按理说绰绰有余,你这OOM大概率是vLLM默认把KV cache撑满了,gpu_memory_utilization别用默认值,直接设0.85或者0.9试试,swap_space留个4G就行。另外max_model_len降到4096其实日常够用,8192对7B来说KV cache翻倍很吃显存。AWQ变慢可能是没走vLLM的量化推理优化,建议检查下是不是加载了原始权重而不是量化后的模型文件。
4090跑7B其实不用量化,试试把gpu_memory_utilization调到0.9,swap_space设成4,max_model_len砍到4096。
gpu_memory_utilization调到0.9,swap_space给个4G,别死磕max_model_len,4090跑7B绝对没问题。
max_model_len砍到4096,关掉前缀缓存,AWQ慢大概率是没开vLLM的量化优化接口。
这问题我上个月也踩过,4090跑7B按理说绰绰有余,问题大概率出在vLLM的显存分配上。你试试把gpu_memory_utilization调到0.85左右,同时把swap_space设成0,别让它预留CPU换页空间。另外max_model_len别死磕8192,改4096基本够用,显存能省下快5G。AWQ慢可能是你没开--quantization awq_marlin,新版vLLM用这个内核会快很多,质量损失其实很小。
4090跑7B按理说够用,先查下是不是vLLM版本太老,升到最新版再把gpu_memory_utilization调到0.9试试。
说实话你这个现象我上周刚踩过一遍,4090跑7B理论上绰绰有余,问题八成出在vLLM的显存预分配策略上。gpu_memory_utilization默认是0.9,但你得知道它会把KV cache和推理中间态全算进去,24G卡实际能用的显存比你想的小得多。我建议先把max_model_len砍到4096,同时把gpu_memory_utilization调到0.85以下,swap_space设成4G左右,给碎片留点余地。另外你试AWQ变慢,我猜是没做KV cache量化,vLLM里有个kv_cache_dtype=fp8_e5m2的选项,配合AWQ能明显省显存还不掉速。还有个小坑,max_num_batched_tokens别单独调太低,它会跟max_num_seqs互相影响,反而导致显存碎片化更严重。最后问一句,你用的vLLM版本是0.6.x还是0.7.x?新版对Qwen2.5的MLA结构做了专门优化,老版本可能根本没吃上这些特性。
4090跑7B不该OOM啊,大概率是vLLM默认预留显存太多了,试试把gpu_memory_utilization调到0.85看看。
我之前也踩过这坑,4090跑7B按理说够用,问题多半出在KV cache上。你试试把gpu_memory_utilization调到0.85,swap_space设成4或8,别用默认值。另外max_model_len别硬顶8192,先降到4096跑通再慢慢加,不然显存直接吃满。AWQ慢可能是没走对vLLM的量化加载接口,检查下是不是用了--quantization awq,还有--dtype half别漏。最后建议开一下--enable-prefix-caching,多轮请求能省不少显存。
说实话4090跑7B按理说完全够用,你八成是没给vLLM留足KV cache的余量,试试把gpu_memory_utilization直接设到0.85,同时swap_space给个4G,让显存和内存做个缓冲。另外max_model_len别一上来就8192,先用4096验证一下能不能跑通,再逐步往上加,有时候是预分配太激进导致的假OOM。AWQ变慢大概率是没开--quantization awq的配套参数,或者batch size太小没吃到量化红利,建议检查下vLLM版本是不是太老。
4090单卡跑7B不OOM的,把gpu_memory_utilization调到0.85,swap_space设个4G试试。
这问题我上周刚踩过坑,4090跑7B按理说完全够,问题多半出在vLLM默认把KV cache和激活层全塞显存了。你可以试试把gpu_memory_utilization调到0.85,别用默认的0.9,给CUDA context和torch留点余量,swap_space设成4到8GB,让部分KV cache溢到内存里,速度损失比OOM强多了。另外max_model_len别硬撑8192,实际业务单请求如果不超过2K,设成4096能省一半显存,毕竟7B的KV cache是每token固定开销。AWQ变慢不奇怪,vLLM对4bit kernel的优化不如FP16成熟,尤其batch小的时候反而有额外开销,建议先用FP16配合--enable-chunked-prefill,这参数能把长prompt分块处理,显存峰值能降30%左右。还有个野路子,开--enforce-eager模式禁用CUDA graph,虽然牺牲点吞吐但启动时能省下1-2G显存。最后记得升级vLLM到最新版,0.6.x对Qwen2.5系列有专门的显存优化补丁。如果还不行,直接换llama.cpp跑Q4_K_M,单卡稳得一批,就是并发吞吐比vLLM差些。
4090跑7B理论上完全够,问题大概率出在KV cache上,24G显存默认会吃掉很大一部分给缓存,试着把gpu_memory_utilization设到0.85左右,swap_space留个2G就行。另外max_model_len千万别死磕8192,实际业务里4K基本够用,直接砍半显存立刻宽松。AWQ慢可能是你没开vLLM的量化推理入口,要额外加--quantization awq参数才行,不然它还是按原始权重加载的。最后建议先跑个纯文本生成不带历史消息的请求试试,排除是不是长上下文导致的瞬时缓存峰值。