多个模型同时跑的时候,内存管理不当很容易 OOM。这篇就讲怎么控制,别等机器崩了才想办法。
Ollama 是怎么管理模型的
每次请求,Ollama 按需加载模型到内存。关键是加载后不会立刻卸载——有个 5 分钟的 keep alive 时间。这段时间里模型占着内存等下一个请求,来了就不用重新加载。
这本来是好事。但如果你连续切几个模型,比如先调 qwen 做翻译,再调 llama 写代码,再调 gemma 做总结,三个模型同时占着内存,可能直接就爆了。
查看当前加载的模型
ollama ps输出类似:
NAME ID SIZE PROCESSOR UNTIL qwen2.5:7b 1234abcd 4.7 GB 100% GPU 4m30s from now llama3.1:8b 5678efgh 4.9 GB 100% GPU 2m15s from now
能看到每个模型占了多少、跑在 CPU 还是 GPU、还有多久自动卸载。
控制模型驻留时间
每次请求可以指定 keep_alive:
# 10分钟后才卸载
curl http://localhost:11434/api/chat -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"你好"}],"keep_alive":"10m"}'
# 用完立刻卸载
curl http://localhost:11434/api/chat -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"你好"}],"keep_alive":"0s"}'
# 永久驻留(只要内存够就不卸载)
curl http://localhost:11434/api/chat -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"你好"}],"keep_alive":"-1"}'嫌每次指定麻烦,直接改全局默认:
sudo systemctl edit ollama
[Service]
Environment="OLLAMA_KEEP_ALIVE=2m" # 改成2分钟,更快释放
# 或者
Environment="OLLAMA_KEEP_ALIVE=0s" # 用完就释放防止 OOM 的几个配置
限制上下文窗口——这是吃内存大户。8G 机器控制在 2048 或 4096,16G 可以开到 8192。Modelfile 里加 PARAMETER num_ctx 2048。
限制同时加载的模型数:
Environment="OLLAMA_MAX_LOADED_MODELS=2"GPU 显存不够的话可以控制多少层放 GPU:
ollama show qwen2.5:7b --modelfile > /tmp/MF
echo "PARAMETER num_gpu 20" >> /tmp/MF # 假设模型有32层,只放20层到GPU
ollama create qwen2.5:7b-partial -f /tmp/MF遇到 OOM 了怎么办
紧急处理:
# 卸载所有模型
curl -X POST http://localhost:11434/api/ps
# 重启 Ollama
sudo systemctl restart ollama排查原因:
dmesg | grep -i "out of memory|oom"
journalctl -u ollama --since "1 hour ago"监控脚本
简单跑个后台,内存超过阈值自动卸载模型:
#!/bin/bash
while true; do
MEM=$(free | awk '/Mem:/ {printf "%.0f", $3/$2 * 100}')
if [ "$MEM" -ge 90 ]; then
echo "[$(date)] 内存 ${MEM}%,卸载所有模型"
curl -s -X POST http://localhost:11434/api/ps
fi
sleep 10
done后台跑着:nohup bash ~/ollama-watch.sh > /var/log/ollama-watch.log 2>&1 &