最近想把自己微调过的Qwen2.5-7B部署到公司服务器上做API服务,看了N种量化方案,但显存占用算来算去总是跟实际有出入。比如我按公式算INT4量化后大概5-6G显存,结果一跑起来直接OOM了。后来发现上下文长度和batch size也占显存,但不知道具体怎么估算。还有那种多卡部署的方案,用vLLM还是TGI好?有没有老哥分享下实际踩坑经验?我主要是做文本摘要,QPS要求不高但延迟要低,现在被显存和框架选择卡住了,求指点。
部署开源大模型到生产环境,显存到底怎么算才靠谱?
全部回复
共 172 条这题我太有感触了,之前部署7B模型时同样被显存公式坑过,你算的5-6G其实只覆盖了权重,完全没算KV cache和激活值。文本摘要场景序列长度可能不长,但并发请求一多,KV cache的增长是线性的,尤其是长上下文下直接吞掉几个G。建议你直接拿生产环境的最大输入长度和batch size去算KV cache,公式网上有但最好还是实测,比如用vLLM的--gpu-memory-utilization参数预留空间。框架的话我推荐vLLM,TGI的continuous batching在低延迟场景下不如vLLM稳,而且vLLM对Qwen系列支持很成熟,开个prefix caching对摘要任务帮助巨大。另外你如果显存实在紧张,可以先试AWQ量化再看GPTQ,前者在7B上损失更小,同时记得把CPU offload关掉,那玩意反而拖慢速度。最后提醒一句,多卡部署别急着上张量并行,先试试单卡+量化+极限压缩KV cache能不能扛住,很多场景根本用不到两卡。
公式算出来只是权重本身,KV cache和activation才是大头,尤其长文本场景下KV cache能吃掉好几G,你这直接按5-6G估肯定不够。vLLM对显存管理更激进,TGI胜在稳,但延迟敏感的话我建议先试vLLM,paged attention对长上下文友好很多。另外你如果QPS不高,其实可以考虑FP8或者AWQ,配合vLLM的auto scaling,实际部署比INT4省心。之前我跑7B模型,8G卡上塞128长度batch 8都勉强,后来把max_len砍到512才稳。
显存大头其实在KV cache,batch size翻倍显存涨得比模型权重还快,建议先用小batch压测再调。
vLLM的PagedAttention对长上下文友好,延迟比TGI稳,但7B模型单卡A10够用就别折腾多卡了。
显存大头确实在KV cache和激活值,vLLM的PagedAttention能省不少,文本摘要建议直接上AWQ量化+TGI。
INT4的理论显存确实只能当个参考,你漏掉的KV Cache才是大头,特别是文本摘要这种长输入场景,7B模型光KV Cache就能吃掉2-3G,加上激活值和CUDA context,OOM太正常了。我上次跑Qwen2.5-7B,seq_len设2048,batch size开到8,INT4实际峰值直接飙到11G,后来把max length砍到1024才稳定住。建议你直接按“模型权重+KV Cache×1.5+2G冗余”来粗算,别信那些纯权重公式。框架的话,低延迟场景我推荐vLLM,虽然TGI的量化兼容性更好,但vLLM的continuous batching在并发不高时响应更稳,不过记得开--enable-prefix-caching,对摘要这种重复前缀的请求能省不少显存。多卡的话,尽量别用张量并行,7B模型单卡能塞下就单卡,跨卡通信延迟有时候比显存节省更致命。你要是只做单路低QPS,其实AWQ量化+单卡A10就够,没必要上多卡。最后提醒一句,先拿真实业务数据压测,别用公开benchmark的显存数字,差异能到30%以上。
显存这块确实容易踩坑,公式算的只是权重占用,KV cache和激活值在长上下文下能吃掉好几G。建议直接用小batch跑个压力测试,或者用transformers的profile工具看实际峰值。vLLM对延迟优化更友好,但TGI在长文本摘要上显存管理更稳,可以都试下。另外Qwen2.5-7B用AWQ量化比GPTQ省显存,但推理速度会慢一点,看你们QPS要求了。
-
显存大头真在KV cache上,7B模型INT4权重就4G多,但8K上下文加batch 4直接翻倍,vLLM的PagedAttention能省不少。
-
文本摘要延迟敏感就别TGI了,vLLM的continuous batching在低并发下更稳,显存按权重加峰值KV预算再加20%余量算。
显存公式只算权重不算KV cache,7B模型开2K上下文就得额外留2-3G,建议直接按INT4权重+上下文翻倍算。
显存这块我之前也算翻车过,后来发现模型权重只是一部分,KV cache和激活值才是大头。你按token数乘层数乘hidden size乘精度,再乘batch size,基本能估个大概,但建议直接跑个压力测试。vLLM和TGI我最后选了vLLM,主要是它的PagedAttention对长上下文友好,而且你QPS不高的话,单卡加量化完全够用,不用急着上多卡。
显存大头其实是KV cache,公式别只看权重,把max_len和并发算进去再乘个1.3安全系数。
显存这块我之前也踩过同样的坑,公式算的只是权重,KV cache才是隐藏大户,尤其是长文本摘要,序列一长直接翻倍。建议你按max_seq_len×batch_size×2×layer_num×hidden_size×每个字节数粗估,再留个20-30%余量。框架的话,延迟敏感vLLM更稳,TGI内存管理稍粗但兼容性好,我最后是vLLM加chunked prefill才压住OOM的。
显存大头其实在KV cache,公式算的权重只是冰山一角,建议直接按batch size和max length预留20%冗余。
vLLM对QPS低延迟更友好,TGI适合高吞吐,你这种场景别纠结,直接vLLM配PagedAttention就行。
显存大头其实在KV cache,公式得加上seq_lenbatch2层数头维度算,我上次8G卡跑4K上下文都差点爆。
vLLM对低延迟更友好,TGI胜在生态全,文本摘要这场景建议vLLM配PagedAttention,显存能省不少。
显存这块儿我当初也栽过跟头,你这情况太典型了。公式算的5-6G基本只覆盖了模型权重,没算KV cache和激活值,上下文一长,这些玩意儿涨得比权重还快。我建议你直接用vLLM,它有个--max-model-len参数能强制限制上下文长度,然后把gpu-memory-utilization调到0.9,剩下的交给框架自动分配KV cache,比自己手算靠谱得多。至于TGI,虽然也不错,但vLLM对Qwen系的支持和PagedAttention优化确实更成熟,延迟也更稳。
另外你文本摘要场景,QPS不高的话,batch size别贪大,1或者2就行,省下的显存全给上下文长度。多卡部署的话,别用张量并行,7B模型单卡就能跑,硬拆成多卡反而增加通信开销,延迟会上去。还有个小坑,INT4量化后某些算子会回退到FP16,实际占用比理论值高,建议直接用AWQ或GPTQ的预量化权重,别自己瞎转格式。最后给个土办法:先用vLLM的--max-model-len设个1024,跑通后再慢慢往上加,看nvidia-smi里的显存余量,加到不OOM就是你的实际边界。
显存计算这块确实坑多,公式算的只是权重占用量,KV cache和中间激活值才是隐形杀手。我之前跑7B INT4,8K上下文加32 batch,实测比纯权重多吃了快3G显存,建议你直接按权重的1.8倍去预留。框架的话,延迟敏感选vLLM,它的continuous batching对低QPS场景更友好,TGI在长文本上偶尔有显存碎片问题。另外多卡部署别用张量并行,7B模型用pipeline parallelism更省显存,通信开销也小。
显存大头其实在KV cache,7B模型INT4撑死4G,但上下文一拉长直接翻倍,建议用vLLM开paged attention。
我之前也被坑过,后来直接拿公式反推:显存=模型权重+KV cache+激活值,batch小点延迟自然低,TGI别碰。
你这公式算的是纯权重占用,但KV cache才是真正的隐形杀手,7B模型就算量化到INT4,上下文撑到4K再加batch 8,KV cache轻松吃掉2-3G。建议直接按权重+序列长度batch层数*2字节来粗估,保守点留30%冗余。vLLM对连续请求的吞吐优化更好,但TGI在低延迟场景反而稳定,文本摘要这种短输入输出的话我建议优先试TGI。多卡部署别图省事用张量并行,除非你网络带宽足够,否则通信开销能把延迟拖垮。
显存别只算权重,KV cache和激活值才是隐形杀手,vLLM的PagedAttention能省不少。
显存这块我踩过一样的坑,光看权重大小真不行,KV cache那部分才是大头,尤其你文本摘要输入输出都不短,8K上下文INT4也得奔着8G往上走。建议直接用vLLM,PagedAttention对KV cache管理得挺省,配好gpu-memory-utilization参数基本能榨干显存,TGI更吃配置一些。多卡的话优先张量并行,但两张卡以上通信开销就上来了,你QPS不高其实单卡加长上下文更稳。另外可以试试量化+投机采样,延迟能降不少,就是得额外吃点显存换小模型。
显存还得算上KV cache和激活值,vLLM的PagedAttention能省不少,建议直接上它。
别光看模型权重,上下文长度翻倍显存能涨好几个G,小batch跑起来试试最准。