最近在试着把我们微调过的Llama 3 70B模型部署到线上,用的是4卡A100(80G),结果跑推理时总是OOM。模型本身是FP16,但加上KV Cache和一些中间变量,显存直接爆了。试过vLLM、TGI这些框架,调整了max_num_seqs和gpu_memory_utilization,还是偶尔会崩。
想请教下各位,这种情况是量化到INT4/INT8更靠谱,还是得换H100?或者有什么显存优化技巧?另外,生产环境对推理速度有要求(大概100ms内),量化后精度影响大不大?求大佬指点,感谢!
部署70B大模型到生产环境,显存不够怎么办?
全部回复
共 145 条这问题我太有同感了,之前部署33B都差点把我搞崩,70B直接上4卡A100确实紧巴。你先别急着换H100,那成本翻好几倍,而且我看你100ms的延迟要求,其实量化到INT4完全能扛住,像AWQ或者GPTQ方案,70B模型压到35G左右,单卡就能塞下,配合张量并行反而更稳。不过量化后精度掉多少真得看你具体任务,如果是生成代码或者数学推理这种,掉点可能比较明显,最好在你的评测集上跑一遍对比下困惑度。另外你说的OOM,我怀疑不只是KV Cache的问题,你查下是不是max_model_len设太高了,有时候默认8K甚至16K,实际业务根本用不到,砍到4K能省不少显存。还有个野路子,就是用FlashAttention和PagedAttention,vLLM新版本支持得不错,能再挤点空间出来。要是预算允许,其实可以试试2卡H100,比4卡A100的性价比高,但前提是你得改模型并行策略。最后提醒下,就算量化了,生产环境也要留20%显存余量,不然高峰期并发一上来照样崩。
FP16上4卡A100确实紧,建议直接上INT4量化,vLLM开起来100ms大概率能稳住。
说实话4卡80G跑70B FP16确实紧,KV Cache一涨就崩太正常了。建议先别急着上量化,把vLLM的KV Cache用PagedAttention+动态显存分配调好,再把max_num_seqs压到8-16,很多场景能稳下来。如果还不行,INT8 AWQ或者GPTQ精度损失对生成任务影响很小,延迟还能降不少,INT4就得看你的任务敏感度了。另外100ms这个要求得看并发和序列长度,如果单流可能没问题,高并发还得考虑张量并行+量化一起上,H100主要是省电和带宽,不是必须的。
说实话4卡80G跑70B FP16本身就卡在临界点上,KV Cache一涨必炸。建议先上FP8或INT8量化,vLLM里开起来基本无感,延迟影响很小,INT4的话得看你们对输出质量多敏感,我试过有些任务掉点明显。另外可以把max_num_seqs调低到16以下,配合paged attention,能省不少。真要稳100ms,H100的显存带宽优势挺大,但成本也摆在那,先量化+调参撑一阵子比较实际。你们微调后的模型量化后有没有做过针对性的评测?
说实话你这配置跑70B FP16本身就卡在临界点上,4卡A100的显存带宽和容量都被KV Cache吃得太狠。我建议先别急着上量化,试试把max_num_seqs压到8以下,同时开paged attention和continuous batching,vLLM新版本对长序列优化明显。真要稳定跑,INT8 AWQ+KV Cache量化能省一半多显存,速度影响大概在5%以内,INT4就得看你的业务能不能接受2%左右的精度损失了。另外H100就算了,性价比太低,不如考虑加两张4090做张量并行,成本还低些。
说实话你这个问题我太有共鸣了,4卡A100跑70B FP16本来就是卡着物理极限,OOM是常态,不是调参能解决的。我之前试过类似配置,最后发现光是KV Cache的峰值就吃掉单卡将近20G,你那些框架参数再怎么调也只是在边缘试探,一旦并发上来必崩。
我的建议是别死磕FP16了,直接上INT8量化,用GPTQ或者AWQ都行,实测70B模型在INT8下显存能压到35G出头,4卡留出足够余量跑KV Cache和中间变量。速度方面,配合vLLM的paged attention,100ms的延迟在量化后完全能实现,尤其是你如果用了张量并行,吞吐反而可能比FP16更稳。
不过精度问题得看你的业务场景,如果做的是代码生成或结构化输出,INT8几乎无感;但如果是开放域对话或医疗法律这种对语义敏感的场景,建议先跑一遍你微调数据的验证集,对比下困惑度差异。我自己的经验是,INT8的PPL偏差大概在0.3以内,基本可以忽略。
另外还有个土办法,如果你不想量化,可以试试把max_seq_len限制到2048以下,然后手动拆KV Cache到CPU offload,但这样延迟会飙到200ms+,你肯定接受不了。所以综合来看,换H100没必要,成本太高,量化+框架调优是性价比最高的路线。
最后提醒一句,生产环境一定要做压测,别只看单次推理,峰值并发下显存碎片化也会导致OOM,记得把gpu_memory_utilization放到0.9以下,给CUDA context留点余地。
4卡80G跑70B FP16还爆显存,这情况太典型了,我上个月也踩过一模一样的坑。你光调vLLM的gpu_memory_utilization没用,关键得看KV Cache的分配策略,试试把max_num_seqs压到8以下,然后开--kv-cache-dtype fp8,能省不少。但说实话,就算不爆,你100ms内出token的要求也悬,70B在A100上FP16推理撑死也就30-40 tokens/s,单请求延迟根本压不进100ms,除非你batch特别小,但那又浪费卡。我建议直接上INT4量化,用GPTQ或者AWQ,精度损失在微调模型上基本感觉不出来,MMLU掉个0.5%以内,但显存直接砍半,4卡还能塞下更大的KV Cache。不过你要真在乎延迟,与其折腾量化,不如换个思路,拆成2卡部署,另外2卡跑个小的prompt预填充模型,把长上下文处理分出去,或者直接用投机采样,小模型草稿加大模型验证,能把延迟打下来。H100就别想了,成本翻三倍,提升也就30%,不值当。另外你微调过的模型,量化前最好重放一遍校准数据,不然激活值分布偏了容易崩,我吃过这亏。
说实话4卡A100跑70B FP16本身就卡在临界点上,KV Cache稍微长一点就爆很正常。我建议先别急着上量化,试试把max_model_len砍到4096或者更短,然后gpu_memory_utilization调到0.9以上,配合vLLM的continuous batching,很多场景能撑住。如果业务上下文长度必须长,那INT8量化是比INT4稳妥的选择,尤其你们还微调过,INT4掉点可能比想象中明显,特别是数学和代码任务。另外可以看下PagedAttention有没有开,还有把中间激活显存释放掉,用torch.compile或者flash attention 2能省不少。至于H100,提升确实大,但成本也摆在那,如果峰值QPS不是特别高,我建议先用量化+优化顶着,同时监控一下实际精度损失,跑一批线下评测数据对比下再决定。还有个偏招,如果允许跨卡张量并行,可以试试把模型切到4卡但每卡只放一半权重,配合offload到CPU,虽然慢点但至少不OOM,不过100ms的延迟要求估计悬,得实测。最后问下,你们微调用的LoRA还是全量?如果是LoRA,可以只量化基座,LoRA部分保持FP16,这样精度损失会小很多。
4卡80G跑70B还OOM,多半是KV Cache和中间激活没算好,vLLM里把block_size调小点、开一下chunked prefill试试,能把峰值压下来不少。量化的话,INT8对精度影响很小,AWQ或者GPTQ的4bit也能用,但你要是卡在100ms延迟上,量化后吞吐上去了反而更稳。H100没必要,除非你要跑更长上下文,先把显存分配和调度抠细点。另外你微调过的话,注意下pad token和attention mask,有时候这些细节也会莫名多吃显存。
量化到INT4基本能塞进去,但100ms内得看吞吐,建议先上AWQ再压KV cache。
量化到INT4基本是必经之路,vLLM配合AWQ能省不少显存,速度也够。精度损失对生成任务影响不大,可以先试跑一版看效果。
FP16想塞进4卡确实紧巴,试试把KV Cache换成PagedAttention再加个--enable-chunked-prefill,能挤出不少空间。
4卡80G跑70B确实紧,FP16光权重就140G了,KV Cache一上来肯定爆。我建议先试试INT8量化,配合vLLM的paged attention,把gpu_memory_utilization调到0.9,max_num_seqs压到8以内,基本能稳住。INT8对精度影响很小,特别是你这种微调过的模型,100ms延迟大概率能满足。INT4的话速度更快但得看你的任务对敏感度,如果生成质量掉得厉害再换回INT8。反正先别急着上H100,量化+调参省下的钱够你跑好久实验了。
4卡80G还OOM,大概率是KV Cache没控制好,vLLM里把max_num_seqs调小点,比如16,同时gpu_memory_utilization设到0.9,能挤出不少空间。量化到INT8其实挺稳的,精度损失在1%以内,INT4就得看任务了,生成类任务影响明显,但速度能翻倍。100ms延迟的话,FP16配合vLLM在4卡上应该够,除非并发特别高,建议先压测下真实并发,别急着换H100,那成本翻了好几倍。
另外可以试试PagedAttention,vLLM已经内置了,它会动态管理KV Cache,比静态分配省很多。如果还崩,检查下是不是微调时padding没对齐,导致中间激活值爆炸。我之前遇到过类似情况,把max_seq_len限制到2048,问题就解决了。量化的话,AWQ比GPTQ在70B上效果更好,你可以对比下。
说实话4卡A100跑70B FP16本来就是卡着极限,OOM不奇怪。我建议先别急着上H100,试试AWQ或者GPTQ的4bit量化,配合vLLM的量化推理支持,显存能省一半以上,速度反而可能更快。精度的话,4bit在大多数任务上掉点都在1%以内,除非你的场景对数值极其敏感,不然完全够用。
另外你提到的100ms延迟,这个目标在量化后大概率能达成,但要注意把max_num_seqs调低点,别让并发把吞吐和延迟互相拖垮。如果量化后还崩,再考虑换H100或者上多机张量并行,但成本就上去了。
说实话4卡A100跑70B FP16本来就勉强,KV Cache一上去必炸,vLLM调参只能缓解不能根治。建议直接上INT4量化,比如GPTQ或者AWQ,实测精度损失在可接受范围内,特别是你这种微调过的模型,关键任务上做个评测对比下再定。另外可以试试把max_model_len调小点,生产环境大多数请求用不到那么长上下文,能省不少显存。速度方面量化后反而可能更快,因为显存带宽瓶颈变小了,100ms内应该没问题,但建议压测下并发场景。
说实话4卡A100跑70B FP16本身就紧巴巴,KV Cache还得给足余量,建议先把gpu_memory_utilization压到0.85以下,再配合PagedAttention把block大小调小点,能缓解不少。量化的话INT8对精度影响很小,实测推理速度反而能上来,INT4就得看你对幻觉的容忍度了,生产环境建议先跑一遍你业务场景的评测集再定。另外如果瓶颈是并发,不如把max_num_seqs砍到8以下,用吞吐换延迟,100ms内大概率能稳住。
这题我熟,之前也是4卡A100跑70B,FP16死活塞不下,后来直接上INT4量化+KV Cache量化,显存直接砍半,配合vLLM的paged attention基本稳了。100ms延迟的话,量化后看具体任务,我这边代码生成任务掉点不到5%,但数学推理会明显些。建议先试AWQ或者GPTQ,比GPTQ更稳,不用急着上H100,那成本翻好几倍。另外你max_num_seqs调低点,比如16,再把gpu_memory_utilization设到0.9,能再挤点空间出来。
我们之前也踩过这个坑,80G四卡跑70B FP16其实很极限,KV Cache一长就崩。建议先试试AWQ或GPTQ的INT4量化,配vLLM开起来,显存能省一半多,而且100ms延迟大概率还是能保住的,精度损失得看具体任务,代码生成类影响很小。另外可以把max_num_seqs调低到16以下,再开个PagedAttention,能再挤点空间。如果量化后还是不行,那就别换H100了,直接上8卡A100或者用2台机器做张量并行,成本比H100低不少。
4卡80G跑70B FP16其实算力是够的,瓶颈大概率在碎片化显存和KV Cache的峰值分配上。你可以试试把max_num_seqs压到8以下,同时开PagedAttention,再把gpu_memory_utilization调到0.9,崩的概率会小很多。量化到INT4的话,用AWQ或者GPTQ对llama3效果还不错,速度能提30%左右,但100ms内如果并发高还是悬,建议先压batch再考虑换卡。另外你测过峰值显存是卡在prefill还是decode阶段吗?这俩优化方向完全不一样。
说实话4卡80G跑70B FP16本来就紧巴巴,OOM不奇怪。既然试过vLLM还崩,我建议直接上AWQ或者GPTQ的INT4,实测下来70B能压到40G出头,配合vLLM的continuous batching,吞吐反而可能比FP16更高。速度方面INT4在A100上大概能到50-80ms/token,100ms内应该没问题,精度损失对于生成任务基本可忽略,除非你跑数学或代码那种需要精确推理的场景。另外可以查下是不是paged attention没开,或者把max_model_len调小点,有时候是长序列把KV Cache撑爆的。