最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条双卡A100的话直接上张量并行吧,vLLM或者TGI都原生支持,70B FP16用两张卡刚好能放下,速度还快。4bit量化其实没那么吓人,LLaMA这种大模型掉点基本在1%以内,实在不行先用GPTQ量化试试效果。ZeRO-3推理确实每卡会有完整副本,但offload到CPU能省不少显存,就是速度慢点。建议先上vLLM,配置简单,社区教程也多。
4bit量化日常用完全够,掉点基本感知不到,两张A100跑起来没问题。
说实话4bit量化掉点真没你想的那么夸张,尤其推理场景下70B模型用bitsandbytes的NF4格式基本能保住90%以上的效果,你可以先用它加梯度检查点试试,单张A100跑起来应该没问题。ZeRO-3不是每个卡装完整副本,它是把参数、梯度、优化器状态都切碎了分到各卡上,两张卡完全够用,就是通信开销大点。另外强烈推荐你看下vLLM或者TGI,这俩对KV cache和并行推理优化得非常好,比我之前自己手搓的Pipeline强太多了。你主要跑什么任务?如果是对话生成,量化加vLLM绝对是最省心的路。
两张A100用ZeRO-3跑70B其实可行,但记得开offload,顺便试试AWQ量化,4bit掉点基本能接受。
4bit量化实际效果没你想的那么夸张,LLaMA这种大模型掉点基本在可接受范围内,尤其做推理任务完全够用。不过bitsandbytes得配合accelerate用,不然加载速度慢到怀疑人生。两张A100的话,其实可以先试试vLLM+张量并行,开个gptq或者awq量化,不用上ZeRO那么重。ZeRO-3确实每张卡都会留完整参数副本,但推理场景不如切分模型来得直接,而且你只有两张卡,通信开销反而可能拖后腿。另外可以看看llama.cpp的GGUF格式,CPU+GPU混合跑,虽然速度差点但至少能启动。
单张A100 80G跑70B FP16确实是无解,130G参数硬塞肯定爆,但你这情况其实不用太慌,两张卡还能玩出花来。我前段时间刚用vLLM+张量并行跑过65B的模型,两卡各分一半参数,吞吐比单卡量化还稳,KV cache也能分布式缓存,显存压力小很多,你可以直接试试这个路线,比DeepSpeed的ZeRO-3更省心,ZeRO-3主要是训练用的,推理时每卡确实会存完整副本的优化器状态和梯度,但推理场景下它的分片机制反而会让通信开销变大,不太划算。
bitsandbytes的4bit量化掉点问题得看具体任务,如果是生成代码或者简单问答,损失基本在可接受范围内,但如果你要做数学推理或者长文本生成,那真的会肉眼可见变笨,尤其是70B这种大模型,量化后逻辑连贯性会打折扣。我建议你先用GPTQ的4bit量化试试,它对权重分布的处理比bitsandbytes更细腻,而且有现成的AutoGPTQ库,配合exllama内核跑起来速度也不差。另外,你还可以考虑把模型切成两半,用accelerate的device_map参数自动分配到两张卡上,配合flash-attention减少中间激活的显存占用,这样就算不量化,纯FP16也可能塞得进去,就是速度会慢点,但至少能跑起来。
还有个偏门招数,如果你主要做离线推理,可以试试offload到CPU,用accelerate把部分层放到内存里,两张A100各负责一部分GPU层,剩下的扔DDR5,虽然慢但能救命,我记得HuggingFace上有现成的llama.cpp后端,配合GGUF格式的4bit量化,单卡都能跑70B,就是速度只有几token每秒,但至少验证流程没问题。总之别急着买卡,先把vLLM和GPTQ这两条路趟一遍,大概率能解决你的问题,我目前就是这样组合用的,效果还不错。
说实话你这个问题我上个月刚踩过一遍,两张A100跑70B其实比想象中要灵活,别一上来就上4bit。我试过bitsandbytes的NF4量化,在MMLU这类任务上大概掉2到3个点,但你要是做chat或者代码生成,体感差距真不大,关键是显存能压到45G左右,单卡就能跑,省心很多。不过你既然有两张卡,我更推荐先用DeepSpeed的ZeRO-3配合inference模式,它不是每张卡装完整副本,而是把参数和优化器状态切碎分到各卡上,推理时按需聚合,两张卡合计能用的显存接近160G,FP16跑70B加个8到16的batch都没问题。唯一麻烦的是你要把模型加载改成from_pretrained(..., device_map="auto")然后配一下zero.InferenceConfig,别用默认的ZeRO-3训练配置,不然会疯狂做梯度同步白白浪费带宽。另外KV cache这块,用vLLM或者TensorRT-LLM的paged attention能省不少,尤其是长上下文场景,比手写缓存管理高效太多。我最后实际方案是两张A100用vLLM加AWQ的4bit量化,精度损失几乎不可见,吞吐还比FP16快两倍,配个简单的FastAPI就能上线了。你要是只想最快跑通,我建议直接试一下llama.cpp的GGUF Q4_K_M,纯CPU也能推理,但两张A100的话还是vLLM收益大,别折腾什么模型并行了,那玩意儿调试起来够你喝一壶的。
你这个问题我太有同感了,当时我拿单卡跑65B的时候也是差点把头发薅光。先说结论:你手头两张A100,最稳的方案其实是vLLM+张量并行,把模型拆到两张卡上,FP16直接跑,速度还快,完全不用动量化。ZeRO-3不建议用在推理上,它主要是训练用的,推理时每个rank确实会持有完整参数,但通过CPU offload或者NVMe offload也能塞下,不过速度会慢到怀疑人生。关于4bit量化,用GPTQ或者AWQ比bitsandbytes的int8稳得多,目测掉点在一个点以内,但如果你跑的是代码生成或者数学推理,建议还是保留FP16,量化对这类任务的影响比对话大不少。另外你提到KV cache,可以用PagedAttention(vLLM自带)或者动态缓存,能省不少显存。还有个野路子,如果模型支持layer-wise offload,可以试试把部分层放到CPU上,虽然慢但至少能跑起来,适合先验证流程。工具链的话,除了vLLM,可以看看ExLlamaV2,它对量化支持很友好,两张卡也能跑。最后提醒下,别光看参数,前向计算的中间激活也很吃显存,可以调小max batch size和max sequence length试试,有时候救命的不是量化而是限制长度。
4bit量化掉点真没你想的那么夸张,尤其推理场景下70B用GPTQ或者AWQ基本能保住90%以上的效果,比硬撑FP16换OOM强多了。两张A100的话其实最省事的是用vLLM+张量并行,代码不用大改,把tensor-parallel-size设成2就行,显存和速度都能兼顾。ZeRO-3主要是给训练用的,推理上反而麻烦,每张卡确实会存完整副本,但offload到CPU又太慢,不推荐。bitsandbytes的NF4在70B上偶尔会有奇怪的概率崩坏,建议先试GPTQ的4bit,实在不行再降3bit。
两张A100的话其实不用太慌,4bit量化掉点没你想的那么夸张,特别是推理场景下,用GPTQ或者AWQ比bitsandbytes更稳一些,速度也快。ZeRO-3不是每卡存完整副本,是切分参数,但推理时通信开销会大,建议直接上vLLM或者TensorRT-LLM,配合张量并行两张卡跑70B很成熟。另外可以试试offload到CPU,把部分层放内存,虽然慢点但能跑起来,适合先验证流程。你主要跑多长上下文?如果seq len不长,KV cache其实占不了太多,优先把模型塞进去再说。
4bit量化掉点没你想的那么夸张,尤其推理场景下70B用bitsandbytes的NF4基本能保住90%+效果,视觉上几乎无感。双卡的话其实不用上ZeRO-3,直接张量并行更省事,比如用vLLM或者TensorRT-LLM,它们对70B的TP=2支持很成熟,内存占用比你想的干净。另外你光盯着模型权重,其实可以把KV cache也量化一下,或者用PagedAttention省显存,这两张A100跑起来完全够用。工具链的话建议直接上vLLM,部署简单还自带continuous batching,别自己折腾DeepSpeed那套推理配置了,坑多。
讲真你这个情况我太懂了,之前我也在单卡上死磕过70B,后来发现思路得换一下。4bit量化掉点这事真得看任务,如果是生成代码或者数学推理,体感上会稍微有点飘,但日常对话和文本摘要基本看不出来,bitsandbytes的NF4格式配合双卡其实挺稳的。不过你只有两张A100,我建议别直接上ZeRO-3,那玩意儿每张卡确实会存一份完整模型状态,显存反而更紧张,不如试试张量并行,比如用accelerate的device_map自动切分,把不同层分到两张卡上,这样KV cache也能分散开,实际跑起来70B+4bit大概能压到40G左右每卡。另外你提到中间激活,这个可以用gradient checkpointing或者flash attention去压,特别是flash attention,直接让激活内存降一个量级,效果立竿见影。还有个野路子,就是offload到CPU内存,用accelerate的cpu_offload,但速度会慢到怀疑人生,只适合验证流程。最后推荐个工具链吧,vLLM现在支持70B的AWQ量化模型,配合张量并行,两张A100跑起来吞吐量很香,而且实现起来比DeepSpeed简单多了,你直接pip装好改个配置文件就行。别急着买卡,我试过这套组合,推理速度能接受,你先把环境搭起来跑个demo看看效果再说。
说实话4bit量化没你想的那么吓人,70B模型跑下来也就是损失一点点困惑度,日常对话完全感知不到,先用bitsandbytes的nf4格式试试,省下的显存够你跑长上下文了。两张A100的话,DeepSpeed ZeRO-3加模型并行是正解,但不用每个卡装完整副本,它会把参数切碎分散到各卡上,你只需要保证每张卡的显存能装下分片加激活就行。我自己试过用vLLM配合张量并行,两张卡跑70B还挺稳的,吞吐比纯DeepSpeed高不少,建议直接走这个路线。另外提醒下,别忘了开flash attention,能再挤出一部分显存给KV cache。
双卡的话直接上张量并行吧,70B用FP16两张A100刚好能塞下,vLLM或者TensorRT-LLM都原生支持TP,比ZeRO-3省心很多,后者做推理反而会慢。4bit量化肯定有掉点,但如果是做对话生成,感官上其实不明显,你可以先用GPTQ量化版跑跑看,很多开源模型都有现成的量化权重。另外KV cache这玩意儿可以开PagedAttention,vLLM里默认就会省不少显存。别折腾bitsandbytes了,加载速度慢还容易踩坑,直接用transformers+accelerate的device_map=auto配合双卡推理,或者干脆用exllama2,专门为低显存优化的。
说实话你这个情况我太懂了,之前我拿单卡4090跑65B的时候也是头疼到失眠。4bit量化其实没你想的那么玄乎,bitsandbytes的NF4格式配合双卡,推理效果在大部分任务上跟FP16差距能控制在3%以内,尤其是生成任务,掉点基本感知不到。不过你要注意,量化后KV cache还是得留够,不然长上下文照样爆。
至于DeepSpeed ZeRO-3,它跟你想的“每卡装完整副本”正好相反,是把模型参数切碎分到每张卡上,推理时按需聚合,所以两卡能塞下,但通信开销会拖慢速度,你最好用inference模式或者配合flash attention优化一下。
性价比最高的路子我建议直接上vLLM或者TGI,这俩原生支持张量并行和量化,两张A100跑70B 4bit完全能稳,吞吐还比裸PyTorch高不少。
另外可以试试把部分层offload到CPU,比如前几层放显存后几层放内存,速度慢点但至少能跑起来。
你手头这两张卡如果支持NVLink,记得开起来,张量并行通信带宽差一倍,效果天壤之别。
最后提醒下,别光盯着模型参数量,中间激活和KV cache的峰值你最好用torch.cuda.max_memory_allocated实测下,有时候省出来的空间比你想的多。
4bit量化掉点没那么夸张,70B跑起来完全能接受,两张卡用vLLM加张量并行最省事。
说实话双卡A100的话,我建议直接上vLLM+张量并行,比ZeRO-3省心得多,而且70B用2卡基本能跑起来,就是需要点显存优化。4bit量化掉点其实没那么可怕,如果只是做chat或者文本生成,体感上基本无差,但你要是跑评测集就得小心了。bitsandbytes配transformers挺成熟的,可以先试试QLoRA那个加载方式,代码改动最小。另外别忘了开flash attention和continuous batching,这俩能省不少显存,我上次用类似配置跑65B,吞吐量比裸跑高了一倍不止。
4bit量化掉点没你想的那么夸张,LLaMA70B实测任务上基本能扛住,两张A100用DeepSpeed ZeRO-3加NVLink够跑。
4bit量化实际效果没你想的那么吓人,LLaMA这类模型在推理任务上基本能保住90%以上的质量,但如果你跑的是生成类任务,偶尔会看到逻辑有点飘。双卡的话强烈建议先试vLLM或者TensorRT-LLM,它们对KV cache和显存管理优化得特别好,两张A100跑70B做4bit量化加张量并行是可行的。ZeRO-3不是每个卡放完整副本,它是把参数切碎分到各卡上,但推理时通信开销大,不如直接用张量并行省心。另外bitsandbytes记得关掉梯度检查点,不然速度会慢到怀疑人生。
两张A100的话,其实不用太慌,70B FP16确实超了,但你这情况完全在可救范围内。我最近刚用vLLM+AWQ量化跑过70B,4bit下模型体积直接砍到35G左右,单卡就能塞下,而且吞吐比FP16还高一点,掉点基本在1-2个点以内,对话场景根本感觉不出来。bitsandbytes的4bit是另一种思路,它是在加载时动态量化,省显存但推理速度慢,而且对某些算子支持不好,容易踩坑,不如直接用GPTQ或AWQ这种离线量化模型来得稳。至于DeepSpeed ZeRO-3,它做推理其实有点大材小用,因为它设计初衷是训练,推理时每张卡确实会存完整参数分片,但通信开销会让延迟变高,不如直接上张量并行,两张卡各放一半权重,配合transformers的device_map或者accelerate就能自动切。你手头两张A100,最省事的方案其实是先试一下llama.cpp的GGUF格式,Q4_K_M量化后大概40G,单卡跑起来很顺,支持CPU+GPU混合,万一显存不够还能把层塞到内存里。如果非要跑满精度,那就用tensor_parallel=2,两张卡各占65G左右,刚好卡在A100的80G边缘,记得把KV cache用8bit存。另外注意一下,70B的KV cache在长上下文时会爆,建议把max_seq_len限制在2048以内,或者用PagedAttention的vLLM自动管理显存。我个人最推荐先试AWQ量化+vLLM,效果和速度平衡得最好,装起来也简单,两行命令就能跑。