最近在搞本地部署,想跑起来一个7B的模型做代码生成,用了llama.cpp和Ollama两个方案。机器是3080 10G显存,内存32G。试了Q4_K_M量化,但加载后跑几轮对话就OOM,只能把context size砍到1024才勉强能跑,但生成速度慢得离谱,大概就2-3 token/s。我看别人同配置跑7B挺流畅的,还能开大context。怀疑是我忘了开flash attention,或者对gpu layers的分配理解有误?另外量化版本从Q4到Q5、Q8到底该怎么选,只影响显存占用还是速度也会差很多?求指个路,已经折腾三天了。
部署7B大模型总是爆显存,是量化参数没调对还是我姿势不对?
全部回复
共 26 条3080 10G跑7B Q4够用了,试试加-ngl 99把层全甩给GPU,再开flash attention,速度能翻倍。
3080 10G跑7B其实挺够用的,你这个2-3 token/s明显不正常,正常Q4_K_M在3080上应该能到30+ token/s。瓶颈大概率不在量化参数,而是gpu layers没全丢给显卡,llama.cpp默认可能只offload了一部分到GPU,剩下的在CPU上跑当然慢。你检查一下-n-gpu这个参数,或者Ollama里num_gpu设成99试试。OOM的问题,10G显存跑Q4_K_M的7B大概占4.5G左右,加上KV cache,context 4096应该没问题,你是不是同时开了别的占显存的东西?flash attention确实能省一点KV cache,但救不了这么大的差距。量化版本选择上,Q4_K_M性价比最高,Q5_K_M会多占1G左右显存速度略慢一点,Q8基本就是翻倍显存了,速度也明显掉,10G卡不太建议。建议先把gpu layers拉满再看,别急着换量化。
3080 10G跑7B其实挺紧的,Q4_K_M大概占4.5G左右,但KV cache才是吃显存的大头,context开到4096的话光cache就能占1-2G,再加上CUDA context本身的开销,10G确实容易顶到墙。你试试把gpu layers设成35左右而不是全部offload,留一两层给CPU跑,反而可能更稳,因为不用把整个模型都塞进去。flash attention在llama.cpp里确实要手动开,-fa参数加上能省不少显存,尤其是长context的时候效果明显。至于量化版本,Q5和Q8不光是显存差别,速度也会掉,因为反量化开销更大,Q4_K_M算是速度和质量的甜点区,Q8在10G卡上基本别想了。2-3 token/s那个速度不太正常,是不是没编译CUDA backend或者跑成纯CPU了?建议先确认一下llama.cpp编译时有没有开cuBLAS。另外Ollama默认的num_gpu和num_ctx配置跟llama.cpp不太一样,两个方案对比的时候注意参数别搞混了。
3080 10G跑7B Q4_K_M应该够啊,试试加-ngl 99把层全丢GPU,再开flash attention,context能拉不少。
3080 10G跑7B其实挺紧的,尤其你还要留显存给系统显示输出和CUDA上下文,实际能用的可能就9G出头。Q4_K_M的7B权重本身大概4.5G左右,但KV cache是按context和层数线性涨的,1024确实太憋屈了,你试试开到2048或者3072,配合flash attention能省不少。llama.cpp里n_gpu_layers拉满不一定最优,有时候留几层给CPU反而能腾出显存给KV cache,这个得自己试。Ollama默认可能没开flash attention,你可以看下它的环境变量,或者直接换llama.cpp手动调参数对比一下。量化版本Q4到Q5速度差别不大,但Q5_K_M的困惑度比Q4_K_M好一截,显存大概多1G左右;Q8基本别想在10G上舒服跑,除非context砍到512。2-3 token/s确实不正常,可能是层没完全放GPU上,或者你CPU内存带宽拖后腿了,可以看下日志里有多少层在GPU。
3080 10G跑7B的Q4_K_M其实挺紧的,别忘了KV cache本身也吃显存,context开2048以上很容易顶满。你可以先把gpu layers拉满,再开flash attention试试,速度应该能好不少。量化从Q4到Q8主要影响显存和加载,速度上Q4通常更快,Q5、Q8会更吃资源但质量略好,10G卡还是老老实实Q4吧。