Ollama 0.4 设 OLLAMA_NUM_PARALLEL 为 4 想提高并发,24GB 卡加载 qwen2.5-14b 后每个槽位各占一份 KV cache,第一个请求就 OOM。
一开始怀疑是「num_ctx 没有随并行数下调」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。并行槽位各自保留一份 KV cache。少数情况下是显存需求等于模型加槽位数乘上下文。
还有一种情况,Ollama 不会自动缩容,直接拒绝加载。
动手时先看启动日志里每个槽位分配的上下文
python -c "print(open('ollama.log',encoding='utf-8').read()[-500:])"
随后按显存估算可用的并行数
python -c "print({'vram_gb':24,'model_gb':9,'kv_per_slot_gb':3.5,'slots':2})"
然后把并行降到 2 并减小上下文重启
setx OLLAMA_NUM_PARALLEL 2 && setx OLLAMA_CONTEXT_LENGTH 4096
并发压测确认不再 OOM
python bench_concurrency.py --url http://localhost:11434 --n 8 --parallel 2
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
改完先别撤,确认这几项。服务稳定加载模型,2 路并发下不出现 OOM,P95 延迟在可接受范围。
容易忽略的是,并行数乘以上下文就是 KV 显存,先按这个公式估一遍,再决定要不要调大并发。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
