最近在试着把我们微调过的Llama 3 70B模型部署到线上,用的是4卡A100(80G),结果跑推理时总是OOM。模型本身是FP16,但加上KV Cache和一些中间变量,显存直接爆了。试过vLLM、TGI这些框架,调整了max_num_seqs和gpu_memory_utilization,还是偶尔会崩。
想请教下各位,这种情况是量化到INT4/INT8更靠谱,还是得换H100?或者有什么显存优化技巧?另外,生产环境对推理速度有要求(大概100ms内),量化后精度影响大不大?求大佬指点,感谢!
部署70B大模型到生产环境,显存不够怎么办?
全部回复
共 156 条说实话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现在也能跑。
4卡A100跑70B FP16确实挺紧的,光是权重就占140G左右了,剩下那点空间要塞KV Cache和activation,稍微并发上来就炸。我之前也踩过类似的坑,后来发现vLLM里gpu_memory_utilization调到0.9以上反而更容易崩,因为留给CUDA context和碎片的空间不够了,建议压到0.85左右试试。量化这块,INT8对70B来说精度损失基本可以忽略,但INT4就看你任务了,像摘要、翻译这种还行,要是做代码生成或者数学推理,掉点会比较明显。100ms延迟的话得看你的输出长度,如果就几十个token,AWQ INT4加vLLM的continuous batching应该能压住,但要是长输出就悬了。换H100肯定最省心,显存带宽也上去了,不过成本摆在那,可以先试试W4A16的量化方案过渡一下。另外你确认下是不是max_num_seqs给太大了,有时候限一下并发比啥优化都管用。
70B FP16 4卡A100确实悬,试试AWQ INT4量化,精度掉不了多少,100ms有戏。
INT4量化加vLLM基本够用,70B四卡A100跑100ms有点悬,建议先测吞吐再定。
先上INT8量化试试,70B压到单卡能跑,精度掉得不多,100ms应该能扛住。
4卡A100跑70B FP16本来就紧,上INT8量化基本不掉精度,速度也能压到100ms内,先试这个再考虑换卡。
写得挺好,建议补充一些性能数据。
有没有更详细的教程推荐?
4卡A100跑70B确实紧,先上INT8量化试试,精度基本没损失,100ms延迟也扛得住。
4卡A100跑70B FP16本身就挺紧的,KV Cache随并发线性涨,OOM基本是必然的。可以试试AWQ或GPTQ的INT4量化,70B压到40G左右,4卡就很宽裕了,精度损失在绝大多数业务场景里感知不到。100ms延迟这个要求得看你的输入输出长度,量化后吞吐会明显好一些,但单请求延迟还得实测。另外可以看下vLLM的enable_prefix_caching和chunked prefill,对长prompt场景省显存挺明显。
4卡A100 80G跑70B FP16确实紧巴巴的,模型权重就占140G了,剩下180G要扛KV Cache和中间激活,max_num_seqs稍微开大点就容易崩。我之前类似配置试过AWQ INT4量化,权重直接降到40G左右,KV Cache压力小很多,吞吐能翻倍,精度掉得其实没想象中厉害,跑通用对话和摘要任务基本感知不到,但你要是做严谨的代码生成或者数学推理,建议先拿评测集对比一下再上。100ms延迟这个目标得看你的输入输出长度,70B INT4在4卡上单请求首token延迟压到几十毫秒问题不大,但输出token的TPOT才是关键,长输出场景很难稳在100ms内,最好按P99来定SLA。换H100当然爽,FP8原生支持加更大显存,但成本摆在那儿,不如先量化加调vLLM的enable_prefix_caching和chunked_prefill试试,KV Cache这块能省不少。另外可以看看是不是max_model_len设太大了,按实际业务截断能明显缓解OOM。
4卡A100跑70B FP16本来就吃紧,先上INT8量化试试,精度损失一般能接受。