刚接触大模型部署,用的两张4090(24G),准备跑Qwen2.5-7B做API服务。看文档说7B模型int8量化大概8G显存,加上KV cache预留几G应该够。但实际用vLLM启动,--gpu-memory-utilization设成0.9,单卡直接吃了22G+,而且第二张卡完全没利用起来(我明明设了tensor-parallel-size=2)。另外推理速度也只有20 tokens/s左右,看别人的benchmark能到40+。想问问是我参数设置的问题吗?还是说KV cache默认开太大了?另外,vLLM和SGLang在长上下文场景下哪个更稳一点?有点迷茫,求指点。
vLLM部署Qwen2.5-7B,显存占用比预期高很多,正常吗?
全部回复
共 60 条显存那个正常,vLLM默认会预分配显存池,你设0.9就是按22G去占的,不是模型本身吃这么多。两张卡没跑起来大概率是TP参数没生效,检查下环境变量或者启动日志里有没有报错。速度这块20 tokens/s确实偏低,但得看并发和输入长度,单请求短文本的话可以试试把--max-num-seqs调小。长上下文我体感SGLang更省显存,但vLLM生态成熟些,自己写vLLM的continuous batching调优下也能压上去。
22G可不就是正常的嘛,你设了0.9的利用率,vLLM会先把显存全占上再慢慢分配,7B int8权重也就8G,剩下的全给KV cache了,这玩意儿默认预分配策略就是能占多少占多少。你两张卡没跑满多半是tensor parallel配置有问题,检查下是不是没设好gpu id或者环境变量,另外4090的PCIe带宽跑TP2有时候反而会拖慢速度,20 tokens/s如果你是带并发请求的话也不一定算异常。长上下文我建议先试试SGLang,它对prefill的优化更激进,显存碎片控制也好点,不过vLLM最近几个版本追得挺紧,关键看你要不要用异步调度那些特性。你试试把--kv-cache-dtype换成fp8,或者手动调下--max-num-seqs到32以下,显存占用能降不少,速度应该也能提一提。
显存这块你大概率是踩了vLLM默认行为:它会把KV cache预分配到接近gpu-memory-utilization的上限,7B模型权重就算8G,剩下14G都会被拿来当KV cache,所以22G+很正常。第二张卡没利用起来可能是你没加--tensor-parallel-size或者设了但没生效,检查下启动日志里的“GPU memory”和“tensor parallel”字段。速度的话20 tokens/s偏慢,看看是不是没开--enable-prefix-caching或者batch size太小。长上下文我体感SGLang更稳,vLLM在超长输入时显存碎片化更明显,不过SGLang的API兼容性稍弱,得自己权衡。
22G这个数其实挺正常的,vLLM默认会给每个KV head预留不少显存,而且--gpu-memory-utilization=0.9基本就是有多少吃多少,不是按模型实际大小来的。你第二张卡没利用起来八成是tensor parallel的配置没生效,试试看环境变量或者启动日志里有没有提示。速度这块20 tokens/s确实偏低,先把量化方式换回FP16对比下,有时候int8在vLLM上反而没优化好。长上下文我自己的经验是SGLang更稳,但vLLM生态完善些,得看你要不要用那些周边功能。
看到你贴的显存占用我第一反应是这数字其实挺正常的,vLLM默认会给每个request预留很大的KV cache池子,而且--gpu-memory-utilization=0.9意味着它会把显存吃满到90%,不是为了只装下模型权重。7B int8实际加载时权重可能到9-10G,剩下全被KV cache和activation占走了,你设的0.9等于告诉它“有多少用多少”,所以22G不奇怪。至于tensor-parallel-size=2没生效,你检查下是不是环境变量CUDA_VISIBLE_DEVICES没设对,或者两张卡没在同一个PCIe域里,vLLM有时候会静默回退到单卡。速度20 tokens/s这个要看你的输入输出长度,如果并发请求多或者max-model-len设了32K,那慢很正常,你可以试着把max-num-seqs调小到256看看。长上下文我个人体感SGLang在显存管理和prefix caching上更稳,但vLLM生态成熟,小坑少一些,建议你先用vLLM把参数摸透再换。你max-model-len设了多少?这个参数对显存和速度影响特别大。
你这情况我太熟了,刚上手vLLM时也踩过一模一样的坑。先说显存,别被“int8 8G”那个数字骗了,那是纯模型权重,vLLM默认会把KVCache和激活值全算进去,而且它会尽量占满你设的gpu-memory-utilization,22G多其实挺正常的,你试着把利用率降到0.6或0.7,再看nvidia-smi,占用会明显下来。第二张卡没利用,大概率是tensor-parallel-size参数没生效,或者你启动时漏了--tensor-parallel-size,又或者两张卡不是通过NVLink连的,vLLM对跨PCIe的TP效率很低,有时候甚至不如单卡跑。速度20 tokens/s确实偏低,但benchmark一般用长输入+连续请求压测,你可能是首token延迟被算进去了,或者并发没调起来,试试--max-num-seqs调大点。至于SGLang,长上下文场景下它的RadixAttention确实更省显存,但vLLM的生态和兼容性更成熟,如果你不是疯狂刷长文档,建议先留在vLLM把参数调明白。最后问一句,你用的vLLM版本是新的吗?老版本对Qwen2.5的支持有bug,升级到0.6.3+可能直接解决一半问题。
显存这块其实正常,vLLM默认会给每个request预留大量KV cache空间,你设0.9利用率但没限制max-num-seqs的话,它会尽量把显存吃满来缓存上下文,7B int8的实际权重确实8G左右,但剩余空间基本都被KV cache和CUDA context占了。两张卡没跑起来大概率是环境变量没配对,vLLM的tensor parallel需要显式设置CUDA_VISIBLE_DEVICES=0,1,而且启动日志里会显示world size,你确认下是不是只识别到单卡。速度20 tokens/s偏低,但得看并发数和输入长度,单请求短上下文不该这么慢,可以试试把--max-model-len降到4096或2048,同时调小--gpu-memory-utilization到0.6,看速度能不能上来。我之前踩过坑,int8量化后KVCache默认还是按fp16算,所以显存估算要重新算。SGLang在长上下文上调度更激进,显存碎片化控制得更好,但vLLM胜在生态成熟,如果你主要跑32K以内,vLLM调好参数完全够用,再往上建议试试SGLang的radix attention,差距挺明显。你先按这几步排查,大概率是配置问题,不是硬件瓶颈。
22G占用挺正常的,vLLM的gpu-memory-utilization是给整卡显存画红线,不是按模型实际需求来的,你设0.9它就会把剩余空间全拿去做KV cache和激活,哪怕用不满也先占着。两张卡没跑起来大概率是环境变量或者启动参数没对齐,tensor-parallel-size=2要配合CUDA_VISIBLE_DEVICES=0,1一起用,而且模型权重路径得确保能被vLLM正确切分,不然它可能直接忽略TP设置跑单卡。速度20 tokens/s偏慢,但先看看是不是没开continuous batching,或者max-num-seqs设太小,并发上不去吞吐自然低。至于SGLang,长上下文场景下它的radix attention确实更省显存,但vLLM胜在生态成熟,你如果只是做API服务,先调调vLLM的--max-model-len和--max-num-batched-tokens,把KV cache压缩到实际需要的大小,比纠结框架更直接。我之前也踩过类似坑,最后发现是prompt长度统计方式不同导致显存预估值差了好几G,建议你用nvidia-smi看下实际进程分配,别只看文档估算。
你试试把--gpu-memory-utilization降到0.6或者0.7,vLLM默认会预占满显存做KV cache管理,22G很正常,不是bug。第二张卡没跑起来大概率是环境变量CUDA_VISIBLE_DEVICES没设对,或者vLLM版本没识别到多卡,先确认nvidia-smi能看到两张卡。速度低的话检查下是不是开了--enable-prefix-caching或者--max-model-len设太大了,长上下文场景SGLang在显存复用上确实更省,但vLLM生态更全,我建议先用默认配置跑通再说。
显存高大概率是KV cache和CUDA context占的,TP=2记得加--distributed-executor-backend=mp。
你这显存占用其实挺正常的,vLLM默认会给每个request预留挺大块的KV cache池,加上7B模型int8实际加载也得10G出头,两张卡没跑起来八成是tensor parallel的配置没生效,检查下是不是启动命令里少了--distributed-executor-backend之类的参数。速度20 tok/s如果是加了长上下文或并发请求的话也不算太离谱,benchmark那些40+多半是短输入单请求跑出来的。SGLang在长上下文下的显存调度确实更激进些,不过vLLM胜在生态成熟,你如果是做API服务可以先试试把--max-num-seqs调小点看能不能把速度拉起来。
显存高大概率是KV cache预分配太多,试试--max-num-seqs调小点,速度慢先看下是不是张量并行没生效。
第二张卡没跑起来八成是TP设置有问题,检查下CUDA_VISIBLE_DEVICES,SGLang长上下文确实更省显存。
显存那个事儿正常,vLLM默认会预留很多KV cache,而且7B在fp16下光权重就14G了,你这情况更像量化没生效或者模型没走int8,可以看看日志里有没有quantization字段。第二张卡不吃满大概率是tensor parallel的通信瓶颈或者你请求并发太低,单流推理根本喂不满两张卡。速度20 tokens/s的话,试试把max-model-len调小点,显存分配会合理很多。长上下文我最近在SGLang上测过8K以上确实比vLLM稳,但部署复杂度高一些,看你愿不愿意折腾了。
显存占用高大概率是KV cache和CUDA context吃掉了,TP=2没生效检查下模型路径和卡间通信。
SGLang长上下文更稳,vLLM省心但显存控制确实糙。
你这情况我刚开始跑vLLM也遇到过,挺正常的。单卡吃满22G大概率不是模型本身,而是vLLM默认给KV cache预留的显存池太大了,加上CUDA context和激活值,7B int8实际占用比你想的高不少。建议把--gpu-memory-utilization调到0.5-0.6试试,或者直接用--max-model-len限制一下序列长度,KV cache是按最大长度预分配的,你如果不设这个参数默认可能拉到32K甚至更长,显存自然就爆了。
tensor-parallel-size=2没生效的话,检查下是不是两张卡之间NVLink没通,或者vLLM版本对Qwen2.5的TP支持有bug,换个最新版或者用--pipeline-parallel-size试试。另外你速度只有20 tokens/s,大概率是没开--enable-prefix-caching,而且长上下文下prefill阶段会拖慢整体吞吐,可以看看是不是max-num-seqs设太小了。
至于SGLang和vLLM,长上下文我个人体感SGLang在radix cache和chunked prefill上更稳,但vLLM生态成熟,社区资料多。你先把显存参数调对,速度应该能上去,再纠结框架不迟。
显存占满大概率是默认给KV cache预分配了,调低gpu-memory-utilization到0.6试试,TP=2得确保两张卡都在同个PCIe域。
SGLang长上下文更稳,vLLM吃显存是出了名的,20t/s也正常,别信benchmark。
显存这块其实挺正常的,vLLM默认会给每个request预留不少KV cache池,而且7B模型即便int8也还有中间激活值和显存碎片,22G不算离谱。你这个tensor-parallel-size=2没生效,大概率是两张卡没走NVLink或者驱动没识别成同一拓扑,看看nvidia-smi topo有没有报错。速度20 tokens/s大概率是被KV cache占满后触发了swap,建议把--max-num-seqs调小到8试试。长上下文我体感SGLang更稳,vLLM在超过32K时容易OOM,但SGLang的API兼容性差点,得看你要不要接现成生态。
你这现象我遇到过,问题大概率出在vLLM默认给每个request预留的KV cache上,7B模型实际weight只占不到5G,剩下全被预分配了,把--max-num-seqs调小或者换--kv-cache-dtype fp8能明显省显存。第二卡没利用可能是没加--enforce-eager,paged attention的CUDA graph在某些驱动下会只绑第一卡。速度20比40低一截的话,先确认下是不是输入输出长度太长,或者试试加--quantization awq配合量化模型。长上下文我体感SGLang在超过16K时更稳,vLLM那个prefix caching偶尔会抽风,但日常用vLLM生态成熟些。
这情况太正常了,刚上手基本都会踩一遍。你看到的8G是纯权重,但vLLM默认会预分配KV cache和CUDA context,0.9利用率基本就是把显存榨干来换吞吐,所以22G+不奇怪。第二张卡没利用上大概率是tensor-parallel参数没生效,检查下启动命令是不是漏了--tensor-parallel-size,或者环境变量CUDA_VISIBLE_DEVICES没设对。速度20跟40的差距,先看看是不是max-model-len设太大导致KV cache吃满,调小点试试。至于SGLang,长上下文确实更稳,但vLLM生态成熟,先把手头这个调通再说吧。
显存那块不用太慌,7B int8实际跑起来权重就得8G+,但vLLM默认会给每个request预留不少KV cache空间,加上CUDA context和activation,22G挺正常的,你试试把--max-num-seqs调小或者--kv-cache-dtype设成fp8能省不少。第二张卡没用上大概率是tensor parallel没生效,检查下是不是环境变量没设对,或者模型路径里已经有切分好的权重,vLLM有时候会直接忽略TP参数。速度20 tok/s确实偏低,可能跟你max-model-len设太大有关,长上下文下prefill会拖慢很多,你可以先固定max-model-len=4096跑个基准对比下。至于SGLang,长上下文调度确实更激进,但vLLM现在0.6.x版本也稳了不少,我两个都试过,如果只是API服务不折腾的话建议先留在vLLM。