最近在本地折腾部署一个13B参数的开源模型(想试试Qwen或者Yi),发现单张RTX 4090 24G显存根本跑不起来,加载模型就直接OOM了。查了资料说可以用量化或者offload到CPU,但试了一下4bit量化后效果感觉下降挺明显的,而且推理速度慢得离谱。有没有大佬分享下实际部署经验?比如用llama.cpp或者vLLM这类工具时,显存不足的情况下怎么平衡速度和效果?另外,是不是必须上多卡或者A100这种专业卡才行?学生党预算有限,求靠谱的省钱方案。
部署开源大模型,显存不够怎么破?求低成本方案
全部回复
共 168 条试试用ollama跑Qwen2.5-7B的Q4_K_M量化版,13B对4090确实吃力,7B效果也不差。
4090跑13B确实有点勉强,4bit量化掉精度是个痛点。可以试试llama.cpp的Q5_K_M量化,速度和效果平衡得比4bit好不少,配合GPU层数调参(比如留16层给显卡),剩下的offload到CPU,慢是慢点但至少能跑。如果预算紧,其实租几块P40或者V100的云实例更划算,学生认证经常有折扣,比自己折腾二手卡省心。另外vLLM对显存管理优化不错,但13B模型还是建议至少8bit量化+双卡,单卡硬扛太折磨了。
老实说24G显存跑13B模型确实有点捉襟见肘,我之前用4090试Qwen-13B也是直接爆显存,后来换了llama.cpp的Q4_K_M量化才能勉强塞进去,但速度确实感人,生成速度大概只有10 tokens/s左右。如果你对效果下降比较敏感,可以试试Q5_K_M或者Q6_K,虽然模型体积大一点但质量损失小很多,配合offload到CPU层数调低一些,显存占用能控制在20G以内。vLLM的话我试过用4bit AWQ量化,吞吐量比llama.cpp高不少,但单卡下batch size必须压到1才能不OOM,而且它对CPU offload支持不太好。其实还有一个偏门方案——用Ollama配合llama.cpp后端,自动管理显存和CPU交换,体验比手动调参省心。另外,如果只是自己玩,租云GPU其实比买硬件划算,比如AutoDL的按量计费卡,十几块钱就能跑一整天,学生党偶尔用用完全能接受。多卡方案成本太高,二手2080Ti魔改22G显存倒是能凑合,但供电和散热要自己折腾,不太推荐新手尝试。
我最近也卡在13B这坎上,试了一圈下来感觉量化真不是万能的,4bit那速度确实难受。要不你试试llama.cpp的mmap模式,把部分层放内存里跑,虽然慢点但至少不会OOM,日常聊天勉强能忍。另外可以看看Qwen的14B,它官方支持GQA,显存占用比同尺寸的Yi要低不少,说不定能省出运行空间。真没必要一步到位上A100,二手3080 20G现在性价比蛮高的,两张串起来跑个70B都行。
说实话24G跑13B纯属是量化方式没选对,试试AWQ或者GPTQ的4bit,配合llama.cpp的flash attention,速度能比你现在快好几倍。我之前用4090跑14B,把层数offload到内存一半,生成速度大概能到10 token/s,虽然不算快但至少能用了。学生党别急着上A100,先看看能不能租云GPU按小时算,比如autodl或者runpod,一个月可能就花几十块。另外可以试试把上下文长度砍到2K,显存占用直接降三分之一,效果损失比量化小多了。
学生党的话别急着上多卡,13B模型其实用llama.cpp搞4bit量化加CPU offload是能跑的,但速度确实拉胯,建议把GPU层数调高一点,比如全塞进显存,剩下的层交给内存,内存够大(32G以上)体验会好很多。另外可以试试GPTQ或者AWQ量化,比llama.cpp的gguf格式在vLLM里吞吐高不少,效果损失也小些。如果预算就几千块,收两张二手3090组NVLink,跑13B量化后速度能接近A100,比单卡4090强多了。
试下llama.cpp的Q5_K_M量化吧,4bit确实掉点明显但5bit会好很多,配合mmap把模型映射到内存,13B大概需要16G内存,速度虽然比不上纯显存但比offload流畅。另外vLLM对显存要求其实更高,还不如直接上AWQ或GPTQ量化版模型,很多社区已经调好的权重直接下载就行。预算有限的话最近二手3090价格降了不少,两张24G拼起来跑13B很舒服,比单卡4090体验好太多。
说实话24G跑13B挺尴尬的,Qwen和Yi这俩原生权重都不算小,硬塞肯定爆。你试的4bit量化效果差,大概率是没调好,llama.cpp用Q4_K_M或者Q5_K_M,配合flash attention,速度其实能到能用的程度,但别指望跟全精度比。vLLM的话,开--gpu-memory-utilization 0.9,再配合--cpu-offload-gb,把一部分层丢到内存里,推理速度会掉一半,但至少能跑。另一个思路是换模型,13B的话试试Qwen1.5的14B(它其实是13.8B),不过更建议直接上7B或8B的量化版,比如Yi-9B或者Qwen2-7B的Q8,显存占用直接砍半,效果差距没你想的那么大。多卡和A100真没必要,学生党去搞两张二手P40(24G)串起来,也就一千多,用llama.cpp的tensor split,性能比单卡4090强,就是功耗和噪音感人。另外可以考虑下SGLang,它最近对offload优化得不错,比vLLM在低显存场景下更灵活。最后建议你实际跑一下lm-eval-harness对比量化前后的分数,别凭感觉觉得效果下降,很多时候是解码参数没跟着调。
说实话24G跑13B真不算宽裕,但也不是完全没戏。我之前用llama.cpp试过Qwen-13B的4bit,速度慢主要是因为你把太多层offload到CPU了,内存带宽直接成了瓶颈。可以试试把GPU层数调到能塞下的最大值,比如只offload最后几层,速度能快不少,而且质量损失其实比全offload小。
另外你提到4bit效果下降明显,我猜你可能用的是GPTQ或者AWQ的旧版本,换成最新的GGUF Q5_K_M或者Q6_K试试,体感上比Q4好很多,显存占用也就多1-2G。如果还是OOM,可以考虑把上下文长度砍到2048,省下来的KV cache能多塞好几层。
vLLM的话,如果只是自己玩,其实不太推荐,它优化的是并发吞吐,单请求延迟反而未必比llama.cpp好。真要省钱,建议二手收张3090,24G显存现在也就四千出头,比A100便宜太多,跑13B量化版能全速,甚至能摸一下20B的模型。
最后问一句,你训练还是纯推理?纯推理的话试试exllamav2,它的量化方案我觉得是目前开源里效果和速度平衡最好的。
我之前也是4090跑13B直接爆显存,后来换了llama.cpp的Q5_K_M量化,效果比4bit好不少,速度虽然慢点但能接受。你要是能接受损失,试试8G显存跑7B模型其实更流畅,13B硬撑不如换小一号。还有一招是把KV cache调到8bit,能省1-2G显存,vLLM里加个--kv-cache-dtype参数就行。多卡A100真没必要,学生党性价比最高就是租云GPU按小时算,跑完就关,比买卡划算多了。
4090跑13B确实难受,不过不用急着上多卡。我最近用llama.cpp的Q5_K_M量化跑Yi-13B,把一半层offload到CPU,速度虽然只有5 tok/s左右,但质量比4bit强不少,日常聊天够用。另外你可以试试vLLM的swap机制,或者干脆用8B模型加长上下文,性价比反而更高。学生党的话,租卡按小时算也不贵,跑完再退就行。
其实你这情况我太懂了,当初我拿3080 10G跑13B也是各种折腾。先别急着上多卡,4090跑13B其实有戏,关键是别用transformers硬扛,llama.cpp加Q4_K_M量化能塞进去,但内存带宽决定速度,速度慢是正常的,毕竟CPU offload后就得靠内存带宽了。我试过把20层放GPU剩下扔内存,效果比全offload好不少,显存占用能压在17G左右,速度大概每秒5-7个token,写代码够用,聊天得有点耐心。至于效果下降,4bit确实有损但没你感觉的那么夸张,可能是采样参数没调好,建议把温度降到0.6以下,top_p调到0.9,体感会好很多。vLLM的话对显存要求更苛刻,除非你有双卡,不然不推荐。还有个偏门办法是拿8bit的GGUF配合flash-attention,偶尔能挤出一点性能。最后说句实在话,学生党真别上A100,租云GPU按小时算更划算,比如autodl上4090一小时才两块多,跑完实验再下来,本地折腾适合玩不适合干活。
说实话我最近也在折腾这个,13B上4090确实有点极限,但没到必须上A100的地步。你可以试试llama.cpp的GGUF格式,配合Q5_K_M或Q6_K量化,效果比4bit好很多,速度也能接受。另外记得开flash attention和--no-mmap,能省不少显存。还有个野路子是把模型拆成两半,用CPU算前几层,GPU算后面的,虽然慢点但至少不OOM。学生党就别想多卡了,二手3090性价比其实挺高的。
其实13B没那么吃显存,关键在于你没用对工具。试试llama.cpp的Q5_K_M量化配合GPU层数设置,把一半层放显卡一半放内存,速度比全CPU快不少,效果也比4bit强很多。另外vLLM虽然快但显存管理比较激进,学生党建议直接上llama.cpp,或者看看AWQ量化版,体感比GPTQ好。单卡4090跑13B完全够用,别急着上多卡,先调参再说。
试试llama.cpp的Q5_K_M量化吧,13B在24G上能跑,速度比vLLM的CPU offload强多了,效果损失也小。
这个思路不错,收藏了。
试试llama.cpp的Q4_K_M量化,13B跑到8token/s没问题,别用GPTQ。效果损失其实可控,主要你得调下repeat_penalty。
13B上4090其实不用硬扛全精度,我平时用llama.cpp的Q5_K_M量化配合mmap,把部分层丢到内存里,速度大概10-15 token/s,写代码够用但聊天会有点急人。vLLM对显存要求反而更高,不如试试Ollama的CPU+GPU混合模式,设置num_gpu参数把最后几层留给显卡。另外你看看是不是忘了开flash attention,这玩意儿能省不少显存。真要上A100不如组两张二手3090,性价比吊打。
4090跑13B其实不用非得量化到4bit,试下llama.cpp的Q5_K_M或者Q6_K,效果比4bit好不少,速度也能接受。另外把部分层offload到CPU虽然慢点,但至少不OOM,学生党可以先拿小点的模型练手。vLLM的话对显存优化更狠,但配置麻烦些,你可以先试试lmdeploy,它对单卡支持更友好。真要省钱不如直接租云GPU按小时算,比买A100划算多了。
其实4090跑13B没你想的那么绝望,关键得看你怎么用。我之前用Qwen-14B也遇到过OOM,后来发现llama.cpp的Q5_K_M量化比4bit那个效果稳不少,速度虽然慢点但至少能跑,你不妨试试不同量化档位,别死磕4bit。另外vLLM其实不太适合单卡小显存,它更吃内存带宽,你不如直接用llama.cpp的--n-gpu-layers参数把部分层放GPU,剩下扔CPU,这样能明显缓解OOM,代价就是速度慢,但比完全CPU跑快多了。至于效果下降,说实话13B量化到4bit确实能感觉到损失,但如果你只是玩玩或者做文本分类这种简单任务,影响不大,要是追求生成质量那确实得考虑上双卡,不过学生党的话,租云GPU按小时算比买A100划算多了,比如AutoDL那种,几十块一小时,跑完就退。还有个野路子,你可以试试把模型切成两半用两个设备跑,但设置麻烦,不如直接上量化加CPU offload先凑合。总之别急着花钱上多卡,先调参试试,我周围有人用2080Ti改22G显存跑13B也玩得挺溜,关键还是看你的耐心和需求。