最近想在单张A100(80G)上部署Qwen2.5-32B-Instruct做内部工具,量化到AWQ 4bit后显存大概还剩10G左右。我先试了vLLM,吞吐还行,但首token延迟偶尔会飙到3秒多,感觉不太稳定。后来换了SGLang,首token快了一些,但并发一高就报OOM,查了下好像是prefill和decode内存复用的问题,没调明白。
部署Qwen2.5-32B用vLLM还是SGLang?显存刚好够但延迟很迷
全部回复
共 41 条SGLang那个OOM得调max-prefill-tokens,我用A100跑同配置调完就稳了。
SGLang那个OOM八成是chunked prefill没开,调下max-prefill-tokens试试,能稳不少。
这俩框架我最近也折腾过一阵,感觉vLLM那个首token飙高多半和scheduler的抢占策略有关,试试把max_num_seqs调小点或者开下continuous batching的tuning参数,能压下来不少。SGLang的OOM我倒是没碰到过,不过看issue里说可以试试把chunked prefill关掉,或者手动设下mem_fraction_static,别让它自动算。你显存剩10G其实挺尴尬的,刚好卡在复用边界上,要不先固定max_len跑几天看看峰值,再决定要不要上pagedattention的v2版。
SGLang那个OOM调下chunked prefill参数试试,我上次调完稳多了。
我最近也在这两个框架间反复横跳,vLLM的调度确实容易抽风,但SGLang那个OOM八成是radix cache没配好,试试把--chunked-prefill关掉或者调低--max-running-requests,内存复用立马就顺了。另外你AWQ后显存还有10G,其实可以试试给vLLM开--enable-chunked-prefill,把prefill拆碎点,首token延迟能稳不少。不过说到底,单卡跑32B还是有点赌运气,要不看看offload到CPU做长上下文?
这问题我上周刚踩过一模一样的坑,也是A100 80G跑32B AWQ。vLLM那个首token抖动我这边也复现了,后来发现是显存碎片化导致的,尤其开了continuous batching之后,长序列请求会挤占prefill的预算。SGLang那个OOM我倒是没遇到,但看你描述,可能是radix cache的reuse策略跟AWQ的group size不兼容,它默认会为每层KV cache预留更多空间,你试试把--kv-cache-dtype改成fp8_e5m2,能省不少。
其实你这情况我更推荐先检查一下量化后的模型是不是真的只占36G,有些AWQ版本会额外保留fp16的weight做scale,实际占用比预想高。另外你提到并发高才OOM,我怀疑是SGLang的page大小设太大了,默认的2048 token/page对32B这种长上下文模型很浪费,改成512试试。
还有个小技巧,如果只是内部工具,可以给vLLM加--max-num-batched-tokens限制一下,牺牲点吞吐换稳定性,首token延迟能压到1秒内。我目前是vLLM跑单请求,SGLang留到需要低延迟的场景,两个框架共存也不冲突,反正模型文件是同一份。
SGLang那个OOM八成是radix cache没关,试试关掉或调小chunk size,首token还能再压一压。
说到这个我最近也折腾过一阵,A100 80G跑32B AWQ确实是个临界点。你那个首token偶尔飙到3秒,我猜大概率是vLLM的continuous batching在prefill阶段碰上长prompt或者多请求排队时触发了chunked prefill的阈值,这个版本参数没调好的话波动会很明显。SGLang那边OOM我倒没遇到过,但它的RadixAttention确实对前缀复用很敏感,如果你内部工具的prompt模板经常变,反而容易让显存碎片化,你可以试试把mem_fraction_static调低一点,或者直接关掉radix cache再对比下。
另外有个思路你可能没试过,就是直接上vLLM的decode-only模式,把prefill单独拆出去用另一个小模型比如Qwen2.5-1.5B顶一下,虽然架构上麻烦点,但能把首token压到稳定1秒内。不过说真的,你这显存余量10G看着够,实际上AWQ的激活值在长序列下会爆炸,建议把max_model_len从默认的32K砍到16K,很多诡异延迟和OOM都是这个引起的。
还有个细节,你用的量化版本是GPTQ还是AWQ?两者在SGLang上的内存复用逻辑不一样,AWQ按group size切分后,如果batch size超过8,KVCache分配容易出问题。我这边最后是换回vLLM,但把gpu_memory_utilization设成0.9,然后开了--enable-chunked-prefill配合--max-num-batched-tokens 4096,首token波动基本就消失了。你可以先试试这个组合,成本和改动最小。
SGLang那个OOM我也踩过,调下chunked prefill参数能缓解,但vLLM3秒延迟确实难顶。
SGLang那个OOM我也踩过,不是显存不够,是它默认把prefill和decode的memory pool分得太死,调一下--mem-fraction-static和--max-prefill-tokens能缓解不少。vLLM首token抖动我倒觉得可能是AWQ量化后某些层对padding敏感,试试把--max-num-seqs调低点,或者开--enable-chunked-prefill,延迟能稳一些。你这场景其实可以混合用,低并发走SGLang,高并发切回vLLM,反正两个框架切换成本不高。
SGLang那个OOM八成是radix cache没关,试试--disable-radix-cache,能省不少显存。
vLLM首token抖动可以调下--max-num-seqs,别让并发全挤在prefill上。
SGLang那个OOM调下--mem-fraction-static试试,我压到0.75就稳了。
vLLM首token飘的话,把max-num-seqs调小点能压住。
这问题我最近也踩过,A100 80G跑4bit Qwen2.5-32B确实是个临界点,10G余量看着够,但prefill和decode的峰值内存是分开算的,SGLang那个OOM多半是radix cache或者chunked prefill的默认参数没调,试试把max-prefill-tokens调小点,或者直接关掉一些内存复用选项,vLLM那边首token飙到3秒我倒觉得不一定是引擎问题,可能是AWQ的group size和vLLM的算子没对齐,导致某些shape走了fallback kernel,你检查下有没有用上Marlin或者GPTQ的优化路径。另外你量化用的什么工具?如果是autoawq,建议看看是不是用了--zero-point,那个在vLLM上兼容性一般,换对称量化可能延迟会稳很多。还有个小技巧,两个框架都试一下把continuous batching的bucket size调低,能明显减少抖动。如果还有余力,建议测下FP8动态量化,A100虽然不支持原生FP8,但vLLM有模拟层,有时候延迟反而比AWQ更稳定,就是显存会紧一点。最后问下,你那个并发高是多高?如果是几十路同时打,单卡这配置确实容易撞墙,可以考虑把max-num-seqs限制在16以内试试。
显存余量太紧就是会这样,SGLang那内存复用参数调一下试试,vLLM加个max-num-batched-token应该能稳点。
你试过把KV cache量化打开没?这俩框架对显存余量的敏感度不一样,vLLM那个3秒延迟可能是调度抖动。
试试把SGLang的chunked prefill打开,再把max-prefill-tokens调低点,OOM能缓解不少。
这俩框架我最近也折腾过一阵,vLLM那个首token抖动大概率是调度策略的问题,可以试试把max_num_seqs调小或者开一下prefix caching,能压下来不少。SGLang那个OOM我倒是没遇到,不过听说是要手动调一下mem_fraction_static参数,默认值在4bit量化下确实容易踩坑。你显存剩10G其实挺尴尬的,要不试试把KV cache的预留再收紧一点,或者干脆把max_model_len限制到8K以内,可能两边都能稳住。另外你测并发的时候有没有留意过GPU利用率?有时候瓶颈根本不在框架,是CPU和GPU之间数据传输卡住了。
这俩框架我最近也在对比,体感vLLM的调度策略对burst请求确实不太友好,首token抖动大可能跟它的continuous batching实现有关。SGLang那个OOM我遇到过,它默认prefill和decode共用显存池,得手动调--mem-fraction-static或者干脆分开设,不然并发一上来就炸。你显存余量不大,建议试试SGLang最新版,我记得更新日志里提过优化这块的内存复用,或者把max-running-requests调低点换稳定性。还有一个思路是检查下量化格式,AWQ在某些版本上对SGLang的支持不如vLLM成熟,说不定换GPTQ能规避掉那个内存问题。
SGLang的OOM八成是chunked prefill没开,把max_prefill_tokens调小点试试。
说实话这俩我都踩过坑,AWQ 4bit下SGLang的显存管理确实更激进,prefill和decode的缓存策略调起来挺费劲,你试试把max-prefill-tokens调小点,或者干脆关掉chunked-prefill看看。vLLM那边首token抖动多半是调度问题,可以试试开continuous-batching然后限制下最大并发数,我这边把--max-num-seqs降到8以后稳了不少。另外你剩10G其实挺悬的,建议给KV cache留点余量,不然并发一上来谁都救不了。
这俩框架在AWQ下表现差异挺大的,vLLM那个首token抖动我猜是显存碎片化导致的,试试把gpu_memory_utilization调低点留出余量,或者开下prefix caching看能不能缓解。SGLang的OOM确实常见,它默认的radix cache策略吃显存比较猛,可以手动限制下prefill的chunk size或者把decode的memory pool调小点,虽然会牺牲点吞吐但至少不崩。另外你量化用的是AutoAWQ还是GPTQ?不同量化格式对这俩框架的支持度也有差别,我之前用GPTQ在SGLang上反而更稳。