Ollama 并发该开几个槽:峰值在 4 槽,16 槽比单槽还慢
同一台 5090D 跑 qwen2.5:14b,五档槽位扫描:61.25 → 97.33 → 180.92 → 158.82 → 55.71 tok/s,峰值在 4 槽,开到 16 槽比只开 1 槽还低 9%。原因是 Ollama 在显存不够时不报错,而是把 KV 和部分权重悄悄搬到内存走 PCIe。三步能在你调 NUM_PARALLEL 之前把该开几槽算清。
OllamaNUM_PARALLEL并发槽位KV缓存显存吞吐本地部署调优14B5090D5060Ti这条适用于
- 一台 16GB 或 32GB 显存的 NVIDIA 卡
- Ollama 0.40+,能改环境变量并重启 ollama serve
- 一个 7B–14B 的 Q4_K_M 模型
版本指纹
Ollama 0.40.4 / qwen2.5:14b Q4_K_M / ctx 8192
具体做法
【实测条件】2026-11-03,RTX 5090D 32GB + Ollama 0.40.4,qwen2.5:14b Q4_K_M,ctx 8192,每请求 128 token。每档独立重启 serve,丢弃首轮预热,三轮取中位,轮间极差 0.4%–10.9%。对照机:RTX 5060Ti 16GB + Ollama 0.40.3(桌面环境已占约 9.2 GiB)。
【五档扫描(32G 卡)】
1 槽:61.25 tok/s|总显存 13502 MiB|无卸载
2 槽:97.33 tok/s(1.59×)|15042 MiB|无卸载
4 槽:180.92 tok/s(2.95×)|18119 MiB|无卸载 ← 峰值
8 槽:158.82 tok/s(2.59×)|24962 MiB|无卸载(占 32G 的 76.6%)
16 槽:55.71 tok/s(0.91×)|31887 MiB|CPU KV 2560 MiB、权重外移 832.07 MiB
【KV 是纯线性叠加】ctx 8192 固定,单槽 KV = 1536 MiB:
NP=1 → 1536.00 MiB(8192 cells, 48 layers, 1/1 seqs)
NP=8 → 12288.00 MiB(8/8 seqs)
NP=16 → 24576.00 MiB(16/16 seqs)
公式 196,608 B/token × 8192 × N 与日志逐 MiB 一致。⇒ 加一个槽不是多一个用户,是多一整份 1.5 GiB 上下文,没有共享也没有摊薄。
【两段曲线,两个机制】
4→8 槽:无任何溢出,仍掉 12%(180.92→158.82)。这是单卡上 8 路 decode 抢同一份 SM,不是容量问题。
8→16 槽:日志出现 `CPU KV buffer size = 2560.00 MiB` / `CUDA0 KV buffer size = 22016.00 MiB`;模型段从 GPU 8148.38 变成 GPU 7316.31 + Host 1249.73。请求仍返回 200,只有吞吐塌了。decode 阶段每生成一个 token 都要把全部 KV 读一遍,落在 CPU 的那部分每次过 PCIe ——这就是延迟从 1.47 秒涨到 22.69 秒的原因。
【卸载有边界】NP=16 × ctx 32768 需 KV 98304 MiB,Ollama 返 502 Bad Gateway(错误体 `upstream connect failed`)。卸载能兜「超出一点点」,兜不住「超出三倍」。
【16G 卡对照】1 槽 11.43 tok/s(15945 MiB,余 366 MiB)→ 2 槽 16.63(1.45×,延迟仅 +3%)→ 4 槽 16.22(0.98×,延迟 13.80 秒)。峰值 2 槽。两卡峰值差 10.9 倍。
【按显存分档的判据(ctx 8192 跑 14B)】
16GB(5060Ti):单槽已用 15945 / 16311 MiB,4 槽只剩 392 MiB、总占 15919 MiB,吞吐反降 2%(16.22 tok/s)→ 开 2 槽。
32GB(5090D):4 槽 18119 MiB 全程无溢出、2.95× 吞吐 → 开 4 槽(以单槽 1.00× 为基准)。
24GB(4090):没有实测,不给数。
效率账:4 槽换 2.95 倍吞吐,并行效率 73.8%,这是「完全不溢出」能达到的上限。
【换算成钱和产出(落点)】
一台 24 小时跑的本地服务,按 4 槽配置一天理论 180.92 × 86400 ≈ 15.6M token;按 16 槽只有 4.8M。
同一张卡同一份电,开错槽位等于白扔掉三分之二的产出。
满载按 575W、0.55 元一度估,一天电费不到 5 元 —— 省电从来不是重点,白扔吞吐才是。
选卡摊价:并发峰值差 10.9 倍,摊到每 1 tok/s,5090D 约 166 元、5060Ti 约 601 元,要跑并发服务前者大约便宜 3.6 倍;只跑单路对话这个价差一分都不值。
【卸载边界的关键三个数】
8 槽到 16 槽:卸载量只占 KV 的 10.4%(2560 / 24576 MiB),吞吐却从 158.82 掉到 55.71,掉 65%。
单请求延迟 1.47 秒 → 22.69 秒,慢 15.4 倍;16G 卡三档延迟 8.12 秒 → 13.80 秒。
NP=16 总显存占 32607 MiB 的 97.8%,余 720 MiB,已在 OOM 边缘。
NP=8 的 24962 MiB 构成:模型 8148.38 + KV 12288 + CUDA_Host 417.66 + 计算缓冲。
NP=16 总显存 31887 MiB 低于「模型 8148 + KV 24576 = 32724」的直觉值,差额就是被搬出显存的那部分。
推演:ctx 拉到 32768 后单槽 KV 6144 MiB,4 槽 24576 MiB —— 已超今天 4 槽实际占用 12288 的两倍,峰值可能前移。
五档数据只对 qwen2.5:14b / ctx 8192 / 这两张卡成立,换模型、换上下文长度、换量化格式都要重测。24GB 卡(4090)本轮没有实测,文中不给数;双卡与多机并发未测。「4→8 槽掉 12% 是抢 SM」是机制解释,未做 profile 验证。跑分库里 NP=8 总显存另有 24267 MiB 一条读数,与同轮启动日志算不平,本方案采用与日志对齐的 24962 MiB。