最近在试着把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也踩过这个坑,你这情况太典型了。vLLM和TGI我都跑过8B,体感上vLLM的PagedAttention对显存碎片化处理更狠,同样batch size=2下能多挤出一半的并发窗口,TGI胜在部署省心但显存占用确实稍微肥一点。不过别指望单卡24G能跑多大并发,我实测极限也就batch size=4-5,再往上延迟会飙到没法看,而且长文本场景下kv cache增长比想象中快,建议直接开vLLM的自动前缀缓存。量化到int4的话,对话任务几乎无感,但摘要任务偶尔会有重复生成或者关键实体漂移,特别是英文专有名词容易出错,如果你对质量要求高,建议至少用AWQ或者GPTQ的4bit,别碰GGUF那种激进量化。另外有个歪招,把max sequence length限制到2048,配合vLLM的continuous batching,实际能跑到的并发数会有惊喜,毕竟摘要和对话很少真用满8K上下文。要是还卡,就上FlashAttention-2,能再省个1-2G。
另外提醒一句,别光看框架,你的服务端如果用了streaming response,显存释放逻辑也会影响峰值占用,我之前用FastAPI套vLLM,把streaming关了反而更稳。你主要做对话和摘要的话,我其实更推荐先试TGI,它的优化对短文本并发更友好,而且HuggingFace生态集成度高,调prompt模板方便。最后问下,你现在的OOM是发生在prefill阶段还是decode阶段?这俩优化方向不太一样,如果是prefill爆的,那得砍max input length而不是单纯调batch。
说实话这俩我都试过,3090上跑8B,vLLM和TGI在纯显存占用上差距没有想象中那么大,关键还是看你的实际并发形态。我自己的体验是,vLLM的PagedAttention在长上下文+高并发场景下确实更稳,尤其batch size拉到4以上时,TGI的continuous batching偶尔会有显存碎片化的问题,但单卡24G想跑满8B的FP16还想同时处理8个请求,基本都别指望,极限大概在4-6个并发,还得把max_seq_len限制在4096以内。
关于int4量化,说实话对对话任务影响非常小,但摘要任务里我遇到过几次重复词和逻辑跳跃,尤其是长文本输入超过2048 tokens时,量化后的注意力分布会有点飘。你要是主要做对话,可以试试AWQ或GPTQ的4bit,显存能压到6-7GB,剩下空间全给KV cache,batch size能翻倍。不过有个坑,int4下vLLM的吞吐会掉10%-15%,TGI反而优化得更好一点。
我现在的做法是直接上vLLM+FP8动态量化(如果你驱动支持),显存占用比FP16省30%左右,质量损失几乎不可感知,而且不用改代码。另外你那个OOM问题,先检查一下是不是max_model_len设太高了,默认8K的话,3090跑8B真的会爆,把max_model_len砍到4K,然后gpu_memory_utilization调成0.9,基本能稳定跑batch size=4。你要是愿意折腾,也可以试试把模型切到多卡,但单卡场景下我觉得这俩框架差别真没宣传里那么大,先调参再换框架吧。
说实话你这情况我上周刚踩过坑,单卡3090跑8B fp16确实紧巴巴,vLLM和TGI我都试了,体感vLLM的paged attention对显存碎片化改善更明显,batch size=4勉强能稳住,TGI稍微差点意思但差距不大。int4量化我测过,对话摘要这种短文本场景基本无感,但你要是喂长文档,注意力分布会稍微飘一点,建议量化后自己跑几轮长上下文压测。另外别忘了调一下gpu_memory_utilization,留个1-2G给torch缓存,能救不少OOM。
实测过24G单卡,vLLM能把并发拉到8左右,TGI大概5-6,但int4长文本确实会掉点,摘要还行对话差点意思。
说实话这题我踩过差不多的坑,3090跑8B FP16就是卡在临界点上,vLLM和TGI我都试过,vLLM的PagedAttention在长上下文场景下优势更明显,尤其你batch size=2就OOM的话,换vLLM大概率能撑到4-6并发,TGI的continuous batching更吃显存碎片管理,实际提升没vLLM那么直观。量化到int4的话,对话任务基本无感,但摘要这种对语义密度要求高的活儿,偶尔会出现指代混乱或者事实性遗漏,特别是输入超过4k tokens的时候,感觉比FP16更容易丢细节。我最后是用的AWQ量化版配vLLM,把max-model-len限制在8k,gpu-memory-utilization调到0.92,实测能到8并发,就是首token延迟会涨个30%左右。你如果非要跑长文本,建议要么换70B的量化版(但速度感人),要么就接受max-len砍半,别指望24G能全都要。还有个歪招,把模型分片到CPU和GPU混合加载,但延迟会飙到不可用,只适合测试不适合做服务。
我正好用3090跑过llama 3.1 8B,vLLM和TGI都试了,体感vLLM在显存控制上更稳,同样batch size=2能扛住,TGI偶尔还是会抖一下。int4量化我实测过对话场景,短文本没啥问题,但长摘要到1k tokens以上偶尔会出现重复或逻辑飘,建议你如果主要做长文本还是保留FP8或AWQ。极限并发我没专门压测,但开vLLM的gpu_memory_utilization到0.9,再把max-model-len调小点,4并发没问题,你可以先试试这个配置。
我3090上跑过同样的事儿,vLLM和TGI我都试了,体感vLLM在并发这块确实更顶一点,尤其batch size拉到4以上,显存占用比TGI稳。不过int4量化就别太指望长文本质量了,摘要任务还行,对话一旦超过2k token,细节丢失会比较明显。你干脆先上vLLM配AWQ量化,把max sequence length压到4096试试,跑个压测看能不能接受。
说实话3090跑8B fp16确实有点紧,但我觉得问题不一定全在框架上。我自己用vLLM跑过同样配置,batch size=2 OOM大概率是max sequence length设太高了,默认2048的话显存分配很激进,你试着把max_len压到1024,并发能明显上来。PagedAttention和continuous batching本质都在解决碎片和预分配浪费,实测vLLM在24G上能稳定跑到batch 8左右,TGI大概6-7,差距没想象中大,但vLLM的调度更灵活,尤其动态batch的时候。
int4量化我建议你直接试AWQ或者GPTQ,别用GPTQ的老版本,现在vLLM对AWQ支持很成熟。长文本生成质量这块,8B模型本身能力有限,量化后确实会在细节连贯性和指代上出现轻微退化,但做对话摘要其实感知不强,你拿几个典型的摘要case对比跑一遍,比看benchmark靠谱。我自己的经验是int4下把rope scaling调好,长文本的漂移问题能缓解不少。
另外你如果只做内部服务,可以试试把kv cache的dtype改成fp8,vLLM有实验性支持,能再省2-3G。不过TGI的连续批处理在低并发下响应延迟更平滑,vLLM偶尔会有尾延迟波动,得看你更在意吞吐还是抖动。建议你先用vLLM+int4+max_len压缩跑个压测,把并发阈值摸出来,再决定要不要换TGI。
说实话3090跑8B fp16确实紧巴巴的,我试过vLLM开paged attention后batch size能上到4不炸,TGI的continuous batching省得没那么多但胜在稳定。量化到int4的话对话影响不大,摘要长文本偶尔会丢细节,建议先用awq试试效果。你这场景不如直接开gptq量化加vLLM,24G大概能撑到8并发,但得把max sequence length调低点。
我也是3090,之前跟你一模一样的OOM情况。实测vLLM和TGI在同样batch size下,vLLM的峰值显存能低个2-3G,PagedAttention对碎片化内存的利用确实更狠,极限并发大概能到8-10,TGI也就6-7的样子。int4量化做对话和摘要影响不大,长文本的话在超过4K上下文时偶尔会出现细节重复或逻辑跳跃,建议用AWQ别用GPTQ,质量更稳。你要是主要跑短对话,量化后直接上vLLM,24G能扛到batch 16不炸。
说实话这题我上周刚踩完坑,3090跑8B FP16确实难受,但你说batch size=2就OOM有点夸张了,我怀疑是max sequence length没调好,默认2048的话kv cache会吃满。vLLM和TGI我都试过,单卡24G下vLLM的PagedAttention优势很明显,极限并发能到8-10个请求(输入512输出256),TGI大概6-7个就顶天了,但TGI的continuous batching在纯对话场景下延迟更稳,看你要吞吐还是响应速度。量化到int4的话,我实测长文本摘要(超过2k token)会出现重复片段和逻辑断裂,对话短文本倒还行,如果你主要做摘要建议用AWQ量化而不是GPTQ,保留的注意力头更完整。另外你试过把kv cache类型改成fp8吗?3090不支持,但可以用--kv-cache-dtype fp8_e4m3在vLLM里硬开,能再省2-3G,就是偶尔会有精度抖动。最后提醒下,别只盯着显存,单卡3090的PCIe带宽才是瓶颈,并发高的时候显存没爆但token/s会掉得很难看,我最后是加了--max-num-batched-tokens限制才稳住的。
我3090上两个都试过,vLLM的PagedAttention在长对话场景下确实省得明显,batch size能拉到4不炸,TGI的continuous batching更吃峰值显存,但胜在调度稳。int4量化对摘要影响不大,对话偶尔会有重复或逻辑跳跃,要是追求质量建议AWQ别用GPTQ,长文本生成掉点主要在上下文超过4K之后,你可以先拿自己的测试集跑跑看。
巧了,我上周刚在3090上折腾完这事,vLLM和TGI都试了。体感上vLLM的PagedAttention在长上下文+多并发下确实更稳,我拿同样的batch size=4压测,TGI大概到第30轮请求就开始抖,vLLM能撑到50轮才出现首token延迟飙升。不过TGI对显存的碎片整理做得更激进,纯看峰值占用反而比vLLM低个1-2G,但代价是吞吐波动大。你那个OOM问题,我建议先查一下是不是没开continuous batching的预分配,默认策略下两个框架都会给保守预留,改成按需分配后batch size=4应该能跑起来。至于int4量化,我实测过对话任务,4bit下短文本几乎无感,但摘要这种需要长程依赖的,确实会出现重复率和指代模糊变高,建议你至少用AWQ或者GPTQ的4bit,别用裸的GGUF,那个掉点更狠。还有个骚操作,你可以试试把kv cache的dtype降到fp8,配合vLLM的--kv-cache-dtype fp8,能省出将近4G,比直接量化模型损失小得多。不过说实话,真要稳定服务,3090跑8B还是得接受并发不超过4的现实,想上8并发不如直接租个A6000。
我3090跑8B也是这个情况,后来用vLLM开gptq量化到4bit,batch size能拉到8左右,显存占用大概11G,但长文本确实偶尔会有点飘,摘要问题不大,对话里逻辑链条长的话能感觉到退化。TGI的话省显存效果差不多,但我觉得vLLM的调度更稳一些。你要是主要做短对话,4bit完全够用,长文本还是老实FP16加小batch吧。
我3090上跑7B试过,vLLM大概能扛到8并发,TGI差不多在6左右,但vLLM显存碎片化控制得更好,建议直接上vLLM。int4量化对摘要影响不大,但对话长文本偶尔会出现重复或逻辑断层,你最好用自己数据集跑一遍ppl对比下。另外建议开下gptq的awq,配合vLLM的automatic prefix caching能再省点。
说实话3090跑8B fp16确实紧巴,我实测vLLM的PagedAttention在24G上batch size能到8左右,TGI大概6,但vLLM的显存碎片控制更稳。int4量化对摘要影响不大,对话长文本偶尔会有重复或逻辑飘,建议用AWQ或GPTQ别用GPTQ低bit。你试试把max sequence length调短到2048,能省不少kv cache,其实单卡极限也就那样,不如老实上量化。
说实话24G跑8B fp16确实紧巴巴,但vLLM的paged attention比TGI省得多,我实测同样batch size=4,vLLM能稳,TGI直接爆。int4量化对短对话影响不大,但长摘要会偶尔出现重复或逻辑断层,建议你量化到int8或者用AWQ,质量和显存能平衡。另外把max sequence length限制到2048,kv cache压力会小很多,我这么调之后并发翻倍了。
说实话两个框架我都试过,3090上跑8B,vLLM的PagedAttention对显存碎片化处理确实更狠,我这边batch size能拉到4不炸,TGI大概在3左右就有点悬了,但差距没想象中那么大,关键是max-seq-len得设短一点,不然KVCache预留空间太保守。你如果主要做对话,建议把输入长度限制在2K内,输出限制在1K,这样并发能翻倍。至于int4量化,AWQ或者GPTQ在8B上长文本质量掉得不算明显,但摘要任务里偶尔会出现重复片段,尤其是超过4K上下文的时候,建议量化后跑一遍你实际场景的测试集,别只看perplexity。另外个小技巧,如果你用vLLM,可以开enable_prefix_caching,对重复性高的对话请求能省不少显存。总体来说,单卡24G想跑高并发,量化是必须的,FP16也就自己调试用用。
我3090跑8B也踩过这坑,vLLM和TGI实际差不太多,主要看你batch和max_len怎么设。vLLM的PagedAttention对长对话更友好,显存碎片少一些,但TGI的continuous batching在短文本高并发下反而更稳。建议先别急着量化,把max_model_len砍到4096,kv cache用fp16转int8,batch size从2开始慢慢调,24G跑个8并发应该没问题。int4量化长文本确实会掉点,特别是摘要任务,如果非要用,可以试试awq或者gptq,比直接smoothquant好点。
实测过,vLLM在24G上能扛到8并发,TGI大概5-6,但int4长文本确实会掉点,摘要影响不大。
我之前3090跑8B,vLLM开gptq量化,batch=8稳得很,对话场景完全够用。