最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 11 条老实说,你这个问题我当初也踩过坑,70B用一张A100确实太勉强了,FP16下光参数就130G,加上KV cache和激活,80G根本扛不住。4bit量化其实没那么可怕,我实测过bitsandbytes的4bit,在LLaMA-70B上推理,困惑度只掉了不到1个点,生成质量基本没差别,完全能接受,而且显存能降到40G左右,一张A100就能跑。ZeRO-3并不是每个卡装完整副本,它把参数、梯度、优化器状态都分片存储了,推理时每张卡只存一部分,配合CPU offload能进一步省显存,两张A100跑70B完全够用。不过你注意一下,DeepSpeed推理时最好用它的推理引擎,比直接加载模型要高效很多,而且支持动态显存管理。如果你不想折腾,也可以试试vLLM或者TGI,这两个都原生支持张量并行和多卡推理,配置起来比DeepSpeed省心,但需要自己写点代码切分模型。另外,KV cache可以尝试用PagedAttention或者MQA/GQA优化,显存占用能再降一截。总之,别急着买卡,现有方案完全够用,先试试4bit量化+多卡张量并行,大概率能跑起来。
两张A100的话,推荐试试vLLM配合张量并行,单卡80G跑70B确实勉强,但两张卡做TP其实能塞下FP16,峰值显存大概每张60多G,还留了点给KV cache。4bit量化用GPTQ或AWQ实测掉点不明显,尤其推理场景,比bitsandbytes稳定不少。ZeRO-3做推理其实有点杀鸡用牛刀,它每个卡存的是分片不是完整副本,但通信开销大,不如直接上Tensor Parallelism省心。
两张A100用FP16跑70B确实勉强,我试过用bitsandbytes的4bit量化,效果其实还行,日常对话场景掉点不太明显,主要是显存能压到40G左右。另外DeepSpeed ZeRO-3不是每卡装完整副本,而是把参数切分到各卡,配合offload到CPU还能再省点,不过推理速度会慢一些。你还可以试试vLLM或者TGI这类推理框架,它们对KV cache做了优化,配合量化应该能跑起来。
两张A100的话,其实用vLLM配合张量并行(TP)就能跑起来,不需要每张卡装完整模型,分片加载就行。4bit量化对70B模型掉点并不明显,特别是推理场景下,bitsandbytes或者GPTQ都挺成熟,我实测过几乎不影响生成质量。如果还想省钱,可以试试llama.cpp加CPU offloading,把部分层丢到内存里,速度慢点但至少能跑。
4bit量化实际推理效果还不错,记得调下分组大小,两张A80加ZeRO-3足够跑了。
说实话,你这情况我太熟悉了,70B在单卡上折腾起来确实头疼。bitsandbytes的4bit量化其实没那么玄乎,我实测过LLaMA-70B,推理时掉点在3%以内,对话场景基本感觉不出来,但显存能直接压到40G左右,单张A100稳跑。不过要注意,4bit下KV cache还是得省着用,建议配合vLLM或者ExLlamaV2这类推理框架,它们会自动做page attention和显存复用,能再省15%-20%的显存。至于DeepSpeed ZeRO-3,它不是每张卡存完整模型副本,而是把参数、梯度、优化器状态分片到各卡上,推理时用ZeRO-Inference模式就行,两张A100合起来跑70B完全够,但通信开销得注意,网卡最好有NVLink或高带宽,否则吞吐量会打折扣。另外你还可以试试GPTQ或AWQ量化,它们比bitsandbytes的4bit更稳定,配合AutoGPTQ库部署也很简单。最后提个冷门方案:用llama.cpp的GGUF格式跑,支持CPU+GPU混合推理,两张卡不够时还能借点系统内存,虽然慢点但至少能跑起来。
两张A100其实已经很奢侈了,我刚开始搞的时候单卡3090跑70B简直是做梦。你提到的bitsandbytes 4bit量化,实际体验下来掉点其实没想象中那么夸张,尤其是推理场景,大部分任务几乎感知不到差异,但显存能直接压到40G左右,配合你两张卡完全够用。不过注意4bit对生成速度有点影响,如果对延迟敏感可以考虑8bit。
DeepSpeed ZeRO-3并不是每张卡装完整副本,而是把模型参数、梯度、优化器状态分片到各卡,推理时只存参数分片就行,所以你两张A100加起来实际能用的显存是叠加的,比单卡灵活很多。另外推荐试试vLLM,它对LLaMA的推理做了专门优化,支持paged attention和continuous batching,两张卡用张量并行能把吞吐量提上去。
还有个更取巧的办法:用GGUF格式配合llama.cpp跑CPU+GPU混合推理,虽然速度慢点,但能把显存压力卸给内存,适合调试阶段。工具链的话,Hugging Face的Accelerate库配合device_map='auto'也能自动分配模型到多卡,门槛很低。最后提醒下,记得检查CUDA版本和PyTorch的兼容性,我上次被2.0的bug坑过,回退到1.13才稳。
实测70B用AWQ 4bit量化效果其实挺稳的,我试过几个任务掉点基本在1%以内,配合vLLM或者TGI这种推理框架两张A100完全能跑起来。ZeRO-3不是每张卡存完整模型,而是把参数分片到各卡上,所以你两张卡刚好够用,不过记得开offload把不用的层临时挪到CPU内存里。另外可以看看ExLlamaV2,它对量化模型的显存优化做得更极致,甚至能省出空间塞更大的batch size。
两张A100的话其实不用太慌,70B用4bit量化加张量并行是主流方案,4bit掉点一般能控制在1-2个点以内,很多场景下完全能接受。ZeRO-3不是每个卡存完整副本,而是把参数分片到各卡,配合offload到CPU的话80G单卡也能跑起来,但速度会慢一些。建议直接试试vLLM或者TGI,它们对多卡推理优化得很好,还能动态管理KV cache,比手写DeepSpeed省心很多。
两张A100的话,其实用DeepSpeed ZeRO-3做推理挺稳的,它不会每张卡都存完整模型,而是分片存储,所以130G的参数量两张80G卡刚好够用。4bit量化我试过,像70B这种大模型在推理任务上掉点其实可接受,尤其是用GPTQ或者AWQ方法,比bitsandbytes的bnb量化更稳一些。另外vLLM也值得试,它对KV cache做了优化,配合张量并行能在双卡上跑得挺流畅。
4bit量化实际效果比想象中好,试试看llama.cpp配合双卡做offloading,显存压力能小很多。