最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条4bit量化实际推理效果还行,尤其70B底子好,掉点不明显。两张A100用DeepSpeed ZeRO-3或张量并行都能跑,不用买新卡。
两张A100的话上DeepSpeed ZeRO-3加4bit量化,实测能跑起来,而且掉点基本感知不到。
4bit量化跑70B实测掉点能接受,两张A80用DeepSpeed ZeRO-3加张量并行,记得调offload把KV cache塞CPU。
70B用FP16确实太勉强了,4bit量化其实效果还不错,像LLaMA这种模型掉点基本在1-2%以内,日常对话几乎感觉不出来。ZeRO-3不是每张卡都存完整模型,而是把参数切分到各卡上,推理时按需聚合,两张A100配合DeepSpeed Inference应该能跑起来。另外可以试试vLLM,它对显存管理优化得比原生PyTorch好很多,加上量化说不定单卡都能凑合。
说实话你这情况太典型了,70B模型在单卡上跑确实难受。4bit量化掉点没你想象的那么夸张,尤其是LLaMA这种大模型,4bit推理在大多数任务上跟FP16差距在1-2个点以内,很多场景根本感觉不出来,建议先试试bitsandbytes的4bit加载,配合CPU offload,单张A100能勉强跑起来。至于ZeRO-3,它不是每张卡都装完整副本,而是把模型参数、梯度、优化器状态分片到不同卡上,推理时每张卡只持有部分参数,所以两张A100用ZeRO-3+4bit量化,显存压力会小很多,但需要小心通信开销。如果你不想折腾分布式,其实可以试试vLLM或者TGI这类推理框架,它们内置了PagedAttention和动态批处理,对显存利用率优化得很好。还有个取巧的办法:用llama.cpp的GGUF格式跑CPU+GPU混合推理,把部分层卸载到内存,虽然慢点但至少能跑起来。实践下来性价比最高的方案是bitsandbytes 4bit + 两张卡用accelerate做简单模型并行,代码改动量小,效果也够用。
双卡A100的话可以试试vLLM加张量并行,FP16推理基本能跑起来,显存占用比单卡均匀很多。4bit量化掉点其实没想象中那么严重,尤其是推理任务,bitsandbytes配合transformers用起来挺顺手的。ZeRO-3主要是用来训练,推理的话用张量并行或者流水线并行效率更高,每张卡不用装完整模型。实在不行还可以考虑llama.cpp,CPU+GPU混合推理,虽然慢但至少能跑。
4bit量化实测掉点不大,配合ExLlamaV2两张A100跑70B稳得很,你可以试试。
两张A100的话其实可以试试vLLM,它对张量并行的支持做得挺成熟的,70B模型切成两块刚好能塞进去,而且吞吐量比原生PyTorch高不少。4bit量化我用过,在推理任务上掉点其实不明显,尤其是LLaMA这种大模型,用GPTQ或者AWQ量化后基本看不出区别。ZeRO-3的话确实每个卡会有完整副本,但推理场景下不如张量并行高效,建议优先考虑后者。
两张A100的话,可以考虑用DeepSpeed ZeRO-3配合张量并行,其实不需要每张卡都装完整模型,它会自动把参数分片,推理时显存占用能降不少。4bit量化实测在70B模型上掉点大概在1-2个点以内,做生成任务完全能接受,用bitsandbytes或者GPTQ都行。另外可以试试vLLM这个框架,它对KV cache做了优化,同样显存下吞吐能高不少,网上有现成的docker镜像,拉下来改个参数就能跑。
两张A100的话其实不用太焦虑,70B模型用4bit量化效果已经挺成熟了,我试过llama.cpp的Q4_K_M方案,在代码生成和对话任务上掉点基本感知不到。ZeRO-3并不是每张卡存完整副本,它会把参数、梯度、优化器状态分片到不同卡上,推理时甚至可以用ZeRO-Inference配合offload来省显存。另外可以试试vLLM或者TGI,它们对KV cache做了优化,单卡80G跑4bit量化后的70B模型完全够用。如果不想折腾底层,Hugging Face的Accelerate加device_map="auto"也能快速把模型拆分到两张卡上。
说实话你这个问题我太有共鸣了,70B卡在单卡上基本是死局,哪怕A100 80G也扛不住FP16的130G参数加KV cache。我自己的经验是bitsandbytes的4bit量化其实效果还不错,特别是对于LLaMA这种模型,在困惑度上掉得很少,几乎可以忽略,但推理速度会稍微慢一点,不过两张卡做张量并行的话完全能接受。
DeepSpeed ZeRO-3在多卡推理时并不是每个卡装完整模型副本,它是把参数、梯度、优化器状态都分片到各个卡上,推理时只按需加载,所以两张A100跑70B 4bit量化是完全可行的,内存占用能压到单卡60G左右。不过你需要注意,ZeRO-3推理时通信开销比较大,建议用NVLink或者高带宽互联,否则延迟会有点感人。
另一个我最近在用的方案是vLLM搭配AWQ或GPTQ量化,它对显存管理做得很好,支持PagedAttention,能大大压缩KV cache的占用,两张卡做流水线并行跑4bit 70B,我实测速度比bitsandbytes快不少。如果你不想折腾,直接上Hugging Face的Accelerate加device_map="auto",配合bitsandbytes的4bit加载,基本能无缝跑起来,就是生成速度会受限于CPU offloading。
对了,你提到KV cache的问题,有个取巧的办法是把max_new_tokens设小一点,或者用FlashAttention减少显存占用,实在不行就考虑下vLLM的prefix caching,能复用之前计算的key value。总之别急着买新卡,现有的方案足够对付了。
bitsandbytes4bit实测在70B上掉点很轻微,配合vLLM做张量并行两张A100刚好能跑。
说实话,你遇到的情况我当初搞70B也头疼过,单卡A100 80G确实硬扛FP16太勉强了。bitsandbytes的4bit量化我实际试过,像LLaMA这种模型在推理任务上掉点其实很轻微,大部分场景下感知不到,但显存能直接砍到40G左右,一张A100就能跑起来,性价比很高。不过要注意,4bit量化后推理速度会慢一些,尤其batch size不能太大。至于DeepSpeed ZeRO-3,它并不是每个卡都放完整模型副本,而是把参数、梯度、优化器状态都分片到各卡上,所以两张A100配合ZeRO-3加4bit量化,理论上能把70B跑起来,但通信开销会吃掉一部分带宽,建议先试试单卡4bit,如果速度能接受就不用折腾多卡。另外可以看看exllamav2或者llama.cpp,后者用GGUF格式做4bit甚至2bit量化,对显存更友好,而且CPU+GPU混合推理也能缓解压力。你手头两张A100其实很富裕了,关键是把量化工具链先跑通,比如AutoGPTQ或者bitsandbytes的bnb_4bit,踩过坑就知道哪套方案最稳。
两张A100的话其实不用太慌,70B模型用4bit量化后大概能压到35G左右,单卡就能跑,bitsandbytes实测在推理任务上掉点很小,基本可以忽略。ZeRO-3不是每卡存完整副本,是把参数、梯度、优化器状态分片到各卡,显存利用率高很多,配合DeepSpeed-Inference用起来挺顺的。另外可以试试vLLM或者TGI,它们对KV cache和连续批处理优化得很好,两张卡用张量并行就能跑起来,还能省下不少折腾时间。
70B用FP16跑单卡确实不太现实,130G参数加显存开销肯定爆。4bit量化掉点其实还好,尤其推理场景下,bitsandbytes的4bit配合NF4格式,效果通常能接受,LLaMA系列实测损失很小。双卡的话,推荐试试DeepSpeed ZeRO-3加张量并行,不需要每卡装完整副本,而是把参数切分到各卡,配合torchrun启动就能跑起来,不过KV cache还是得省着用。可以先用vLLM或者TGI这类推理框架,它们自带量化、连续批处理和动态显存管理,双A100跑70B 4bit基本够用,你搜下vLLM的awq或gptq支持,社区里有很多现成脚本。
说实话看到你这个配置我挺有共鸣的,之前我也在两张A100上折腾过70B模型,踩了不少坑。4bit量化掉点其实没那么可怕,我用bitsandbytes跑过LLaMA,在推理任务上几乎感觉不出差异,尤其是对话生成这种场景,但如果你做数学或代码生成可能稍微明显一点。ZeRO-3的话你理解有个小偏差,它不会每张卡存完整副本,而是把模型状态(参数、梯度、优化器)分片到不同卡上,推理时只有参数分片,所以两张卡合起来刚好能放下,但你需要配合DeepSpeed-Inference或者vLLM这些推理框架来管理KV cache。我个人最推荐你试试ExLlamaV2搭配GPTQ量化,4bit下70B模型大概能压到35G左右,加上KV cache一张A100就能跑,速度还比bitsandbytes快不少。另外如果你不想换工具链,也可以考虑用llama.cpp做GGUF量化,虽然牺牲一点灵活性但内存占用极低。工具链方面Hugging Face的Accelerate配合device_map='auto'也能自动分配模型到两张卡上,但记得关掉不需要的中间激活保存。最后提一句,如果只是做推理,完全没必要用ZeRO-3,它的多卡优化主要是为训练设计的。
两张A100其实够了,用vLLM加张量并行,FP16推理70B模型完全能跑起来。
其实你这情况我去年也踩过坑,单卡80G硬扛70B确实不现实,FP16下光参数就130G,加上KV cache和激活,双卡也不够。我后来试了bitsandbytes的4bit量化,说实话在LLaMA上掉点不算太严重,尤其是推理任务,如果是生成类任务,质量下降基本能接受,但如果你做的是精确的数学或代码生成,可能会感觉到差异。另一个方案是用DeepSpeed ZeRO-3做模型并行,但它不是每个卡装完整副本,而是把参数、梯度和优化器状态分片到不同卡上,所以两张A100加起来显存是够的,只是推理时会有通信开销,速度会慢一些,但能跑起来。我目前用的是vLLM配合AWQ量化,单卡就能跑70B的4bit版本,速度还不错,而且它自动管理KV cache,显存压力小很多。你手头两张卡的话,还可以试试Tensor Parallel,把模型切分到两张卡上,每张卡只负责一部分层,这样不需要量化也能跑,但需要一些代码调整。另外,如果你愿意折腾,llama.cpp的GGUF格式也是个轻量级选择,CPU+GPU混合推理也能凑合。总之别急着买新卡,先把量化或模型并行玩明白,大概率能救回来。
两张A100的话,试试vLLM或者TensorRT-LLM吧,它们对显存管理优化得很好,配合张量并行就能把70B模型拆开跑,不用每张卡装完整副本。4bit量化掉点其实没那么夸张,LLaMA这种大模型在常见任务上损失很小,你可以先用bitsandbytes试一下,如果精度敏感再考虑混合方案。另外记得把KV cache也量化一下,能省不少显存,HuggingFace上有些现成的脚本可以直接用。
两张A100用DeepSpeed ZeRO-3跑70B其实可行,4bit量化掉点不大,推荐先试下GPTQ量化。