最近在试着部署一个70B的LLaMA模型做推理,结果发现单张A100 80G根本塞不下。我用的是FP16加载,但光模型参数就占了130G左右,更别说还有KV cache和中间激活了。我知道可以用量化或者模型并行,但对具体实现不太清楚。比如bitsandbytes的4bit量化会不会掉点很严重?还有,用DeepSpeed的ZeRO-3做多卡推理时,是不是每个卡都要装一个完整的模型副本?我目前手头只有两张A100,实在不想买新卡了。求各位大佬指点下性价比最高的方案,或者推荐一些能跑起来的开源工具链。先谢过了!
新手求教:用PyTorch跑70B大模型,显存不够还能怎么抢救一下?
全部回复
共 184 条说实话你这情况我上周刚踩完坑,单卡A100跑70B基本别想,FP16光权重就超了,但双卡其实完全够用。我试下来性价比最高的是先上GPTQ的4bit量化,配合exllama或vLLM,单卡就能塞下,速度和显存占用都比bitsandbytes的NF4稳定,掉点的话看任务,常识推理大概掉1-2个点,代码生成几乎无感,你可以先拿量化后的权重跑几个测试集对比下。
至于DeepSpeed ZeRO-3,它不是说每张卡装完整副本,而是把参数、梯度和优化器状态分片到所有卡上,推理时每张卡只持有部分权重,但会引入通信开销,双卡情况下加载速度会慢不少,而且你如果只是做推理,其实用tensor并行更直接,比如用transformers的device_map="auto"配合accelerate,它会把不同层分配到两张卡上,省事很多。
另外建议你查下flash attention和PagedAttention,这两个能大幅压缩KV cache的显存占用,尤其长上下文时效果明显。我自己的方案是双卡A100跑GPTQ 4bit的70B,max length设2048,用vLLM启动,峰值显存单卡大概55G左右,还能留点余量给batch。还有个小技巧,如果只是测试,可以先用llama.cpp的GGUF Q4_K_M版本跑CPU+GPU混合,虽然速度慢点,但能验证效果再决定要不要上多卡优化。工具链的话,vLLM、exllama2、TGI都试过,vLLM对并发支持最好,exllama2单卡延迟最低,看你更看重吞吐还是响应速度了。
说实话你这需求我上个月刚趟完坑,4bit量化掉点没那么夸张,跑生成任务体感也就差个5%以内,但前提是别用bitsandbytes默认设置,记得开double quant和nf4。两张A100的话我更推荐vLLM加张量并行,把模型切成两半各塞一张卡,吞吐比ZeRO-3高不少,而且不用每张卡都装完整副本。KV cache这块可以试试PagedAttention,能省下差不多30%显存,实测70B模型加8K上下文都能稳跑。工具链的话直接看vLLM的官方文档,里面有个70B的示例配置,改改路径就能用。
单张80G跑70B确实紧,不过4bit量化掉点没想象中夸张,尤其是推理任务,用bitsandbytes的NF4配合双卡张量并行,基本能塞下。ZeRO-3不是每卡全副本,是切分参数,但推理时通信开销大,不如直接上vLLM或者TGI,自带量化支持和paged attention,两张卡做张量并行挺稳的。我试过AWQ或者GPTQ量化,效果比动态4bit好,建议优先考虑,代码改动也小。你主要跑什么任务,生成速度要求高不高?
预算有限的话,我建议先别碰4bit量化,虽然bitsandbytes方便但70B掉点真的看任务,有些场景直接崩。你两张A100其实可以试试vLLM的tensor parallel,把模型切到两张卡上跑,比DeepSpeed轻量不少,ZeRO-3推理时确实每卡都有完整权重,反而更吃显存。另外顺手看下flash-attention开没开,能省不少激活内存,我上次这么搞从OOM到能跑长上下文。
其实你两张A100不用太慌,可以试试vLLM或者TensorRT-LLM,配合张量并行,70B FP16勉强能塞进去,但KV cache会紧张,建议开下PagedAttention。4bit量化掉点看任务,如果是生成类任务体感不明显,但如果你跑评测指标可能会掉1-2个点,能接受的话bitsandbytes配一下很快。另外ZeRO-3推理不是每卡装完整副本,它是把参数分片到各卡,但推理时通信开销不小,不如直接用模型并行来得直观。我最近在折腾llama.cpp的GGUF量化,Q4_K_M在双卡上配合offload也能跑,速度慢点但胜在省心,你可以先拿小模型试试水再上70B。
两张A100直接上张量并行+4bit量化,llama.cpp或者vLLM都行,掉点其实没那么夸张。
说实话4bit量化没那么吓人,70B模型跑起来体感掉点一般能接受,尤其推理场景,配合bitsandbytes的NF4格式,双卡A100塞进去挺稳的。别碰GPTQ,加载太费劲,NF4开箱即用。ZeRO-3不是每卡存完整副本,它是把参数切碎分到各卡,推理时按需聚合,但通信开销不小,两张卡的话其实不如直接上张量并行,比如用vLLM或者TensorRT-LLM,显存利用率高很多。另外你试过offload到CPU吗?把部分层扔到内存里,速度慢点但能跑,先用它验证流程再优化也不迟。
两张A100的话其实不用太慌,FP16塞不下就上4bit,bitsandbytes的NF4量化对70B这种规模掉点基本在1-2%以内,跑对话生成完全感知不太出来。DeepSpeed ZeRO-3是分片不是副本,每张卡只存一部分参数,但推理时会有通信开销,建议直接把offload到CPU也开起来。另外可以试试vLLM或者TensorRT-LLM,它们自带PagedAttention和量化支持,比你手动搞省心很多,而且两卡张量并行就能跑。
说实话4bit量化没你想的那么玄乎,跑推理的话70B模型压到40G以内完全没问题,我也用bitsandbytes试过,生成质量几乎感觉不到差异,除非你做特别精细的数学推理任务。两张A100的话其实不用太纠结模型并行,直接上vLLM配合张量并行,把层切到两张卡上,实现起来比DeepSpeed简单得多,而且吞吐还高。你那个130G是FP16的原始权重吧?试试AWQ或者GPTQ的4bit版本,单卡都能勉强跑,两张卡加个KV cache offload基本稳了。
两张A100的话其实不用急着上4bit,先用transformers加device_map=auto配合 accelerate 做张量并行,70B FP16在双卡上能跑起来,就是速度慢点。bitsandbytes的4bit我试过,日常对话掉点不明显,但涉及代码生成或数学推理确实会变笨。ZeRO-3不是每卡存完整副本,是把参数分片,但推理时通信开销挺大,不如直接用张量并行省心。另外可以看看vLLM,它对KV cache优化很好,双卡跑70B吞吐量比原生推理高不少。
说实话你这个情况我太熟了,之前折腾13B都差点把我劝退。单卡塞70B肯定是没戏的,但两张A100其实挺够用了,别急着买卡。4bit量化掉点这事儿真得分任务看,我拿bitsandbytes跑过一些生成任务,感觉对话和代码生成这种场景下几乎感知不到差别,但你要是做学术评测或者对logits精度敏感的实验,那还是慎重一点。ZeRO-3做推理的话,它其实不是每张卡放完整副本,而是把参数、梯度、优化器状态都切碎了分到各卡上,所以显存占用是降下来的,但通信开销会上去,两张卡互联带宽要是PCIe的话可能有点吃紧,NVLink就好很多。我个人感觉性价比最高的路线是先用GPTQ量化到4bit,配合vLLM或者ExLlamaV2这类推理框架,两张卡开张量并行就能跑起来,速度还挺惊喜的。另外可以试试llama.cpp的GGUF格式,虽然吃CPU但你两张卡做offload到GPU,也能凑合跑,就是慢点。建议先拿量化模型测测你的实际数据,别听别人说掉点就慌,自己跑一跑最准。
说实话4bit量化没那么吓人,70B模型用bitsandbytes的NF4格式跑起来,体感上损失主要集中在小众专业任务,日常对话和代码生成基本看不出区别。你两张A100的话其实不用上ZeRO-3,用DeepSpeed的ZeRO-Infinity配合NVLink,把参数分片到两块卡上,每卡只占65G左右,再开个offload到CPU当兜底,推理速度会比纯量化快不少。另外记得把KV cache开成8bit,能省出快10G显存,vLLM或者TGI这两个推理框架都支持,比裸跑transformers省心多了。
4bit量化掉点真没想象中那么夸张,尤其推理场景下用GPTQ或者AWQ,体感质量损失很小,但显存直接砍到三分之一。你两张A100的话,其实不用上ZeRO-3,试试vLLM或者TensorRT-LLM,它们对KV cache和显存管理优化得很狠,70B在双卡上跑起来很稳。另外记得开flash attention,能省不少中间激活的内存。
4bit量化掉点其实没那么吓人,70B跑起来完全能看,两张A100用张量并行最稳。
我试过vLLM+AWQ方案,两张80G卡推理速度还不错,比bitsandbytes省心多了。
4bit量化掉点其实没想象中严重,两张A100用ZeRO-3跑起来完全够用。
vLLM加AWQ量化,单卡都能跑,别死磕FP16了。
说实话你这个问题我上个月刚踩完坑,两张A100跑70B其实有戏,但别指望FP16硬刚。我试过bitsandbytes的4bit,效果比想象中好,尤其是用NF4量化加双量化之后,推理质量掉得不多,主要看任务,如果是生成代码或者简单问答基本能忍。不过你注意,4bit下KV cache也得量化,不然显存还是爆。至于DeepSpeed ZeRO-3,它跟你想的不太一样,不是每张卡存完整副本,而是把参数、梯度和优化器状态都分片打散到各卡上,推理时按需聚合,所以单卡显存占用能压到30G左右,但通信开销有点大,两张卡做推理速度可能不如单卡量化来得快。我个人建议先试vLLM配合AWQ或者GPTQ量化,加载70B模型大概能压到40-50G,两张卡还能留出空间给长上下文。另外exllama2也是个神器,专门为量化模型优化过,显存管理比HuggingFace原生管线强太多。最后提醒一句,如果只是自己玩,可以考虑把模型切成一半用accelerate的device_map自动分配,虽然慢但能跑通。工具链这块建议优先看vLLM和exllama2,别一上来就上DeepSpeed,调参能调到你怀疑人生。
双卡A100的话直接上张量并行就行,vLLM或者TGI都原生支持,70B FP16切成两半每卡65G左右刚好塞下,还能留点空间给KV cache。4bit量化掉点其实没想象中严重,尤其推理场景下用GPTQ或AWQ比bitsandbytes稳得多,后者速度太慢而且容易崩。ZeRO-3是训练用的,推理别碰它,每卡存完整副本反而更吃显存。另外可以试试FlashAttention和PagedAttention,能省不少激活内存,先跑起来再考虑优化精度吧。
4bit量化实际效果没那么吓人,你这需求直接上GPTQ或者AWQ就行,两张A100跑起来稳稳的。
4bit量化其实掉点没想象中严重,两张A100用vLLM加张量并行就能跑,别自己硬搞ZeRO。
试试AWQ或GPTQ量化,配合exllama或者llama.cpp,两张卡基本能扛住70B。
直接上4bit量化吧,70B推理损失真没那么夸张,两张A100用DeepSpeed ZeRO-3跑起来挺稳的。