最近在试着把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还得看你的max sequence length,kv cache是跟这个挂钩的。我实测vLLM在24G下,max_len设4096、batch size到4没问题,但TGI的显存控制略好一点,能到5-6,不过吞吐量vLLM更高。int4量化建议用AWQ,对话摘要影响不大,长文本确实会偶尔出现重复或逻辑跳跃,但你要是不追求极致效果完全能接受。另外可以试试把max_model_len调低到2048,很多场景根本用不到那么长,显存能省出2-3G。
我之前3090跑7B也遇到过这问题,后来换了vLLM,同样batch=2稳住了,还能开多点并发,PagedAttention对碎片内存的利用率确实比TGI好不少。但int4量化在长文本上我试过,摘要还行,对话超过2k token会偶尔出现逻辑断层,你要不先试试8bit或AWQ,效果折中些。另外建议把kv cache的max num seq调小点,省出来的显存能多塞一个batch。
说实话俩框架在24G下差距没那么玄乎,vLLM的PagedAttention对碎片显存利用更狠一点,但3090跑8B的话我建议直接上AWQ或GPTQ量化到4bit,模型体积直接砍到5-6G,剩下全给kv cache,batch size拉到8没啥压力。不过int4做长文本生成确实会有轻微掉点,尤其是摘要任务里偶尔会出现重复或逻辑跳跃,你如果对质量要求高可以试试FP8动态量化,显存和效果平衡得更好。另外记得把max-model-len设成4096而不是默认的8192,不然预分配显存照样爆。
实测过3090上跑8B,vLLM的PagedAttention确实比TGI省显存,同样batch size=2下kv cache能少占用2-3G,极限并发大概能到8左右,TGI大概6。int4量化对短对话影响不大,但长文本摘要时偶尔会丢失细节,建议保留FP16用awq或者gptq针对性优化。另外可以试试把max_seq_len限制在4096,能挤出不少空间。
我之前在3080上折腾过类似问题,vLLM开了--gpu-memory-utilization 0.95之后峰值能压到22G,但并发超过6就开始变慢。TGI的continuous batching调度更激进,显存抖动小,但吞吐上不去。你要是主要做摘要,量化到int4真得慎重,我试过生成超过1k字时会出现重复片段,不如把kv cache换成动态缩放或者直接砍掉一半上下文。
说实话两个方案我都试过,3090上跑8B的话,vLLM的PagedAttention在显存碎片利用上确实比TGI稍微强一点,但差距没想象中大,极限并发大概也就差个2-3个请求的样子。你光看模型FP16是16GB,但实际跑起来kv cache才是大头,特别是长文本场景,vLLM那个page调度在batch size=2的时候优势不明显,等到batch上到8以上才拉开差距。我建议你先别急着上量化,把max_seq_len限制到4096试试,vLLM的gpu_memory_utilization调到0.9,swap空间留一点给CPU,这样应该能稳跑batch=4。int4量化的话,对话和摘要这种短文本任务其实影响不大,但一旦要生成超过1k tokens的长摘要,你可能会注意到连贯性下降,偶尔有重复片段,所以如果质量要求高,我宁可用FP8或者AWQ的4bit,别用GPTQ。还有个坑是TGI的continuous batching对显存碎片处理更激进,但会导致单请求延迟偶尔抖动,你要是做API服务得考虑这个。最后提一句,如果你愿意折腾,可以试试把模型拆成两层放CPU,用accelerate的offload,虽然慢点但至少不OOM。
vLLM的PagedAttention在24G上能扛住batch 4,TGI差点,但int4长文本确实会掉细节,摘要还行对话慎用。
vLLM更省,我3090实测batch能到4,int4长文本摘要还行,对话偶尔飘,建议先试AWQ。
说实话3090跑8B fp16确实紧巴,我实测vLLM的paged attention在24G下能撑到batch size 4左右,TGI的continuous batching大概也就3-4,差距不大,但vLLM的显存碎片控制略好一点。int4量化对摘要影响很小,对话长文本偶尔会有点逻辑跳脱,要是你不在乎那点精度损失,建议直接上AWQ或GPTQ,能省出一半显存给kv cache。另外你把max sequence length限制在2048试试,别默认拉到8k,OOM概率会低很多。
vLLM在24G上能撑到8并发,TGI大概6个,int4长摘要会掉点细节但对话基本没差。
说实话这题我踩过一模一样的坑,3090跑8B FP16就是卡在显存墙上的。vLLM的PagedAttention确实比TGI的continuous batching更省,我实测下来同样batch size=4,vLLM显存峰值能低2-3G,但TGI在长上下文下的吞吐更稳,尤其是对话场景连续请求多的时候。量化到int4的话,8B模型跑摘要任务基本没感知,但对话生成超过1k token时偶尔会出现重复句式,建议用AWQ而不是GPTQ,质量损失更小。另外你可以试试把kv cache类型改成fp8,配合vLLM的--kv-cache-dtype fp8,能再挤出一块显存,虽然官方说还在实验阶段,但我跑了两周没崩过。极限并发的话,单卡24G用int4加8k上下文,vLLM大概能撑到batch size=8,TGI大概6-7,但前提是你得把max-num-seqs和max-num-batched-tokens调好。最后提醒下,如果主要做API服务,别光看显存,vLLM的continuous batching在请求排队上的延迟抖动比TGI明显,建议压测时关注P99。
之前3090跑7B的时候也被OOM折磨过,后来换了vLLM确实好不少,PagedAttention对kv cache的利用率比想象中高,batch size调到4基本稳。不过TGI的continuous batching在小并发下差距不明显,建议你两个都跑个benchmark看看。int4量化的话,对话场景影响不大,摘要长文本偶尔会有细节丢失,如果对质量敏感可以试试AWQ。我目前是vLLM加int8,24G跑8B加2000token上下文能到8并发,你可以参考下。
我之前3090上跑7B也踩过这坑,vLLM和TGI实际用下来差距不大,主要是PagedAttention对长上下文和并发更友好,TGI的continuous batching在高吞吐下调度更稳,但单卡24G想跑batch size=2,建议直接上AWQ或GPTQ的int4,显存能压到7-8G,kv cache余量就出来了。不过量化后长文本确实有轻微掉点,摘要任务尤其明显,对话反而还好,可以先试试4bit配合vLLM的--kv-cache-dtype fp8,能再挤点空间。你平时请求的prompt平均多长?如果经常超2K token,可能还得考虑换更长上下文的量化版。
vLLM省显存明显一些,PagedAttention对碎片管理更好,3090上int4能到8并发左右,摘要影响不大。
实测TGI也不差,但vLLM的KV cache复用更灵活,int4长文本会稍掉点分,对话场景基本无感。
实测过3090跑8B,vLLM开PagedAttention+continuous batching,24G下batch size能到8左右不OOM,TGI大概6-7,差距没想象大但vLLM确实稳些。int4量化长文本确实会掉点,尤其摘要任务里指代和细节容易糊,建议先试AWQ或GPTQ的4bit,你对话多的话可能得留点KV cache余量。另外记得把max-model-len调小点,默认8k太吃显存,按你实际需求设4k能明显缓解。
说实话两个都用过,24G卡上跑8B的话,vLLM的显存控制确实比TGI更狠一点,PagedAttention对KV cache的碎片化管理在长上下文场景下优势挺明显的,我实测batch size能拉到4-6不爆,TGI大概在3-4左右就有点悬了。不过有个细节,vLLM首token延迟会略高,如果你对响应速度敏感,得自己权衡下。关于int4量化,对话场景下损失真不大,但摘要任务里偶尔会出现重复词或逻辑跳跃,特别是超过4K上下文时,这点我踩过坑。你要是主要做中文摘要,建议试试AWQ或GPTQ的4bit,比RTN好不少,实在不行就int8加vLLM的fp8 KV cache,显存省一半质量几乎无损。另外3090的显存带宽其实够用,瓶颈反而在计算利用率,vLLM的continuous batching把这点优化得比较好,TGI在动态batch切换时会有明显卡顿。最后提醒一句,别只看显存占用,把--max-model-len调小到4096或2048,比啥都管用,很多人爆显存都是因为默认把上下文长度拉满到8K了。
这俩我都试过,3090上跑8B的话vLLM的PagedAttention实际省显存效果更明显,同样batch size=4能跑起来,TGI到3就快爆了。不过你如果只做对话摘要,int4量化几乎感知不到质量下降,长文本里偶尔会有点重复但问题不大。建议直接上vLLM+AWQ量化,24G跑并发8应该稳,就是首次加载会慢点。
3090跑8B fp16确实紧,我试过vLLM开paged attention后batch size能拉到4左右,TGI的continuous batching在长文本下显存波动更小,但极限并发两者差距不大。int4量化对摘要影响很小,对话场景偶尔会丢点细节,长文本生成时重复概率会高一些,建议用AWQ别用GPTQ。你如果主要做API服务,不如直接上vLLM,显存碎片处理得更干净,而且对动态请求的适配比TGI舒服。
vLLM配AWQ量化能压到8G左右,不过int4长文本确实会有点糊,摘要凑合对话差点意思。
我3090实测vLLM batch能到8,TGI到6就抖了,但int4摘要真不如fp8稳,你试试GPTQ。
我之前也是3090跑8B,vLLM和TGI都试过,体感vLLM在并发高的时候更稳,PagedAttention对KV cache的碎片管理确实比TGI的continuous batching更激进,极限并发大概能多个2-3个请求,不过得把max-seq-len调低点。int4量化的话,对话摘要这种短文本问题不大,但长文本生成确实会有重复或逻辑断裂的情况,特别是超过2K token之后,建议你如果主要做摘要,可以试试AWQ,比GPTQ在长文本上保留得稍微好一点。顺便问下你batch size=2就OOM,是不是没开prefix caching?那个对省显存帮助挺大的。
我用vLLM配AWQ int4,24G能扛住8并发,长文本摘要没觉得掉链子。
说实话3090跑8B fp16确实太极限了,我拿vLLM试过,PagedAttention对kv cache的碎片化改善挺明显,batch size=4勉强能跑,但再往上就悬。TGI的continuous batching在显存占用上感觉跟vLLM半斤八两,区别不大,主要看你更习惯哪个生态。
int4量化我建议你直接上AWQ或GPTQ,对话和摘要这种短文本场景基本感知不到质量下降,但长文本超过2k确实会有轻微逻辑松散,不过比OOM强多了。你现在最该做的其实是把max-model-len调小,比如限制到4096,能省出一大块缓存空间,否则光靠框架优化还是不够。