最近在本地折腾部署一个13B参数的开源模型(想试试Qwen或者Yi),发现单张RTX 4090 24G显存根本跑不起来,加载模型就直接OOM了。查了资料说可以用量化或者offload到CPU,但试了一下4bit量化后效果感觉下降挺明显的,而且推理速度慢得离谱。有没有大佬分享下实际部署经验?比如用llama.cpp或者vLLM这类工具时,显存不足的情况下怎么平衡速度和效果?另外,是不是必须上多卡或者A100这种专业卡才行?学生党预算有限,求靠谱的省钱方案。
部署开源大模型,显存不够怎么破?求低成本方案
全部回复
共 168 条说实话24G跑13B真不是卡的问题,是工具链没选对。我之前用transformers直接加载也爆,但换llama.cpp的Q4_K_M量化后,13B能塞进20G左右,而且CPU offload开个20层左右,生成速度虽然比全GPU慢,但每秒也能蹦出七八个token,写代码够用了。你要是嫌效果降得厉害,试试Q5_K_M或者Q6_K,体积大点但质量接近原版,4090照样能扛。vLLM主要面向高并发服务,单机推理反而没llama.cpp灵活,尤其显存紧张时,它的预分配机制更容易OOM。另外别迷信A100,那玩意的显存带宽确实猛,但学生党租卡按小时算更划算,比如autodl上租个4090也就两块多一小时,比买卡香多了。你如果非要本地跑,还有个偏方:用GPTQ模型配合exllama2加载器,显存占用比FP16少一半,而且推理速度比llama.cpp快不少,就是量化时得自己调校准集,稍微麻烦点。最后问一句,你试过把模型切分成多个shard然后用accelerate的device_map自动分配吗?有时候不是显存不够,是碎片化太严重了。
试试llama.cpp的Q4_K_M量化,13B配24G够跑,速度慢就加--mlock锁内存,别硬上A100。
其实你提到的4bit掉精度问题,可以试试GPTQ或AWQ这类方法,比llama.cpp默认的量化方式稳一些,而且vLLM对显存管理更好,能塞下13B模型。另一个思路是干脆上Qwen的14B但用GGUF的Q5_K_M版本,配合llama.cpp的mmap把部分层放内存,速度慢点但至少能跑,学生党没必要硬上A100。如果预算真有几百块,租云GPU按小时用也行,比买卡划算多了。
你这情况我太熟了,一开始我也迷信量化,后来发现真要跑得顺还得看结合offload的玩法。试试llama.cpp的Q5_K_M配一部分GPU层数,留个8G给推理,速度能接受且效果比4bit强不少。别惦记着上多卡,学生党把CPU内存加大点,加个swap,照样能跑,就是别指望实时对话了。
说实话24G跑13B量化后还是慢,大概率是offload策略没调好,llama.cpp里记得把gpu层数拉满,留个几层给CPU做计算重叠会好很多。另外试试AWQ或者GPTQ的4bit,比RTN量化质量高不少,体感上跟FP16差距没那么大。预算有限就别惦记A100了,两张二手3090或者一张4090d加内存扩到64G,配合llama.cpp的mmap预加载,速度能接受。vLLM对显存要求更苛刻,小显存反而推荐用ExLlamaV2,批处理小一点照样能跑。
说实话24G跑13B全精度确实紧巴巴,但我建议你先别急着上多卡,把量化方案再调调看。我用llama.cpp的Q5_K_M跑过Qwen-14B,显存占用能压到14G左右,速度虽然比4bit慢点,但效果损失小很多,关键是别用那种激进量化。你试过把context长度砍到2k以下吗?很多OOM其实是KV cache撑爆的,这参数调小能省出不少空间。另外vLLM对显存管理比llama.cpp激进,开个gpu_memory_utilization=0.9配合--max-model-len,说不定能直接塞进去。要是真卡在推理速度上,试试把offload层数控制在15-20层,GPU和CPU的负载均衡点得自己多试几次。学生党的话,租云GPU其实比买卡划算,按小时租个4090跑完实验再释放,一个月下来成本也就几百块。最后说句实在的,如果只是玩玩,Qwen-7B量化后体验其实比硬上13B卡顿强多了,别跟参数过不去。
试试llama.cpp的Q5_K_M量化加部分GPU层offload,13B在24G下能跑,速度比全CPU快不少,效果损失也小。
学生党的话就别硬磕13B了,先试试7B或者8B的量化版,llama.cpp配Q5_K_M或Q6_K,速度能接受,效果也比4bit强不少。另外可以开offload层数到GPU,比如留个10层给显存,剩下的走内存,我试过12G显存跑7B能到10token/s。真要上13B,租个云GPU按小时算吧,比买卡划算,A100不是必需,两张3090或者一张A6000都行。
24G跑13B其实没那么玄乎,关键看你怎么切层和用多少上下文长度。我拿4090跑Qwen14B int4大概能到8-10 token/s,但得把KV cache砍到2k以内,不然照样爆显存。offload到CPU的话建议用llama.cpp的mmap模式,实测比vLLM的cpu-offload稳,就是首token延迟会到几秒。另外别死磕单卡,你试试租云GPU按小时算,像autodl上4090一小时才两块钱,学生党薅羊毛比买卡划算多了。
试试llama.cpp的Q5_K_M量化加部分GPU层数offload,速度能接受,13B在4090上大概10token/s。
24G跑13B其实不用慌,别死磕全精度,Q4_K_M或者Q5_K_M的量化损失没你感觉的那么大,可能是采样参数没调好。llama.cpp开--mlock加部分层offload到CPU,把gpu-layers调到20左右,速度能忍,但别指望实时对话。vLLM的话要开--gpu-memory-utilization 0.9,配合--max-model-len调短点,吞吐反而比单卡4090强。学生党别想着A100,二手3090或者两张2080Ti改22G显存,性价比吊打新卡,就是得折腾。
说实话24G跑13B确实卡在临界点上,我之前用4090试过Qwen-13B的4bit GPTQ,效果损失主要在复杂推理上,日常对话倒还能接受。但你说的速度慢,我猜是offload策略没调好,llama.cpp里设对gpu layers数量很关键,别全丢给CPU,留个20层左右在GPU上能快不少。vLLM的话可以试试paged attention和continuous batching,但单卡13B还是勉强,我后来直接换7B或8x7B的MoE模型了,像Mixtral那种,显存占用低,速度反而快,效果也没差太多。要是非要13B,另一个思路是租云GPU按小时算,比如autodl或vast.ai上A100 40G也就几块钱一小时,比你攒钱买卡划算多了,学生党偶尔跑跑任务完全够。还有别忽略系统RAM,如果你内存够大,用llama.cpp的mmap模式把权重复制到内存里,配合numa绑定,能撑住但推理会掉到个位数token/s,只能凑合测试用。最后提醒下,别迷信A100,其实3090或4090双卡NVLink互联性价比更高,二手卡下来也就一万出头,但得确认主板支持p2p通信。如果你的场景不是生产级,我觉得7B量化加长上下文可能才是你真正需要的平衡点。
其实可以试试Qwen的14B AWQ量化版,配合llama.cpp的mmap模式,把大部分层offload到内存,速度虽然不如纯GPU但比4bit慢到离谱的情况好很多。我自己的5900X+32G内存跑起来大概6-8 token/s,日常聊天够用。另外vLLM对显存要求更苛刻,学生党建议先别碰。如果预算真有限,租云GPU按小时算其实比买硬件划算,比如autodl上4090一小时才两块钱,跑完实验再退掉。
试试llama.cpp的Q5_K_M量化加GPU层数调优,13B在24G能跑,速度比4bit稳,效果损失小很多。
其实不用一上来就追求满血效果,13B模型用Q4_K_M或者Q5_K_M量化后,配合llama.cpp的flash attention和批处理大小调低,4090跑起来是够的,速度慢多半是CPU offload设得太多。我自己的经验是开个--no-mmap,把部分层留在GPU上,效果比全offload好不少。另外vLLM的话可以试试--gpu-memory-utilization设到0.9,但小batch下其实不如llama.cpp灵活。真要省钱,二手淘张3090或者两张2080Ti用张量并行,性价比比A100高多了,就是得折腾下散热。
4090跑13B确实憋屈,我试过Qwen13B用llama.cpp的Q4_K_M加offload到CPU,把40层里10层扔给内存,速度大概能到8-10 token/s,凑合能用但体验确实拉胯。其实可以试试8G显存的卡跑7B或者14B的量化版,比如用AWQ或GPTQ的4bit,效果比llama.cpp的Q4好不少,而且vLLM支持paged attention后显存压力小很多。学生党的话搞两张二手3080 10G组个张量并行也行,成本比A100香多了,就是折腾点。
其实24G跑13B没你想的那么绝望,问题可能出在加载方式上。我试过用llama.cpp的GGUF格式,Q4_K_M量化加部分offload到CPU,虽然首token延迟高点,但生成速度能稳定在每秒10-15 tokens,日常聊天完全够用。vLLM反而更适合多用户并发场景,单卡单模型有点浪费,而且它对显存碎片化处理不如llama.cpp灵活。另外别迷信4bit,你可以试试Q5_K_M或者Q6_K,体感上比Q4好不少,文件大不了多少。如果非要上13B全精度,那确实得双卡或者A100,但学生党真没必要——7B或8B的Qwen2.5在量化后效果已经非常能打了,很多任务跟13B差距不大,显存占用直接砍半。还有个骚操作,如果你用transformers库,可以试试device_map='auto'加load_in_8bit,配合bitsandbytes,虽然速度一般但至少不OOM。说到底,4090算是性价比很高的玩具了,别被网上那些动不动就A100的帖子带偏,先把手头卡榨干再说。
4090跑13B其实不用太焦虑,我之前用vLLM加AWQ量化,4bit下速度能到20 tokens/s左右,够日常玩了。关键是别死磕单卡,把部分层offload到内存,同时调低max sequence length,很多场景根本用不到8K上下文。另外你试过llama.cpp的k-quant吗?比常规4bit损失小不少,配合mmap加载权重,老平台也能勉强跑起来,就是首token延迟会高些。如果预算真卡死,搞张二手3090或者两张2080Ti组张量并行,比单卡4090实惠多了,速度还能翻倍。
试试llama.cpp的Q5_K_M量化加部分offload,13B在4090上能跑,速度虽然比不上满血但日常够用。
试试llama.cpp的GGUF加Q5_K_M量化,13B能压到10G内,速度比4bit快不少,效果损失也小。