Ollama 多模型同时运行 + 资源监控:避免 OOM 崩溃的实用配置

多个模型同时跑的时候,内存管理不当很容易 OOM。这篇就讲怎么控制,别等机器崩了才想办法。


Ollama 是怎么管理模型的

每次请求,Ollama 按需加载模型到内存。关键是加载后不会立刻卸载——有个 5 分钟的 keep alive 时间。这段时间里模型占着内存等下一个请求,来了就不用重新加载。

这本来是好事。但如果你连续切几个模型,比如先调 qwen 做翻译,再调 llama 写代码,再调 gemma 做总结,三个模型同时占着内存,可能直接就爆了。


查看当前加载的模型

BASH
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:

BASH
# 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"}'

嫌每次指定麻烦,直接改全局默认:

BASH
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

限制同时加载的模型数

BASH
Environment="OLLAMA_MAX_LOADED_MODELS=2"

GPU 显存不够的话可以控制多少层放 GPU:

BASH
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 了怎么办

紧急处理:

BASH
# 卸载所有模型
curl -X POST http://localhost:11434/api/ps

# 重启 Ollama
sudo systemctl restart ollama

排查原因:

BASH
dmesg | grep -i "out of memory|oom"
journalctl -u ollama --since "1 hour ago"

监控脚本

简单跑个后台,内存超过阈值自动卸载模型:

BASH
#!/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 &

发表评论