最近在用vLLM部署一个13B的模型到公司服务器上,单卡A100 80G跑起来倒是还行,但并发一上来就显存溢出,报OOM错误。我试了GPTQ量化到4bit,精度有点下降但还能忍,结果显存占用还是跑满。问了同事,有人推荐用Flash Attention,有人建议上多卡张量并行,但我搞不清楚这些方案到底怎么落地。有没有大佬分享一下实际部署中压显存的成熟套路?或者有没有什么简单的trick能先顶住小流量?感谢!
部署开源大模型到生产环境,显存总不够用怎么办?
全部回复
共 166 条vLLM的gpu_memory_utilization调低点,再限制max_num_seqs,小流量能顶住。
13B模型4bit量化后单卡80G还OOM,大概率是KV cache没管住,gpu_memory_utilization默认0.9,并发一高就炸了。先把max_model_len和max_num_seqs调小试试,能顶住小流量。另外enable_prefix_caching和chunked_prefill开了没?这俩对显存和吞吐帮助挺明显的,比急着上张量并行省事多了。
vLLM的gpu_memory_utilization调低点先扛着,再开enable_prefix_caching,小流量基本稳。
vLLM的gpu_memory_utilization默认0.9,你可以先降到0.8试试,另外max_num_seqs也调小点,别让并发请求堆太多。GPTQ 4bit还OOM的话,大概率是KV cache没控制好,开enable_prefix_caching和限制max_model_len能省不少。Flash Attention主要省的是计算时的中间激活,对KV cache帮助有限,真要压显存还是得看张量并行或者量化KV cache这条路。
13B模型在A100 80G上并发一高就OOM,大概率不是模型权重本身的问题,而是KV Cache把显存吃光了。你可以先算一下vLLM里gpu_memory_utilization设了多少,默认0.9的话留给KV Cache的空间其实很有限,把max_model_len调小或者限制max_num_seqs往往比换量化方案来得更直接。GPTQ 4bit确实能压权重,但KV Cache是跟序列长度和并发数线性相关的,这部分量化收益不大,所以你会觉得“量化了还是爆”。Flash Attention主要省的是注意力计算时的中间激活,对长序列帮助明显,但它不直接解决KV Cache占用。张量并行能把权重和KV Cache分摊到多卡,但通信开销和部署复杂度都上来了,小流量场景未必划算。想先顶住的话,可以试试调低gpu_memory_utilization到0.85、开enable_prefix_caching、限制max_num_seqs,这几个改起来最快。
写得挺好,建议补充一些性能数据。