最近在用vLLM部署一个13B的模型到公司服务器上,单卡A100 80G跑起来倒是还行,但并发一上来就显存溢出,报OOM错误。我试了GPTQ量化到4bit,精度有点下降但还能忍,结果显存占用还是跑满。问了同事,有人推荐用Flash Attention,有人建议上多卡张量并行,但我搞不清楚这些方案到底怎么落地。有没有大佬分享一下实际部署中压显存的成熟套路?或者有没有什么简单的trick能先顶住小流量?感谢!
部署开源大模型到生产环境,显存总不够用怎么办?
全部回复
共 161 条试试把max-num-seqs调小点,配合continuous batching,小流量能稳住,大并发再上张量并行。
Flash Attention得先安排上,它能省不少显存而且基本不影响精度,vLLM里直接开就行。另外4bit量化建议试试AWQ,比GPTQ在相同bit下能再压低点显存而且推理速度更快。如果并发再涨,要么上两张A100跑张量并行,要么考虑用FP8动态量化配合PagedAttention,这两个组合拳在咱们社区挺多人在用的。还有个急招,把max-num-seqs调小一点,比如8或者16,能立刻缓解OOM但吞吐会降。
试试把max-num-seqs调小点,配合continuous batching,小流量下能省不少显存。
显存不够先上Flash Attention,能省不少。多卡并行得改代码,小流量用GPTQ加max-num-seqs调低点顶住。
Flash Attention真能省不少显存,配合vLLM的paged attention一起用,小流量基本能稳住。
vLLM的PagedAttention本身已经帮你把KV Cache的碎片化问题解决了一大半,但13B模型在80G上单卡并发上不去,瓶颈多半在prefill阶段的计算峰值和显存带宽,而不是单纯容量。你试了GPTQ但显存还跑满,可以确认下是不是没开--quantization参数让vLLM真正加载4bit权重,或者max-model-len设太大导致KV Cache预留过多。Flash Attention确实能省显存,但在vLLM里是默认开启的,所以你要看的是另一个方向——把并发拆小,用--max-num-seqs限制同时处理的序列数,或者调低--gpu-memory-utilization到0.85,给运行时留点buffer。多卡张量并行是治本的路子,但你要注意TP=2时A100的NVLink带宽够不够,如果服务器是PCIe互联,反而会因通信开销拖慢吞吐。小流量顶一下的trick,可以试试把--swap-space调大,让部分KV Cache落到CPU内存,虽然慢点但至少不OOM。另外你量化后精度下降,可以考虑下AWQ或者GPTQ的--group-size 128版本,比4bit全精度的损失小不少。最后别忽略一个坑:检查一下你的max-model-len,如果默认设成4096,但你的实际输入只有几百token,等于白扔了大半显存给永远不会用到的位置。
vLLM的PagedAttention本身已经比HF原生推理省显存了,但你并发上来还OOM,大概率是KV cache的预留策略没调好。可以试试把gpu_memory_utilization设到0.9以上,然后把max-num-seqs调小一点,比如32或者16,先看能不能撑住小流量。另外Flash Attention确实有用,但vLLM里其实已经默认集成了,你如果是自己改的模型结构可能没吃到这个优化,检查一下是不是用了自定义attention。多卡张量并行是治本的路子,但13B模型在80G卡上其实没必要,除非你想把batch size拉得很高——我怀疑你真正的瓶颈是max-seq-len设太长,很多人默认设2048甚至4096,实际业务根本用不到,砍到512或1024能省一大截显存。GPTQ 4bit精度下降如果还能接受,那可以再试试AWQ,同是4bit但激活值量化做得更好,显存占用差不多但推理速度会快一点。还有个土办法,把并发请求按长度分组,长文本和短文本分开排队,避免短请求被长请求的KV cache挤爆。最后提醒一下,如果模型服务是内部用的,可以把response的max_tokens限制死,比如128,很多OOM是生成阶段累积的cache爆掉的。
vLLM的continuous batching开了吗?这玩意儿对并发OOM的缓解比量化直接多了,先把这个加上再看显存曲线。Flash Attention确实能省不少显存,但本质是优化attention计算,你OOM大概率是KV cache爆了,不如直接调低max_num_seqs和gpu_memory_utilization,先牺牲点吞吐保证服务别挂。张量并行的话,除非你有多卡且模型真的很大,否则13B单卡80G其实没必要,通信开销反而可能拖慢速度。还有个歪招,把模型切一半到CPU,用offload顶着,但延迟会明显上去,小流量应急可以试试。
vLLM本身支持paged attention,先确认下是不是没开起来,这个对显存碎片帮助很大。Flash Attention主要省的是计算时的临时缓冲,对峰值占用有点用但效果有限。多卡张量并行确实是吃大模型的标准解法,13B在两张A100上每卡才分到6.5B,但要注意通信开销,建议先上2卡试试。小流量顶一顶的话,可以调低max_num_seqs限制并发数,或者把KV cache比例调小点,牺牲点吞吐换稳定。另外GPTQ 4bit配合vLLM有个坑,需要装对应的量化kernel,不然显存反而可能更高。
Flash Attention对长上下文效果明显,但并发瓶颈更大概率在KV cache,试试PagedAttention或把max-num-seqs调小点。
多卡张量并行最省心,2张A100跑13B跟玩似的,就是得注意通信开销,先上这个准没错。
Flash Attention确实值得先试,它主要是优化注意力计算的内存占用,改造成本低,vLLM里直接开就行。我之前跑7B模型,开了之后显存峰值能降20%左右,而且对小并发提升明显。至于张量并行,你单卡都OOM了,上多卡得先确保模型能拆开,13B用2卡A100其实挺稳的,但要注意通信开销,最好用NVLink。如果只是临时顶小流量,可以试试把max_num_seqs调小点,或者限制最大输入长度,有时候是长序列把显存撑爆的。另外GPTQ降到4bit后,记得把vLLM的gpu_memory_utilization调低点,留点余量给KV cache,别让缓存也占满。
vLLM本身已经集成了FlashAttention,如果没生效大概率是版本或启动参数问题,可以加--enable-flash-attn看看日志确认。多卡张量并行确实能分摊显存,但13B模型在A100上并行边际收益不高,建议先查下是不是max-num-seqs或gpu-memory-utilization没调好。另外小流量顶一顶的话,可以开--enable-chunked-prefill,能把长请求的prefill阶段拆开,显存峰值能低不少。
说到OOM这事儿我太有同感了,之前我们部署7B模型也卡在这。你提到GPTQ降到4bit还跑满,大概率是KV cache在作怪,vLLM默认会预分配很大的cache空间,并发一高直接爆。可以试试把--max-num-seqs调小,比如从256降到64,再配个--gpu-memory-utilization设到0.85,别让它全吃光,留点余量给碎片。Flash Attention确实能省不少显存,它主要优化的是注意力那块的中间矩阵,vLLM新版已经内置了,你换个最新版本跑一下可能就有惊喜,不需要额外配置。多卡张量并行是个正经解法,但得看你模型能不能分,13B用两卡A100跑TP2的话,每卡压力能少一半,不过通信开销得拿实测说话,小流量下可能反而慢。还有个土办法,把max-model-len改短,比如从4096压到2048,很多场景其实够用,KV cache瞬间小一半。你要是能接受动态批处理,开个continuous batching,小流量下顶住几十个并发没问题。最后提醒一句,别光盯显存,看看是不是CPU内存溢出导致OOM假象,有时候swap一开性能反而崩。
vLLM的显存管理其实有讲究,你可以先看看gpu_memory_utilization参数,别默认拉到0.9,留点余量给碎片,再配合--max-num-seqs限制并发,小流量能先稳住。Flash Attention是省显存但主要是省KV cache那部分,跟量化不冲突,建议先把它加上,效果立竿见影。张量并行得上多卡,但你这单卡80G都OOM,说明问题不在算力而显存分配策略,得先查下是不是max_model_len设太大,或者prompt缓存没关。我之前用13B模型,把--swap-space调低,再开--enable-chunked-prefill,并发翻倍也没爆过,你可以试试。
说实话GPTQ 4bit在13B上显存还跑满有点不正常,你检查下vLLM的gpu_memory_utilization参数没?我一般设到0.9左右,再配合--max-num-seqs调小并发数,小流量能先撑住。Flash Attention确实能省不少显存,但vLLM里是默认开启的,你确认下版本是不是太老。多卡张量并行是正解,但得注意张量并行度别超过单卡能放下的层数,否则反而会因通信开销拖慢速度。另外可以试试把KV cache的量化打开,最近几版vLLM支持FP8 KV cache,能再挤出一块空间。
vLLM的OOM不一定是模型权重占满,很可能是KV cache没限制好,先检查下--max-num-seqs和--gpu-memory-utilization这两个参数,把利用率调到0.9以下能缓解不少。Flash Attention确实省显存,但vLLM里已经默认集成了,你不需要额外配置。如果并发要求不高,最简单的trick是限制max-num-seqs=4或者8,牺牲一点吞吐先顶住小流量。多卡张量并行是终极方案,但13B模型上两卡A100有点浪费,不如直接换70B或者用offload。
vLLM本身就支持paged attention,你先把max_num_seqs调小点试试,比如压到16或8,小流量下能明显缓解OOM。张量并行其实没那么复杂,A100 80G两张卡直接上TP=2,显存翻倍不说,吞吐还能涨一截。Flash Attention主要是省显存带宽和加速,对OOM帮助有限,不如先开vLLM的continuous batching参数。另外4bit GPTQ建议配合awq或者exl2再压一遍,有些模型用AWQ精度损失比GPTQ小,显存还能再抠出几个G。
我这边也是用vLLM跑13B,A100 80G单卡,并发一多就OOM,太真实了。你试过把max-num-seqs调小点吗?这参数直接限制同时处理的序列数,先压到16或者8,虽然吞吐会掉,但能顶住小流量不崩,属于马上能用的trick。Flash Attention确实有效,它主要是省attention那块的显存,尤其长上下文场景,但vLLM老版本默认没开,你升级到最新版再在启动参数里加上--enable-flash-attention试试,代码层面不用改,这个能明显缓解峰值显存。至于多卡张量并行,我建议你先用2卡试试,vLLM里加--tensor-parallel-size 2,显存直接砍半,但要注意你得有足够的卡,而且卡间通信带宽得够,不然性能反而下降。GPTQ 4bit说实话精度损失在13B上不算大,但显存占用高也可能是因为KV cache没优化,你可以在vLLM里设置--max-model-len别给太长,比如4096,能省一大块。还有个小坑,检查一下你的并发请求是不是有长文本的,长prompt特别吃显存,可以加个长度限制或者用--gpu-memory-utilization 0.9把显存利用率调到90%,别让默认值留太多空余。你跑的是13B还是13B-chat?如果业务场景对延迟不敏感,也可以考虑把batch size用手动控制,别让vLLM自动调太大。
Flash Attention确实得优先安排上,它主要是省显存带宽,对长上下文场景提升明显,vLLM里直接开--enable-flash-attn就行。多卡张量并行是治本的路子,但你要注意13B模型在A100上其实2卡就够了,用tensor-parallel-size 2能直接把每卡占用砍半。另外小流量顶一下的话,把max-num-seqs调低到16或者32,再配合gpu-memory-utilization设到0.9,基本能避开OOM。你GPTQ量化后还跑满,大概率是vLLM的KV cache没限制住,检查下max-model-len是不是设太大了。
Flash Attention建议优先安排上,它主要是优化注意力计算的内存占用,13B模型上能省出不少显存给并发请求,而且vLLM本身就支持,改个参数就能开。多卡张量并行确实能扛更大并发,但得看你们服务器有几张卡,如果就一张A100,那只能靠量化加Flash Attention先顶着。另外可以试试调低vLLM的max-num-seqs,限制同时处理的请求数,小流量下能明显减少OOM,就是吞吐会降一点。GPTQ 4bit精度其实还行,配合KV cache量化还能再压一截。