5月28日 07:09

优化 Ollama 性能需要调整哪些参数?

优化 Ollama 性能该从哪些方面入手?

Ollama 的性能瓶颈通常出现在三个环节:模型加载、推理计算和内存调度。优化思路可以归纳为——选对量化、调好参数、用满硬件。下面逐项展开。

模型量化怎么选?

量化是影响推理速度和显存占用最直接的参数。Ollama 支持多种量化级别,核心区别在于精度和速度的权衡:

量化格式模型体积推理速度精度损失适用场景
Q4_K_M最小最快较明显显存紧张、追求速度
Q5_K_M适中较快轻微多数场景的推荐选择
Q8_0较大较慢极小对输出质量要求高
F16最大最慢调试或精度验证
bash
# 下载不同量化版本 ollama pull llama3.1:8b-q4_k_m ollama pull llama3.1:8b-q8_0

实际测试中,8GB 显存的 RTX 4060 运行 Q4_K_M 量化的 7B 模型,速度可以从 3-4 tok/s 提升到 30-45 tok/s,差距在一个数量级。2026 年 Ollama 还新增了 NVFP4 量化支持,让本地推理结果能和云端生产环境保持一致。

选择建议:先从 Q4_K_M 起步,如果输出质量不满意再升到 Q5_K_M,一般不需要更高量化。

Modelfile 里哪些参数值得调?

在 Modelfile 中通过 PARAMETER 指令可以精细控制推理行为:

dockerfile
PARAMETER temperature 0.7 # 控制输出随机性,代码生成建议 0.1-0.3,对话 0.6-0.8 PARAMETER top_p 0.9 # 核采样阈值,和 temperature 二选一调整即可 PARAMETER top_k 40 # 候选 token 数,一般 20-60 PARAMETER num_ctx 4096 # 上下文窗口,短对话设 2048 省显存 PARAMETER repeat_penalty 1.1 # 重复惩罚,1.05-1.1 之间即可 PARAMETER num_gpu 99 # GPU 卸载层数,不是 GPU 数量 PARAMETER num_batch 512 # 批处理大小,吞吐优先可调到 1024-2048

几个容易踩的坑:

  • num_gpu 的含义是模型有多少层放到 GPU 上计算,不是 GPU 的数量。比如 Llama 2 7B 有 32 层,设成 32 就全部走 GPU,显存不够就减到 20 让部分层回退 CPU。
  • num_ctx 直接影响显存占用,从 4096 减到 2048 可以省出相当可观的显存,短对话场景放心缩减。
  • num_batch 调大能提高吞吐量,但也会吃更多显存,需要和 num_ctx 一起权衡。

GPU 和显存怎么管?

GPU 是 Ollama 性能的关键,显存不够用是最常见的问题。

bash
# 指定使用的 GPU export CUDA_VISIBLE_DEVICES=0 # 查看显存使用情况 nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits # 启用 Flash Attention,显存占用可降低 30%-50% export OLLAMA_FLASH_ATTENTION=1

显存不够时的降级策略:

  1. 开启 OLLAMA_FLASH_ATTENTION=1,这是最优先的操作,几乎无副作用
  2. 降低量化级别,从 Q8_0 换到 Q5_K_M 或 Q4_K_M
  3. 减少 num_ctx,短对话用 2048 甚至 1024
  4. 减少 num_gpu,让部分层回退 CPU
  5. 开启低显存模式,KV 缓存放到 CPU 内存,速度会下降但能跑起来

苹果 M 系列芯片有独特优势——统一内存架构意味着显存等于内存。M2/M3 跑 7B-14B 模型性能接近入门级独立显卡,2026 年 Ollama 切换 MLX 引擎后 M5 芯片在 70B 以上模型上表现更是突出。

并发请求怎么处理?

Ollama 默认单并发,生产环境需要调整:

bash
# 环境变量方式 export OLLAMA_NUM_PARALLEL=4 # 并行处理请求数 export OLLAMA_MAX_LOADED_MODELS=3 # 最大同时加载模型数 export OLLAMA_MAX_QUEUE=20 # 排队上限 export OLLAMA_KEEP_ALIVE=30m # 模型保持加载时长,-1 表示永久

也可以在 Modelfile 里设置:

dockerfile
PARAMETER num_parallel 4

OLLAMA_KEEP_ALIVE 很实用——默认 5 分钟没请求就卸载模型,设长一点能避免冷启动。频繁使用的服务建议设成 30m 或 -1。

CPU 模式有什么优化空间?

没有 GPU 的机器也能跑,但参数要针对性调整:

dockerfile
PARAMETER num_thread 6 # CPU 线程数,建议设为物理核心数的 60%-80% PARAMETER num_batch 128 # 小批量减少内存压力 PARAMETER num_ctx 2048 # 缩短上下文 PARAMETER num_gpu 0 # 强制全走 CPU

服务器级 CPU 可以开启 NUMA 优化:

bash
export OLLAMA_NUMA=1

纯 CPU 模式跑 Q4 量化的 1B-7B 模型,速度大约 5-15 tok/s,能用但不快,适合低频调用场景。

怎么监控和排查性能问题?

bash
# 查看当前运行的模型和资源占用 ollama ps # 查看 Ollama 服务日志 ollama logs # 实时监控 GPU 使用 watch -n 1 nvidia-smi

几个关键指标:

  • 首 token 延迟:反映模型加载和首次推理速度,正常应该在 2 秒以内
  • 推理速度:tok/s 数值,7B 模型 GPU 跑 30+ tok/s 算正常
  • GPU 利用率:推理时应该在 80% 以上,否则说明有瓶颈
  • 显存占用:跑起来后应该接近满载,剩很多说明显存没利用好

如果 GPU 利用率低,检查 num_gpu 是否设够了、num_batch 是否太小。如果频繁 OOM,按前面的降级策略逐项排查。

不同硬件大致能跑什么模型?

模型规模最低显存/内存推荐硬件参考速度
1B-3B无需 GPU8GB RAM30-60 tok/s (M2)
7B-8B8GBRTX 3080 / M2 Pro40-80 tok/s (GPU)
13B-14B12GBRTX 3080 Ti / M3 Max25-45 tok/s
30B-34B24GBRTX 4090 / M2 Ultra15-25 tok/s
70B48GB双卡 4090 / M2 Ultra8-15 tok/s

注意这是 Q4 量化下的参考值,Q8 或 F16 所需显存会翻倍。选择模型时先看自己硬件的上限,再在量化级别上做取舍。

标签:Ollama