最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条双卡A100的话直接上张量并行(比如用accelerate或者vLLM)比ZeRO-3省心,后者虽然省显存但通信开销大,推理延迟反而可能更高。4bit量化日常对话场景掉点不明显,但代码生成或数学推理会露馅,建议先用GPTQ量化试试,bitsandbytes的NF4稍微稳一点。另外可以看看llama.cpp的GGUF格式,配合双卡跑70B其实挺能打的,虽然速度一般但至少能跑。
4bit量化掉点没想象中严重,跑70B推理足够,先试bitsandbytes加CPU offload,两张A100能凑合跑起来。
说实话你这情况我太懂了,之前我拿两张4090试70B的时候也是折腾到怀疑人生。量化肯定掉点,但4bit的NF4配合GPTQ校准之后,实际生成质量损失很小,尤其是对话场景基本感觉不出来,关键是你能把显存压到40G左右一张卡。不过bitsandbytes的4bit推理速度会慢一些,如果你对延迟有要求,建议先试试8bit,效果更接近原版。至于DeepSpeed ZeRO-3,它其实是把模型参数切分到各卡上,不是每张卡存完整副本,推理时会有通信开销,但两张A100跑70B还真得靠这个,或者你直接上vLLM+张量并行,那个对推理优化更友好。我自己的做法是先用GPTQ量化到4bit,再用vLLM的tensor-parallel=2,单卡占用能压到35G左右,速度还能接受。另外你记得把KV cache也量化一下,或者用PagedAttention减少碎片,能再省个几G。要是怕麻烦,HuggingFace上有很多现成的AWQ或GPTQ量化版模型,直接拉下来跑就行,别自己从头搞。
4bit量化掉点没你想的那么夸张,chat场景基本够用,两张A100跑70B用GPTQ+张量并行最稳。
试试vLLM吧,张量并行直接怼,FP16两张卡刚好够,省心还快。
4bit量化日常用够的,掉点没想象中恐怖,两张A100上vLLM张量并行跑70B挺稳。
双卡A100的话直接上vLLM+张量并行就行,代码改动很小,吞吐比ZeRO-3省心多了。4bit量化掉点其实看任务,常识问答基本无感,但代码生成或数学推理可能会明显变笨,建议先用GPTQ量化试试效果。另外可以开flash attention和continuous batching,能省不少显存,实测能把70B的KV cache压进80G里。
4bit量化跑70B掉点其实能接受,关键是选对工具,试试GPTQ或者AWQ。两张A100用DeepSpeed推理模式加KV cache offload,基本能跑起来。
4bit量化在70B上实际效果还行,日常对话基本看不出掉点,但如果你要跑代码生成或者数学推理,精度损失会明显一些。两张A100的话,建议直接试下vLLM+张量并行,不用上DeepSpeed那么重,把模型切两半各占一张卡,显存压力小很多,吞吐也高。另外记得开KV cache的量化,能省不少显存。如果还想省事,试试llama.cpp的GGUF格式,Q4_K_M大概40多G,单卡就能跑,就是速度慢点。
直接上AWQ或GPTQ的4bit量化,70B能压到40G内,两张A100张量并行随便跑,掉点基本可忽略。
说实话你这情况我太理解了,当初我折腾65B的时候也是差点把头发薅光。你这俩A100其实挺尴尬,单卡塞不下,但两张卡又刚好卡在临界点。我建议你先别急着上4bit,试试看把FP16改成8bit动态量化,加上bitsandbytes的LLM.int8(),实测下来掉点基本能控制在1%以内,比4bit稳多了。至于KV cache,可以试试PagedAttention或者vLLM,它对显存的利用效率比原生HuggingFace实现高不少,能省下好几G。DeepSpeed ZeRO-3的话,模型权重是分片的,不是每卡完整副本,但推理时会有个all-gather的通信开销,两张卡互联带宽不够的话反而可能更慢。你不如直接上张A100 80G,用fairscale的fully_sharded模型并行,配合activation checkpointing,70B勉强能跑,虽然慢点但至少不爆显存。还有个小技巧,把输入序列长度限制在2048以内,或者用FlashAttention-2,中间激活能省一半。要是实在不行,就退一步用70B的量化版,比如TheBloke的GPTQ或者AWQ版本,4bit确实会有轻微质量下降,但聊天场景下基本感知不到。反正别买新卡,先用工具榨干现有硬件,跑通了再考虑优化。
两张A100可以试试vLLM+张量并行,4bit量化打游戏够用,推理掉点真没那么玄乎。
4bit量化掉点没那么吓人,跑起来先试试AWQ或GPTQ,比bitsandbytes稳多了。两张A100上ZeRO-3加offload基本能救,但记得开KV cache offload。
说实话4bit量化现在成熟度挺高的,70B掉点基本在可接受范围,尤其是推理场景,用bitsandbytes的NF4格式配合双卡其实是最省事的。ZeRO-3不是每卡装完整副本,而是把参数切分到各卡上,但推理时通信开销会有点大,建议直接上vLLM或者TGI,它们对量化+张量并行的支持更省心。另外你这两张A100其实可以试试把模型切成两半做张量并行,配合FlashAttention,激活值压力会小很多,比硬塞FP16靠谱。
顺便问下你跑的是对话还是生成任务?如果长文本的话,KV cache这块可以试试PagedAttention,能再省不少显存。
说实话你这情况我太熟了,之前我拿两张4090试70B的时候也是这个鬼样子。4bit量化其实没那么吓人,像GPTQ或者AWQ这种方案,推理质量掉得真不明显,尤其是做chat或者文本生成,体感上跟FP16差距很小,但显存能直接砍到40G左右,你这80G单卡反而能塞得下。bitsandbytes的NF4虽然方便,但速度慢点,而且有些算子优化没跟上,建议优先试GPTQ。ZeRO-3的话你理解有点偏,它不是每卡放完整副本,而是把参数、梯度、优化器状态切碎了分到各卡,推理时是动态all-gather,所以两张卡能撑起更大模型,但通信开销会拖慢速度,尤其你只有两张卡,PCIe带宽可能成瓶颈。我给你的性价比方案是:先用GPTQ的4bit把模型压到单卡能跑,如果还想上更长上下文,再用DeepSpeed的offload把KV cache甩到CPU内存,代价就是慢一点,但至少能跑起来。另外强烈推荐试下vLLM或者TGI,它们对连续批处理和KV cache管理优化得非常好,比你手动调度省心太多,而且支持量化模型直接加载。你手头这配置,跑70B做离线推理完全够用,别急着买卡,先折腾下工具链。
4bit量化掉点没你想的那么狠,跑推理完全够用,两张卡上Zero-3加offload稳得很,先试bitsandbytes配transformers吧。
双卡ZeRO-3跑70B其实可行,每卡不用完整副本,但速度会慢,建议先试4bit量化,掉点不明显。
双卡A100的话直接上DeepSpeed ZeRO-3 + offload到CPU吧,70B FP16其实能塞进去,就是慢点,但比买卡强。4bit量化我用过bitsandbytes,LLaMA这种模型掉点其实不明显,尤其推理场景,你可以先试NF4那个精度。另外推荐vLLM,它支持张量并行,两张卡刚好,而且KV cache管理比原生transformers高效不少,省下来的显存能多塞点batch。对了,中间激活可以开梯度检查点(虽然推理用不上),但记得把trust_remote_code关掉,别问为什么。
我之前试过类似的情况,4bit量化对70B这种规模其实掉点没想象中那么夸张,尤其推理任务,基本感知不大,但bitsandbytes加载时内存碎片会有点烦。ZeRO-3不是每卡存完整副本,而是把参数切分到各卡,但推理时通信开销不小,两张A100跑70B可能速度会有点憋屈。你不如先试试vLLM加AWQ量化,配合张量并行,两张卡应该能流畅跑起来,KV cache还能省不少。要是追求省事,直接上llama.cpp的GGUF Q4_K_M也行,就是性能比vLLM差一截。
双卡ZeRO-3加4bit量化够用,掉点基本能接受,别上FP16硬扛。
4bit量化实际用下来在70B这种规模上掉点没那么可怕,尤其是跑生成任务,体感差距很小,但显存能压到40G左右,两张A100做张量并行完全够。ZeRO-3不是每个卡装完整副本,它是把参数切分到各卡,推理时按需聚合,不过通信开销会大一些,建议优先试下transformers的device_map=auto配合accelerate,简单很多。另外可以看看vLLM或者TGI,它们对KV cache优化得更好,80G单卡跑4bit的70B甚至能撑住短上下文。