最近在试着把我们微调过的Llama 3 70B模型部署到线上,用的是4卡A100(80G),结果跑推理时总是OOM。模型本身是FP16,但加上KV Cache和一些中间变量,显存直接爆了。试过vLLM、TGI这些框架,调整了max_num_seqs和gpu_memory_utilization,还是偶尔会崩。
想请教下各位,这种情况是量化到INT4/INT8更靠谱,还是得换H100?或者有什么显存优化技巧?另外,生产环境对推理速度有要求(大概100ms内),量化后精度影响大不大?求大佬指点,感谢!
部署70B大模型到生产环境,显存不够怎么办?
全部回复
共 145 条INT8量化加vLLM基本能压住,100ms内没问题,精度掉得不多,先试这个再考虑H100。
说实话4卡A100跑70B FP16本来就很极限,vLLM就算把gpu_memory_utilization调到0.95也容易在长序列上翻车。我建议你先试试AWQ或者GPTQ的4bit量化,配合vLLM的awq后端,显存能压到40G左右,速度反而可能比FP16还快,因为带宽瓶颈变小了。100ms的延迟要求得看你的输入长度和并发,如果batch不大,量化后应该没问题,但你要是跑长文档或者高并发,还是得考虑上H100或者搞张卡做prefix caching。精度上4bit对生成质量影响其实很小,尤其你这种微调过的模型,我自己的经验是困惑度只掉零点几个点。
另外你检查过KV cache的分配策略吗?vLLM里max_num_seqs调太低会导致cache碎片化,反而浪费显存。可以试试把block_size设成16或者32,然后监控一下实际cache利用率。如果还崩,那就别硬撑了,直接上8卡或者换H100,省得线上出事故赔钱。
这题我熟,之前我们部署33B也踩过同样的坑。说实话70B上4卡A100确实紧,但换H100成本太高,建议先试AWQ或GPTQ的4bit量化,配合vLLM的tensor parallel,吞吐能提不少,延迟大概率能压进100ms。精度的话看任务,如果是生成式或开放域对话,掉点不明显,但要是做检索或数学推理,得自己跑一遍评测集对比下。另外你试过PagedAttention没?vLLM里把KV cache管理好,OOM会少很多,还有留意下max_model_len别设太大,有时候是显存碎片化的锅。
量化到INT4基本是唯一解,再配下KV Cache量化,100ms内应该能稳住,精度掉得没那么吓人。
说实话4卡80G跑70B FP16本来就紧巴巴,vLLM里把KV cache的量化开关打开(比如fp8),再把max_num_seqs压到16以下,能缓解不少。不过100ms的延迟要求,INT4基本是唯一解,AWQ或者GPTQ都可以,精度损失看任务,如果是代码生成或数学逻辑,掉点可能明显,建议先在评测集上跑一遍对比。另外别急着上H100,A100用INT4吞吐其实够,瓶颈主要在显存带宽,可以试试把tensor parallel改成pipeline parallel,配合continuous batching,有时候比单纯换卡更划算。
量化到INT4用AWQ或GPTQ,配合vLLM的paged attention基本能压住,100ms内问题不大。
4卡80G跑70B按理说挺宽裕的,但FP16加长上下文确实容易吃满,我这边用vLLM把KV Cache换成INT8,再把max_model_len从8K砍到4K,OOM基本就消失了。量化的话建议先试INT8,精度损失在1%以内,INT4对数学和代码任务会有明显掉点,生产上不太敢用。动态batching和continuous batching开起来也能压不少显存,你可以在代码里看看有没有preemption相关的配置,有时候是碎片化导致的崩,加个--enable-chunked-prefill试试。100ms延迟的话,INT8其实够用了,H100没必要,除非你还要跑更大模型。
建议先试INT8+KV Cache量化,vLLM里调下block_size,基本能稳,精度掉得很少。
INT8加vLLM基本够用,精度损失很小,但100ms得看并发,建议先压测再决定上不上H100。
建议直接上INT4量化,70B在80G上能塞下,配好KV cache的paged attention,100ms基本能守住。
看到4卡A100还OOM,大概率是KV Cache的显存分配策略没调好,vLLM的block_size和max_num_seqs可以再往下压一压,先把峰值显存降下来再谈量化。我自己的经验是70B用AWQ的INT4配合vLLM,单卡80G跑长上下文都挺稳的,速度损失其实在可接受范围,你先试试量化后能不能满足100ms的延迟要求。另外,如果你们对精度特别敏感,可以考虑把模型切到DeepSpeed的ZeRO-Inference,用CPU offload分担一部分KV Cache,不过速度会慢一些。H100的性价比其实不高,除非你们有强需求要跑满FP8,否则先软优化更划算。
4卡80G还OOM,大概率是KV Cache的显存分配策略没调好,试试把vLLM的block_size调小点,或者开paged attention的swap,能挤不少空间。量化到INT8其实精度损失很小,尤其你这还是微调过的模型,用AWQ或GPTQ校准一下基本无感,INT4就得看任务类型了,生成类任务掉点明显。真要100ms以内,H100的性价比其实不高,不如先优化下请求并发和batch策略,很多场景根本吃不满4卡。
说实话4卡A100跑70B FP16本身就卡在临界点上,KV Cache稍微涨点就爆很正常。建议先试下AWQ或GPTQ的4bit量化,配合vLLM的量化推理,显存能省一半还多,速度也基本能压到100ms内。精度的话看任务,如果是生成类任务体感差距很小,但你要是做数学推理或代码生成这种对精度敏感的,最好先在验证集上测下指标再决定。
另外你试过PagedAttention或者把max_num_seqs调小吗?有时候不是显存不够,是碎片化太严重。还有,如果业务允许,可以考虑把输入序列长度限制在2K以内,KV Cache能省不少。真要是量化后精度掉太多,再考虑H100或者上多机张量并行,但成本就上去了。
说实话你这情况我太熟了,之前我们部署33B的时候也卡在显存边缘疯狂试探。70B在4卡80G上跑FP16确实极限,光权重就要140G,KV Cache一涨直接GG,vLLM那些参数调来调去也就是治标不治本。我建议你直接上INT4量化,AWQ或者GPTQ都行,实测下来70B的量化模型跟FP16比,在推理任务上损失大概在2-3个点以内,对业务来说基本无感。但速度这块你得有心理准备,INT4虽然省显存,但有些框架在解码阶段反而会慢,因为要反量化,你100ms的预算得实际压测一下。另外可以试试把KV Cache换成FP8或者INT8的,这招能省不少,配合量化后单卡塞个70B的量化版应该没问题。要是还崩,那就别犹豫直接上H100,但我觉得你先量化试一周,大概率不用换卡。还有个小技巧,如果允许的话把输入序列长度限制一下,或者用PagedAttention的框架把KV Cache分散到CPU上,虽然慢点但至少不OOM。
说实话4卡A100跑70B FP16本身就卡在临界点上,KV Cache一涨就崩太正常了。我们之前也是类似配置,最后是量化到INT8配合vLLM的paged attention才稳下来,但你要有心理准备,精度损失对生成质量的影响得看具体任务,代码生成类还行,对话类偶尔会出逻辑硬伤。100ms这个延迟要求挺苛刻的,量化后单卡吞吐会好很多,但要是并发上来了还是得靠多卡张量并行撑。建议先拿你们业务数据跑个评测集对比下INT8和FP16的输出差异,再决定要不要为了省显存牺牲效果,H100那成本不是一般团队扛得住的。还有个小技巧,可以试试把max_num_seqs调小到8以下,虽然吞吐降了但至少不崩。
之前跑34B也遇到过类似情况,后来把max_model_len砍到4096再加paged attention,OOM频率明显降了。70B这个规模建议直接上AWQ或GPTQ的4bit,配合vLLM的automatic prefix caching,吞吐能上来不少,延迟100ms内大概率没问题。精度损失看任务,如果是生成式对话基本无感,但要是做代码或数学推理可能得实测对比下。另外H100的显存带宽确实强,但性价比不如先量化试试,毕竟4卡A100的硬件成本已经摆在那了。
4卡80G跑70B的FP16确实紧,KV Cache稍微涨一点就容易爆,你试过把max_num_seqs压到个位数吗?我之前用vLLM碰到类似情况,调低这个参数把吞吐让给显存,稳定性会好不少。量化的话,AWQ或者GPTQ的INT4对精度影响其实挺小的,尤其你这种微调过的场景,损失基本在可接受范围,但100ms延迟得看具体batch和输入长度,建议先压测一下。实在不行再考虑换H100,毕竟显存带宽和容量都更从容,但成本你得权衡下。
说实话你这配置已经不算差了,4卡80G跑70B理论上绰绰有余,问题大概率出在KV Cache的分配策略上。vLLM里那个gpu_memory_utilization不是调越高越好,我建议你试试把max_num_seqs压到16以下,同时给每个序列的max_model_len设个上限,比如2048,能省出不少显存。另外,你提到的FP16其实可以换成FP8,A100虽然不支持原生FP8计算,但存储上能省一半,配合vLLM的FP8 KV Cache特性,基本能把OOM问题解决掉。
至于量化,INT4确实是最稳的解法,尤其是用AWQ或GPTQ这种精度损失极小的方案。我自己跑过70B的INT4版本,在MMLU这类基准上掉点只有1%以内,对生产场景的语义理解影响可以忽略。但你要是对生成质量特别敏感,比如做代码生成或数学推理,INT8会更保险,速度也就比FP16慢个10%左右,完全在100ms预算内。
换H100的话,除非你预算充足且需要同时跑多个70B实例,否则真没必要。H100的FP8算力强,但A100通过量化加优化后,单卡都有机会跑到50ms内,关键是你要把vLLM的continuous batching调好,别让空闲序列占着显存不干活。
最后问一句,你试过PagedAttention的v2版本吗?新版对长序列的显存管理优化很明显,特别是处理高并发请求时,比老版本稳得多。要是还崩,建议看看是不是微调时padding或特殊token导致序列长度异常,有时候问题不在框架,在模型本身。
4卡80G跑70B FP16,理论显存是够的,但OOM基本都出在KV Cache和临时张量上。你试过把max_num_seqs压到8以下吗?我之前遇到类似情况,把并发砍到4,再用paged attention,稳定性好了很多,但吞吐确实下降明显。如果100ms延迟是硬指标,量化可能是更实际的路——INT8用AWQ或GPTQ,精度损失在0.5%以内,但显存能省一半,而且vLLM对INT8支持已经很成熟了。INT4的话,虽然能塞进单卡,但激活值精度掉得厉害,特别是长上下文场景,很容易出现幻觉或重复生成。建议先跑一遍你们微调数据集的评估集,对比量化前后的BLEU和准确率,如果误差在1%以内就直接上INT8。H100就别想了,成本翻倍,除非你们业务量真的大到需要那么多并发。另外可以看看flash attention和continuous batching是不是都开了,这俩对显存占用影响很大。最后一个小技巧,把输入序列长度限制在2048以内,很多OOM其实是长序列导致的KV Cache爆炸。
4卡80G跑70B FP16本来就紧巴巴的,KV Cache一涨必炸。我建议先试AWQ或GPTQ的INT4,配合vLLM的tensor parallel,显存能压到一半以下,速度反而可能比FP16更稳。100ms延迟的话,INT4在A100上通常问题不大,关键看你任务对精度的敏感度,建议拿你的微调数据做个离线评测对比下。另外别只盯着量化,检查下max_model_len是不是设太高了,砍到2048或4096能省不少缓存。