最近在试着把我们微调过的Llama 3 70B模型部署到线上,用的是4卡A100(80G),结果跑推理时总是OOM。模型本身是FP16,但加上KV Cache和一些中间变量,显存直接爆了。试过vLLM、TGI这些框架,调整了max_num_seqs和gpu_memory_utilization,还是偶尔会崩。
想请教下各位,这种情况是量化到INT4/INT8更靠谱,还是得换H100?或者有什么显存优化技巧?另外,生产环境对推理速度有要求(大概100ms内),量化后精度影响大不大?求大佬指点,感谢!
部署70B大模型到生产环境,显存不够怎么办?
全部回复
共 145 条说实话4卡A100跑70B FP16本身就紧巴巴的,vLLM里把KV Cache用INT8存能省不少,另外试试把max_num_seqs压到8以内,别让并发把显存吃满。量化的话建议先试INT8,AWQ或GPTQ都行,精度损失在推理任务上通常能接受,INT4速度快但微调过的模型容易掉点。你这100ms的延迟要求,量化后吞吐反而更稳,H100暂时没必要换。另外查下是不是有碎片化问题,开个--enable-chunked-prefill试试。
说实话4卡A100 80G跑70B FP16确实挺极限的,光权重就要140G,你还得给KV Cache和激活留空间,vLLM再怎么优化也容易撞墙。我建议你先别急着上H100,试试AWQ或者GPTQ的4bit量化,配合vLLM的awq后端,显存能压到60G左右,剩下40G给KV Cache和并发,实测吞吐能提升不少。不过量化后精度这事得看你的任务,如果是生成类或者开放域对话,4bit基本感知不到差异,但如果是数学推理或者代码生成这种对logits敏感的,可能掉点会明显,建议先在离线评测集上对比一下INT8和INT4的差距。
另外你提到100ms延迟,这个要求其实挺高的,量化能帮上忙但主要瓶颈可能还在显存交换上。可以试试把max_num_seqs调低到16或者8,同时开启vLLM的continuous batching和prefix caching,再配合paged attention,有时候比盲目上量化更有效。还有个野路子,如果你允许拆成多机部署,用tensor parallel加pipeline parallel混合并行,把70B拆到8卡上,每卡压力小很多,但延迟会受卡间通信影响,得实测下。最后问一句,你试过把输入序列长度限制一下吗?比如max_model_len设到2048或者3072,别用默认的4096,能省不少KV Cache空间。
试试FP8动态量化加KV Cache量化,A100也支持,基本能塞下且精度损失很小,100ms应该够呛但能接近。
4卡80G跑70B还OOM,大概率是KV Cache和并发配额没算好,vLLM里把--max-model-len调低到4096或2048试试,能省下一大截。量化的话,INT8用AWQ或GPTQ精度损失很小,生产环境其实够用,INT4就得看下游任务敏不敏感了。100ms这个延迟目标有点紧,量化后吞吐能上去,但首token延迟未必比FP16快多少,建议先用量化+动态batch压测一轮再定。如果预算允许,H100的显存带宽确实香,但先别急着换卡,把paged attention和continuous batching的配置吃透可能就解决了。
4卡A100 80G跑70B FP16其实卡在临界点上了,模型权重就占140G左右,剩下180G要同时扛KV Cache、激活值和框架开销,max_num_seqs稍微调大一点就悬。我之前类似配置试过AWQ INT4,权重直接压到35G出头,KV Cache也能用FP8存,吞吐翻了一倍多,但100ms延迟这个目标得看你的输入输出长度,长上下文场景量化省下的显存很快又被KV吃回去了。精度方面INT4对通用对话影响不算大,但如果你微调过特定领域任务,建议拿评测集跑一遍对比,有些任务掉点挺明显的。换H100的话显存还是80G,单卡没本质区别,除非上H200或者多机,不然性价比不高。可以试试chunked prefill配合PagedAttention,再把max_model_len卡紧一点,很多时候OOM是prefill阶段峰值撑爆的。另外INT8其实挺尴尬,省得不多精度还比FP8差,不如直接上FP8权重加FP8 KV,A100虽然原生支持弱一些但vLLM现在也能跑。