最近在本地折腾部署一个13B参数的开源模型(想试试Qwen或者Yi),发现单张RTX 4090 24G显存根本跑不起来,加载模型就直接OOM了。查了资料说可以用量化或者offload到CPU,但试了一下4bit量化后效果感觉下降挺明显的,而且推理速度慢得离谱。有没有大佬分享下实际部署经验?比如用llama.cpp或者vLLM这类工具时,显存不足的情况下怎么平衡速度和效果?另外,是不是必须上多卡或者A100这种专业卡才行?学生党预算有限,求靠谱的省钱方案。
部署开源大模型,显存不够怎么破?求低成本方案
全部回复
共 168 条说实话13B全精度在24G上确实紧,但OOM不全是显存的问题,可能是你context长度没调好。我建议试试llama.cpp的Q5_K_M量化,比4bit损失小很多,配合-mmproj跑CPU offload,速度虽然慢点但至少能跑起来。你真想省钱的话,租个云GPU按小时算比买卡划算,比如AutoDL上4090也就两块多一小时,跑完就关。另外vLLM对显存优化比llama.cpp强,但13B模型用单卡还是别指望太高吞吐,先调低max-model-len到2048试试。
试试llama.cpp的Q5_K_M量化吧,比4bit强不少,13B在4090上配合mmap把部分层offload到内存,速度虽然慢点但能跑。vLLM对显存要求其实更高,适合多卡场景,你单卡还是别折腾了。另外可以看看AWQ或者GPTQ的4bit,效果比普通量化好,但得用对应的推理框架。学生党的话,租云GPU按小时算,跑实验比买卡划算多了。
4090跑13B其实不用offload到CPU,llama.cpp里开--no-mmap再把gpu层数调到30层左右,速度能接受,效果比4bit强些。vLLM的话试试--gpu-memory-utilization 0.9,但得配好swap。我自己的经验是Qwen的GGUF Q5_K_M在24G上能跑到15token/s,比量化损失小很多。另外别急着上A100,二手3090两张也就比一块4090贵一点,用张量并行跑效果更好,学生党可以蹲蹲矿卡。
说实话24G跑13B确实有点极限,我之前用4090试过Qwen-14B,4bit量化加8k上下文刚好卡在边缘,但速度只有10来token/s,日常用挺煎熬的。你试过llama.cpp的GGUF格式吗?那个对显存不够的情况优化得比vLLM好不少,它能把部分层自动offload到CPU,虽然慢点但至少不OOM。另外别死磕13B,其实7B或者8B的模型在量化后效果差距没想象中大,尤其用AWQ或者GPTQ这类更先进的量化方法,比GPTQ默认的4bit好多了。我现在的方案是租云GPU,按小时计费那种,比如AutoDL或者RunPod,一个月几十块钱就能搞定,比自己买卡划算多了,学生党真的别硬攒钱上A100,性价比太低了。你不如先试试把模型换成7B的Qwen2.5或者Yi-1.5,配合llama.cpp的--split-mode layer选项手动分配显存和CPU比例,应该能跑起来,速度慢就慢点,至少能玩。还有个小技巧,把context长度限制在2k以内,能省不少显存,别贪心开太长。要是真想上13B,那就做好心理准备,要么接受低速度,要么就上双卡,但二手3090现在也不贵,两张24G加起来比一张4090还便宜,你可以考虑下这个路线。
试试llama.cpp的Q5_K_M量化配合部分层offload,13B在24G能跑到10t/s,比4bit靠谱多了。
说实话24G跑13B理论上是够的,问题出在你用的框架和量化方式上。我之前用Qwen-14B在4090上跑4bit,llama.cpp的GGUF格式,context长度限制在2048,然后开一部分层offload到CPU,速度虽然比全GPU慢但至少能稳定跑,而且效果没你感觉的那么差——你是不是用了GPTQ那种动态量化?换AWQ或者直接用llama.cpp的Q4_K_M试试,感知损失会小很多。另外vLLM的话记得开--gpu-memory-utilization 0.92,然后配合--swap-space,虽然会触发CPU offload但吞吐比你想的高。学生党真没必要上多卡,A100更是乱花钱,你完全可以租云GPU按小时算,比如AutoDL或者RunPod,4090一小时也就两块钱,跑实验比本地折腾省心多了。最后提醒下,13B模型用FP16本来就不是给单卡设计的,你如果非要追求原版精度,那只能牺牲速度用纯CPU推理,但那个体验真的会让人崩溃。
4090跑13B其实不用执着于4bit,试试llama.cpp的Q5_K_M或者Q6_K,配合部分offload到CPU,速度和效果能平衡不少,我实测比纯4bit强多了。vLLM的话可以开--gpu-memory-utilization 0.9,把KV cache吃满,但得看你的CPU内存够不够快,不然还是会卡。另外别急着上多卡,先看看你的模型有没有用flash-attention,这个对显存占用影响很大,开了之后说不定能省几个G。学生党的话,二手3090或者两张4060Ti 16G组起来,性价比其实比单卡4090高不少,就是得折腾下张量并行。
说实话24G跑13B全精度确实紧,但量化掉精度这事儿得看你怎么用,我试过用llama.cpp的Q5_K_M档位,体感比4bit强不少,速度也还能接受,关键是得把gpu层数调到刚好塞满显存,剩下丢给CPU。vLLM的话可以试试开swap空间,虽然慢点但至少不崩。学生党的话别纠结A100了,租云GPU按小时算其实更划算,或者直接上二手的3090组双卡,性价比比4090高多了。
试试llama.cpp开--mlock加--threads拉满,24G跑13B的4bit其实能稳,慢就慢点但比OOM强。
试试llama.cpp的Q5_K_M量化吧,比4bit效果好不少,而且它那个offload到CPU的机制其实挺智能的,你只要把部分层留在GPU上,速度不会太拉胯。我之前用16G显存跑13B模型,大概能到8-10 token/s,虽然不快但起码能跑。另外vLLM对显存要求其实更高,不太适合单卡场景,建议直接放弃。多卡或者A100真没必要,学生党的话先盘一盘自己手头的显存碎片化利用,比如把batch size调成1,关掉所有缓存,能省不少。
试试llama.cpp的Q4_K_M配合mmap,13B在32G内存的笔记本上能跑,速度虽然一般但比4090强。
13B用4bit还慢,大概率是没用对工具,llama.cpp的Q4_K_M配合mmap预加载能压到10G左右,速度比CPU硬扛强不少。vLLM对显存要求高些,但开--gpu-memory-utilization 0.9配合swap,13B量化后也能在24G上跑起来,就是并发别开太高。不追求极速的话,其实8G显存的卡也能凑合,关键是offload层数要调好,比如留个15层在GPU剩下丢CPU,单token延迟大概2-3秒,当个研究用途完全够。真要省钱,二手两张3090组NVLink比A100划算多了,就是电源和散热得折腾下。
说实话你这情况我太懂了,4090跑13B全精度本来就是硬撑,OOM太正常了。我建议你别死磕Qwen和Yi的原版,直接去下AWQ或者GPTQ的4bit版本,配合vLLM的awq后端,吞吐量能比llama.cpp高不少,而且显存占用能压到12G左右。不过你说效果下降明显,我猜你用的是GPTQ的老版本量化,试试最新的AutoAWQ或者用llm-compressor重新量化,质量损失会小很多,尤其是Yi系模型对量化敏感,得用更精细的校准集。至于offload到CPU,除非你内存特别大且是DDR5高频,否则真不建议,那速度不是慢一点,是直接没法用。另一个思路是上MoE架构的小模型,比如Mixtral 8x7B虽然也是13B级别,但激活参数只有2B,推理时显存压力小很多,效果还比同尺寸dense模型强。多卡的话,两张3090或者4090用NVLink互联,配合vLLM的tensor parallel,其实比单卡A100更划算,二手市场两张3090也就一万出头。最后提醒个坑,系统内存和swap文件一定要给足,不然模型加载时直接崩。
试试llama.cpp的Q5_K_M量化,13B能压到10G内,速度比4bit强不少,日常够用了。
试试llama.cpp的Q5_K_M量化加部分offload,13B在24G能跑,速度凑合,效果比4bit强不少。
试试llama.cpp的Q5_K_M或者Q6_K吧,4bit掉精度太明显了,13B在24G上其实能塞下,关键得开--split-mode和一部分层offload到CPU,速度会慢但至少能跑。vLLM的话可以开--max-model-len调小点,把KV cache省出来,不过它更吃显存,还是llama.cpp更省。别急着上多卡,二手3090或者两张2080Ti改22G的方案性价比高很多,A100对学生党真没必要。
说实话你这情况我太懂了,24G显存看着不小,但13B模型全精度加载确实就是刚好卡在悬崖边上。我之前试过Qwen-13B,4bit量化后效果其实没你想的那么拉胯,关键得看用啥工具做量化——GPTQ和AWQ的4bit比llama.cpp自带的那个gguf量化稳很多,尤其数学和代码任务上差距明显。但如果你追求速度,vLLM配合量化加上部分offload到内存,吞吐量能比llama.cpp高不少,代价是首token延迟会变长。我个人觉得现阶段最省钱的办法是别死磕13B,7B或8B模型用4bit量化在4090上能跑到很舒服的速度,效果其实够用了,比如Yi-6B或者Qwen-7B-Chat,日常对话和简单推理完全不掉链子。真要上13B还得保证速度,那确实得考虑双卡,但二手3090两张现在价格也不算离谱,或者干脆租云GPU按小时算,学生党偶尔跑实验比买卡划算多了。另外你试过把上下文长度调短一点吗?有时候OOM是因为默认的2048或4096的KV cache吃满了显存,手动限到1024能救不少。最后问一句,你推理的时候是纯CPU跑还是会用部分GPU层?如果显卡和内存之间走PCIe带宽不够,offload设置就得慢慢调,不然速度慢到怀疑人生。
试试llama.cpp的Q4_K_M再加GPU层数调优,13B在4090上能跑,速度能接受,效果损失比AWQ小。
试试llama.cpp的Q5_K_M量化加部分offload,13B在24G里能跑,速度慢点但比4bit靠谱。
试试llama.cpp的Q5_K_M量化+部分offload,13B在24G能跑,速度慢点但比4bit强不少。预算紧就别惦记A100了。