最近想把Llama-3-8B部署到本地做代码生成,用的是4090 24G显存,按理说8B模型量化成4bit应该跑得动。但我实际用Ollama跑Q4_K_M版本,生成速度只有8-10 token/s,还不如我朋友用CPU跑的速度。我看网上别人同配置都能跑到40+,怀疑是不是我的显存频率设置有问题,或者Ollama默认没开GPU加速?另外我试过用vLLM部署,但量化模型老报错,有没有比较稳的部署方案?求有经验的大佬指点一下,我是刚接触这块,不太确定该往哪个方向调优。
本地部署7B模型显存够但推理很慢,是量化问题还是配置不对?
全部回复
共 51 条4090跑Q4才8token肯定不对,先看下ollama日志确认有没有走CUDA,多半是核显在跑。
说实话你这速度肯定不正常,4090跑Q4_K_M的8B模型,哪怕没开GPU加速也不至于只有8-10 token/s,这基本是纯CPU推理的水平了。我怀疑Ollama默认没正确调用GPU,你可以在终端里跑一下ollama ps看看显存占用,如果显示0MiB那就是压根没加载到显卡上,大概率是环境变量没配好或者驱动识别有问题。另外显存频率这个因素影响很小,别在这上面浪费时间。
vLLM报错大概率是因为你用的量化格式不支持,它更适合跑AWQ或GPTQ这种硬量化,GGUF格式得用llama.cpp那套或者配专门的转换脚本,新手别硬磕。我建议你先别碰vLLM,直接用Ollama排查硬件加速,确认nvidia-smi能看到进程占用显存,然后再试试llama.cpp原版编译的二进制,它对4090的优化反而更直接。还有个容易忽略的点,你是不是开了省电模式或者显卡被别的进程占用了?看看后台有没有别的AI程序在跑。
如果排查下来还是慢,试试换Q5_K_M或者干脆用FP16的原始权重跑,8B模型24G显存完全塞得下,量化反而可能因为反量化操作拖慢速度,你对比下就知道是不是量化的问题了。代码生成场景对延迟敏感,建议把上下文长度调小点,或者用Ollama的num_ctx参数限制一下,有时候长上下文会让缓存占用暴涨导致速度暴跌。
8-10确实不对劲,先看看ollama日志确认有没有走CUDA,大概率是掉到CPU了。
4090跑Q4_K_M的llama-3-8B正常应该能到30-50 token/s,你这个速度确实不对劲。先用nvidia-smi看看显存占用和功耗,如果显存没吃满大概率是Ollama没走GPU,试试OLLAMA_NVIDIA_VISIBLE_DEVICES=all或者重装下驱动。vLLM对AWQ或GPTQ支持更稳,Q4_K_M这种GGUF格式它本来就不太友好,可以换llama.cpp的server跑,或者直接用Ollama但把num_ctx调小点,说不定是上下文撑爆了缓存。另外确认下是不是被CPU的集成显卡抢了推理,bios里把核显关掉有时会有奇效。
先查下ollama的日志确认GPU有没有加载,没加载的话设一下OLLAMA_NUM_GPU=1就行,另外别用Q4_K_M换Q4_0试试。
4090跑8B的Q4_K_M只出8-10 token/s确实不正常,这速度基本等于没吃上GPU。先跑一下nvidia-smi看推理时显存占用和GPU利用率,如果利用率很低,多半是Ollama没正确调用CUDA或者模型层没全放显卡上,可以试试设置OLLAMA_NUM_GPU和检查下CUDA版本。vLLM对量化支持确实挑,AWQ格式比较稳,GPTQ也行,但得下对应量化版而不是直接喂GGUF。想省事的话可以试试llama.cpp自己编译带CUDA,或者LM Studio这类带图形界面的,调起来直观些。
8-10 token/s确实不太正常,4090跑Q4_K_M的8B怎么也得30以上。先确认Ollama有没有真正吃到GPU,跑的时候看下nvidia-smi的显存占用和GPU利用率,如果显存没怎么涨就是跑在CPU上了。另外4090的功耗墙和驱动版本也会影响,可以试试更新驱动、关掉其他占显存的程序。vLLM对量化支持确实挑,AWQ格式相对稳一些,或者直接用llama.cpp手动指定ngl层数也比Ollama好调。
8-10 token/s确实不正常,4090跑4bit的8B模型不该这么慢。你先看看ollama ps里GPU占用率是不是100%,有时候它会偷偷回落到CPU跑一部分层。另外Q4_K_M在4090上正常应该能到60以上,检查下是不是没装对CUDA驱动或者Ollama版本太老。vLLM对量化支持确实挑,可以试试AWQ格式的模型配vLLM,或者直接用llama.cpp手动编译开CUDA,比Ollama可控多了。
8-10 token/s 这个速度确实不对劲,4090 跑 8B 的 Q4_K_M 怎么也不该这么低,我第一反应是 Ollama 没真正吃到 GPU。你可以跑一下 ollama ps 看看模型是不是 100% 在 GPU 上,有时候它会偷偷切一部分层到 CPU,尤其显存被其他进程占着的时候。另外 Ollama 默认的 context 长度和 batch 设置偏保守,长上下文场景下 prefill 会拖慢整体感受,但 decode 阶段掉到个位数还是更像 offload 了。vLLM 对量化支持确实挑,AWQ 和 GPTQ 相对稳一些,GGUF 在 vLLM 上一直不太行,你要走 vLLM 路线建议直接换 AWQ 权重。想省事的话其实可以试试 llama.cpp 直接编译带 CUDA 的版本,手动指定 -ngl 99 把所有层丢给显卡,速度会直观很多。显存频率那个方向基本可以排除,除非你手动锁过频或者卡在节能模式,否则不是主因。
8-10 token/s 确实不太正常,4090 跑 8B Q4 怎么也该在 40 以上。先确认下 Ollama 有没有真的吃到 GPU,跑的时候用 nvidia-smi 看下显存占用和 GPU 利用率,如果利用率很低那多半是没加载到显卡上。另外 Ollama 默认上下文长度是 2048,你要是改了 num_ctx 调大也会拖速度,可以试试调回去对比下。vLLM 对 AWQ/GPTQ 支持比较稳,可以换 AWQ 量化版本再试,别用 GGUF 格式喂 vLLM。
8-10 token/s确实不太对劲,4090跑4bit的8B怎么也该有40以上。先看下Ollama日志里有没有识别到GPU,有时候驱动版本不对它会偷偷跑CPU,nvidia-smi看一眼推理时显存占用就知道了。vLLM对量化格式挑得厉害,AWQ和GPTQ支持好些,GGUF基本别想,你要稳的话可以试试llama.cpp直接编译或者LM Studio,省心很多。