最近在折腾把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显存还有救吗?
全部回复
共 44 条8G显存跑8B模型确实有点极限,Q4_K_M能加载成功已经不错了,慢可能是CPU-GPU传输瓶颈。可以试试ollama配合--num-gpu-layers参数把部分层offload到GPU,再留一些给CPU运算,或者用llama.cpp的--tensor-split选项手动控制显存分配。另外RAG场景可以先把向量库本地化,模型用更小的比如3B或Q2量化版本,响应速度会好很多。
8G显存跑4bit量化版Llama 3.1确实有点极限,ollama加载时可能额外占用了不少显存做缓存。你试过用llama.cpp的--tensor-split参数手动分配多少层给CPU吗?我自己的经验是,把大概一半的transformer层offload到CPU内存,虽然推理会慢点,但至少能跑起来,而且Q4_K_M版本的显存占用应该能压到6G左右。另外,ollama默认的context size是2048,如果改成512或1024能省不少显存。你提到RAG实验,其实可以试试先拆分文档再用小模型做embedding,这样主模型只负责生成,负载能降不少。不过加swap的话,推理延迟确实会翻倍,建议优先调参而不是依赖swap。对了,你用的cuda版本是12.1以上吗?有时候驱动和cuda版本不匹配也会导致显存管理异常。
可以试试把部分层offload到CPU,配合numa绑定,8G显存跑4bit量化8B模型能省出不少显存。
8G显存跑8B模型确实有点极限,我踩坑比你早两个月。ollama默认会用满显存,其实llama.cpp加载时加个--no-mmap参数,再手动设置--n-gpu-layers到20左右能把部分层offload到CPU,推理慢但至少能跑。不过你这情况Q4_K_M加载成功还慢,可能CPU内存带宽是瓶颈,我笔记本DDR4 3200跑起来也就5-6 token/s。swap就别打了,硬盘读写延迟比CPU推理还夸张,体验会崩。你可以试试先把模型切成Q2_K或者用AWQ量化版,显存占用能再降1-2G,牺牲点精度换速度。另外做RAG的话,其实可以只把embedding模型用小显存跑,LLM用CPU推理,配合llama.cpp的--parallel参数做请求排队,这样单机也能凑合。我现在就是混搭方案,纯本地不调云API完全可行,但得接受回答像老牛拉车。