刚接触大模型部署,用的两张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 条显存吃满很正常,你设了0.9利用率,vLLM会尽量把显存都占住,KV cache的预留空间也是按这个比例算的,所以22G+不算异常。但tensor-parallel-size=2没生效有点奇怪,检查下是不是环境变量或者启动命令里被别的地方覆盖了,另外两张卡之间通信带宽不够也会导致并行效率低,速度上不去。速度20 vs 40那个benchmark,可能别人用的是更短的输入输出长度,或者量化方式不同,你可以试试把max-model-len调小一点,比如4096,看显存和速度会不会改善。长上下文我个人体感SGLang更稳一些,但vLLM生态更成熟,你这情况先排查并行设置吧。
你这显存占用挺正常的,vLLM默认会预留很多KV cache空间,加上CUDA context和碎片,7B int8实际吃满单卡很常见。tensor-parallel-size=2没生效的话,检查下模型路径和启动命令是不是加了--tensor-parallel-size,有时候环境变量或者版本不对会静默回退。速度20 tokens/s偏慢,大概率是量化格式没走对(比如用AWQ但没指定--quantization),或者max-model-len设太大导致KV cache分配过猛。长上下文我体感SGLang更稳,vLLM在32K以上容易OOM,但SGLang调参门槛高一点。
显存占用高大概率是KV cache默认预留太多,调低gpu-memory-utilization到0.6试试,两张卡吃不满可能是并行配置没生效。
显存高正常,vLLM默认预分配很激进,但TP=2没生效八成是模型路径或并行参数写错了,查下日志。
你这情况我当初也踩过,22G占用其实挺正常的,vLLM默认会预分配显存给KV cache和CUDA context,就算7B int8理论权重才8G,实际跑起来加上激活值、中间buffer,还有你设的0.9利用率,基本就是把整卡吃满的节奏。第二张卡没用起来大概率是tensor parallel配置没生效,你得确认启动命令里有没有加--tensor-parallel-size 2,而且两张卡得是同一型号,另外vLLM对TP的支持有时候需要设--distributed-executor-backend=mp,不然会默认走单卡。速度20 tokens/s偏低,先看看是不是输入输出长度太长,或者量化方式选的AQLM这种,换AWQ或者GPTQ试试,还有--max-num-seqs调小点,比如64,能明显提升并发下的吞吐。长上下文的话我个人更推荐SGLang,它对长序列的prefix cache优化更激进,显存碎片也少,但vLLM现在也在追,稳定性上两者都够用,关键看你实际测试。你先别纠结显存,把TP搞定,再对比下两个框架在你自己数据上的表现,跑个压力测试心里就有数了。
4090是48G双卡但nvlink没接吧,tensor parallel要两张卡都看得到显存,你设0.9肯定全塞第一张了。
显存占用高大概率是KV cache的预留策略导致的,建议把gpu-memory-utilization降到0.6试试,速度慢也可能跟这个有关。
你这显存占用其实正常,vLLM默认会给每个request预留不少KV cache空间,7B int8光权重就得7-8G,再加上activation和显存碎片,22G真不夸张。tensor-parallel-size=2没生效的话,建议检查下CUDA_VISIBLE_DEVICES和vLLM版本,有时候多卡要配合--distributed-executor-backend=mp才能跑起来。速度20t/s有点低,但先确认下是不是输入输出长度设太大,或者并发请求挤占了prefill;SGLang长上下文我体感更稳,调度上比vLLM激进,不过你刚入门还是先调好vLLM再说。
显存占用高大概率是vLLM默认给每个request预留了很大的KV cache空间,加上7B模型的中间激活值也不小,--gpu-memory-utilization=0.9基本就是全塞满了。两张卡没跑起来可能是你忘了设--tensor-parallel-size,或者环境变量CUDA_VISIBLE_DEVICES没配对,建议先看下nvidia-smi确认下进程到底绑在哪个卡上。速度20toks要是没开--enable-prefix-caching,短并发下确实会吃亏,但20偏低可能是量化格式没走对,试试FP16或者AWQ对比下。长上下文的话我体感SGLang在超长输入下调度更平滑,vLLM反正最近几个版本改了不少,但你这情况先把单卡跑明白了再折腾框架吧。
你这情况我遇到过,tensor-parallel-size=2但第二卡没动静,大概率是模型没真正切分,检查下vLLM版本和启动日志里有没有“Loading model weights on multiple GPUs”的提示。显存占用高其实正常,7B int8权重就8G但activation和临时buffer能吃掉不少,0.9利用率基本就是给KV cache留了不到2G,你可以试着降到0.6看显存曲线变化。至于20 tokens/s,可能是max-model-len设太大导致KV cache碎片化,或者输入长度长,先试试把max-num-seqs调小到4。长上下文我最近用SGLang更稳,vLLM在4K以上偶尔会崩,不过SGLang配置麻烦点,你如果只是API服务可以两个都跑个压测对比下。
显存这块你大概率被prefill阶段的长序列缓存坑了,vLLM默认会按max-model-len预分配KV cache,你试试把--max-model-len调小点,比如4k或8k,占用能掉一大截。TP=2没生效的话,检查下是不是两张卡没走NVLink,或者驱动里P2P被禁了,vLLM日志里会打印detected topology,看一眼就知道。速度20 tokens/s确实偏低,但如果你max-model-len设很大,连续推理时显存带宽都耗在cache管理上了,速度自然上不去。SGLang在长上下文上调度更激进,但稳定性我觉得vLLM还是好点,毕竟迭代久。
显存那事儿正常,vLLM默认会预分配整卡显存,tensor-parallel要配合--gpu-memory-utilization调低才行。
显存占比高是正常的,vLLM预分配+KV cache会吃满显存,TP=2没生效大概率是模型没转成张量并行格式。速度瓶颈可能是量化精度和max-model-len设太大,长上下文建议先试SGLang,调度更灵活。
你这情况我遇到过,八成是tp没生效,vLLM对单卡显存占用是按gpu-memory-utilization直接预留的,两张卡得确认下环境变量或者启动命令里有没有被覆盖成单卡模式。速度20的话,试试关掉continuous batching或者调低max-num-seqs,有时候默认并发拉满反而拖慢单请求延迟。长上下文我体感SGLang更稳,vLLM在超长序列下偶尔会爆显存,但你要是图省心,先把tp修好再对比也不迟。
22G这个数其实挺正常的,你设了0.9的gpu-memory-utilization,vLLM会直接把90%显存都预留给KV cache和运行时,7B模型权重本身不到8G,剩下全被cache占了。想验证的话把utilization降到0.5再跑一次,显存占用立刻掉下来,但吞吐也会跟着降。至于tensor-parallel-size=2没生效,大概率是你启动命令里少了--tensor-parallel-size这个参数名,或者版本对多卡支持有bug,检查下日志里有没有“GPU 0”和“GPU 1”都出现的字样。速度20 tokens/s确实偏低,但benchmark那40+一般是配合连续批处理和更长prompt测出来的,你如果并发低、输入短,单流速度就上不去。长上下文场景我个人更倾向vLLM,毕竟SGLang虽然调度更激进,但社区和稳定性还在追赶,尤其你刚入门,别给自己挖坑。最后建议先用单卡跑通,把cache比例调小,确认速度正常了再考虑多卡,别一上来就上并行。
显存占用高正常,4090跑7B本来就要20G+,TP2得加--enable-tp-intercommunication才行,SGLang长上下文更稳。
你这情况大概率是vLLM默认把KV cache的预留空间算进显存了,--gpu-memory-utilization=0.9基本等于把单卡能用的都占满,第二张卡没跑起来检查下是不是环境变量CUDA_VISIBLE_DEVICES没设对,或者tensor-parallel-size在启动时被忽略了。速度掉一半可能是量化格式不对,Qwen2.5的AWQ和GPTQ在vLLM上支持程度不一样,建议换下--quantization参数试试。长上下文的话我个人体感SGLang更稳,vLLM在超过8K后会有明显延迟波动,不过SGLang的API兼容性还得自己调一轮。
学到了,感谢分享!
vLLM默认会预分配显存给KV cache和CUDA context,0.9的比例直接吃满很正常,实际峰值比模型权重高不少。TP=2没生效的话,检查下模型路径和backend是不是传对了,我之前没加--distributed-executor-backend=mp时也遇到过第二卡闲置。速度这块20 tokens/s确实偏低,先看看是不是没走flash attention,另外Qwen2.5的GQA对长上下文友好,但短query场景下TP=2反而可能拉低吞吐。SGLang在长上下文下调度更激进,但vLLM的生态和稳定性更好,个人体感是先把KV cache比例调低到0.6再对比。
7B int8实际跑起来显存大头在KV cache和activation,8G只是权重大小,vLLM默认会预分配整卡显存,22G+挺正常的。你tensor-parallel=2没生效的话检查下是不是两张卡没连NVLink,或者vLLM版本对Qwen2.5支持有bug。速度20tokens/s偏慢,看看是不是max-model-len设太大导致KV cache占满,调低到4096试试。长上下文的话SGLang在显存管理上更激进,但vLLM生态成熟些,我最近用SGLang跑32K没崩过,vLLM倒是偶尔OOM。