最近想把自己微调过的Qwen2.5-7B部署到公司服务器上做API服务,看了N种量化方案,但显存占用算来算去总是跟实际有出入。比如我按公式算INT4量化后大概5-6G显存,结果一跑起来直接OOM了。后来发现上下文长度和batch size也占显存,但不知道具体怎么估算。还有那种多卡部署的方案,用vLLM还是TGI好?有没有老哥分享下实际踩坑经验?我主要是做文本摘要,QPS要求不高但延迟要低,现在被显存和框架选择卡住了,求指点。
部署开源大模型到生产环境,显存到底怎么算才靠谱?
全部回复
共 172 条显存这账真不能只按权重算,KV cache才是隐藏大户,尤其你文本摘要输入输出都不短,7B模型INT4下8K上下文随便就吃2-3G。建议用vLLM,它自带显存监控,PagedAttention能把KV cache利用率拉高不少,先跑个小batch试出真实峰值。多卡的话TGI部署更省心,但vLLM对QPS不高场景延迟优化更极致,你这需求直接单卡A10或L20试试,别急着上多卡。
显存这块我踩过一样的坑,公式算的只是权重,KV cache才是隐形杀手,尤其你文本摘要场景输入输出都不短,建议直接按最大序列长度算一下,7B的int4加8k上下文,batch size给1,预留个10G比较稳。框架的话,vLLM对显存管理更省心,TGI的延迟控制更细,但你QPS不高,我推荐先试vLLM,paged attention对长文本友好很多。另外别忽略CUDA context本身也吃几百M,多卡的话优先张量并行,别用流水线并行,通信开销小很多。
显存这事儿我踩过一样的坑,公式算的只是权重,KV cache才是大头,尤其你摘要场景输入输出都不短。建议直接按最大上下文先预留个2-3G,再用vLLM的--gpu-memory-utilization参数让它自己算,比手动估靠谱多了。框架选型的话,延迟敏感就vLLM,TGI现在优势不大了,连续批处理在低QPS下反而有点浪费。另外多卡的话优先考虑张量并行而不是数据并行,虽然7B单卡勉强能塞,但留点余量给长文本爆发会稳很多。
显存这块我踩过一样的坑,你漏算的是KV cache和激活值,7B模型INT4权重确实只要5G左右,但上下文一长,KV cache能吃掉好几G,建议直接按峰值token数乘层数乘隐藏维度再乘2字节来粗算。框架的话,低延迟就无脑vLLM,TGI的continuous batching在长上下文下更稳,但QPS不高的话其实差别不大。你这场景建议先固定max_length=2048试跑,把prefill和decode分开看显存,实测比任何公式都靠谱。
显存这块我踩过一样的坑,公式算的只是权重,KV cache才是隐藏大头。你文本摘要如果输入长文本,7B模型INT4量化后建议直接按8G+预留,batch设1试试。框架的话,低延迟场景vLLM的continuous batching更稳,TGI在量化兼容性上稍好,但你这需求直接vLLM就行。另外多卡部署别用tensor parallel,7B模型单卡就能跑,优先把显存余量堆上去。
显存大头其实在KV cache,7B满血部署至少留12G,建议直接上vLLM开paged attention。
显存这坑我太懂了,公式算的只是权重部分,KV cache和激活值才是隐藏杀手。你试试把max_seq_len设成实际业务最长长度,别按模型默认的2048算,光这块就能差出2-3G。vLLM对连续请求的批处理确实省显存,但如果你QPS不高,TGI的延迟会更稳一些,建议拿同样的prompt压测下看首token时延。
还有个野路子,用flash-attention能省不少KV cache,配合paged attention的vLLM,7B模型INT4在单张3090上跑过8K上下文是没问题的。你那个OOM多半是预分配缓存设太大了,调低gpu_memory_utilization参数试试,0.85起步慢慢往上加。
公式算的只是权重本身,KV cache和中间激活才是大头,你文本摘要如果输入长,KV cache轻松吃几个G。我上次跑7B INT4,context设4K,batch 1,实测峰值8G多,建议你直接按权重+context层数2*字节数来粗估。框架的话,延迟敏感就vLLM,TGI的continuous batching在某些卡上调度更稳,但你这QPS不高其实差别不大,先拿vLLM试,OOM就降并发或换AWQ。
公式算的只是权重本身,KV cache那部分才是大头,你7B模型就算INT4,上下文拉到2K以上batch一到8基本要吃4-6G额外显存,建议直接用vLLM的--max-num-seqs限制并发然后看它启动时打印的显存预估。框架我两个都试过,TGI对Qwen支持更省心,vLLM调优空间大但坑也多,你延迟敏感的话建议先用TGI的continuous batching跑个benchmark。另外多卡部署别直接tensor parallel,7B单卡能塞下就优先单卡,跨卡通信那点延迟对摘要这种任务真不值当。
显存这块我当初也栽过跟头,光算权重没用,KV cache才是隐藏大户,特别是长文本摘要场景,上下文一拉长直接翻车。你按公式估的时候得把max_seq_len和并发数乘进去,建议直接拿实际数据压测一轮,比啥公式都准。框架的话,低延迟选vLLM没错,TGI在动态batch上更灵活,但你QPS不高的话其实vLLM够用了,记得开continuous batching。另外INT4别光看显存,还得看推理速度,实在不行就上AWQ量化,比GPTQ稳一点。
Qwen2.5-7B的KV cache按层数×头数×维度×长度×batch算,公式里漏了它就必OOM。延迟低直接上vLLM,TGI吞吐好但首token慢。
INT4算5G那是权重,KV cache随上下文和并发涨得飞快,延迟敏感直接上vLLM吧。