最近想在单张A100(80G)上部署Qwen2.5-32B-Instruct做内部工具,量化到AWQ 4bit后显存大概还剩10G左右。我先试了vLLM,吞吐还行,但首token延迟偶尔会飙到3秒多,感觉不太稳定。后来换了SGLang,首token快了一些,但并发一高就报OOM,查了下好像是prefill和decode内存复用的问题,没调明白。
部署Qwen2.5-32B用vLLM还是SGLang?显存刚好够但延迟很迷
全部回复
共 50 条SGLang那个OOM调下--mem-fraction-static试试,我之前调低点就好了,vLLM可以开prefix-caching压首token延迟。
你这情况跟我之前跑Yi-34B时差不多,vLLM的调度对突发请求确实容易抖,可以试试把max_num_seqs调小点,牺牲点吞吐换稳定。SGLang那个OOM我倒是没遇到过,不过prefill和decode的内存池可以分开设,试试--mem-fraction-static调低点,给动态分配留点余量。另外你AWQ后还剩10G,是不是给KV cache的预留太大了?我一般会手动限制一下,反而更稳。
说实话,这俩框架现在都挺卷的,vLLM版本更新特别快,你那个延迟抖动说不定换个最新版就解决了,之前他们改过chunked prefill的逻辑。SGLang的话,OOM大概率是radix cache的显存没控制好,可以看看它的--max-prefill-tokens,调小点能缓解。不过你这显存卡得这么死,我建议干脆用FP8试试,虽然量化麻烦点,但负载能低不少。
我之前在80G上跑过同尺寸模型,感觉10G余量其实挺紧的。vLLM你试试开--enable-prefix-caching,内部工具如果请求有重复前缀,首token能明显降下来。SGLang那个OOM,我猜是你在并发高时没给decode留足显存,可以试试手动设--mem-fraction-static到0.
试试把SGLang的chunked prefill打开,OOM应该能缓解,首token和吞吐能平衡不少。
我之前也遇到过类似的情况,vLLM首token抖动确实挺烦人的,后来把max_num_seqs调小了点,情况会好一些,你可以试试看。SGLang那个OOM我倒没碰上过,但我看官方文档说可以试试把chunked prefill打开,或者调低max_prefill_tokens,感觉你显存既然卡在临界点,可能得牺牲点吞吐换稳定。另外你AWQ量化用的是哪个版本?我怀疑是不是量化参数对attention部分影响比较大,导致内存分配策略不太一样。
说实话你这个显存余量挺尴尬的,刚好卡在SGLang的prefill和decode复用临界点上。我之前跑13B也遇到过类似OOM,后来直接把max-running-requests调低到8才稳住,但吞吐又掉不少。
vLLM那个首token抖动我倒觉得不一定全是框架问题,可能跟AWQ的group size还有连续批处理的调度策略有关,你可以试试把--enable-chunked-prefill关掉对比下,有时候能压住那3秒的尖峰。
另外你确定量化后显存真的还剩10G吗,我算过32B的KV cache加中间激活其实挺吃紧的,建议用nvidia-smi盯着看几轮请求再下结论。如果只是内部工具,我倒是更倾向vLLM配个简单的流式响应,毕竟稳定压倒一切。
对了,你测并发的时候是不是开了continuous batching?SGLang那个radix cache在长上下文下反而容易爆显存,可以试试关掉或者调小cache容量,或者直接换最新版,他们最近修了不少内存复用的问题。
A100 80G跑AWQ 4bit的32B确实有点紧,剩下10G余量对KV cache来说不太够折腾。vLLM首token飙到3秒多,大概率是调度器在等batch凑数,你可以试试把--max-num-seqs调小或者开chunked prefill,延迟会稳一些。SGLang那边OOM多半是mem-fraction-static给太高了,默认0.9的话prefill阶段容易炸,降到0.8左右再压一下max-running-requests试试。说实话这配置想扛并发有点勉强,不如考虑双卡或者换14B,省心很多。
单卡80G跑32B AWQ确实挺紧的,剩10G基本全给KV cache了。vLLM首token飙到3秒我怀疑是chunked prefill没开,或者调度策略在长上下文时把prefill和decode混在一起了,可以试试调小max_num_batched_tokens。SGLang那个OOM八成是mem_fraction_static给太高了,它默认会预留比较多显存做prefill复用,降到0.75左右试试,另外schedule_policy改成lpm对并发场景友好点。
AWQ 4bit在A100上跑32B确实有点紧,剩10G看似够用,但KV cache一上来就容易爆。vLLM那个首token飙到3秒多,大概率是调度器在等显存回收,可以试试把gpu_memory_utilization调到0.9以下,别拉太满。SGLang并发高OOM我也遇到过,后来把chunked prefill打开、限制max_running_requests才稳住。如果并发不是特别高,其实可以两个都留着,vLLM扛批量、SGLang跑低延迟交互。
SGLang那个OOM我也踩过,mem-fraction-static调低一点会稳不少,但吞吐确实会掉。你试过把max-running-requests压到16以内吗?A100跑32B AWQ本来就紧巴巴的,prefill和decode抢显存很难完全避免。vLLM首token飙3秒多可能是调度器在等batch凑满,加个--enforce-eager或者调小max-num-seqs试试,不过eager会牺牲点吞吐。实在不行可以考虑跑双卡TP=2,单卡80G伺候32B确实有点勉强。
我这边用AWQ 4bit跑32B也遇到过类似情况,vLLM首token飙高大概率是调度策略的问题,可以试试调低max_num_seqs或者开chunked prefill,会稳不少。SGLang那个OOM基本就是mem_fraction_static给太高了,留点余量给KV cache动态增长,调到0.8左右再试。另外你还剩10G其实挺紧张的,并发稍微上来两个方案都容易崩,建议压测前先把gpu_memory_utilization卡死别让它吃满。