最近在试着把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 条说实话这俩框架在24G卡上我都试过,vLLM的PagedAttention对碎片显存管理确实更狠,我跑8B FP16 batch size能撑到4-6,TGI大概3-4,但vLLM首token延迟会稍高一点。int4量化对对话影响不大,摘要偶尔会出现句式重复或关键词遗漏,你如果追求长文本稳定输出,建议先试AWQ别用GPTQ。另外3090的带宽跑8B其实有点吃力,你可以把max-seq-len压到2048看看,显存能省出一大截。
vLLM的PagedAttention在24G下能扛到batch8,TGI到6就抖了,建议直接上vLLM。
量化到int4跑摘要掉点不明显,但对话长文本偶尔会啰嗦,实测还得看你的温度设置。
3090跑8B其实vLLM和TGI差别不大,关键看你的并发模型和max_seq_len设置。我实测过vLLM开gpt-omni量化到int4,24G能稳到batch size=8,但TGI在长上下文下显存碎片化更明显,容易提前OOM。int4对对话摘要影响很小,主要是长文本生成时偶尔会有重复或逻辑跳跃,建议用AWQ别用GPTQ,校准集选对话数据。你试试把kv cache换成fp8,能再省2-3G,batch size提到4应该没问题。
vLLM和TGI我都试过3090,vLLM的paged attention在长上下文的场景下确实比TGI更能扛,我batch size开到4也没爆,TGI到3就有点悬了。不过你这8B模型fp16占16G是纯weights,kv cache得看max seq len,如果设8k的话并发2确实紧张。int4的话对话影响不大,但摘要任务里偶尔会丢细节,建议awq或者gptq别用gptq的旧版本,新校准参数会好很多。你如果主要跑短对话,其实可以试试把max_seq_len调低到4k,显存能省一大截。
说实话3090跑8B fp16确实紧巴巴的,我之前用vLLM在24G上把max batch size调到4还能稳住,TGI更吃显存一点,尤其长上下文时差距更明显。int4量化对摘要影响不大,但对话里偶尔会冒出逻辑跳跃的句子,特别是超长上下文时,建议你用AWQ而不是GPTQ。你如果主要跑短对话,干脆把max sequence length限制到2048,能省不少缓存。
3090跑8B其实不用太纠结框架,vLLM和TGI在纯推理上显存差距不大,真正吃显存的是长上下文的kv cache,建议优先开一下TGI的显存优化选项试试。我之前在24G卡上测过,batch size拉满4就顶天了,主要卡在prefill阶段,两个框架半斤八两。int4量化对摘要这种短文本影响很小,但对话轮次多了之后,长上下文召回确实会有点飘,尤其涉及具体数字或人名的时候,建议保留FP8或者AWQ。你如果主要做API服务,不如直接限制最大输入长度到4k,比换框架省心多了。
说实话这俩框架在24G卡上我都跑过,vLLM的PagedAttention对显存碎片化处理确实更激进,同样batch size=2的OOM问题,换vLLM大概能撑到4-6并发,TGI的continuous batching更像传统调度,省显存效果大约在20%-30%左右,但胜在稳定。不过你3090是24G,FP16权重16G后只剩下8G给KV cache,这本身就是瓶颈,我建议你先试试vLLM的--max-num-seqs参数调小,再配合--gpu-memory-utilization 0.9,把显存榨干,实测极限并发可能比你想象的高。
量化到int4的话,对话任务体感上损失很小,但摘要这种需要长上下文的场景,attention部分精度下降会导致重复或漏信息,尤其超过4K token后更明显。我自己的做法是保留FP16的权重,但把KV cache用FP8存,vLLM有--kv-cache-dtype fp8选项,能再省一半缓存显存,质量影响微乎其微。你要是只做API服务不在乎首token延迟,干脆把max-model-len限制在8K以内,别给长文本留余量,这样并发还能再提一截。另外记得开--enable-chunked-prefill,对长输入的处理显存占用能降很多,这个参数比你想的要关键。
实测过3090上跑8B,vLLM的显存管理确实比TGI狠一点,同样batch size=4,vLLM大概能吃到18-19G,TGI到17G左右就开始抖了。但实际瓶颈往往在prefill阶段,长文本下两个框架都会突然飙显存,建议把max-model-len设成4096或2048,对话摘要足够用了。int4量化对短文本影响不大,但长文本生成时重复率和连贯性会明显变差,特别是摘要任务,建议至少用int8或者awq。另外可以试试把kv cache的dtype调成fp8,能再省1-2G,代价是极低概率的精度损失。
我之前在4090上跑过Llama 3.1 8B,vLLM和TGI都试了下,说实话单卡24G想FP16跑并发确实挺紧的,你batch size=2就OOM不奇怪。vLLM的PagedAttention对kv cache碎片控制确实好一些,实测同显存下能撑的并发大概比TGI多一截,但也没到翻倍那么夸张,gpu_memory_utilization调到0.9左右能挤出更多空间。TGI的continuous batching调度更保守一点,显存占用稳但极限吞吐差点意思。真要在24G上舒服跑,int4量化基本是必选项,AWQ或GPTQ都行,对话和摘要这种任务掉点很有限,长文本的话建议自己拿几百条样本对比下,一般感知不明显。不过量化后并发上去了,延迟和首token时间还是得看你的SLA,别光盯着显存。
3090跑8B FP16确实挺紧的,我实测vLLM在24G上batch开到4左右就开始抖了,TGI稍好一点但差距没想象中大,关键还是kv cache占大头。建议直接上AWQ int4,显存能压到6G出头,并发拉到8-10问题不大,对话和摘要这种任务质量损失基本感知不到。长文本的话超过4k token后int4偶尔会有点复读,但调下temperature还能接受。
我之前在4090上也折腾过Llama 3.1 8B的部署,FP16确实单卡24G扛不住稍微大点的并发。vLLM的PagedAttention对kv cache的显存碎片控制确实好一些,我测下来batch size能比TGI多撑个一两档,但TGI的continuous batching调度更稳,长请求混短请求的时候不太容易把显存吃满。你要是纯做对话和摘要,输入输出都不算特别长的话,vLLM可能更适合你,毕竟吞吐量摆在那。int4量化我试过GPTQ和AWQ,长文本摘要确实会掉点质量,尤其是需要精确引用原文细节的时候,模型容易自己编。如果摘要要求不高、对话为主,int4基本够用,但建议留个FP16的降级方案。另外3090不支持bf16原生加速,可以考虑用fp8 kv cache,能再省一截显存。