最近想在单张A100(80G)上部署Qwen2.5-32B-Instruct做内部工具,量化到AWQ 4bit后显存大概还剩10G左右。我先试了vLLM,吞吐还行,但首token延迟偶尔会飙到3秒多,感觉不太稳定。后来换了SGLang,首token快了一些,但并发一高就报OOM,查了下好像是prefill和decode内存复用的问题,没调明白。
部署Qwen2.5-32B用vLLM还是SGLang?显存刚好够但延迟很迷
全部回复
共 41 条这俩框架在长上下文场景下表现差异挺明显的,vLLM那个3秒延迟我猜是prefix caching没命中导致的,可以试试把调度策略调成优先保首token。SGLang的OOM大概率是radix cache的chunk size设置问题,把max-prefill-tokens调小点能缓解。另外你AWQ量化后显存余量其实挺紧的,建议给KV cache留个固定上限,不然并发一高肯定炸。要是主要跑内部工具而不是压极限性能,vLLM加个continuous batching的配置可能比换框架省事。
这俩框架在长上下文下的调度策略差别挺大的,vLLM那个首token抖动大概率是chunked prefill的调度窗口没调好,试试把max-num-batched-tokens调小点能缓解。SGLang那个OOM我之前也踩过,可以试试把radix cache的eviction策略改一下,或者干脆关掉prefix caching,显存占用能降不少。另外AWQ的group size对显存占用影响也很大,你确认下是不是128的,换256的说不定能省出几个G来。
这个情况我也遇到过,vLLM的prefill波动确实烦人,尤其AWQ量化后首token延迟更容易被放大。SGLang的OOM我倒没碰到,但看GitHub上有人提过类似问题,说把--mem-fraction-static调低点能缓解,你可以试试。另外你显存余量10G其实挺紧的,建议把max-num-seqs限制到16以下,并发高的时候能稳不少。
SGLang那个OOM我也踩过,prefill和decode的显存池是分开的,得手动调--mem-fraction-static和--max-prefill-tokens,不然默认设置下并发一高肯定炸。vLLM倒是稳,但首token延迟飘我觉得是AWQ量化后batch调度的问题,试试开--enable-prefix-caching能不能缓解。你显存剩10G其实挺尴尬的,这俩框架都得留点余量给KV cache,建议把max-num-seqs压到16以内再对比一轮。
我之前也碰到过类似情况,vLLM首token抖动大概率跟调度策略有关,可以试试调大continuous batching的窗口或者限制下max_num_seqs。SGLang那个OOM倒不一定是显存不够,可能是radix cache的缓存策略跟你的并发模式不匹配,把chunked prefill打开或者手动调下mem_fraction_static看看。另外你AWQ量化后还留10G,其实可以考虑上FP8,我记得Qwen2.5对FP8支持得挺好,延迟会更稳一些。你跑的是什么长度的prompt?如果长文本多,这俩框架的行为差异会更明显。
SGLang的radix cache吃显存,prefill和decode分开调参试试,我上次调完稳定不少。
SGLang那个OOM我也踩过坑,主要是它默认把kv cache和显存池共用,得手动调--mem-fraction-static和--max-prefill-tokens,不然并发一上来prefill直接吃掉预留空间。vLLM延迟飙到3秒我怀疑是连续批处理里的长尾效应,试试把--max-num-seqs调小一点。另外你这显存余量其实挺紧张,AWQ虽然省显存但decode阶段要解权重,实际开销比FP8还高,可以考虑换FP8试下延迟会不会更稳。
这个场景太典型了,我也是在80G上跑32B AWQ,vLLM的首token确实会在某些输入长度下突然抽风,后来发现是chunked prefill的阈值没调好。SGLang那个OOM我也踩过,你试试把--mem-fraction-static调低点,或者直接开--chunked-prefill-size,比折腾内存复用参数省心。另外你显存还剩10G,其实可以试试FP8动态量化,AWQ的4bit在长上下文下延迟波动会更明显,我这换完平滑多了。
跑过同样的配置,vLLM那个3秒延迟大概率是显存碎片化导致的,可以开--enable-chunked-prefill配合--max-num-batched-tokens限制下,能稳不少。SGLang的话建议把radix cache关了再压测,不然prefill阶段会抢decode的内存,我这边关掉后OOM直接消失,延迟还降了20%。不过你这10G余量确实紧,要不试试把max-model-len砍到16K,内部工具应该够用。
我也是A100用户,32B这体量用vLLM确实容易忽高忽低,你可以试试给它加--gpu-memory-utilization 0.95,再把continuous batching的窗口调小,首token会稳定很多。SGLang的OOM我倒没碰到
SGLang那个OOM八成是chunked prefill没开,试试把max-prefill-tokens调小点。
这问题我也踩过坑,单卡80G跑32B量化后确实挺极限的。vLLM首token偶尔飙高,我后来发现跟max_num_seqs和KV cache预留策略有关系,调小点能稳不少。SGLang那个OOM我也遇到过,它的radix cache和chunked prefill默认参数在显存紧的时候特别容易爆,把mem_fraction_static调低一档试试?不过说实话两个框架在边界场景下都得手动抠参数,没有开箱即用的选项。
试试把SGLang的chunked prefill打开,内存复用那个参数调大点,OOM应该能缓解不少。
SGLang试试把max-prefill-tokens调小,vLLM那边首token不稳可能是调度问题,加个continuous-batching参数看看。
这配置我熟,A100 80G跑32B AWQ其实挺极限的,你剩10G看着够,但prefill和decode的峰值内存是分开算的,SGLang那个OOM八成是radix cache和chunked prefill的默认参数没调,把max-prefill-tokens调小点比如1024试试。vLLM那边首token飘到3秒我倒觉得不一定是引擎问题,可能是AWQ的group size没对齐导致部分层走了慢速路径,你换个GPTQ或者把--quantization-param-bits调成32试试。另外你说并发高,这俩框架默认都是continuous batching,如果请求长度差异特别大,内存碎片化会很严重,建议给vLLM开个--enable-chunked-prefill,或者限制一下max-num-seqs到8以下。我个人现在偏向vLLM做生产,主要是SGLang的调度策略在长上下文场景下太激进,除非你愿意花时间改它的radix tree参数。你测过两个框架在完全相同的batch size和输入长度下的延迟分布吗?有时候是测试流量本身不均匀导致的假象。
这俩框架我最近也折腾了一圈,感觉SGLang的显存管理默认参数确实偏激进,你把max_prefill_tokens调小点或者开一下chunked prefill试试,OOM应该能缓解。vLLM那边首token延迟波动大,可能跟continuous batching的调度策略有关,试试把--max-num-seqs调低,让单batch别塞太满。另外AWQ量化后的模型,vLLM对某些算子的优化反而没SGLang到位,你换成FP8或者GPTQ对比下可能更明显。
SGLang那个OOM八成是chunked prefill没开,vLLM首token不稳可以试试调下max_num_batched_tokens。
你这显存余量挺紧的,SGLang内存复用得把radix cache关掉试试,vLLM那边换个调度器参数可能更省心。
这俩框架的取舍其实挺看场景的,你这种显存刚够的情况确实容易踩坑。SGLang那个OOM我遇到过,后来把chunked prefill打开、再调小max running requests就稳了,你可以试试。vLLM首token不稳定多半是调度策略的问题,换个调度器或者把max num batched tokens调低点能改善。不过话说回来,10G余量对32B AWQ来说还是有点紧,真追求低延迟的话建议把KV cache量化开起来,能省不少。
试试把SGLang的chunked prefill打开,OOM能缓解不少,首token还能再压一压。
试试把SGLang的chunked prefill调小点,或者直接上vLLM的prefix caching,这俩我都踩过坑。
试试把SGLang的chunked prefill打开,能缓解内存复用问题,不过你这显存余量确实有点紧。
同款配置踩过坑,AWQ 4bit下A100 80G跑32B其实余量没你想的那么宽裕。我最后是vLLM加max_num_batched_tokens限制到4096才稳住,首token抖动大概率是连续抢占或显存碎片在作祟,建议开下vllm的prefix caching试试,内部工具如果prompt重复度高收益会很明显。SGLang那个OOM我也遇到过,它默认会把prefill和decode的KV cache池分开,但你的场景显存太紧,得手动调mem_fraction_static或者直接开radix_attention的eviction,不然高并发必炸。不过说实话,这俩框架在单卡场景下差距真没那么大,瓶颈多半在AWQ的group size或者量化后激活分布变了,你可以先跑下per-token延迟分布,看看是不是长尾效应。如果只是内部工具,我反而建议试试llama.cpp的server模式,显存控制粒度细得多,虽然吞吐低点但延迟曲线平滑,不会像前两个那样忽上忽下。最后问一句,你的并发大概多少?我这边8并发以内vLLM还挺稳,过了12就不行了。
SGLang那个OOM八成是radix cache没调好,试试关掉或者限制树宽,vLLM延迟抖动可能是调度策略问题。