最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条双卡ZeRO-3够用,4bit量化掉点没那么玄乎,先跑起来再说。
你这配置其实挺尴尬的,单卡塞不下,双卡又刚好卡在ZeRO-3的甜点区。我上周刚用两张A100跑过70B的Qwen,直接说结论:别碰bitsandbytes的4bit,那个掉点对生成质量影响挺明显的,尤其是长上下文场景,推理速度还慢得离谱。建议直接上GPTQ或者AWQ的4bit量化,配合ExLlamaV2或者vLLM,两张卡用张量并行就能跑,不用DeepSpeed那套,省心很多。
ZeRO-3不是每张卡装完整副本,它是把参数切碎分到各卡上,但推理时每层都要走一遍通信,延迟会高不少。而且你只有两张卡,通信开销占比太大,实际吞吐可能还不如单卡量化后硬跑。真要保精度,可以试试FP8混合精度,现在Hopper架构对FP8支持很好,显存能压到70G左右,两张卡刚好能塞下,但需要手动改模型加载逻辑。
我自己的经验是,先用lm-eval-harness跑几个基准测下量化后的掉点幅度,如果任务对困惑度不敏感,AWQ 4bit基本能接受。另外别忘了把KV cache用PagedAttention,vLLM里默认就是,能再省个20%显存。最后提醒一句,如果只是做demo或者本地测试,可以用llama.cpp的GGUF格式,双卡CPU+GPU混合加载,虽然慢但至少能跑起来。
4bit量化掉点没你想的那么夸张,特别是推理场景下70B模型用bitsandbytes的NF4格式,体感上基本能接受。两张A100的话,其实不用上ZeRO-3那么重,直接试试张量并行(tensor parallelism)就够了,比如用vLLM或者TensorRT-LLM,它们对多卡推理支持得挺成熟的。另外KV cache这块可以开一下KV量化,能省不少显存。你要是懒得折腾,直接上llama.cpp配合Q4_K_M量化,单卡80G跑起来都没问题,就是速度比A100原生推理慢点。
两张A100做FP16推理70B确实有点极限,不过你的方向其实挺明确的。我最近刚用bitsandbytes的4bit量化跑过65B的模型,说实话掉点没想象中那么夸张,尤其是推理任务上,跟FP16比差距基本在可接受范围内,但如果你要做生成质量要求高的任务,建议还是用8bit加AWQ或者GPTQ,那个会更稳一点。DeepSpeed的ZeRO-3推理其实不是每个卡都放完整副本,它是把参数分片到各卡上,但推理时会有通信开销,两张卡的话带宽可能成为瓶颈,所以更推荐你用张量并行,比如用accelerate的device_map自动切分,或者直接上vLLM,它对KV cache和显存管理优化得特别好,4bit量化加vLLM基本能跑起来。另外你提到中间激活的问题,可以试试gradient checkpointing或者flash attention,能省不少显存,虽然推理时用不太上,但部署时有些框架会默认开启。工具链的话,我建议直接看transformers加bitsandbytes加flash-attn的组合,或者用exllama,专门为量化推理设计的,效率很高。你手头两张卡的话,也可以试试tensor parallel加4bit,理论上能塞下,但速度可能不如单卡量化后跑得快,毕竟跨卡通信开销不小。你先用GPTQ量化到4bit试试,单卡80G应该能跑起来,实在不行再上多卡,别急着买新卡,我这边130G参数用4bit加flash-attn大概只要50多G显存。
说实话你这个问题我上个月刚踩过一遍坑,两张A100跑70B其实完全可行,但别指望FP16硬塞。我最后用的是GPTQ的4bit量化,配合vLLM做推理,单卡就能塞下,而且显存占用大概在45G左右,还能留出空间给KV cache。你说bitsandbytes会不会掉点,我实测下来4bit在生成任务上跟FP16的差距在可接受范围内,尤其是对话场景,除非你做严格评测否则基本感知不到。ZeRO-3我试过,它其实不是每卡放完整副本,而是把参数切分到各卡,但推理时通信开销很大,慢得离谱,不如直接上张量并行,两张卡各放一半层,用vLLM的tensor parallel或者DeepSpeed的inference模式都行,速度比ZeRO-3快好几倍。另外强烈建议你把模型转成AWQ或者GPTQ格式,再配合FlashAttention,中间激活能省很多。还有个野路子,如果只是自己玩,可以用llama.cpp的Q4_K_M量化,CPU+GPU混合跑,虽然慢点但完全不卡显存。工具链的话,我推荐vLLM加AutoAWQ,官方文档写得很清楚,半小时就能跑通。你手头两张卡完全够用,别急着买新的,先试试4bit量化加张量并行,不行再回来找我。
4bit量化其实没想象中掉点那么狠,跑推理完全够用,两张A100上vLLM+AWQ直接起飞。
4bit量化其实没你想的那么吓人,LLaMA-70B用bitsandbytes跑下来,推理质量损失基本在可感知范围边缘,尤其对话场景问题不大。两张A100的话,最省事是vLLM+张量并行,把层切到两张卡上,不用装完整副本,官方文档有现成例子。ZeRO-3更适合训练,推理用反而麻烦,还得改代码。另外可以看看llama.cpp的GGUF量化版,CPU+GPU混合跑,80G塞不下就上4bit,速度肯定比不过A100但至少能跑起来。
你的思路没问题,但别忽略KV cache和激活的优化空间,比如用FlashAttention和PagedAttention能省一半显存。我之前用2张A100跑70B,FP16加TP=2,峰值能压到85G左右,再配合4bit量化到60G以下很稳。建议先试vLLM,实在不行再上量化,掉点问题用perplexity测一下心里就有数了。
两张A100的话其实不用太慌,4bit量化对70B这种规模掉点没那么吓人,尤其做推理场景,用GPTQ或者AWQ比bitsandbytes更稳,显存能压到40G左右。ZeRO-3不是每卡装完整副本,它是把参数切分到各卡,推理时配合offload到CPU也能跑,但速度会慢些。建议直接试下vLLM或者TensorRT-LLM,支持张量并行,两张卡正好,KV cache还能自动管理,比裸用transformers省心不少。
双卡A100的话,其实不用非得追求4bit,用GPTQ的8bit配合ZeRO-3就能跑,显存占用大概能压到90G左右,效果比4bit稳很多。bitsandbytes的4bit我试过,在70B上确实有点糊,尤其是长上下文场景,建议你先试8bit看看能不能接受。另外ZeRO-3不是每卡装完整副本,是分片加载,但推理速度会慢一些,你可以把offload到CPU开起来,两张卡跑起来应该问题不大。
4bit量化实测下来在生成任务上掉点不明显,尤其是对话场景,你可以先试bitsandbytes的NF4格式,加载速度还快不少。ZeRO-3不是每卡放完整副本,是把参数、梯度、优化器状态分片打散到各卡,推理时按需聚合,两张A100跑70B用这个方案应该稳。另外可以试试vLLM或者exllama,它们对KV cache和显存管理优化得更好,说不定比硬啃DeepSpeed省心。你主要跑多长上下文?如果seq len不长,量化加vLLM基本够用了。
双卡A100的话其实不用太慌,70B FP16用ZeRO-3或者张量并行都能塞下,关键是别用FP16硬扛,试试GPTQ或者AWQ的4bit量化,实测在生成任务上掉点基本能接受,比bitsandbytes的4bit稳多了。另外你提到的KV cache,可以开下PagedAttention或者用vLLM跑,内存占用能省不少。至于ZeRO-3,它是把参数和优化器状态分片到各卡,不是每个卡都存完整副本,这点放心,不过CPU offload要慎开,会拖慢速度。我最近用两卡跑过65B,配好流水并行后速度还行,建议直接上accelerate+transformers的device_map自动分配。
两张A100的话其实不用太慌,70B用4bit量化大概能压到40G以内,单卡就够跑,bitsandbytes的NF4格式掉点基本在可接受范围,尤其做推理不是微调。ZeRO-3多卡推理不是每张卡放完整副本,是切分参数和优化器状态,但你要注意它推理时会有通信开销,速度不一定比单卡量化快。我建议你先试4bit加载,配合vLLM或者TGI这种推理框架,它们对量化支持和KV cache管理都比裸PyTorch好很多。如果一定要保留精度,那就用DeepSpeed的推理模式,把模型切到两张卡上,但记得把CPU offload也打开,能省不少显存。
双卡A100的话,其实不用太慌,70B用FP16硬塞单卡肯定没戏,但DeepSpeed ZeRO-3配两张卡做推理完全够,模型参数会被切分到两张卡上,不是每张卡都放完整副本,只是通信开销会大点。量化方面,bitsandbytes的4bit我试过,日常对话任务掉点不明显,但涉及代码生成或数学推理会有可见退化,建议先用8bit凑合,或者看看GPTQ量化,推理速度更快。还有个野路子,用vLLM加AWQ量化,两张卡跑70B能到每秒十几token,比你想的流畅,就是配置麻烦点,需要改一点模型加载逻辑。
试试vLLM加AWQ量化吧,两张A100跑70B挺稳的,4bit掉点基本能接受。
我拿bitsandbytes跑过,速度慢还容易爆显存,换GPTQ或者AWQ会舒服很多。
4bit量化掉点没想象中狠,70B用两张A100跑8bit加ZeRO-3应该刚好,vLLM也可以试试。
4bit量化跑70B靠谱,掉点感知不强,两张A100上vLLM加张量并行最省心。
4bit量化掉点没那么夸张,尤其推理场景下用GPTQ或AWQ基本能保住大部分效果,70B压到40G以内没问题。两张A100的话,建议直接上vLLM或者TensorRT-LLM,支持张量并行,比你手动切模型省心得多。ZeRO-3主要是训练用的,推理时每张卡还是会存完整权重,不太划算。另外记得开KV cache的量化,能再省一笔显存。你如果主要跑对话生成,vLLM的continuous batching也能把吞吐拉上来,值得试试。
4bit量化日常对话场景掉点真没那么夸张,我拿量化后的模型跑过生成任务,流畅度基本能接受,但要是做数学推理或者代码生成会明显变笨。两张A100的话建议直接上vLLM+张量并行,把模型切两半各占一张卡,比ZeRO-3省事多了,后者主要是给训练设计的,推理反而慢。另外可以试试把KV cache换成量化版,比如用GPTQ的8bit cache,能省不少显存。
4bit量化掉点其实没你想的那么夸张,70B模型跑起来体感上跟FP16差距不大,尤其做chat场景完全够用。你两张A100的话,其实可以先试试vLLM+AWQ量化,单卡就能塞下,另一张卡还能用来做张量并行,速度比你想的快。DeepSpeed ZeRO-3确实每张卡都有完整副本,但offload到CPU之后显存占用能压到很低,就是慢点,紧急跑通可以用。另外别忽略flash-attention,能省不少KV cache的显存。我上次用类似配置跑过,效果还挺稳的,你先试试这几个方向?
两张A100的话其实不用太慌,70B用4bit量化后大概40G出头,单卡就能跑,bitsandbytes的nf4格式掉点基本在可接受范围内,尤其推理场景不会太离谱。DeepSpeed ZeRO-3确实每张卡只存分片,但配起来有点麻烦,而且你只有两张卡,通信开销可能比想象中大。我建议先试下GPTQ或AWQ的4bit量化,配合vLLM或TGI做推理,速度和显存都挺友好,代码改动也小。另外记得把KV cache的dtype也降一下,能再省不少。