最近在本地折腾部署一个13B参数的开源模型(想试试Qwen或者Yi),发现单张RTX 4090 24G显存根本跑不起来,加载模型就直接OOM了。查了资料说可以用量化或者offload到CPU,但试了一下4bit量化后效果感觉下降挺明显的,而且推理速度慢得离谱。有没有大佬分享下实际部署经验?比如用llama.cpp或者vLLM这类工具时,显存不足的情况下怎么平衡速度和效果?另外,是不是必须上多卡或者A100这种专业卡才行?学生党预算有限,求靠谱的省钱方案。
部署开源大模型,显存不够怎么破?求低成本方案
全部回复
共 168 条你试试llama.cpp的Q5_K_M量化,配合--n-gpu-layers把部分层扔到GPU,效果比4bit好很多,速度也能接受。13B模型其实24G够呛,但用offload到内存加--mlock锁页,慢是慢点,日常玩玩够了。vLLM对显存要求更苛刻,学生党不如搞两张二手3090,或者直接租云GPU按小时跑,比买A100划算多了。我目前就用3060 12G跑7B模型,量化加长上下文也凑合,别太追求速度就行。
说实话4090跑13B量化到4bit还是OOM有点奇怪,可能是上下文窗口开太大了或者没开KV cache量化。我自己的经验是llama.cpp配合Q4_K_M加flash attention,13B能稳在8-10 token/s,日常聊天够用了,效果比GPTQ稍微好点。预算有限的话别急着上多卡,先试试把gguf的split模式打开,CPU内存够大可以分一半层出去,速度会掉但至少能跑。另外vLLM对显存优化其实更激进,但设置复杂点,新手建议先玩llama.cpp。真不够再考虑二手3090或者等国产卡降价,A100对学生党真没必要。
4090跑13B其实不用非得量化到4bit,试试llama.cpp的Q5_K_M或者Q6_K,效果比4bit好不少,速度也能接受。另外开个--no-mmap加--mlock,把部分层丢到CPU上,跑起来也就比全GPU慢30%左右,日常聊天完全够用。真要追求速度就上双卡,二手3090现在也不贵,两张加起来比一张4090还便宜,显存直接翻倍。别迷信A100,学生党用性价比方案才是王道。
说真的,24G跑13B全精度确实卡在临界点上,但你这情况不至于直接放弃。我试过llama.cpp的Q5_K_M量化,效果比4bit强不少,速度也能接受,大概每秒10来个token,写代码或者跑对话够用了。别死磕Qwen和Yi的原版,GGUF格式的量化版在HuggingFace上直接下,省事很多。
另外你提到offload到CPU,其实把大部分层放GPU,只留几层给CPU,配合--tensor-split参数调一下,能明显缓解OOM,速度损失没想象中那么夸张。vLLM的话对显存优化更激进,但配置起来麻烦点,学生党不如先用llama.cpp把流程跑通。
多卡或者A100真没必要,我之前用两张3090跑过70B,但性价比太低,电费都心疼。你现在的瓶颈其实是显存带宽,不是容量,试试把batch size调成1,关闭所有额外缓存,甚至用--mlock锁内存,都能挤出空间。
最后问下,你换过flash attention吗?这玩意儿对显存占用影响挺大的,我开了之后直接省了3G多。如果还不行,考虑下7B模型+LoRA微调,参数少一半,效果未必差多少,日常折腾完全够用了。
试试llama.cpp的Q4_K_M量化加部分offload,13B在24G能跑,速度慢点但效果比4bit好。
13B量化到4bit其实不该这么拉胯,你试试llama.cpp的Q5_K_M或者Q6_K,体感和fp16差距小很多,速度主要卡在内存带宽,搞个双通道DDR5能提升不少。别急着上A100,二手3090性价比挺高的,两张24G跑起来比一张4090舒服多了,或者干脆用AWQ配合vLLM的投机采样,延迟能砍半。说到offload,把KV cache留GPU上、权重扔内存,实测比全offload快三倍,就是得手动调一下层数分配。
其实不用一上来就盯着13B,Qwen和Yi的7B版本配合4bit量化在4090上能跑得很舒服,速度完全可用。如果非要上13B,试试llama.cpp的Q5_K_M量化,效果比Q4好不少,配合offload到CPU层,把部分层放GPU,速度也就慢个两三成。vLLM主要吃显存,24G跑13B确实极限,但开gpu_memory_utilization到0.95,加上--max-model-len调短点,也能勉强塞进去。多卡或者A100真没必要,学生党的话,租云GPU按小时算更划算,比如AutoDL的4090也就两块多一小时,跑完就关。
说实话24G跑13B纯属踩坑了,这个参数级别本来就不是给单卡消费级准备的。我自己试过Qwen-13B的GPTQ4bit,效果确实掉得厉害,尤其中文长文本生成时逻辑会飘,后来换回7B的Qwen-14B反而觉得更稳。你要真想省预算,先别急着上多卡,把llama.cpp的offload层数调到一半试过没?我这边把20层放GPU、剩下扔CPU,速度虽然只有3-4 token/s,但至少不OOM,日常问个代码逻辑够用了。另外vLLM其实对显存优化更好,但得配合AWQ量化,4bit精度比GPTQ高一点,你可以试试用AutoAWQ重新量化一份。还有个野路子,用llama.cpp的mmap模式配合NVMe SSD做swap,我把量化到5bit的Yi-34B跑在32G内存+SSD上,速度慢到没法交互,但批量跑个摘要任务还能忍。学生党的话建议直接租云GPU按小时算,比如autodl上租个3090 24G才两块钱一小时,比你买卡划算多了,跑完就停不心疼。至于A100,除非你要微调,纯推理真没必要。
试试8bit量化加llama.cpp,13B在24G能跑,速度慢就调小batch,别太纠结效果,先跑通再说。
试试llama.cpp的Q5_K_M量化,配20层offload到GPU,速度能接受效果也比4bit好不少,13B其实不用上多卡。
4090跑13B确实有点勉强,我之前用llama.cpp开8bit加部分offload,速度能忍但延迟还是明显,后来换Qwen的7B量化版才流畅些。你试试把上下文长度砍到2k,再把kv cache量化打开,能省不少显存,效果损失比单纯4bit小很多。别急着上多卡,先看下能不能用AWQ或者GPTQ的4bit配合CPU offload,推理慢点但至少能跑起来。另外vLLM对显存优化更好,但小显存下容易报错,得仔细调参数。
试试llama.cpp的Q5_K_M量化,13B跑CPU+GPU混合,速度能接受,效果比4bit强不少。
说实话24G跑13B应该不至于直接OOM,你试试用vLLM开--max-model-len调低点,或者把KV cache的显存占比调小,我怀疑是默认配置把上下文窗口拉太满了。我之前用4090跑Qwen-14B的AWQ量化版,8bit下能稳定跑4K上下文,速度大概20 tokens/s,虽然不算快但完全能用来做代码生成这种任务。4bit效果下降明显的话,可以考虑GGUF的Q5_K_M这个档位,比Q4好不少,文件大小也就多1-2G。另外别把offload到CPU当洪水猛兽,只要别全量offload,比如只把部分层放CPU,配合--tensor-parallel-size 1,实测比纯GPU量化慢不了太多。真要省钱的话,二手3090 24G现在大概七八千,两张并联跑13B的FP16很稳,比上A100划算多了,不过得注意电源和散热。你用的什么推理框架?如果是transformers直接加载,那确实容易OOM,换llama.cpp或者ExLlamaV2会好很多。
试过把13B量化到4bit还得配合8-10层offload到CPU,速度确实拉胯,但至少能跑起来。后来发现vLLM对显存管理比llama.cpp激进,配合KV cache量化能挤出不少空间,效果损失比单纯量化小。别急着上多卡,先试试把max-model-len调低,或者用MoE架构模型(比如Mixtral 8x7B的量化版),单卡能玩转。学生党的话,租云GPU按小时算更划算,别折腾本地了。
单张4090跑13B确实有点极限,但别急着上多卡。我之前用llama.cpp的GGUF量化到Q5_K_M,配合部分层offload到CPU,速度虽然不如全GPU但至少能跑,效果比4bit强不少。另外vLLM对显存管理更激进,可以把KV cache压缩一下试试,不过学生党的话,租个云服务器按小时算可能更划算,比如AutoDL的4090才两块多一小时。
显存不够的话试试llama.cpp的GGUF格式加Q5_K_M量化,13B大概只要10G出头,速度比4bit那个看起来靠谱多了,不过CPU推理确实急人,建议把部分层offload到GPU。vLLM对显存要求反而更高,学生党还是别碰了。另外可以看看MoE架构的模型,比如Mixtral 8x7B虽然总参数大但激活参数少,24G反而能跑,效果不比13B差。真不想牺牲效果的话,租云GPU按小时算吧,比自己买卡划算。
别急着上多卡,先把llama.cpp的--n-gpu-layers参数调一下,把能塞进显存的层数算好,剩下的丢CPU,速度虽然慢点但至少不OOM。量化方面建议试试Q6_K,比4bit质量好很多,体积也就多2G。还有一招是改模型并行,把模型切成两半分别加载到CPU和GPU,但你需要自己写点代码。实在不行就看看7B或8B的模型,很多场景下跟13B差距真没想象中大。
说实话24G跑13B其实没那么绝望,问题可能出在你直接硬加载全精度权重上了。我自己的经验是先试试llama.cpp的Q4_K_M或者Q5_K_M量化,效果比你说的4bit要好不少,而且它支持GPU和CPU分层加载,你可以把一部分层放显存,剩下的丢内存,速度虽然比不上全GPU但至少能跑起来。vLLM的话对显存要求更苛刻,但好处是吞吐高,如果你只是自己调试用,不如老老实实走llama.cpp的offload方案。另外别忘了开swap或者调整内核的vm.swappiness,有时候OOM根本不是显存不够,而是内存映射策略太保守。真要追求效果又不想多花钱,可以考虑租云端GPU按小时算,比如autodl或者runpod上租个24G的卡也就几块钱一小时,比你直接买A100划算多了。最后想确认下,你说的推理速度慢是指token生成时的每秒几个字,还是加载模型的时间?如果是前者,试试把batch size调小一点,或者用--mlock锁页内存,有时候能意外提速不少。
试试llama.cpp的Q5_K_M量化配合mmap,把offload层数调到一半,13B在24G上能跑,速度比vLLM稳。
讲真13B在24G上OOM有点怪,你八成是没开offload或者context塞太长了。我之前用llama.cpp跑Qwen 14B,就是4bit量化加一部分层扔到CPU,显存占用压到10G左右,速度虽然掉到个位数token/s,但至少能跑。你要是接受不了这个速度,试试vLLM的swap策略,把KV cache放内存,推理快一些但显存照样吃紧。效果下降的话,其实可以对比下GPTQ和AWQ,有些模型对AWQ的感知损失更小,尤其Yi系列,4bit下感觉比Qwen还能打。至于上不上多卡,说实话学生党别碰A100,租卡一小时几十块够你跑很久了。省钱方案我试过最靠谱的是用两个二手P40 24G,拼起来48G,大概两千出头,虽然没Tensor Core但跑13B量化后速度比offload强多了。还有就是别死磕13B,试试7B的Qwen1.5或者Yi 6B,配合vLLM的continuous batching,体验完全不一样。你要是实在想省,先去Colab薅免费的T4 16G,开4bit量化跑7B,顺便把llama.cpp的--split-mode layer参数调明白再说。
24G跑13B其实卡在KV cache上,试试llama.cpp的flash attention加部分offload,把大部分层留GPU,只把最后几层扔CPU,速度损失能接受。另外Qwen的AWQ量化比GPTQ更稳,效果掉得少,你换这个格式试试。vLLM就别想了,那玩意吃显存更狠,不如老老实实llama.cpp。真不用上A100,我拿两张3090跑过70B,性价比比单卡4090高多了。