最近在试着把Llama 3.1 8B部署到自己的单卡3090上做API服务。按照常规FP16加载,光是模型就占了16GB,再加上kv cache,跑个并发生成batch size=2就直接OOM了。查了资料说vLLM的PagedAttention和TGI的continuous batching能省显存,但不知道实际效果差多少。有没有大佬实测过这两种框架在单卡24G显存下的极限并发数?另外,量化到int4的话,会不会影响长文本生成质量?我主要做对话和摘要,求指点。
部署Llama 3.1 8B时显存爆了,用vLLM还是用TGI更省显存?
全部回复
共 131 条说实话3090跑8B FP16确实有点捉襟见肘,但你这问题其实不在框架,而在没开量化。vLLM和TGI的显存优化原理不太一样,vLLM的PagedAttention是把KV cache分块管理,碎片少很多,TGI的continuous batching更依赖调度策略,实测下来同batch下vLLM大概能多塞30%-40%的并发,尤其是长序列场景差距更明显。但你想要极限并发,建议直接上AWQ或GPTQ的4bit量化,模型体重降到5GB左右,24G卡跑8B甚至能开batch size=8,显存余量很充裕。至于int4对长文本的影响,说实话对话和摘要这种任务,4bit的困惑度损失几乎感知不到,除非你要做非常严谨的领域抽取,不然别太纠结。我自己的做法是vLLM+AWQ,再加个--max-model-len调低到4096或8192,这样既保住了长文本能力,又能把显存留给kv cache,实测并发能到12左右还不OOM。你如果主要跑摘要,建议把输入长度限制在2048内,效果和速度会平衡很多。
实测过,3090上vLLM开gptq int4能稳8并发,TGI同配置会掉到6。长文本摘要建议别碰int4,质量缩水明显。
实测过,同batch下vLLM显存峰值能压到15G左右,TGI稍高些,但int4长文本确实会掉细节。
量化到int4摘要还行,对话多了逻辑容易飘,建议先开vLLM+fp8试水。
实测过3090,vLLM开gpt-ql量化的4bit能顶住batch=8,TGI同配置还差点意思,但长文本确实会掉点细节。
int4对话摘要够用,别惦记FP16了,直接上AWQ量化,还能塞更多并发。
24G跑8B fp16本来就很极限,vLLM的pagedattention对短对话场景提升明显,但长文本下kv cache照样吃满,建议直接上int4量化,实测4bit下长文本生成质量损失很小,摘要任务几乎无感。另外tgi的continuous batching在并发调度上更激进,但3090的显存带宽是瓶颈,这两个框架实际差距不会超过10%,不如把batch size压到1,开流式输出更稳。
俩框架我都跑过,3090上vLLM的PagedAttention确实更稳,同样batch size=4的对话场景,TGI到后面容易触发碎片化OOM,vLLM能多扛几个请求。int4量化建议用AWQ,长文本摘要我测过8K上下文,关键信息丢失不明显,但生成速度会比FP16慢一点,你如果主要做API服务,其实可以试试把max_seq_len调到4096,省下的显存能换不少并发。
实测过,24G卡上vLLM开gpt-9量化加paged attention,batch能到8不炸,TGI同参数下大概5-6。int4对话摘要基本无损,长文本会稍糊但可用。
说实话俩框架我都折腾过,3090上跑8B FP16想舒服并发确实有点勉强,vLLM的PagedAttention在显存碎片化上比TGI强不少,我实测batch size能拉到4左右不OOM,TGI开continuous batching大概3就顶天了,但TGI对长文本的prefill优化更稳。量化到int4的话,对话摘要这种任务基本感知不到质量下降,但如果你做长文档抽取式摘要,位置编码那块会有轻微漂移,建议用AWQ别用GPTQ。另外还有个野路子——用vLLM的--kv-cache-dtype fp8,能再省2GB,代价是首token延迟高个20ms,但并发上限能到6。最后提醒下,3090的显存带宽是瓶颈,别只盯显存容量,实际吞吐可能比你想的低,试试把max-model-len从8192砍到4096,并发能翻倍。
说实话3090跑8B FP16确实紧巴巴,vLLM和TGI我都试过,体感vLLM的PagedAttention在长上下文和并发上更稳一些,24G下batch size拉到4问题不大。量化int4对摘要影响很小,但对话场景偶尔会冒出逻辑不连贯的句子,你要是对质量敏感建议先试AWQ。另外可以开--enable-prefix-caching,省显存效果比想象中明显。
我3090上两个都试过,体感vLLM的PagedAttention对显存碎片处理更狠,batch size能撑到4,TGI到3就有点抖了。不过int4量化建议慎用,对话短还行,摘要一长就明显感觉逻辑连贯性变差。你要是主要跑长文本,不如把max length限制到2048,再配vLLM的自动前缀缓存,比盲目量化稳多了。
我3090上两个都跑过,体感vLLM在长上下文下的显存控制更稳,TGI的continuous batching在短对话场景下吞吐稍好,但24G跑8B就别想batch size=2以上了,int4量化能救,实测对话摘要影响不大,长文本生成确实会有点飘。
实测过3090,vLLM峰值占用比TGI低2-3G,但int4下长文本确实会掉点。
3090上跑8B说实话vLLM和TGI差别没那么玄乎,PagedAttention主要解决的是碎片化问题,但24G硬上FP16还是紧。我建议你直接上GPTQ int4,显存能压到6G左右,长文本质量下降真没想象中明显,对话摘要场景感知不强。极限并发这事得看你的平均序列长度,短query的话两者都能到20+,长文档就都歇菜。你不如先试试vLLM+int4,调下max-num-seqs和gpu-memory-utilization,比纠结框架更实际。
我之前3090跑13B也是爆得死去活来,最后换vLLM才稳住,PagedAttention对显存碎片的管理确实比TGI的continuous batching更激进,同batch size下能多塞2-3个并发请求。不过int4我试过,对话摘要这种短文本还行,一旦长上下文超过2k就开始有重复和逻辑断裂,你要是对质量敏感还是先上AWQ或GPTQ的4bit,别直接裸奔。另外你记得把vLLM的gpu_memory_utilization调到0.9,再开个--enforce-eager,能再省一笔显存。
vLLM的PagedAttention在3090上实测能多扛2-3个并发,int4对摘要影响不大但对话长文本会偶尔飘。
实测过vLLM,24G下batch size能到4,TGI到3就卡了,int4对话长文本确实有损失。
我之前3090跑7B也踩过这坑,vLLM和TGI都试过,体感vLLM的PagedAttention对显存碎片化控制更狠,同样batch size=4能稳住,TGI到3就有点抖了。不过int4量化是真别乱上,对话短还行,摘要一长就明显掉逻辑连贯性,尤其Llama 3.1这种对细节敏感的模型。你要是主要跑摘要,建议先试试vLLM加FP8或者AWQ,显存能省一半,质量损失比int4小很多。对了,你kv cache设的多少?有时候调低点也能救急。
vLLM的PagedAttention在24G上跑8B int4稳很多,我batch size拉到8没爆,不过长文本确实会有点掉细节。
量化到int4做摘要还行,对话多了偶尔逻辑会飘,建议先试awq。
说实话这俩我都试过,3090上跑8B FP16的话vLLM的PagedAttention确实更稳,TGI的continuous batching在长序列下显存碎片化更明显,极限并发也就差个20%左右。不过你真想省显存不如直接上AWQ量化,4bit下模型才5G,kv cache能留出巨多空间,batch size拉到8都没问题。至于长文本质量,量化对对话影响很小,但摘要任务里偶尔会有细节丢失,建议你拿具体数据集跑一遍对比再决定。
3090跑8B其实量化到int4最稳,vLLM吃显存比TGI狠点但吞吐高,摘要场景够用。
实测3090上vLLM开gptq int4能到8并发,但长摘要偶尔会丢细节,建议先试awq。
TGI更稳但吞吐低两成,量化后对话影响不大,摘要还是fp8吧。