Featured image of post GPU 加速本地 LLM 部署:在 VPS 上高效运行 Ollama 的完整实战指南

GPU 加速本地 LLM 部署:在 VPS 上高效运行 Ollama 的完整实战指南

手把手教你在 VPS 上搭建 GPU 加速的 Ollama 服务,支持 Qwen3、Llama 4 等大模型的本地推理。从 NVIDIA GPU 驱动安装到容器化部署,再到性能调优,一篇搞定所有细节。

引言:为什么要在 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-4s0.3-0.5s0.1-0.2s
并发请求1-28-1620-40
月成本(对比云端 API)节省 90%+节省 95%+节省 95%+

看到差距了吗?GPU 加速不是"锦上添花",而是"质变"。对于需要高频调用 LLM 的场景,没有 GPU 的本地推理几乎不可用。

第一步:选择合适的 VPS 配置

GPU 型 VPS 推荐配置

套餐GPUVRAM适用模型月费参考
入门级NVIDIA T416GBQwen3-8B, Llama 3.1-8B¥200-400
进阶级NVIDIA A1024GBQwen3-14B, Mistral-Large¥500-800
高性能NVIDIA A10040GBQwen3-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-8B8BQ4_K_M6GB通用对话、代码生成
Qwen3-14B14BQ4_K_M10GB复杂推理、长文档分析
Llama 4-8B8BQ4_K_M6GB多语言、创意写作
Mistral-Nemo12BQ4_K_M8GB长上下文(128K)
Gemma3-4B4BQ4_K_M4GB轻量级、嵌入式部署

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 服务的每一步:

  1. ✅ 选择合适的 GPU 型 VPS 配置
  2. ✅ 安装 NVIDIA 驱动和 Docker 环境
  3. ✅ 部署 Ollama 服务并验证 GPU 加速
  4. ✅ 模型选择与量化策略
  5. ✅ 性能调优与显存管理
  6. ✅ 安全加固与访问控制
  7. ✅ 集成到现有工作流
  8. ✅ 监控告警体系

有了这套方案,你的 VPS 就不再只是一台普通的云服务器——它是一个私有 AI 推理中心,可以支撑聊天机器人、RAG 系统、代码助手等丰富的应用场景。

下一步行动:今天就挑选一台 GPU VPS,按照本文步骤部署你的第一个本地 LLM 服务吧!

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials