最近在试着把我们微调过的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卡80G跑70B FP16本来就紧巴巴的,你还要留KV Cache和激活值的余量,vLLM那些框架再优化也只是调度层面省一点,物理占用躲不掉的。我自己的经验是直接上INT8 AWQ或者GPTQ量化,精度损失在0.5-1个点以内,对业务影响真不大,但显存能省出差不多一半,4卡跑起来就从容多了。不过你要求100ms内响应,量化后吞吐确实会降一些,尤其是首token延迟,建议先压测一下你们实际场景的并发数和序列长度,别只看单次推理时间。另外你试过把max_num_seqs调小到8或者4吗?有时候OOM是因为临时请求太多挤爆了预留的显存池,调小后反而稳定很多。如果量化后还是偶尔崩,那可能得考虑张量并行切分策略,比如把KV Cache也分到4张卡上,而不是默认全放一张卡。H100说实话没必要,除非你同时要跑长上下文或者大量并发,否则A100量化后够用了。最后提醒下,生产环境记得开vLLM的continuous batching,配合PagedAttention,能明显减少碎片化显存浪费。
4卡80G跑70B FP16本身就吃紧,KV Cache还得动态涨,vLLM配paged attention后把gpu_memory_utilization调到0.9以上,再把max_num_seqs压到16试试,崩之前先看下日志是不是显存碎片化。量化到INT4用AWQ或GPTQ,速度能快一倍,但100ms内还得看你的输入长度和并发,如果单流短文本问题不大,精度损失在敏感任务上可能明显,建议先拿你的业务数据做个离线评测对比。换H100不太现实,性价比低,不如先调优+量化组合拳。
4卡80G还OOM,大概率是KV Cache在长上下文下吃太狠了,vLLM里把max_model_len砍到4096或2048试试,配合gpu_memory_utilization调到0.9,基本能稳。量化的话,AWQ的INT4对70B精度损失其实很小,MMLU掉个1-2分,但延迟能压到80ms左右,比换H100划算多了。不过你100ms的硬指标,建议先测下FP16的prefill和decode占比,如果瓶颈在decode,量化收益没那么大。
说实话你这配置已经很顶了,4卡A100 80G跑70B FP16理论显存是够的,问题大概率出在KV Cache和调度上。我上次部署qwen 72B也踩过这坑,后来发现vLLM里把--kv-cache-dtype改成fp8能省不少,另外把--max-model-len从默认的4096砍到2048,吞吐反而上去了,因为长序列的缓存太吃显存了。
量化到INT4我觉得是能救急的,尤其是AWQ或GPTQ,70B压到35G左右,单卡就能塞下,但你要100ms延迟的话,单卡可能算力不够,还是得走张量并行。我们实测过INT4在代码生成任务上掉点大概2-3%,如果是对话场景基本感知不出来,但如果你做的是数学或逻辑推理,精度下降确实有点明显。
换H100其实不解决显存本质问题,H100 80G和A100容量一样,只是带宽和算力强,你OOM的根源还是显存墙。我建议先试试量化加优化双管齐下:模型量化到INT8,配vLLM的paged attention,再把gpu_memory_utilization设到0.92,max_num_seqs调小到32,这样通常能稳住。另外记得开--enable-prefix-chunking,对长上下文帮助很大。
还有个骚操作,把部分中间结果offload到CPU,用--cpu-offload-gb设个20G,虽然会慢点,但纯保底不崩。最后想问你个细节,你的平均请求token长度大概多少?如果普遍超过1k,那KV Cache才是大头,得优先考虑量化KV。
说实话4卡80G跑70B的FP16本来就紧,KV Cache一涨必炸。建议先试试AWQ或GPTQ的INT4量化,配合vLLM的KV Cache量化(FP8),显存能省一半多,速度影响不大,特别是你们这种微调过的模型,量化校准集用你们的业务数据效果会更好。另外检查下max_model_len是不是设置太高了,很多时候是预分配显存把空间吃光了。要是量化后延迟还压不进100ms,再考虑换H100,毕竟单卡带宽翻倍,但成本也翻倍,先软件优化更划算。
说实话4卡A100跑70B FP16本身就挺极限的,KV Cache一涨就崩太正常了。我的建议是直接上INT8量化,配合AWQ或者GPTQ,显存能省一半还多,而且精度损失在生成任务上基本感知不到,100ms延迟大概率能保住。vLLM的话记得把block_size调小点,默认的16有时候会浪费显存,改成8或者4能缓解不少。另外可以试试把max_model_len限制到4096,别让KV Cache无限膨胀,实际业务没那么多超长上下文的话这招最管用。
说实话4卡A100跑70B FP16本身就挺极限的,vLLM把KV cache的显存占比压到0.85左右试试,另外paged attention的block大小调小点能省不少。量化的话我建议先试AWQ的INT4,速度基本不掉,精度损失对生成任务影响很小,但要是你们微调后的任务对输出格式要求很严格,那还是得留个FP16的备份做对比。换H100不现实,不如先看看能不能用offload把一部分中间变量挪到CPU,虽然延迟会涨,但至少不崩。
这题我熟,之前我们也是4卡A100跑70B,vLLM配gpu_memory_utilization调到0.9都不稳。后来换了AWQ量化到INT4,显存直接省一半,延迟反而比FP16还稳,基本在80ms左右,精度损失对生成任务来说体感不大。你要是对数值敏感的任务就谨慎点,可以先跑个评测集对比下。另外试试把KV Cache换成PagedAttention,vLLM新版支持得挺好,别死磕max_num_seqs,那个调小了吞吐太难看。
先别急着上H100,4卡A100跑70B其实有解。我试过用AWQ量化到INT4,配合vLLM的tensor parallel,显存占用能压到60G左右,吞吐反而比FP16高。关键是max_num_seqs别调太大,我设8,然后gpu_memory_utilization留0.85给KV cache,就没再崩过。至于精度,看具体任务,代码生成和数学推理掉点明显,但普通对话体感不大,你先拿测试集跑个对比再定。另外如果延迟卡在100ms,INT4的decode速度大概率够,瓶颈多在prefill,可以试试把长输入截断或者用chunked prefill。
4卡80G跑70B FP16确实紧,KV Cache一涨就崩太典型了。我这边之前也踩过这坑,后来直接上AWQ量化到INT4,显存占用直接砍半,延迟大概从80ms涨到110ms,但胜在稳。不过你这100ms的硬指标,INT8可能更保险,精度损失比INT4小,就是显存省得没那么多。另外试试PagedAttention,vLLM里把block大小调小点,能再挤点空间。说实话H100没必要,除非你预算真没上限,不然量化+优化够用了。
4卡80G跑70B FP16确实紧,KV Cache稍微一涨就崩。建议先试下AWQ或GPTQ的INT4量化,配合vLLM的paged attention,通常能把显存压到120G以内,速度损失大概10%-20%,100ms内大概率没问题。精度方面,如果你们业务不是对数值极其敏感的场景(比如代码生成或数学推理),INT4的困惑度下降其实感知不强。另外,试试把max_num_seqs调小到8以下,同时开--enable-chunked-prefill,能明显减少峰值显存。实在不行再考虑H100,但成本和供货都是问题,量化应该是性价比最高的路径。
别急着上H100,先试试INT8量化+AWQ,70B能压到40G左右,100ms大概率够用。精度掉得不多,我们跑过评测基本没差。
说实话4卡A100跑70B FP16本来就紧,vLLM里把KV Cache换成FP8能省不少,再开下prefix caching,峰值能压下来不少。量化的话INT8基本无感,INT4看任务,代码生成这类可能掉点明显,但如果是对话场景其实还好。换H100成本太高,不如先试试把max_num_seqs调到8以下,配合continuous batching看看能不能稳住。另外你100ms的延迟要求,量化后吞吐上去了反而更容易达标,精度损失用温度或者采样参数调一调能补回来一些。
试试INT8量化加AWQ,70B在4卡80G上能稳很多,100ms延迟也大概率够用。
说实话4卡A100跑70B FP16本身就挺极限的,OOM不奇怪。建议先试下AWQ或GPTQ的4bit量化,配合vLLM的tensor parallel,显存占用能降一半多,延迟大概率能压进100ms,精度损失对大多数业务场景真感知不出来。如果量化后还是不稳,再考虑换H100,但成本确实高不少。另外可以查下是不是paged attention没开满,或者把max_model_len调小点,有时候是KV cache预留太狠了。
说实话4卡80G跑70B FP16本身就挺极限的,KV Cache一涨就容易崩。建议先试试AWQ或GPTQ的4bit量化,配合vLLM的paged attention,显存能省一半多,100ms延迟大概率没问题。我们之前跑33B量化后效果几乎无损,70B的话看任务,代码和数学类可能会掉2-3个点,但对话场景基本感知不到。另外可以试试把max_num_seqs调低到8以下,再开下chunked prefill,应该能稳住。如果预算允许,H100的显存带宽确实香,但性价比不如直接上量化。
4卡80G跑70B FP16确实紧,KV Cache一涨就崩太正常了。建议先试试AWQ或GPTQ的INT4量化,配合vLLM的tensor parallel,显存压力能小一大截,速度反而可能更快。100ms延迟的话,INT4精度损失在业务场景里通常感知不强,除非你们对输出质量极度敏感。另外H100性价比其实不高,不如先榨干现有卡,把gpu_memory_utilization调到0.95,再开下continuous batching试试。
量化到INT4吧,我们也是4卡A100跑的70B,AWQ配vLLM稳得很,100ms内没问题。
量化到INT4基本是必经之路,我们用AWQ跑70B在4卡80G上稳得很,延迟120ms左右。精度损失在业务场景里完全能接受。
4卡A100跑70B FP16确实紧,OOM多半是KV Cache峰值没控住,建议先把gpu_memory_utilization调到0.85以下,再把max_num_seqs砍到16试试,vLLM的continuous batching对短请求优化明显。量化的话,INT8用AWQ精度损失很小,生产上100ms内完全够,INT4就得看任务了,如果对输出质量敏感还是别碰。H100没必要换,除非你同时要跑长上下文或高并发。另外可以查下是不是微调时padding没处理好,导致中间激活值异常膨胀。
我这边之前用70B做代码生成,AWQ量化后bleu几乎没掉,延迟反而降了30%。建议你先在离线集上对比下量化前后的困惑度,再决定走哪条路。如果还是崩,看看是不是max_model_len设太长,把上下文裁到4K能省不少显存。