最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条两张A100的话试试vLLM加张量并行,4bit量化实际效果还行,别太担心掉点。
4bit量化实际用下来效果还行,特别是推理场景,bleu掉个零点几但显存直接砍到40G以内,两张A100完全够。ZeRO-3倒是没必要,70B用张量并行加流水线并行更省事,vLLM或者TGI都支持,你直接照官方文档配就行。不过要注意KV cache也得算进显存,长上下文时候容易爆,建议把max-length调低点。另外bitsandbytes加载时候记得用load_in_4bit=True加bnb_4bit_compute_dtype=float16,不然速度会慢得你想砸电脑。
4bit量化其实没你想的那么玄乎,Llama.cpp或者GPTQ跑起来效果挺稳的,日常对话基本看不出掉点,除非你做严格评测。两张A100的话直接上张量并行就行,不用非得ZeRO-3,vLLM或者TGI都原生支持,配置起来比你想的简单。另外可以把KV cache换成8bit,能省不少显存,跟量化叠加效果更明显。先试试4bit加张量并行的组合,应该能流畅跑起来。
70B上4bit基本不咋掉点,两张A100用vLLM开张量并行最省事。
4bit量化真没那么玄乎,跑推理日常用够够的,双卡ZeRO-3或者干脆vLLM加张量并行更省心。
说实话4bit量化掉点没想象中那么狠,尤其推理场景下用GPTQ或者AWQ,70B模型压到40G左右完全能跑,A100单卡都够了。你两张卡的话,更推荐vLLM或者TensorRT-LLM,这俩对显存管理优化得很好,比裸跑PyTorch省太多了。ZeRO-3不是每个卡存完整副本,是把参数切碎分到各卡上,但通信开销会大点,推理场景不如张量并行来得直接。另外可以试试offload到CPU,虽然慢但至少能跑起来,应急挺好。
说实话4bit量化没你想的那么玄乎,LLaMA这类模型用bitsandbytes的NF4格式跑推理,体感上跟FP16差距很小,尤其你只是做生成任务的话。两张A100的话,其实不用非得走ZeRO-3,试下vLLM或者TensorRT-LLM,它们对KV cache的优化特别狠,80G两张卡配合张量并行应该能塞下70B。另外记得开flash attention,这玩意儿能省不少显存,我上次跑33B模型直接少吃了快20G。你要是实在担心掉点,可以先拿量化后的模型跑几个测试样本对比一下,再决定要不要上更复杂的方案。
两张A100跑70B其实挺尴尬的,FP16光权重就超了,但直接上4bit又怕效果崩。我最近试过bitsandbytes的NF4量化,配合double quant,推理速度倒是能接受,但生成质量确实有点波动,尤其是长文本和复杂逻辑推理时,偶尔会出现明显的不连贯。你如果只是做demo或者测试,可以试试,但要是生产环境,我建议别省这个钱。
另外DeepSpeed ZeRO-3做推理的话,不是每张卡放完整副本,而是把参数分片到各卡上,但运行时需要频繁通信,两张卡的话带宽可能会成为瓶颈。你其实可以试试vLLM或者TensorRT-LLM,它们对KV cache做了优化,配合张量并行,两张A100勉强能跑起来,就是得把batch size压得很小。
还有个土办法,用CPU offload,把部分层放到内存里,但速度会慢到怀疑人生,除非你只是要验证流程。我个人觉得性价比最高的方案还是4bit量化加张量并行,掉点在小模型上可能明显,但70B这种规模,冗余度其实挺高的,实际效果未必差。你跑个困惑度对比测试看看,如果掉的在可接受范围内,就直接上吧。
说实话你这配置已经比大多数人强了,双卡A100绝对够玩,关键看怎么调度。我前段时间刚用vLLM把70B跑在两张80G上,FP16确实塞不下,但换AWQ或GPTQ的4bit量化后,单卡权重能压到40G以内,两张卡做张量并行完全没压力,速度比FP16还快一截,掉点说实话在生成任务上体感不明显,除非你做数学推理或代码生成这种对精度极敏感的场景。
bitsandbytes的4bit我试过,优点是省事,load_in_4bit直接能用,但推理速度比GPTQ慢不少,而且和DeepSpeed的ZeRO-3配合起来有点别扭——ZeRO-3是分片模型,不是每卡复制完整副本,但你需要额外处理通信开销,两张卡的话其实更推荐直接用张量并行,比如accelerate的device_map=auto或者vLLM的tensor_parallel_size=2,代码改动量最小。
另外你提到的KV cache,80G卡跑70B 4bit时,上下文长度控制在2048以内,显存还能剩20G左右,够用。如果非要长上下文,可以试试FlashAttention-2或者PagedAttention,能省不少激活内存。工具链的话,我建议直接上vLLM,吞吐量比原生PyTorch高一个量级,而且自带continuous batching,不用自己手撸调度。
最后说下量化方案选择,如果你追求极致速度就AWQ,如果图省事就用GPTQ的预量化权重,很多开源模型都直接给好了。别碰smoothquant那种训练后量化,部署麻烦收益还小。至于掉点问题,4bit下perplexity大概涨0.3到0.5,但你要跑RAG或者Agent流程,这个误差完全可接受。
两张A100的话其实不用太慌,70B FP16确实超了,但4bit量化后的模型大概40G出头,单卡就能塞下,bitsandbytes的NF4格式在推理任务上掉点基本在1-2个点以内,除非你跑的是需要高精度的生成任务,否则体感差别不大。我之前试过用QLoRA微调7B和13B,4bit下效果挺稳的,70B推理的话你甚至可以试试把模型切到CPU offload,用accelerate的device_map="auto"让部分层跑到内存里,速度慢点但能跑起来。至于DeepSpeed ZeRO-3,它不是每张卡存完整副本,而是把参数、梯度和优化器状态分片到所有卡上,推理时通过通信把需要的权重临时聚合起来,所以两张卡加起来能用的显存就是160G,但要注意通信开销会拖慢速度,尤其是小batch时。性价比最高的方案我建议先试4bit量化加单卡推理,如果速度能接受就不用折腾多卡了,实在不行再上张4090或者租个云GPU,毕竟两张A100跑70B的ZeRO-3,吞吐量可能还不如一张卡量化后快。另外可以看下vLLM或者TGI,它们对量化模型支持得比较好,而且有PagedAttention管理KV cache,能省不少显存,比你手动调要省心。
巧了,我上周刚折腾完类似的事,70B FP16单卡确实无解,但你这情况其实不用太慌。bitsandbytes的4bit量化我实测过,在LLaMA-70B上困惑度大概涨1.5到2个点,生成质量看任务,写代码和短问答基本没差,长文本推理偶尔会冒点小毛病,但绝对比跑不起来强。你要是追求保险,可以试下GPTQ的4bit,比bitsandbytes稳一点,就是量化时间长,得等个把小时。两张A100的话,我强烈建议你别上ZeRO-3,那个主要是训练用的,推理时每张卡确实会存完整参数副本,反而更吃显存。你直接上vLLM或者TensorRT-LLM,它们支持张量并行,把模型按层切到两张卡上,配合FP16或者INT8,80G*2跑70B是够的,KV cache还能留不少空间。不过vLLM对LLaMA的支持比较新,最好用最新版,老版本有bug。另外你还可以考虑offload到CPU,用accelerate库的device_map="auto",但速度会慢一半,适合只做离线批量推理。工具链我推荐先试vLLM,文档全,社区活跃,遇到问题好搜。你手头有HuggingFace的模型缓存吗?如果之前下载过,直接改个加载参数就行,不用重新下。
别急着上4bit,bitsandbytes的NF4配合双卡其实够用,我试过LLaMA-70B在两张A100上跑,量化后掉点大概在1-2%以内,做生成任务完全能接受。ZeRO-3不是每卡存完整副本,是切分参数,但推理时通信开销不小,建议直接上vLLM或者TensorRT-LLM,支持张量并行,两张卡正好各放一半。另外你可以试试把KV cache换成FP8或者量化到8bit,能省不少显存,中间激活用gradient checkpointing也能压一压。
说实话你这个情况我太懂了,之前我拿两张3090试跑70B的时候也是折腾到怀疑人生。bitsandbytes的4bit量化其实没那么吓人,推理场景下掉点基本在1-2个点以内,尤其是LLaMA这种大模型,量化后的困惑度变化肉眼几乎看不出来,关键是fp16的130G直接变35G左右,单卡都能勉强塞进去了。但你要注意,4bit量化之后KV cache反而会占更多显存,因为需要额外存储量化参数,所以建议配合vLLM的PagedAttention一起用,它能动态管理缓存,比原生transformers省不少。至于DeepSpeed ZeRO-3,它每个卡确实会存完整模型分片,但不是副本,是切分后的部分权重,推理时需要频繁的all-gather通信,两张卡的话通信开销会吃掉不少性能,不如直接用张量并行,比如用accelerate的device_map='auto'配合模型并行,把每层切成两半分别放到两张卡上,这样KV cache和激活也能跟着分摊。另外还有个野路子,你可以试试llama.cpp的GGUF格式,用CPU+GPU混合推理,把一部分层offload到内存,虽然慢但至少能跑,适合先验证效果。最后建议你优先试试vLLM+4bit量化的组合,两张A100跑70B应该能稳定跑到10 tokens/s左右,比想象中流畅不少。
双卡A100的话直接上vLLM+张量并行就够了,70B FP16拆到两张卡正好每张65G左右,KV cache还能留不少空间。4bit量化掉点其实没你想的那么夸张,尤其是只做推理的话,拿GPTQ或AWQ量化完基本能保住90%以上的效果,但你要是跑生成任务最好还是先用小规模测试集对比下。ZeRO-3那个是训练用的,推理场景用张量并行更省显存,每张卡只存自己的那部分权重,不需要完整副本。另外可以看看llama.cpp的GGUF格式,Q4_K_M量化大概40G出头,单卡都能跑,就是速度慢点。
两张A100跑70B,试试vLLM加张量并行,FP16下勉强够,不用折腾量化掉点。
4bit量化掉点没你想的那么玄乎,70B跑起来流畅度优先的话直接上AWQ,两张A100分片推理完全够用。
说实话你这情况我上个月刚踩过一遍坑,A100 80G单卡跑70B FP16就是纯纯的折磨。bitsandbytes的4bit量化其实没那么玄乎,我试过LLaMA-70B,困惑度掉得不多,大概在1-2个点以内,但推理速度会慢一些,因为反量化有开销。如果你只是做测试或者demo,这方案最省事,三行代码就能改完。
不过你要是追求速度,还是建议上模型并行,两张A100刚好能塞下FP16的70B,关键是别用ZeRO-3,那个主要是给训练用的,推理时每张卡确实会存完整副本,但更蛋疼的是通信开销巨大,慢到你怀疑人生。推荐直接用张量并行,比如vLLM或者TensorRT-LLM,它们把transformer层切分到两张卡上,KV cache也是分布式存的,效果立竿见影。
另外有个偏方,如果你能容忍一点延迟,可以用offload到CPU内存,配合accelerate库的device_map参数,让不常用的层睡在内存里,显存只需要放活跃层,这样单卡也能跑,但速度会掉到每秒几个token,适合应急。
还有个小细节,你提到中间激活爆炸,其实可以试试gradient checkpointing,虽然推理时用不上,但有些框架支持激活重计算,能省不少显存。最后提醒下,两张卡最好用NVLink连着的,不然PCIe带宽会卡死你。我目前就在用vLLM跑4bit量化版的70B,效果和速度平衡得还不错,你可以先拿这个当baseline试试。
4bit量化其实没你想的那么玄乎,跑推理的话体感掉点很小,尤其LLaMA这种大模型,用GPTQ或者AWQ比bitsandbytes稳,建议直接上AutoGPTQ,两张A100加量化肯定能塞下。ZeRO-3做推理倒是不用每卡完整副本,参数会被分片,但通信开销挺大,不如直接上vLLM或者TensorRT-LLM,它们对KV cache优化好得多,你这两张卡跑70B量化后应该挺流畅的。顺便问下你打算部署成服务还是本地脚本?如果是服务,vLLM的PagedAttention真的能救大命。
4bit量化没你想的那么吓人,llama.cpp或者GPTQ跑70B,体感质量也就比FP16稍微糊一点,做demo完全够用。不过bitsandbytes那个4bit是混合精度加载,速度会比GGUF慢不少,我建议你直接上vLLM加AWQ量化,两张A100拼起来跑70B很稳。另外ZeRO-3不是每个卡存完整模型,是分片存的,但推理时通信开销大,不如张量并行来得直接。你试过用transformers的device_map=auto吗?配合accelerate应该能自动把层切到两张卡上,先跑通再优化。
4bit量化实测掉点能接受,两卡上vLLM张量并行最省事,直接改下参数就能跑。