最近在试着把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 条vLLM和TGI我都试过,单卡3090上vLLM的PagedAttention对显存碎片处理得更狠,同样batch size=2,vLLM能多扛几个并发,TGI的continuous batching在长上下文下反而容易提前爆。int4量化建议用AWQ或GPTQ,对话摘要这种任务质量损失基本感知不到,但长文本生成时偶尔会出现重复或逻辑跳跃,得自己调下repetition penalty。你OOM主要是kv cache没限制,vLLM里设max_num_seqs或gpu_memory_utilization到0.9能缓解不少,不过极限并发还是得实测,毕竟3090的24G对8B来说其实挺紧的。
说实话我之前在3090上折腾过类似的场景,vLLM和TGI我都跑过,体感vLLM的PagedAttention在长上下文的场景下优势更明显,特别是你这种对话+摘要的需求,kv cache碎片化少很多,同样的batch size和max length,vLLM的峰值显存大概能比TGI低个2-3G,但极限并发数其实差距没那么大,主要看你seq length怎么设,我试过把max length压到2048,batch size拉到8还是稳的,再高就悬了。至于int4量化,如果你用GPTQ或者AWQ的话,4bit下8B模型大概5G左右,但长文本生成质量确实会有微妙劣化,尤其是摘要任务里容易丢细节,我建议你如果对质量敏感,可以试试FP8或者混合精度,或者干脆用vLLM的自动量化策略,它有个选项能只量化attention层,效果会好很多。另外你OOM可能不只是框架问题,检查下是否开了显存碎片整理,或者把preemption模式换成swap,有时候能救回来不少。最后想问你,你的平均输入长度大概是多少?如果经常超过4K,那可能得考虑分块处理或者滑动窗口,不然就算换了框架也容易撞墙。
实测3090上vLLM开gptq量化能稳8并发,int4长文本摘要没崩过,但对话会偶尔啰嗦。
我之前也遇到过一模一样的情况,3090看着24G挺大,但FP16的8B加上动态batch真的说爆就爆。vLLM和TGI我都试过,说实话在同batch size下显存占用差距不大,但vLLM的PagedAttention在长序列和随机并发时更稳,TGI的continuous batching在纯文本生成上调度更激进,极限并发可能多一两个,但一旦触发碎片化重排,延迟会突然飙高。建议你先别急着上量化,把vLLM的gpu_memory_utilization调到0.9,再配合--max-num-seqs 8和--max-model-len 4096,基本能跑到batch size 4不炸。量化到int4的话,对话和摘要这种短文本任务几乎感知不到质量下降,但长文本生成到2k以上时,重复和逻辑断裂的概率确实会高一些,特别是人名和数字容易出错。如果你主要是API服务,我反而建议用AWQ或GPTQ的4bit权重配合vLLM,实测能塞下更大的kv cache,比硬扛FP16划算得多。另外注意一下,3090的显存带宽比4090低不少,int4的推理速度提升没想象中大,但省下来的显存确实能换来并发数翻倍。最后补一句,如果你愿意接受一点点延迟,把--max-num-batched-tokens调小一点,比如2048,也能挤出一部分显存来跑更大batch,这个参数很多人会忽略。
说实话你这情况我太熟了,3090跑8B其实挺尴尬的,fp16权重16G看着够,但一旦并发起来kv cache直接把你剩余显存吃干抹净。vLLM和TGI我都折腾过,体感上vLLM的PagedAttention对显存碎片化处理得更狠一点,尤其你这种batch size小但并发多的场景,能多扛一两路请求,但TGI的continuous batching在长上下文下更稳,不会突然爆掉。不过说实话,24G显存这俩框架极限也就8-10并发(输入输出各512 token左右),想再往上就得动量化了。int4的话我用AWQ试过,对话摘要这种短文本任务跟fp16几乎没差,但你要是让模型生成超过1k token的长文,末尾会有明显的重复和逻辑松散,毕竟4bit对注意力头精度影响还是存在的。建议你先试vLLM+fp16,把max-model-len调小到4k,gpu-memory-utilization设到0.9,大概率能撑住日常使用。要是真想上int4,别用GPTQ,用AWQ或bitsandbytes的nf4,质量损失小很多。对了,你检查过是不是没开continuous batching的预填充和decoding分离?那个开关能省不少显存。
实测过3090,vLLM开gptq量化能稳8并发,TGI同参数下会少2个左右。int4长文本确实有掉点,摘要还行对话会变笨。
我之前也是3090跑的Llama 3.1 8B,FP16开batch size=1都悬,后来换了vLLM,PagedAttention确实立竿见影,batch size能拉到4左右,TGI的continuous batching更像是在排队调度上省,显存峰值反而没压那么狠。量化int4我试过,对话摘要这种短文本场景基本感觉不到掉点,但长文本超过2k后会有轻微逻辑跳跃,建议你vLLM+AWQ量化组合,24G下跑8并发问题不大。另外记得把KV cache的预留上限调低点,vLLM默认策略有时候太保守了。
说实话3090跑8B FP16确实挺紧的,我之前用vLLM在24G上试过,batch size开到4勉强能稳,但序列一长照样OOM。PagedAttention省的是KV cache的碎片化内存,TGI的continuous batching主要是提高吞吐,两者原理不太一样,实际省显存效果vLLM会明显一点,毕竟它连权重都能分页。你要是主要做对话和摘要,我建议直接上AWQ或GPTQ的4bit量化,实测长文本生成质量下降很小,特别是摘要这种任务几乎感知不到区别,但显存直接砍半,可以留出更多空间给KV cache。不过注意量化后batch size别开太大,否则解码速度反而比FP16慢,因为反量化有开销。你可以先用vLLM+AWQ试跑一下你那两个场景,设个max_length上限比如2048,应该能稳很多。另外别忘了开--enable-prefix-caching,对话场景重复前缀多,这个能再省不少显存。
3090跑8B其实vLLM和TGI差距不大,PagedAttention主要赢在长序列上,你这种对话场景batch=2就爆大概率是显存碎片化,不是框架的锅。建议直接上AWQ或GPTQ的4bit量化,实测长文本生成质量损失很小,摘要任务基本无感,但显存能压到8G以内,并发翻倍没问题。另外注意把max-seq-len调低点,别让kv cache无限预留。
说实话这配置我太懂了,3090玩8B就是卡在显存和带宽的尴尬点上。vLLM和TGI我都跑过,体感上vLLM的PagedAttention在长序列下优势更明显,尤其你batch size=2就爆的话,换vLLM可能直接能撑到4-6的并发,TGI的continuous batching更吃调度策略,默认参数下省得没那么多。但你这情况我建议先别急着上框架,检查下KV cache有没有手动调过,默认配置经常给得过于保守。至于int4量化,如果是AWQ或GPTQ这类权重量化,对话摘要这种短文本任务几乎感知不到差异,但长文本生成超过2K token时,确实偶尔会出现逻辑跳跃或者重复,尤其是Llama 3.1的tokenizer对量化更敏感。另一个坑是3090的PCIe带宽,量化后虽然显存降了,但吞吐可能反而瓶颈在内存拷贝上,实测过4bit下并发高反而比FP16更慢。我现在的方案是vLLM+AWQ 4bit,max_seq_len限制在4096,并发开8稳得很,你试试把gpu_memory_utilization调到0.9,剩下给KV cache,别用默认的0.8。
vLLM和TGI我都试过,3090上跑8B FP16,vLLM的PagedAttention确实比TGI省10%左右显存,但极限并发也就4-5个,想再高就得量化。int4的话对话还行,摘要长文本会偶尔丢细节,特别是超过2k token时明显。建议先用vLLM+AWQ量化到4bit,显存能压到8G以内,然后调大kv cache试试。
说实话我最后用exllamav2了,虽然生态差点但同参数下显存比vLLM还低一点。不过你主要做API服务的话,vLLM的兼容性更省心。长文本质量这块,量化到int4损失能接受,但别用GPTQ,AWQ的感知量化好一些。
对了,你batch size=2就OOM有点怪,检查下是不是max_seq_len设太长,把KV cache预分配撑爆了。3090跑8B FP16理论上4并发没问题,除非你上下文窗口拉满到8k。
vLLM的PagedAttention在24G上能跑到8并发,TGI大概6个,但int4长文本确实会掉点,摘要任务建议先用AWQ试试。
vLLM省显存更明显,尤其PagedAttention对长文本友好,int4做摘要够用但对话偶尔会飘。
vLLM的PagedAttention在24G上能扛住batch size=4,TGI差点意思,但int4量化长文本确实会掉细节,摘要还行对话慎用。
同配置实测vLLM比TGI多扛两个并发,int4跑摘要会偶尔丢细节,对话影响不大。
我之前3090跑7B也遇到过这问题,vLLM的PagedAttention在并发上确实比TGI省一些,但极限并发也就那样,batch size调成1反而更稳。int4量化长文本确实会有细节丢失,摘要任务影响不大,对话偶尔会飘,建议先用AWQ试试。另外你试试把max sequence length调低,很多OOM其实是预分配太长导致的。
我自己实测过同样的卡,TGI的continuous batching在长上下文下显存波动更小,但vLLM吞吐量更高,看你是要稳定还是要速度。量化到int4如果只做中文对话,其实体感差距不大,不过摘要里数字和专有名词容易出错。你可以先开个GPTQ的4bit跑几天,不行再换回FP8,反正切换成本不高。
我之前用vLLM跑8B,FP16下并发设成4就爆了,但换成TGI能撑到6,主要是它的显存回收更积极。int4的话建议用GPTQ别用AWQ,长文本下AWQ的attention会稍微漂。你如果主要做摘要,量化后输出质量下降不明显,但对话确实会偶尔答非所问,最好保留一个FP16备用。
说实话我3090上两个都试过,vLLM的PagedAttention在长上下文场景下确实更稳,batch size拉到4还能撑住,TGI到3就开始抖了。不过int4量化我建议你慎重,对话摘要这种任务短文本还行,一旦输入超过2K,量化误差会明显放大,输出会有点飘。你如果不追求极致并发,其实可以先上vLLM+FP16,把max sequence length限制在4K试试,很多OOM是预分配太多导致的。另外记得把gpu_memory_utilization调到0.9,默认值太保守了。
我之前3090跑7B也遇到过这问题,vLLM和TGI我都试过,体感vLLM的PagedAttention在长上下文下省得更多,batch size能到4左右,TGI开continuous batching大概也就3。量化int4的话对话摘要影响不大,但长文本生成偶尔会有重复或逻辑跳脱,建议先跑几个长case看看。另外你试试把max_model_len调低点,比如4096,能明显缓解OOM,毕竟摘要场景用不到太长输入。
vLLM在24G上能撑到batch 4,TGI会稍微紧点,int4长文本确实会掉点细节但摘要够用。
实测过24G下vLLM比TGI多扛一倍并发,int4长文本掉点不明显,摘要够用。