最近在试着把我们微调过的Llama 3 70B模型部署到线上,用的是4卡A100(80G),结果跑推理时总是OOM。模型本身是FP16,但加上KV Cache和一些中间变量,显存直接爆了。试过vLLM、TGI这些框架,调整了max_num_seqs和gpu_memory_utilization,还是偶尔会崩。
想请教下各位,这种情况是量化到INT4/INT8更靠谱,还是得换H100?或者有什么显存优化技巧?另外,生产环境对推理速度有要求(大概100ms内),量化后精度影响大不大?求大佬指点,感谢!
部署70B大模型到生产环境,显存不够怎么办?
全部回复
共 145 条试试FP8动态量化加PagedAttention,A100也支持,速度影响很小,能省不少显存。
说实话4卡A100跑70B FP16本身就卡在临界点上,vLLM那个gpu_memory_utilization调到0.95以上基本就是赌运气。我建议你先试试AWQ或GPTQ的4bit量化,配合KV Cache量化到8bit,显存能省一半还多,之前我们跑Qwen-72B就是这么稳下来的。速度的话100ms大概率没问题,但精度你得自己测,业务场景不同敏感度差很多,尤其数学和代码任务掉点比较明显。另外别急着换H100,先把paged attention和continuous batching的版本调新一点,老版本bug导致OOM的情况我碰到过好几次。
量化到INT4基本是唯一解,vLLM+AWQ能稳在100ms内,精度损失对业务影响真没那么大。
我们之前同配置跑70B,INT8还是有点悬,换INT4后显存余量充足,崩的问题再没出现过。
我们团队之前也踩过这个坑,4卡A100跑70B FP16确实紧,后来换成INT8量化配合vLLM,把KV cache的分配策略调了下,稳定多了,延迟大概从120ms降到90ms,精度损失在可接受范围。你试试把gpu_memory_utilization设到0.9,同时限制max_num_seqs别超过8,有时候是并发请求太多导致峰值显存爆掉。H100当然更省心,但成本摆在那,先量化+调参试试,实在不行再考虑换卡。另外问下你微调时用了LoRA还是全参?如果是全参,量化后某些层可能容易崩,需要重点验证下。
说实话4卡A100跑70B FP16本来就紧巴巴,OOM不怪你,vLLM那些参数调半天不如直接上AWQ或GPTQ的INT4,速度还能顺带提一截。量化对生成质量的影响得看任务,如果是对话或者代码生成,体感差异很小,但你要是做数学推理或者长上下文,掉点就明显了。至于100ms内,INT4配合vLLM的continuous batching大概率能压住,H100除非你预算无上限,否则真没必要。建议先量化试个几天,盯着p95延迟和token多样性,比网上问一圈都靠谱。
说实话4卡A100跑70B FP16本来就很极限,vLLM那个gpu_memory_utilization调到0.9以上容易触发碎片化OOM,建议先试试把KV Cache换成PagedAttention的8bit版本,能省不少。量化的话INT8其实精度损失很小,尤其你们是微调过的模型,用AWQ或者GPTQ校准一下,基本能保住大部分效果,INT4就得看任务敏感度了,如果是生成类任务偶尔会有明显退化。至于100ms延迟,INT8在A100上大概率够用,但INT4可能更稳,建议先量化后跑个压测看看p99,别只看平均。另外H100那个性价比真不划算,除非你们同时要推多个模型,不然先把显存优化到极致再说。
量化到INT4基本能塞进4卡,但100ms延迟悬,建议先上AWQ试试,精度损失对业务影响得实测。
FP16换H100也紧张,不如直接上8卡A100或者用量化+投机采样,别死磕单机。
量化到INT4基本是必经之路了,70B FP16在4卡上本来就很紧,vLLM里把KV Cache用FP8或者INT8存能省不少。我们之前用AWQ量化后延迟大概从80ms涨到95ms,还在你100ms预算内,但要看具体业务对长上下文敏感不敏感。另外gpu_memory_utilization别拉满,留个5%给碎片,还有试试把max_num_seqs调到8以下,偶尔崩多半是并发峰值顶爆了。H100没必要换,除非你同时要训模型,否则量化加调参完全够用。
说实话4卡A100跑70B的FP16本身就挺极限的,你那个OOM大概率是KV Cache峰值和中间激活没算准。建议先把max_num_seqs压到8以下,再配合PagedAttention试试,vLLM里这俩参数对显存影响比量化还直接。至于INT4,如果你们的业务对困惑度不敏感(比如分类或抽取),实际掉点可能就1-2%,但100ms延迟确实悬,量化后吞吐上去了延迟未必降。我倒是好奇你测过单卡跑70B的INT4吗?之前看有人用AWQ在4090上都能跑,但速度大概也就20 tokens/s,离你目标差挺远。
4卡80G跑70B还要压100ms确实挺极限的,KV Cache那部分在长上下文下吃显存比模型权重还狠。建议先试试FP8动态量化,比INT4稳不少,精度损失小到业务基本无感,配合vLLM的continuous batching把吞吐拉起来,延迟反而可能比FP16更可控。另外检查下是不是max_model_len设太大,按实际业务截断到2K或4K能省出一大块缓存。H100对FP8有硬件加速,但如果你只是显存瓶颈而不是算力瓶颈,先优化再考虑换卡更划算。
这题我熟,之前我们压过7B,70B真不是单纯堆卡的事。你这情况别急着上H100,先试下AWQ或GPTQ的4bit量化,配合vLLM的paged attention,显存占用能掉一半还多,速度影响其实在可接受范围。不过100ms的延迟要求有点紧,量化后长上下文场景可能会波动,建议压测时重点看下TTFT和吞吐。另外你gpu_memory_utilization调到0.95试试,但max_num_seqs要相应调小,别让它动态分配撑爆。
这题我熟,之前跑33B也遇到过类似情况,最后是量化到INT8加动态KV Cache才稳住的。你这4卡80G跑70B,FP16确实太极限了,vLLM的continuous batching其实已经很吃显存了,可以试试把KV Cache的精度降到FP8,能省不少。量化的话INT4对精度影响确实有,但看你的任务,如果是生成类的问题不大,要是做分类或者抽取就得谨慎了。另外建议把max_num_seqs调小点,比如4或者8,牺牲点吞吐换稳定性,100ms的延迟要求其实主要看首token时间,别被总延迟误导了。
INT4量化加AWQ基本能保住精度,vLLM里开下KV cache量化,100ms内问题不大。
说实话4卡A100跑70B FP16本来就紧巴巴,vLLM那个gpu_memory_utilization调到0.9以上还得留意KV Cache的分配策略,不如直接上AWQ或GPTQ的4bit,实测吞吐能翻一倍,延迟大概多个5-8ms,100ms内应该还扛得住。精度方面看你的任务,如果是代码生成或数学这类对token敏感的场景,4bit可能掉点明显,建议先在验证集上跑个对比,不行就试试8bit加量化KV cache的组合。另外H100性价比真不高,除非你并发特别大,否则把显存优化做透比换卡实在。
INT8量化加PagedAttention基本能压住,但100ms内延迟得看吞吐量,建议先压测再定。
说实话4卡A100跑70B FP16本身就挺极限的,KV Cache一长必炸。建议直接上AWQ或GPTQ量化到INT4,显存能省一半多,配合vLLM把gpu_memory_utilization调到0.9,基本能稳。速度方面INT4在A100上不比FP16慢多少,100ms内问题不大,关键看你的batch size和max_seq_len,别开太大。精度影响得看任务,如果是生成式对话几乎无感,但要是做数学或代码生成,建议先用你的测试集跑一遍对比下。
另外别急着换H100,成本翻倍但显存没变,只是带宽高些。真要优化,试试PagedAttention(vLLM自带)把KV Cache拆开管理,再把max_num_seqs调小到8-16,OOM概率能降很多。我这边之前用7B+量化方案,延迟控制在80ms左右,你们70B量化后应该也能接近这个数。
试试FP8动态量化吧,A100也支持,精度损失很小,配合vLLM基本能压进显存。100ms延迟别指望INT4,质量崩了还得调回来。
说实话4卡A100跑70B FP16本来就是极限操作,OOM不奇怪。建议先别急着上量化,试试把KV Cache换成PagedAttention(vLLM自带)并把max_num_seqs调到16以下,同时把gpu_memory_utilization压到0.85,很多时候是碎片化导致崩而不是真容量不够。
如果这样还不行,INT8量化(比如GPTQ或AWQ)对精度影响其实很小,尤其是生成任务,但INT4在长上下文下会明显变笨,尤其是数学和代码。你100ms的延迟要求,INT8在A100上应该能撑住,但得看你的并发和输入长度。
另外,H100性价比不一定高,除非你同时需要大显存和超快吞吐。真想省事,不如直接租个8卡A100或者上2卡H100,把张量并行调好,比单机4卡稳得多。你试过在量化后跑一下你们的微调数据集的评测吗?有时候领域任务对量化更敏感。
说实话4卡A100跑70B FP16本身就紧巴巴的,KV Cache一上来必炸,vLLM调参治标不治本。建议直接上INT4量化,比如AWQ或者GPTQ,显存能压到40G左右,4卡跑起来余量很足,而且现在量化推理框架对70B这类大模型的支持已经很成熟了。
精度方面不用太担心,我们之前对比过MMLU和代码生成任务,INT4掉点基本在1%以内,业务场景完全够用。真要追求100ms内响应,H100当然更稳,但性价比不高,先试试量化+调整KV Cache策略,大概率能解决问题。
另外可以看下PagedAttention的配置,把block大小调小一点,能减少碎片化浪费。你用的什么量化工具?如果是AutoAWQ,记得把batch size设小点,避免显存峰值。
说实话4卡A100跑70B FP16本来就是极限操作,OOM不意外。我建议你先试试AWQ或GPTQ的4bit量化,配合vLLM的tensor parallel,显存占用能降到40G左右,速度反而可能比FP16还快,因为显存带宽瓶颈缓解了。精度影响的话,看你的业务场景,如果是代码生成或数学推理,INT4掉点会明显些,但普通对话任务基本感知不到。100ms的延迟要求,量化后单次生成应该能到30-40 tokens/s,问题不大。另外记得给KV Cache留足空间,gpu_memory_utilization别拉满,留个2-3G余量给碎片。