最近在折腾把Llama 3.1 8B量化到4bit,想在自己笔记本上跑个API服务。用的ollama部署,结果模型加载到一半就报CUDA out of memory,8G显存直接爆了。试了用llama.cpp的Q4_K_M量化版,加载倒是能成功,但推理速度慢得离谱,一句话要等十几秒。想问下各位大佬,是不是我的量化参数选得不对?或者有没有什么模型分片、offload到CPU的配置技巧?另外看到网上说可以加swap,但感觉延迟会更高。主要场景是自己做点RAG实验,不想每次都调云API,求指点!
部署Llama 3.1本地服务时OOM怎么破?8G显存还有救吗?
全部回复
共 197 条8G跑8B Q4确实紧巴,ollama默认会把整模型塞显存,你可以试试OLLAMA_KEEP_ALIVE=0或者手动限制gpu层数,把后面几层丢给CPU算,延迟会高一点但至少不OOM。llama.cpp那边记得开--mlock和--no-mmap,换Q4_0或者Q5_0可能比K_M更稳。RAG场景其实不用全量加载,考虑下把embedding模型单独跑CPU,主模型用vLLM的prefix caching试试?另外swap就别指望了,那速度做实验能急死人。
8G显存跑4bit量化8B确实紧,不过你llama.cpp能加载成功说明路子没走错,试试把层数分片到CPU跑,--n-gpu-layers调成20左右,推理速度会比纯CPU快不少。另外ollama默认会预留显存给上下文,你手动把num_ctx调小到2048试试,能省出不少空间。swap就别指望了,那玩意一碰延迟直接起飞,RAG场景体验会很糟。真要舒服点的话,可以考虑下6B或者7B的量化模型,或者用Qwen2.5-7B的AWQ版本,显存占用会好看很多。
8G显存跑8B量化确实紧张,但Q4_K_M加载成功已经很不错了。你说的慢大概率是部分层跑在CPU上导致的,可以试试把GPU层数调高一点,比如-ngl 20到25,让更多计算留在显存里。另外ollama的并发和上下文长度也会吃显存,看看是不是默认设太高了,把ctx砍到2048能省不少。swap就别指望了,那速度做RAG能把人急死,实在不行就换5B或者3B的小模型,精度损失对实验来说完全可以接受。
8G显存跑8B量化其实有点极限,我自己的体验是Q4_K_M配llama.cpp时把层数offload到CPU能稳不少,比如-ngl 20左右,虽然慢点但至少不会爆显存。你试过把batch size调小吗?Ollama有时候默认参数太激进,手动设OLLAMA_NUM_PARALLEL和OLLAMA_MAX_LOADED_MODELS可能有用。另外swap别碰,延迟直接起飞,不如老老实实分片到CPU内存。RAG场景的话,其实可以试试把embedding模型和生成模型分开跑,或者用更小的7B/3B版本先验证流程。你推理慢是不是没开GPU加速?llama.cpp编译时带CUDA支持了吗?
8G显存跑8B量化确实很极限,我试过Q4_K_M但把大部分层offload到CPU,用--n-gpu-layers 20左右能跑起来,速度虽然不快但比全CPU好不少。你那个十几秒会不会是没调好线程数?llama.cpp记得开--threads和--batch-size试试。另外RAG场景其实可以考虑用更小的embedding模型加向量库,主模型只做生成,这样显存压力会小很多,或者干脆试试4bit的7B模型比如Mistral,效果差距没那么大。swap就别折腾了,延迟高到没法用。
8G跑4bit量化8B其实挺极限的,OOM大概率是ollama默认把上下文窗口拉太高了,试试把num_ctx调到2048能省不少显存。llama.cpp那边慢可能是没用GPU加速,编译时加个CUDA支持,再把层数offload到GPU一半,速度能起来不少。swap就别折腾了,延迟高到没法用,不如直接把batch size调小点。另外RAG的话可以考虑挂个embedding小模型,主模型推理压力能小很多。
我8G跑Q4_K_M也就这速度,RAG的话试试把embedding模型换小的,或者用llama.cpp的mmap加offload层数调低点。
8G跑8B量化确实有点极限,我自己的经验是Q4_K_M能加载已经不错了,速度慢多半是因为部分层被挤到CPU上算的。你可以试试把gpu_layers设到30左右,留几层给CPU,同时把ctx长度砍到2048,RAG场景够用,速度能快不少。另外ollama的num_parallel默认可能开了多路,改成1能省点显存。swap就别指望了,延迟高到没法用,真要流畅还是得看6B或者7B的量化版,比如Qwen2.5-7B,体感比Llama3.1友好。
8G跑4bit确实紧,试试把部分层offload到CPU,llama.cpp加个--n-gpu-layers调小点能稳不少。
8G显存跑4bit的8B模型确实卡在临界点上,我自己的4060也踩过这坑。你提到llama.cpp能加载但慢,大概率是没开GPU offload,默认全跑CPU了,试试加-ngl 32把层数往GPU塞,8G显存大概能放30多层,剩下几层CPU兜底,速度能快好几倍。另外量化参数其实没啥问题,Q4_K_M已经挺均衡了,换个思路用llama.cpp的--no-mmap参数能省点显存,或者干脆上GGUF的Q3_K_S,画质损失不明显但能多塞几层进显存。ollama那个OOM很诡异,它默认会预分配全部上下文,你把num_ctx调到2048甚至1024,显存占用能砍掉一大截。swap就别加了,那个延迟会让RAG检索体验直接报废,我试过,生成token的时候能卡到怀疑人生。还有个偏方,用--split-mode layer配合--main-gpu 0手动控制分片,但8G单卡效果有限。最后如果实在不行,就退而求其次用Qwen2.5 7B的AWQ量化版,同级别显存占用下速度能快30%,专门为RAG做的话够用了。
试试Q3_K_M加8层offload到CPU,8G勉强能跑,速度能压到5秒内,RAG够用了。
8G跑8B量化确实勉强,但你这情况大概率不是量化参数的问题,而是ollama默认把整层都塞进显存了。试试用llama.cpp带--n-gpu-layers参数手动分配,比如只offload 20层到GPU,剩下的给CPU,速度会好很多。另外swap真别碰,那玩意儿延迟能让你怀疑人生,不如把系统内存加大点或者直接用MMP(内存映射)模式。对了,你RAG实验如果只是文本检索,其实可以试试更小的7B或6B模型,8B在8G上就算跑起来也容易随机崩。
试试Q3_K_S加8层offload到CPU,RAG场景延迟能压到5秒内,还不行就换7B模型吧。
8G跑4bit确实勉强,试试把层数offload一半到CPU,速度能平衡些。
8G显存跑4bit量化确实有点极限,问题大概率出在KV cache和上下文长度上。你试试把llama.cpp的ctx从默认的4096砍到2048,再开个--no-mmap,能省下不少显存给计算用。另外offload层数别全给GPU,留个10来层给CPU跑,速度虽然不会飞起但至少不会爆显存。swap就别指望了,那东西读写放大太严重,RAG场景下检索出来的上下文稍长点延迟直接没法看。
8G跑8B量化确实有点极限,我试过llama.cpp的Q4_K_M,加载后把大部分层offload到CPU,gpu层数调到20左右,速度能到每秒3-4个token,虽然慢但至少不爆显存。另外ollama的OOM可能和它默认的KV cache分配有关,你试试把num_ctx调小到2048,能省不少显存。swap就别想了,延迟会高到怀疑人生。RAG场景其实可以试试把embedding模型单独跑CPU,主模型留GPU,这样能匀出更多空间。
8G跑4bit确实勉强,试试把部分层offload到CPU,batch size调小点,速度能接受就行。
8G显存跑4bit 8B确实紧,但ollama默认会把部分层塞给GPU,你可以试试把num_gpu调低点,比如只留20层在显卡上,剩下全走CPU,实测能跑但速度也就图一乐。另外llama.cpp记得开--no-mmap和--mlock,能减少内存碎片和换页,比硬上swap靠谱。RAG实验的话,干脆把embedding模型放GPU,主模型全CPU算了,反正一句话十几秒也能忍。你系统内存多大?如果16G以上,用Q4_K_M全CPU推理其实比GPU+CPU混合更稳。
8G跑8B量化确实紧巴,ollama默认会预留不少显存给上下文,你可以试试把num_ctx调小到2048,能省出1-2G。另外llama.cpp记得开--mlock和--no-mmap,避免内存换页拖慢速度,Q4_K_M本身没问题,慢多半是CPU offload太多。swap就别想了,延迟会高到怀疑人生,真要本地跑RAG不如考虑5B或7B的模型,或者用llama.cpp的--parallel参数把计算图拆开,虽然麻烦但能压榨出点性能。
8G跑8B量化确实卡在临界点上,我之前用llama.cpp的Q4_K_M也遇到过类似问题。你可以试试把layer数调低,比如只offload一半到GPU,剩下的走CPU,虽然慢点但至少不崩。另外别开flash attention,那个吃显存,还有把context长度砍到2048试试,RAG场景够用了。swap就别指望了,延迟会高到怀疑人生。