最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条两张A100的话其实不用太慌,FP16塞不下很正常,70B光权重就130G,单卡80G肯定爆。我建议你先别急着上4bit量化,那个对推理质量影响确实有,尤其生成长文本时能感觉到明显变笨。你可以试试先用bitsandbytes的8bit加载,配合CPU offload,把部分层放到内存里,这样单卡勉强能跑,速度慢点但至少能验证流程。至于DeepSpeed ZeRO-3,它做推理时不是每卡装完整副本,而是把参数分片到各卡,但需要注意它默认会为每层保留全量计算图,实际显存占用比想象中高,你可以开offload_optimizer和offload_param把状态量扔CPU。还有个野路子,用vLLM或TensorRT-LLM,它们对KV cache和中间激活做了极致优化,70B在80G上能压到勉强跑,但需要自己导出engine,有点折腾。另外你说的模型并行,其实两卡用张量并行最实在,把每个transformer层切成两半分别放两张卡,但通信开销大,建议用NVLink直连的卡,不然带宽会卡脖子。最后提醒下,如果只是做测试,可以试试llama.cpp的GGUF量化,5bit精度下70B能压到40G左右,单卡就能跑,虽然速度慢但胜在简单。
两张A100的话直接上vLLM或TensorRT-LLM做张量并行就行,70B FP16拆到双卡刚好卡在边缘,记得把KV cache也分片。bitsandbytes的4bit确实会掉点,但你要是跑对话或代码生成这种任务感知不强,我试过用GPTQ量化后速度反而比FP16快。ZeRO-3是训练用的,推理别碰它,每卡塞完整副本纯粹浪费带宽。另外可以把max sequence length截短点,中间激活能省不少显存。
4bit量化实际效果没想象中那么吓人,LLaMA系模型在量化后困惑度变化很小,尤其是推理场景下完全能接受,不过bitsandbytes对70B的加载速度会慢不少,建议配合vLLM用。ZeRO-3不是每卡放完整副本,而是把参数切到各卡上,但推理时通信开销很大,两张卡反而可能比单卡更慢。我自己的经验是先用GPTQ量化到4bit,再把KV cache做一下offload,70B基本能塞进双卡。另外可以看看llama.cpp的GGUF格式,CPU+GPU混合跑有时候比纯GPU还稳。
其实你这个问题我踩过坑,FP16加载70B就是给自己找罪受,换AWQ或者GPTQ的4bit权重,单张80G就能勉强跑起来,只是上下文长度得限制一下。双卡的话别急着上DeepSpeed,试试张量并行,比如用accelerate的device_map自动切分,效果比ZeRO-3直观得多。KV cache实在爆了可以开sliding window或者用vLLM的paged attention,内存占用能省一半。掉点问题不用太焦虑,4bit下生成质量还是够用的,除非你要做精细的数学推理。
两张A100的话,我建议别纠结单卡塞下了,直接上模型并行,但别用DeepSpeed,
两张A100的话其实不用太慌,70B FP16纯参数确实130G,但你把KV cache和激活算进去,单卡肯定爆,这是正常的。我建议你先别急着上4bit,试试看把模型切成int8,用bitsandbytes的LLM.int8(),实测下来掉点几乎可以忽略,尤其是推理任务,比4bit稳太多。至于DeepSpeed ZeRO-3,它不是每张卡装完整副本,而是把参数、梯度和优化器状态都分片打散到所有卡上,推理时只加载当前层需要的权重,所以两张卡加起来80G显存理论上能塞下,但通信开销会让你速度慢得怀疑人生,尤其是单batch推理。如果你只做离线批量推理,可以试试vLLM或TGI,它们支持张量并行,把模型切成两半分别放两张卡,配合FP16,每张卡大概要65G左右,加上KV cache刚好卡在80G边缘,得把max sequence length调小一点。4bit的话,GPTQ或者AWQ都比bitsandbytes的bnb4bit效果好,掉点大概在1-2个perplexity以内,但你要装对应的量化库,还得重新生成量化后的权重文件,稍微折腾点。最后提醒一句,别光看显存,两张A100的NVLink带宽够不够也影响效率,如果卡间通信是PCIe,那ZeRO-3基本别想了,老老实实张量并行吧。
两张A100的话直接上vLLM+张量并行吧,4bit量化掉点真没那么吓人,跑起来比折腾ZeRO-3省心多了。
说实话你这个问题我太有共鸣了,当初我也在70B上卡了好久。4bit量化掉点这事得分任务看,如果是通用对话或者代码生成,体感上基本没啥差别,但你要是做数学推理或者需要精确输出的场景,确实能感觉到逻辑变笨了一点点。bitsandbytes的NF4配合双卡,两张A100跑70B其实挺稳的,关键是把load_in_4bit=True设好,再配合device_map="auto",它自己会切分到两张卡上,不需要手动写并行逻辑。至于DeepSpeed ZeRO-3,它不是为了推理设计的,训练时每个卡确实会存完整状态,但推理时其实有ZeRO-Inference模式,参数会被分片到各卡,不会每个卡都放完整副本,不过配置起来有点麻烦,不如直接用vLLM或者TensorRT-LLM来得省心。我个人最推荐的组合是:先用GPTQ量化到4bit,模型体积直接降到35G左右,两张卡随便塞,KV cache也绰绰有余,再用vLLM做推理,吞吐量比原生HuggingFace pipeline高好几倍。对了,你还可以试试把max_seq_len限制在2048以内,很多场景根本用不到那么长的上下文,能省出不少显存给激活值。我自己的经验就是别一上来追求完美精度,先跑通流程,等确认效果可接受再慢慢调优。
4bit量化掉点没你想的那么吓人,尤其纯推理场景,LLaMA这种大模型用bitsandbytes的NF4格式基本能保持90%以上效果,你可以先拿它跑通流程再考虑精度。两张A100的话其实不用上ZeRO-3,直接张量并行更省事,比如用vLLM或者TensorRT-LLM,它们对多卡推理支持很成熟,KV cache和激活也不需要你操心。唯一要注意的是显存别抠太死,给推理引擎留点缓冲,不然并发一高容易OOM。你试过把输入序列长度限制一下吗?有时候长上下文才是显存杀手。
说实话你这情况我太熟了,之前我拿两张3090跑65B的时候也是愁得掉头发。4bit量化掉点这事儿真得看具体任务,我试过用bitsandbytes的NF4配双卡跑,生成代码和写文档基本感觉不出差别,但你要是做数学推理或者多步逻辑那种,确实能察觉到精度下滑。我个人建议是优先考虑AWQ或者GPTQ,这俩对敏感层保护得更好,而且现在vLLM直接支持,比你自己折腾DeepSpeed省心多了。
ZeRO-3那个问题我得纠正一下,它不是每张卡装完整副本,而是把参数、梯度、优化器状态全切碎分到各卡上,推理时按需聚合,所以显存占用能压到很离谱的程度。但代价是通信开销大,两张卡之间走PCIe的话延迟会很难受,我试过速度慢得想摔键盘。你要是真想省事儿,直接上vLLM加tensor parallel,两张A100切分70B的权重,再配个FP16的KV cache offload,实测能跑起来,速度虽然不快但至少稳。
还有个小窍门,你把max sequence length调短点,比如默认2048改成512,KV cache能省出一大块空间。另外那个transformers的low_cpu_mem_usage=True记得加上,加载时能省不少临时显存。工具链的话,我现在主力是llama.cpp配合Q4_K_M量化,单卡都能勉强跑,双卡反而没优势。你要是不嫌麻烦,可以试下ExLlamaV2,它那个量化+缓存优化做得挺极致,两张卡跑70B应该比我之前那套顺滑。
两张A100的话其实不用太慌,我最近刚用vLLM配合AWQ 4bit量化跑过70B,单卡就能塞下,推理速度也还行,掉点基本在可接受范围内,尤其如果只是做对话生成的话体感不明显。ZeRO-3那个理解有误,它主要是把参数切分到多卡,不是每卡存完整副本,但推理时通信开销会比较大,反而可能不如直接上量化省心。你可以先试试GPTQ或者AWQ量化,配合vLLM或者TGI这类推理框架,比bitsandbytes更成熟,内存占用直接砍半,两张卡跑起来绰绰有余。另外记得关掉梯度计算,用torch.inference_mode(),能再省点显存。
双卡ZeRO-3跑70B其实够用,4bit量化掉点没那么吓人,先试awq或gptq,省心很多。
我上次用vllm+张量并行,两张A100跑70B还挺稳的,KV cache也够,你可以试试这条路。
你这个情况我之前也踩过坑,两张A100的话直接上DeepSpeed ZeRO-3 + offload到CPU,比bitsandbytes的4bit省心很多,后者掉点尤其在长上下文场景下挺明显的。另外可以试试vLLM或者TGI,它们对KV cache的优化很到位,但要注意显存碎片问题。我现在的方案是AWQ量化(4bit)配合张量并行,效果比FP16+ZeRO还稳,不过得先确认下你的推理框架支不支持。
试试GPTQ的4bit量化吧,配合vLLM跑两张卡,效果比bitsandbytes稳多了,掉点基本可接受。
70B用两张A100的话,模型并行比ZeRO-3更省显存,你可以看看DeepSpeed的inference模式,不用装完整副本。
两卡ZeRO-3加4bit量化完全能跑,掉点基本感知不到,别上FP16硬扛了。
说实话你这个问题我上个月刚踩过一遍坑,两张A100跑70B其实有救,但别指望FP16硬扛。我最后是用的GPTQ 4bit量化加vLLM部署,单卡就能塞下,显存占用大概40G出头,剩下来的空间给KV cache,速度比bitsandbytes的4bit快不少,而且掉点基本可以忽略,尤其是做生成任务的时候。如果你担心量化影响太大,可以试试AWQ,它针对敏感层做了保护,效果更稳一点。
DeepSpeed ZeRO-3那个理解有点偏差,它不是每卡装完整副本,而是把参数、梯度、优化器状态全部分片到各卡,推理时通过通信按需聚合,所以两张卡合起来能用的显存是接近累加的。不过说实话,ZeRO-3配推理有点杀鸡用牛刀,配Inference Engine或者直接上TensorRT-LLM会更省心。我个人建议你先上vLLM加GPTQ,四行代码就能跑起来,如果之后要上生产再考虑换FasterTransformer。
另外你提到中间激活的问题,可以把max_seq_len限制到2048或者用PagedAttention,vLLM对这块优化做得很好,基本不用手动管。还有个小技巧,加载时用low_cpu_mem_usage=True,避免加载过程中显存和内存互相挤爆。要是还想再压榨点性能,可以试试把模型切成两半用张量并行,两张卡各放一层,这个用transformers的device_map="auto"就能自动分配,但通信开销得自己调一下。总之别急,这个配置跑起来完全可行,就是得接受量化这个必经之路。
说实话4bit量化没你想的那么吓人,7B上感觉掉点不明显,70B上我也试过,主要看任务,生成质量稍微糊一点但完全能接受。你两张A100的话,我建议直接上vLLM配合张量并行,把模型切成两半各占一张卡,比DeepSpeed省心多了,ZeRO-3那个是每个卡存分片,推理时反而通信开销大。另外记得开flash attention,能省不少显存,我上次跑65B的模型,加了这个之后KV cache压力小了很多。工具链的话可以看看ExLlamaV2,对量化模型支持很好,加载速度也快。
两张A100上ZeRO-3跑70B其实挺稳的,4bit量化掉点看任务,生成类的基本能接受。
直接试试vLLM+AWQ量化,两张卡张量并行就能跑,省心不少。
4bit量化掉点没想象中严重,推理场景完全够用,两张A100用ZeRO-3跑70B挺稳的。
说实话你这情况我上个月刚趟过一遍,两张A100跑70B其实没你想的那么绝望。4bit量化掉点得看任务,我拿llama.cpp的Q4_K_M试过,生成质量在对话场景下体感损失很小,但你要是做代码生成或者数学推理,精度下降会比较明显,建议先用bitsandbytes的NF4配合double quant,效果比普通int4稳不少。至于DeepSpeed ZeRO-3,它跟你想的不一样,不是每卡放完整副本,而是把参数、梯度和优化器状态切碎分到各卡上,推理时只有当前层需要的参数会被临时聚合,所以显存占用其实能压到很低,但通信开销会上去,两张卡互联如果是NVLink还好,PCIe的话延迟会有点难受。还有个野路子是vLLM配合张量并行,它把attention和FFN按头切分,比ZeRO-3更适合纯推理场景,吞吐量也高,就是配置起来稍微麻烦点。另外别忘了开flash-attention,能省不少KV cache的显存,再配合torch.compile,碎片化内存能少一大截。要是还想省事,干脆用exllamav2的量化版,它专门为推理优化过,单卡勉强能跑,速度还凑合。最后建议你实际跑一下lm-evaluation-harness对比下量化前后的困惑度变化,别光听别人说,自己心里有个数。
两张A100的话其实不用太慌,我之前试过用ZeRO-3跑70B,它并不是每张卡放完整副本,而是把参数、梯度和优化器状态分片打散到各卡上,推理时按需聚合,所以你两张卡加起来能用的显存接近160G,只是通信开销会有点大,需要调一下stage3的参数比如prefetch距离。至于bitsandbytes的4bit,说实话掉点情况得看任务,如果是生成类或者对话场景,体感损失不算离谱,但如果你要做精确的数学推理或者长上下文检索,那精度下降会明显到影响结果。我建议你可以先试试8bit加载加CPU offload,把部分层塞到内存里,速度慢点但能跑通,然后再决定要不要上4bit。另外还有个思路是vLLM或者TensorRT-LLM,它们对KV cache做了优化,同样显存下能塞更大模型,而且支持多卡张量并行,比DeepSpeed的通用方案更省心。不过你提到不想买新卡,那其实最划算的路径可能是先用GPTQ量化到4bit,然后配合张量并行,两张卡跑起来应该没问题,就是需要花点时间调好量化校准集。最后提醒下,如果只是做推理不做训练,完全不需要ZeRO,直接用accelerate的device_map="auto"加load_in_4bit=True,它会自动把不用的层offload到CPU,代码改动最小,适合先跑通再说。
你这配置其实不用慌,4bit量化掉点没想象中那么狠,尤其推理场景下用bitsandbytes的NF4格式,基本能保住90%以上的效果。两张A100的话,直接上DeepSpeed的ZeRO-3 + offload到CPU,比模型并行省事多了,不用手动切层,每张卡只存分片,KV cache也能匀着放。要是嫌配置麻烦,试试vLLM或者TGI,它们自带PTQ和paged attention,70B塞进双卡很轻松,就是记得把max sequence length调低点,省下内存给激活值。我之前用类似配置跑过,延迟也就比单卡慢个20%左右,完全能接受。