引言:为什么要在 VPS 上跑本地 LLM?
大语言模型正在从云端 API 走向本地部署。无论是出于数据隐私、成本控制还是低延迟响应的需求,在 VPS 上自建 LLM 推理服务已经成为越来越多开发者和企业的选择。
而 Ollama 作为目前最流行的本地 LLM 运行框架,配合 GPU 加速,可以让你的 VPS 变成一个强大的 AI 推理引擎。本文将带你从零开始,搭建一套生产级别的 GPU 加速 Ollama 服务。
核心优势:GPU 加速 vs CPU 推理
| 指标 | CPU 推理 | GPU 推理(4GB VRAM) | GPU 推理(24GB VRAM) |
|---|---|---|---|
| Qwen3-8B tokens/s | ~3-5 | ~25-40 | ~60-80 |
| 首 token 延迟 | 2-4s | 0.3-0.5s | 0.1-0.2s |
| 并发请求 | 1-2 | 8-16 | 20-40 |
| 月成本(对比云端 API) | 节省 90%+ | 节省 95%+ | 节省 95%+ |
看到差距了吗?GPU 加速不是"锦上添花",而是"质变"。对于需要高频调用 LLM 的场景,没有 GPU 的本地推理几乎不可用。
第一步:选择合适的 VPS 配置
GPU 型 VPS 推荐配置
| 套餐 | GPU | VRAM | 适用模型 | 月费参考 |
|---|---|---|---|---|
| 入门级 | NVIDIA T4 | 16GB | Qwen3-8B, Llama 3.1-8B | ¥200-400 |
| 进阶级 | NVIDIA A10 | 24GB | Qwen3-14B, Mistral-Large | ¥500-800 |
| 高性能 | NVIDIA A100 | 40GB | Qwen3-32B, Llama 3.1-70B (量化) | ¥1500-3000 |
推荐服务商:AutoDL、恒源云、阿里云 PAI、AWS EC2 G5/G6、Google Cloud A2
💡 省钱技巧:AutoDL 等按需 GPU 平台在非高峰时段价格可低至正常价的 30%,适合间歇性推理任务。
非 GPU 替代方案
如果你的 VPS 没有 GPU,可以考虑:
- CPU + llama.cpp 量化:使用 Q4_K_M 量化的 7B 模型,CPU 推理约 3-5 tokens/s
- Intel Arc GPU:部分 VPS 提供 Intel GPU 实例,配合 oneAPI 也能加速
- 云端 API + 边缘缓存:混合架构,热门回答缓存到 Redis
第二步:安装 NVIDIA GPU 驱动
2.1 检查 GPU 硬件
# 查看 GPU 信息
nvidia-smi
# 输出示例:
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 550.120 Driver Version: 550.120 CUDA Version: 12.4 |
# |-------------------------------+----------------------+----------------------+
# | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
# | 0 NVIDIA A10 Off | 00000000:00:1E.0 Off | 0 |
# | N/A 38C P0 42W / 150W | 2048MiB / 24576MiB | 5% Default |
# +-------------------------------+----------------------+----------------------+
2.2 安装驱动(如果没有预装)
# Ubuntu/Debian 系统
sudo apt update
sudo apt install -y ubuntu-drivers-common
sudo ubuntu-drivers autoinstall
# 验证安装
nvidia-smi
nvcc --version
2.3 安装 Docker + NVIDIA Container Toolkit
# 安装 NVIDIA Container Toolkit
curl -fsSL https://raw.githubusercontent.com/NVIDIA/nvidia-container-toolkit/main/extras/install.sh | sudo bash
# 验证
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 测试 GPU 容器
docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
第三步:部署 Ollama 服务
3.1 使用 Docker 部署(推荐)
# 创建持久化数据目录
mkdir -p /opt/ollama/models
# 启动 Ollama 容器
docker run -d \
--name ollama \
--gpus all \
-v /opt/ollama/models:/root/.ollama \
-p 11434:11434 \
ollama/ollama:latest
# 验证服务
curl http://localhost:11434/api/tags
3.2 直接安装(不使用 Docker)
# 一键安装脚本
curl -fsSL https://ollama.com/install.sh | sh
# 启动服务
ollama serve &
# 设置开机自启(systemd)
sudo tee /etc/systemd/system/ollama.service <<EOF
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now ollama
3.3 验证 GPU 加速生效
# 拉取并运行 Qwen3-8B 模型
ollama pull qwen3:8b
# 检查模型加载日志,确认 GPU 层数
ollama run qwen3:8b "说一段自我介绍"
# 监控 GPU 使用情况
watch -n 1 nvidia-smi
⚠️ 注意:如果看到
GPU offload相关日志,说明 GPU 加速已生效。如果显示CPU only,请检查驱动和 Docker 配置。
第四步:模型选择与量化策略
4.1 主流模型推荐
| 模型 | 参数量 | 推荐量化 | 最小 VRAM | 适用场景 |
|---|---|---|---|---|
| Qwen3-8B | 8B | Q4_K_M | 6GB | 通用对话、代码生成 |
| Qwen3-14B | 14B | Q4_K_M | 10GB | 复杂推理、长文档分析 |
| Llama 4-8B | 8B | Q4_K_M | 6GB | 多语言、创意写作 |
| Mistral-Nemo | 12B | Q4_K_M | 8GB | 长上下文(128K) |
| Gemma3-4B | 4B | Q4_K_M | 4GB | 轻量级、嵌入式部署 |
4.2 量化方案详解
量化是在精度和性能之间的权衡:
- FP16:最高精度,最大显存占用。适合研究和高精度任务
- Q8_0:8-bit 量化,精度损失极小,显存减半
- Q4_K_M:推荐的平衡方案,质量接近 FP16,显存仅需 1/4
- Q3_K_S:极致压缩,适合 VRAM 极度受限的场景
# 下载不同量化的模型
ollama pull qwen3:8b-q4_K_M # 推荐:平衡性能与显存
ollama pull qwen3:8b-q8_0 # 高精度需求
ollama pull qwen3:8b-fp16 # 最大精度
4.3 模型库浏览
# 列出所有可用模型
ollama list
# 搜索特定模型
ollama search qwen3
# 查看模型详细信息
ollama info qwen3:8b
第五步:性能调优
5.1 Ollama 环境变量配置
# 编辑 Ollama 服务配置
sudo tee /etc/systemd/system/ollama.service.d/override.conf <<EOF
[Service]
ENV="OLLAMA_NUM_PARALLEL=4"
ENV="OLLAMA_MAX_LOADED_MODELS=2"
ENV="OLLAMA_KEEP_ALIVE=24h"
ENV="OLLAMA_HOST=0.0.0.0"
ENV="OLLAMA_NUM_GPU=-1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama
关键参数说明:
OLLAMA_NUM_PARALLEL:并行请求数,建议设为 GPU 能承载的最大值OLLAMA_MAX_LOADED_MODELS:同时加载的模型数,多模型切换时减少加载延迟OLLAMA_KEEP_ALIVE:模型在内存中保留的时间,避免频繁加载/卸载OLLAMA_NUM_GPU:发送到 GPU 的层数,-1表示全部
5.2 显存优化技巧
# 监控显存使用
nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv
# 限制单个请求的上下文长度(减少显存峰值)
export OLLAMA_MAX_CONTEXT=8192
# 启用 GPU 内存共享(多模型场景)
export OLLAMA_MAX_VRAM=61440 # 单位 MB,限制最大显存使用
5.3 批量推理优化
对于高并发场景,建议使用批处理 API:
# 批量生成
curl http://localhost:11434/api/generate -d '{
"model": "qwen3:8b",
"prompt": "解释量子计算的基本原理",
"stream": false,
"options": {
"num_ctx": 4096,
"temperature": 0.7
}
}'
5.4 性能基准测试
# 安装 benchmark 工具
ollama pull qwen3:8b
# 测试推理速度
time curl -X POST http://localhost:11434/api/generate \
-d '{
"model": "qwen3:8b",
"prompt": "请用500字详细介绍深度学习的发展历史",
"stream": false
}'
第六步:安全加固与访问控制
6.1 配置反向代理(Nginx + HTTPS)
# /etc/nginx/sites-available/ollama
server {
listen 443 ssl http2;
server_name ollama.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:11434;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持(用于流式输出)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
6.2 API 密钥认证
# 使用 Nginx 基本认证
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.ollama_auth ollama_user
# 在 Nginx 配置中添加
location / {
auth_basic "Ollama API";
auth_basic_user_file /etc/nginx/.ollama_auth;
proxy_pass http://127.0.0.1:11434;
}
6.3 防火墙配置
# UFW 防火墙规则
sudo ufw allow 11434/tcp comment 'Ollama API'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable
# 或使用 firewalld
sudo firewall-cmd --permanent --add-port=11434/tcp
sudo firewall-cmd --reload
6.4 限制并发与速率
# 使用 Nginx 限流
limit_req_zone $binary_remote_addr zone=ollama_limit:10m rate=10r/s;
location / {
limit_req zone=ollama_limit burst=20 nodelay;
proxy_pass http://127.0.0.1:11434;
}
第七步:集成到你的工作流
7.1 作为 ChatGPT 替代品
# 使用 OpenWebUI 搭建 Web 界面
docker run -d \
--name open-webui \
--gpus all \
-v open-webui:/app/backend/data \
-p 3000:8080 \
ghcr.io/open-webui/open-webui:main
# 访问 http://your-vps:3000
# 后端 URL 设置为 http://your-vps:11434
7.2 接入 LangChain / LlamaIndex
# LangChain 集成示例
from langchain_community.llms import Ollama
llm = Ollama(
base_url="http://your-vps:11434",
model="qwen3:8b",
temperature=0.7,
max_tokens=2048
)
response = llm.invoke("请总结这篇文章的核心观点:...")
print(response)
7.3 作为 RAG 系统的后端
# 结合 ChromaDB 构建本地 RAG
from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document
# 嵌入模型
embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url="http://your-vps:11434")
# 向量存储
vectorstore = Chroma(
collection_name="my_docs",
embedding_function=embeddings
)
# 检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# LLM
llm = Ollama(model="qwen3:8b", base_url="http://your-vps:11434")
7.4 与 Home Assistant 集成
# configuration.yaml
conversation:
llm_api:
- platform: ollama
api_key: ""
base_url: "http://your-vps:11434"
model: "qwen3:8b"
第八步:监控与告警
8.1 GPU 监控面板
# 使用 Prometheus + Grafana 监控
# 安装 node_exporter + dcm_exporter
docker run -d \
--name gpu-exporter \
--gpus all \
--pid=host \
nvilern/gpu-exporter:latest
# 访问 http://your-vps:9100/metrics
8.2 自定义健康检查脚本
#!/bin/bash
# /opt/ollama/health-check.sh
MODEL="qwen3:8b"
API_URL="http://localhost:11434"
ALERT_THRESHOLD=5000 # ms
# 检查服务状态
STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${API_URL}/api/tags)
if [ "$STATUS" != "200" ]; then
echo "ALERT: Ollama service is down!"
exit 1
fi
# 测试推理延迟
START_TIME=$(date +%s%N)
RESPONSE=$(curl -s -X POST ${API_URL}/api/generate \
-d "{\"model\":\"$MODEL\",\"prompt\":\"hi\",\"stream\":false}" | jq -r '.done')
END_TIME=$(date +%s%N)
ELAPSED=$(( (END_TIME - START_TIME) / 1000000 ))
if [ $ELAPSED -gt $ALERT_THRESHOLD ]; then
echo "ALERT: Inference latency too high: ${ELAPSED}ms"
exit 1
fi
echo "OK: Latency ${ELAPSED}ms, Response: $RESPONSE"
exit 0
8.3 定时任务
# 每小时执行健康检查
echo "0 * * * * /opt/ollama/health-check.sh >> /var/log/ollama-health.log 2>&1" | crontab -
常见问题排查
Q1: 模型加载失败,提示 “out of memory”
# 解决方案 1:降低量化等级
ollama pull qwen3:8b-q3_K_S
# 解决方案 2:减少上下文长度
export OLLAMA_MAX_CONTEXT=4096
# 解决方案 3:清理未使用的模型
ollama rm qwen3:70b
Q2: GPU 未被识别
# 检查 Docker GPU 配置
docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
# 检查 NVIDIA Container Toolkit
nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 重启 Ollama
sudo systemctl restart ollama
Q3: 推理速度慢于预期
# 确认 GPU 层全部加载
ollama run qwen3:8b "test" 2>&1 | grep -i "gpu"
# 调整并行度
export OLLAMA_NUM_PARALLEL=4
# 检查是否启用了 swap(会严重拖慢性能)
free -h
# 如果 Swap 使用率高,考虑增加物理内存
Q4: 多用户并发冲突
# 增加最大并发模型数
export OLLAMA_MAX_LOADED_MODELS=3
# 使用请求队列
export OLLAMA_NUM_PARALLEL=8
# 定期清理空闲模型
export OLLAMA_KEEP_ALIVE=30m
成本对比:自建 vs 云端 API
| 方案 | 月费用 | Qwen3-8B 调用成本 | 数据隐私 | 延迟 |
|---|---|---|---|---|
| 阿里云 DashScope | ¥0.008/千token | 按量付费 | 数据出域 | 200-500ms |
| OpenAI API | $0.10/百万token | 按量付费 | 数据出域 | 300-800ms |
| 自建 VPS(GPU) | ¥300-800 | 近乎免费 | 完全本地 | <50ms |
📊 结论:每月调用超过 100 万次时,自建 GPU 方案的成本优势开始显现。对于高频使用场景,自建是绝对的最优解。
总结
本文完整介绍了在 VPS 上搭建 GPU 加速 Ollama 服务的每一步:
- ✅ 选择合适的 GPU 型 VPS 配置
- ✅ 安装 NVIDIA 驱动和 Docker 环境
- ✅ 部署 Ollama 服务并验证 GPU 加速
- ✅ 模型选择与量化策略
- ✅ 性能调优与显存管理
- ✅ 安全加固与访问控制
- ✅ 集成到现有工作流
- ✅ 监控告警体系
有了这套方案,你的 VPS 就不再只是一台普通的云服务器——它是一个私有 AI 推理中心,可以支撑聊天机器人、RAG 系统、代码助手等丰富的应用场景。
下一步行动:今天就挑选一台 GPU VPS,按照本文步骤部署你的第一个本地 LLM 服务吧!
