刚接触大模型部署,用的两张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 条你这情况我遇到过,大概率是tp没生效,可以看看启动日志里有没有提到tensor_parallel_size,或者直接nvidia-smi看两张卡是否都有进程。另外vLLM默认会预分配显存给KV cache,--gpu-memory-utilization设0.9确实会吃掉几乎所有显存,建议先降到0.6左右试试,速度慢也可能跟这个有关。长上下文的话SGLang在极端长度下更稳,但vLLM生态成熟很多,如果只是常规业务其实都够用。
显存那块其实挺正常的,vLLM默认会预分配KV cache和CUDA context,7B int8在4090上吃到20G+不奇怪,尤其你设了0.9利用率,它不会真按8G来算。第二张卡没跑起来大概率是tensor parallel的通信后端没配好,或者环境变量没设对,你检查下CUDA_VISIBLE_DEVICES和nccl。速度20 tokens/s偏慢,可能跟量化方式还有max-model-len设置有关,试着把max-model-len调小点比如4096,看看会不会改善。SGLang在长上下文上确实调度更激进,但vLLM胜在生态成熟,你先用vLLM把并行搞通再说。
显存占用高大概率是KV cache和CUDA context吃满了,试试把gpu-memory-utilization降到0.6再看。
显存这块正常,vLLM默认会预分配整卡显存,TP=2没生效八成是模型路径或参数没对齐。
22G占用其实正常,vLLM默认会预分配显存给KV cache和CUDA context,7B int8光权重就8G了,加上激活和预留,0.9利用率肯定拉满,第二张卡没跑起来多半是tensor parallel需要两张卡同时加载权重,你检查下是不是环境变量或者启动命令里少了什么。速度20 tokens/s有点低了,试试把max-model-len调小点,或者关掉continuous batching看看。SGLang长上下文确实更稳,vLLM最近版本有些bug,但API服务生态还是vLLM方便。
这情况太正常了,别慌。你设了gpu-memory-utilization=0.9,vLLM会按这个比例把显存全占满,它默认把KV cache和权重都塞进这90%里,所以22G+是预期行为,不是bug。真正的问题是tensor-parallel-size=2没生效——大概率是环境变量CUDA_VISIBLE_DEVICES没设对,或者两张卡没走NVLink,vLLM在PCIe模式下经常静默回退到单卡。你查一下启动日志里有没有“Using 2 GPUs”之类的字样,没有的话就是没识别到。至于20 tokens/s,7B在4090上单卡跑满也就这水平,别人40+多半是用了更小的max-model-len或者加了--enable-prefix-caching,你试试把max-model-len从默认的32768砍到8192,速度能翻倍。KV cache不是“开太大”,而是你给了90%显存它就把剩余空间全吃了,本质是资源分配策略问题。SGLang在长上下文下确实更稳,主要是它的radix cache对重复前缀命中率高,但前提是你得会用它的API,vLLM胜在生态成熟,小项目不用折腾。建议你先用nvidia-smi确认第二张卡占用,再跑个小batch压测,别光看文档数字。
22G占用太正常了,vLLM默认会把能塞的KV cache和activation都塞满,你设0.9就是让它尽量吃,不是bug。第二张卡没用起来大概率是tensor parallel的权重切分没生效,检查下环境变量或者启动命令里有没有带上卡号,有时候是驱动没识别到两张卡。速度慢可能跟量化格式有关,int8用AWQ或GPTQ会快不少,FP16反而更吃带宽。长上下文我体感SGLang更稳,vLLM在超长输入下偶尔会爆显存,但SGLang调参麻烦点。你先把TP修好,速度应该能上来。
显存那部分其实正常,vLLM默认会预分配整卡显存做KV cache和运行时缓冲,7B量化后权重只占几个G,剩下的全被它拿走了,你设0.9它当然吃到22G+。两张卡没利用起来大概率是tensor parallel的启动方式有问题,比如没设好环境变量或者模型路径不对,建议看下日志里有没有真正初始化2个rank。速度20多可能是因为量化类型+长上下文导致cache命中率低,或者你跑的是并发压力测试,单流40+一般是用短prompt测出来的。SGLang长上下文确实更稳,显存管理更动态,vLLM更适合高吞吐短任务,你这种API服务如果用户输入长,建议试试SGLang。
22G是预分配显存,vLLM会全占,速度慢大概率是量化精度和max-model-len没调好,SGLang长上下文更稳。
显存占用正常,vLLM默认预分配+KV cache会吃满,建议调低gpu-memory-utilization到0.6试试,速度瓶颈大概率是量化方式或没开continuous batching。
你这情况太正常了,vLLM默认会给每个request留很大比例的KV cache,尤其--gpu-memory-utilization设0.9基本等于把显存全占住,实际模型权重反而没多少,第二卡没吃满大概率是tensor-parallel对7B这种小模型收益太低,甚至可能因为通信开销拖慢速度。20 tokens/s如果是并发压力下其实还行,单流的话建议查下--max-num-seqs和--max-model-len是不是被设得太大。长上下文我体感SGLang的radix cache更省显存,但vLLM生态成熟稳定,先调小KV cache池子试试。
两张4090跑7B开TP纯属浪费,单卡就能塞下,速度慢八成是量化没生效或者max-model-len设太大了。
你这启动参数看着没问题,但显存占用高多半是vLLM默认给每个请求预留的KV cache空间太大,试试把max-num-seqs调小点。
速度上不去的瓶颈大概率在张量并行没生效,建议先确认下CUDA_VISIBLE_DEVICES和tp配置是否真的对上了。
这情况太典型了,别慌。你看到的22G+其实是vLLM默认把KV cache预分配满了,--gpu-memory-utilization=0.9意味着它会把单卡90%的显存都吃进去,哪怕实际用不到那么多,这跟你量化后的模型权重大小是两码事。至于tensor-parallel-size=2没生效,我猜你可能是启动了但没看日志确认,或者两张卡之间nvlink带宽不够,vLLM在跨卡通信时反而可能因为同步开销拖慢速度,你可以试试只用单卡,把KV cache的预留调小,比如--max-num-seqs=64或者直接设--kv-cache-dtype=fp8,看看显存和速度会不会更合理。20 tokens/s在双卡没利用好的情况下其实不算离谱,但如果你把量化换成AWQ或者GPTQ,再把并行关掉,单卡跑应该能上30+。长上下文的话,我体感SGLang在超过8K token时更稳,vLLM有时候会莫名其妙触发重新计算,不过如果你主要做短对话,vLLM的生态和文档更省心。建议你先跑个不带量化的BF16版本对比下,排除是不是量化格式和vLLM的兼容性问题。
显存高大概率是KV cache预分配和连续批处理占的,TP=2得确保两张卡都在同一PCIe域且驱动识别。速度瓶颈可能卡在量化格式或max-model-len设太长,试试调低点。
22G占用挺正常的,你设了0.9利用率,vLLM会尽量把显存吃满来缓存KV,不是bug。tensor-parallel-size=2没生效大概率是模型没走量化的原因,int8加载时权重还是占了大部分,可以先用--quantization awq指定下。速度20 tokens/s确实偏低,检查下是不是没开--enable-prefix-caching,或者输入长度太长导致prefill开销大。长上下文的话我体感SGLang更稳,vLLM在超长序列下偶尔会有碎片化问题,不过你要是只跑7B,两者差别不大。
你这情况太典型了,vLLM默认会预分配显存给KV cache和CUDA context,--gpu-memory-utilization设0.9基本就是按“有多少吃多少”来的,22G很正常,不是bug。两张卡没利用起来大概率是环境变量没配对,比如CUDA_VISIBLE_DEVICES没设成0,1,或者vLLM版本太老对TP=2支持有坑,建议先检查nvidia-smi确认两张卡都在,再试试--pipeline-parallel-size=1。速度20 tokens/s确实偏低,可能是量化格式选的不好,int8用AWQ或GPTQ比简单rounding好很多,另外你看的benchmark多半是batch size拉满的,单请求流式输出本来就会慢一截。至于SGLang和vLLM,长上下文我最近体感SGLang的radix cache更省显存,但vLLM生态更成熟,你先别急着换框架,把TP和量化搞定再说。最后提醒一句,7B模型两张4090其实有点浪费,单卡跑int4能剩不少显存给KV cache,长上下文反而更稳。
22G占用确实不正常,你试试把--max-model-len调小点,默认可能拉到32K了,KV cache直接吃满。TP=2没生效大概率是环境变量没配对,检查下CUDA_VISIBLE_DEVICES或者干脆用--tensor-parallel-size显式指定。速度慢跟显存占用高是一回事,上下文开太大导致显存碎片化,调低点应该能上来。SGLang长上下文更稳,但vLLM生态好,看你要不要折腾。
vLLM的显存预分配策略比较激进,0.9的利用率基本就是有多少吃多少,22G+挺正常的,你可以试着把gpu-memory-utilization降到0.6-0.7看实际占用,跑起来也不一定差。tensor-parallel-size=2没生效的话,可能得检查下模型路径或环境变量,或者试试用--multi-step-stream-requests强制多卡,另外20 tokens/s对7B int8来说确实偏慢,看看是不是没开--enable-prefix-caching。长上下文我体感SGLang在内存控制上更细,但vLLM生态成熟度高,如果只是API服务建议先用vLLM调参,真不行再换。
你这显存占用其实挺正常的,vLLM默认会预分配KV cache,--gpu-memory-utilization设0.9基本就是把显存塞满,7B int8权重才8G,剩下全被cache吃了。两张卡没跑满大概率是tensor parallel没生效,得确认下模型路径和启动命令里有没有加--tensor-parallel-size,另外4090不支持nvlink,TP通信开销大,速度反而可能更慢。
速度20 tokens/s确实偏低,但4090跑7B本来就不算快,如果开了--enable-prefix-caching或者max-model-len设太大都会拖慢。可以试试把max-model-len降到8k,或者用--kv-cache-dtype fp8看看。
SGLang在长上下文上优化更激进,显存管理更细,但vLLM生态成熟,坑少点。你如果主要跑长文档,可以两个都跑个压力测试对比下,我体感SGLang在超长输入下首token延迟更低,但vLLM稳。