最近在试着部署一个13B的开源模型到单卡上做推理,结果发现哪怕模型刚加载完,显存就占了快30G,根本跑不起来。我查了些资料,看到有几种路子:一个是4bit量化,但好像精度损失挺明显的,而且有些算子还不支持;另一个是剪枝,但我完全不知道怎么具体操作,那些论文里的方法感觉太复杂了。
部署开源大模型时显存总不够,大家是怎么量化或剪枝的?
全部回复
共 152 条其实可以先试试GPTQ或者AWQ的4bit,很多框架像vLLM和exllama已经支持得挺好了,精度损失在生成任务上体感没那么夸张。剪枝的话确实门槛高,我之前用LLM-Pruner试过,跑通流程就得折腾好久,效果还不一定稳定。如果你只是单卡推理,不如先看看是不是显存碎片化或者KV cache没调好,有时候把max_seq_len压一下就能省出好几个G。另外可以留意下最新的量化方法,比如FP8或者混合精度,有些新卡支持得比老方案好。
说实话4bit量化没你想的那么吓人,我最近在V100上跑13B的qwen,用GPTQ做完4bit之后显存直接掉到9G左右,精度跑了下MMLU确实掉了两三个点,但日常对话体感基本没差。你担心的算子不支持问题,其实现在主流框架像transformers加bitsandbytes已经兼容得挺好了,实在不行就把某些敏感层留在fp16,混合精度跑起来也没毛病。
剪枝这玩意我是真不建议新手碰,除非你有时间折腾结构化剪枝那套流程,不然稀疏化之后推理库不支持,速度反而更慢。我自己的经验是,先上AWQ或者GPTQ这类量化,把模型塞进去再说,等真跑通了再考虑要不要用llama.cpp的GGUF格式,那个对显存小的卡更友好,还能配合CPU offload。
不过你提到单卡13B,我猜你是想在推理时留点余量给长上下文?如果是的话,除了量化还可以试试vLLM或者TGI的continuous batching,它能把显存碎片利用起来,实际占用的峰值会比朴素的transformers调用低不少。另外问下你用的什么卡?如果是3090或者4090这种24G的,4bit之后跑13B应该绰绰有余,如果是16G的,那可能还得配合KV cache量化,那个在transformers里直接开load_in_4bit加use_cache量化就行。
说实话4bit量化没那么玄乎,我最近在3090上跑13B模型就是用的GPTQ,精度掉的那点对日常对话任务影响不大,关键是显存直接从30G干到10G以内。剪枝这块确实坑多,我之前试过那些结构化剪枝的代码,跑通就花了两天,最后效果还不如直接量化省心。你要是卡在显存上,我建议先别碰剪枝,找几个支持4bit推理的框架比如exllama或者llama.cpp先跑起来,算子不支持的问题换个后端可能就解决了。对了你主要跑什么任务?如果是生成类的,还可以考虑offload几层到CPU,虽然慢点但至少能跑。
说实话我最近也被这个问题折磨得不行,最后干脆换了条路:直接上GGUF格式的量化版,省心很多。你提到4bit精度损失明显,我猜可能是直接用GPTQ或者AWQ这种统一量化,没做per-layer的敏感度分析?实测下来有些层确实可以多砍点,有些层动一刀就崩,建议先跑个校准集看看每层的影响再定方案。
剪枝你要是嫌论文太复杂,可以试试SparseGPT这种现成工具,不用自己从头写,虽然效果跟论文里那种精细调出来的差一点,但胜在能跑。不过说实话,13B模型硬塞单卡,就算量化到4bit,推理速度也够呛,我试过7B的4bit在4090上都要吃20多G,你这13B恐怕得看具体卡的显存余量了。
还有个偏方:如果只是做demo,可以试试offload到CPU,像llama.cpp那样搞内存映射,虽然慢但至少能起来。另外你检查过模型加载时是不是把优化器状态和中间激活也算了?有时候光改量化不动推理框架的显存管理,还是会爆。
对了,你用的什么推理框架?VLLM和TGI对量化的支持差别挺大的,有些算子不支持换个框架可能就绕过去了。要是方便的话可以说下具体卡型和框架,说不定能帮你少走点弯路。
试试AWQ量化吧,13B能压到8G左右,比GPTQ稳,精度损失小到基本看不出来。
13B单卡真别硬上,先试试GPTQ 4bit加AWQ,精度够用,算子坑少很多。
13B单卡确实尴尬,我之前也是硬塞,后来发现直接上AWQ或者GPTQ的4bit其实比想象中稳,关键是选对校准集,拿你业务数据跑一下,精度损失大部分能拉回来。剪枝那个真不建议新手碰,SparseGPT那些代码跑起来一堆坑,不如先试试kv cache量化或者offload几层到CPU,能用就行。对了你推理框架用的啥?vLLM对量化支持好不少,能省不少事。
我最近也在折腾这事儿,13B上单卡确实难受。你试试GPTQ或者AWQ的4bit,别用那种一刀切的动态量化,精度其实还行,主要得挑对支持好的算子。剪枝的话别碰论文里的结构化剪枝,直接用SparseGPT或者Wanda这种现成工具,跑一遍就知道哪些层能砍了。另外你检查下是不是加载时没开torch的显存优化,有时候能省下好几个G。
我之前也卡在这步,13B硬塞单卡确实难受。后来试了AWQ或者GPTQ的4bit,精度其实比想象中好,关键是得避开那些不支持的算子,比如某些attention结构得手动改一下。剪枝的话别碰论文里的结构化剪枝,直接用SparseGPT或者Wanda这种现成工具,跑一遍看稀疏度到50%效果还行。你用的什么框架?如果是transformers的话,可以试试bitsandbytes的8bit加载,配合torch.compile能省不少显存,虽然速度会慢点但至少能跑起来。
4bit加AWQ量化能跑,精度损失其实没你想的那么夸张,试过再说。
剪枝别碰论文了,直接上SparseGPT或Wanda,一条命令的事。
试试AWQ或GPTQ的4bit吧,13B能压到8G左右,精度比GPTQ老版本好不少。剪枝真别碰,工程落地不划算。
量化的话别只盯着4bit,可以试试GPTQ的group size调大一点,或者AWQ对激活值做保护,精度损失会小不少。剪枝对13B这种规模其实不太划算,结构稀疏很难直接省显存,除非你用llm-pruner那种整体裁层,但效果掉得也快。我最后是换了7B加4bit,再配合vLLM的paged attention,单卡跑起来还算稳。你那边是什么卡?如果显存实在紧,考虑用CPU offload分担一部分也行。