Ollama 本地大模型部署与故障排查
适用场景:在自有服务器/边缘设备上私有化部署 LLM,避免数据外泄、降低 API 调用成本、实现离线可用。
1. 快速部署(Docker Compose)
# docker-compose.yml
version: "3.8"
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
restart: unless-stopped
volumes:
ollama_data:
启动:
2. NVIDIA GPU 加速配置
2.1 前置检查
# 验证驱动
nvidia-smi
# 验证 Docker GPU 支持
docker run --rm --gpus all nvidia/cuda:12.6-base-ubuntu22.04 nvidia-smi
若第二条命令无输出或报错,安装 nvidia-container-toolkit:
# Ubuntu/Debian
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
2.2 Docker Compose 中的 GPU 声明
注意:若使用 Podman,需额外设置
--device /dev/dri:/dev/dri --device /dev/nvidia*:/dev/nvidia*。
3. 模型下载与管理
3.1 常用模型速查
| 模型 | 参数量 | 最低显存 | 适用场景 |
|---|---|---|---|
llama3.2:1b |
1B | 2 GB | 边缘设备、低延迟 |
llama3.2:3b |
3B | 4 GB | 通用对话 |
qwen2.5:7b |
7B | 8 GB | 中文理解强 |
deepseek-r1:8b |
8B | 10 GB | 推理增强 |
llama3.1:70b |
70B | 40 GB | 高质输出 |
3.2 下载加速(国内)
方法一:环境变量
方法二:镜像配置(推荐)
编辑 /etc/ollama/config.json:
方法三:手动导入 GGUF
# 下载 .gguf 文件到 ~/.ollama/models/blobs/
# 目录结构:~/.ollama/models/blobs/sha256-<hash>
ollama create my-model -f Modelfile
4. API 调试
4.1 基础调用
# 生成文本
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2:3b",
"prompt": "解释 Docker volume 的生命周期",
"stream": false
}'
# Chat 接口
curl http://localhost:11434/api/chat -d '{
"model": "llama3.2:3b",
"messages": [
{"role": "user", "content": "Kubernetes Pod 处于 Pending 状态的原因有哪些?"}
]
}'
4.2 OpenAI 兼容模式
Ollama 内置 OpenAI API 兼容端点:
curl http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "llama3.2:3b",
"messages": [{"role": "user", "content": "hello"}]
}'
此特性允许 LangChain / LlamaIndex 等框架直接接入。
5. 常见问题排查(8 个坑)
问题 1:no CUDA-capable device is detected
# 检查 nvidia 运行时
docker info | grep -A5 "Runtime"
# 确认 nvidia-container-toolkit 已安装
nvidia-ctk runtime inspect --runtime docker | grep nvidia
解决:重新配置 Docker runtime:
问题 2:模型加载后推理极慢
原因:模型跑在 CPU 上而非 GPU。
解决:确保 Docker Compose 中 devices 配置正确,且宿主机已安装驱动。
问题 3:显存不足(OOM during load)
解决:
- 换小模型(7B → 3B → 1B)
- 启用量化:ollama pull llama3.2:3b:q4_K_M
- 减少并发请求数
问题 4:API 响应超时
解决:调整超时参数:
或在 Docker Compose 中添加:
问题 5:多模型冲突
现象:同时加载多个大模型导致显存耗尽。
解决:限制并发模型数:
问题 6:Windows WSL2 下 GPU 不可用
解决:确保 WSL2 版本 ≥ 5.15,且 NVIDIA 驱动支持 WSL2。在 Windows 侧运行 nvidia-smi 确认驱动正常,WSL2 内运行相同的命令验证。
问题 7:Docker 容器时间不同步
现象:某些模型推理结果异常。
解决:
services:
ollama:
# ...
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
问题 8:模型文件损坏
现象:pull 中断后模型无法加载。
解决:
6. 生产环境加固
6.1 网络隔离
services:
ollama:
networks:
- ai-internal
# 不暴露端口到宿主机
# ports 配置移除
networks:
ai-internal:
driver: bridge
internal: true
通过反向代理(Nginx/Caddy)提供对外访问:
location /ai/ {
proxy_pass http://ollama:11434/;
proxy_set_header Host $host;
limit_req zone=ai burst=5;
}
6.2 资源限制
services:
ollama:
deploy:
resources:
limits:
memory: 16G
cpus: '8'
reservations:
memory: 8G
cpus: '4'
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
6.3 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 3
7. 配套工具链
| 工具 | 用途 |
|---|---|
ollama CLI |
模型管理、API 调用 |
ollama show <model> |
查看模型元数据 |
ollama list |
列出已安装模型 |
ollama cp |
复制模型(跨实例迁移) |
| LangChain / LlamaIndex | 应用开发框架 |
| Open WebUI | 可视化 Web 界面 |
8. 延伸阅读
FAQ
docker run --rm --gpus all nvidia/cuda:12.6-base nvidia-smi 验证 GPU 可见性。
/etc/ollama/config.json 添加 "proxy": "https://ollama.myhloli.com"。或手动下载 .gguf 文件到 ~/.ollama/models/ 目录。
OLLAMA_ORIGINS 限制来源。
ollama list 查看已下载模型,ollama run <model> 启动交互,ollama pull <model> 下载新模型。API 调用时指定 model 字段即可切换。
dmesg | grep -i oom 定位触发点。