Ollama 双 RTX4090 运行 DeepSeek-R1:32B 速度极慢问题排查与解决
问题现象
服务器配置:
- CPU:AMD/Intel 多核处理器
- GPU:RTX 4090 × 2(24GB × 2)
- 系统:Linux
- Ollama:0.3.x 及以上版本
- 模型:deepseek-r1:32b
运行模型后发现:
ollama run deepseek-r1:32b模型能够正常加载,但推理速度非常慢。
表现为:
- 每秒只能输出 1~2 个汉字
- GPU 显存占用接近满载
- 双卡均被使用
- 7B 模型运行正常且速度很快
查看状态:
ollamaps输出类似:
NAME SIZE PROCESSOR deepseek-r1:32b 55 GB 16%/84% CPU/GPU说明:
16% 层在 CPU 84% 层在 GPU模型并没有完全加载到 GPU。
初步排查
查看 GPU 使用情况
nvidia-smi发现:
GPU0 ≈ 22.5GB GPU1 ≈ 22.8GB双卡均已被使用。
因此可以排除:
- GPU 未识别
- 双卡未启用
- CUDA 安装异常
查看模型信息
ollama show deepseek-r1:32b输出:
architecture qwen2 parameters 32.8B context length 131072 quantization Q4_K_M此时注意到:
context length = 131072即默认上下文长度为:
131K关键排查
查看 Ollama 日志:
journalctl-uollama-n300--no-pager|grep-Ei"memory|offload|layer|cuda"发现关键内容:
load_tensors: offloaded 55/65 layers to GPU llama_kv_cache: CUDA0 KV buffer size = 13824.00 MiB CUDA1 KV buffer size = 13824.00 MiB llama_kv_cache: size = 32768.00 MiB (131072 cells)重点:
KV Cache 占用了 32768 MiB也就是:
32GB 显存全部被上下文缓存吃掉了。
原因分析
DeepSeek-R1:32B 默认:
Context Length = 131072Ollama 在模型加载时直接按照:
131072 tokens分配 KV Cache。
计算结果:
KV Cache ≈ 32GB双 RTX4090 总显存:
24GB × 2 = 48GB其中:
32GB已经被 KV Cache 占用。
剩余显存:
48GB - 32GB = 16GB不足以放下全部模型层。
因此 Ollama 被迫:
55 层放 GPU 10 层放 CPU最终表现为:
16% CPU / 84% GPU推理速度急剧下降。
错误尝试
很多人会尝试:
/set parameter num_ctx8192但是没有效果。
原因是:
模型已经加载完成。
KV Cache 已经按照:
131072创建完成。
此时修改参数不会重新分配显存。
正确解决方案
修改 Ollama 服务配置。
编辑:
sudosystemctl edit ollama或修改已有 Override 配置:
[Service] Environment="OLLAMA_ORIGINS=https://你的IP:8989" Environment="OLLAMA_HOST=0.0.0.0" Environment="OLLAMA_MODELS=/usr/share/ollama/.ollama/models" Environment="OLLAMA_SCHED_SPREAD=1" Environment="OLLAMA_GPU_OVERHEAD=0" # 关键配置 Environment="OLLAMA_CONTEXT_LENGTH=8192"保存后执行:
sudosystemctl daemon-reloadsudosystemctl restart ollama验证是否生效
查看环境变量:
systemctl show ollama|grepCONTEXT应看到:
OLLAMA_CONTEXT_LENGTH=8192重新运行模型:
ollama run deepseek-r1:32b然后查看日志:
journalctl-uollama-n100--no-pager|grep"KV buffer"如果成功,KV Cache 会显著降低。
最终效果
修改前:
Context Length = 131072 KV Cache ≈ 32GB CPU/GPU = 16% / 84% 推理速度: 每秒约 1~2 个汉字修改后:
Context Length = 8192 KV Cache 大幅降低 模型可全部加载到 GPU 推理速度显著提升总结
当双 RTX4090 运行 DeepSeek-R1:32B 出现以下情况:
显存占满 双卡均正常识别 7B 模型速度正常 32B 模型极慢 ollama ps 显示: 16% CPU / 84% GPU不要急着怀疑:
- CUDA
- 驱动
- 双卡配置
- Ollama 多卡支持
首先检查:
ollama show deepseek-r1:32b是否存在:
context length = 131072然后通过:
Environment="OLLAMA_CONTEXT_LENGTH=8192"限制默认上下文长度。
对于双 RTX4090 用户,这是最有效、最直接的解决方案。