新品 NVIDIA B300 · 288 GB HBM3e 服务器 — 起价 $4,019/月 每块 GPU

查看 B300

文档 · 应用

在 GPU 服务器上部署 Ollama 和 Open WebUI

Ollama 在您的 GPU 上运行开放模型,Open WebUI 为它们提供类 ChatGPT 的界面:两者结合,就能在您掌控的 GPU 服务器上搭建私有 ChatGPT。让两者都只监听 localhost,并通过 SSH 或经过身份验证的 TLS 代理来访问。

更新于 8 分钟阅读

GPU 服务器上的 Ollama 与 Open WebUI:能得到什么

要在 GPU 服务器上部署 Ollama 和 Open WebUI:先用官方脚本安装 Ollama,脚本会把它配置为监听 127.0.0.1:11434 的 systemd 服务;拉取一个模型;然后在 Docker 中启动 Open WebUI,连接到这个本地 Ollama,并通过 SSH 隧道打开它。Ollama 负责把模型加载到 GPU 上,并通过自己的原生 API 和一个兼容 OpenAI 的 API 提供服务。Open WebUI 则增加了带账户和聊天记录的类 ChatGPT 界面:两者结合,就是一个私有化部署的 ChatGPT。

Ollama + Open WebUIvLLM
模型按标签从 Ollama 模型库拉取;默认标签通常是 4-bitHugging Face 上 BF16、FP8 或 4-bit 格式的检查点
并发默认每个模型一次只处理一个请求(OLLAMA_NUM_PARALLEL)对传入的请求进行连续批处理
多块 GPU只有当模型在一块 GPU 上放不下时,才会将其分布到多块 GPU 上张量并行、流水线并行和数据并行
Web 界面Open WebUI没有内置;可以用 Open WebUI 连接

Ollama 适合为您自己或小团队提供私密的聊天界面,也便于快速切换模型;vLLM(推理服务)则适合大量用户或应用同时调用 API 的场景。如果您下单时在“软件”步骤中选择了搭配 Open WebUI 的 Ollama,两者已连同您的模型一起装好;本指南介绍的是手动安装和配置。为什么要私有化部署,参见在自己的 GPU 服务器上自建私有 ChatGPT。

在 Ubuntu 上安装 Ollama

请先安装 GPU 驱动(NVIDIA 驱动与 CUDA 或 MI355X 上的 ROCm):如果安装程序发现了没有驱动的 NVIDIA GPU,它会自行安装 NVIDIA 的 cuda-drivers 软件包,导致驱动来源混杂。然后运行 Ollama Linux 页面上的脚本:

sudo apt update && sudo apt install -y zstd    # 安装程序需要用 zstd 解压
curl -fsSL https://ollama.com/install.sh | sh
ollama -v                                        # 已安装的版本
systemctl status ollama --no-pager               # 应显示 active (running)
nvidia-smi                                       # NVIDIA:应列出所有 GPU
amd-smi list                                     # AMD MI355X

该脚本会创建一个 ollama 用户(属于 render 和 video 组),安装并启动监听 127.0.0.1:11434 的 ollama systemd 服务;在 AMD 主机上,它还会添加 Ollama 自带的 ROCm 库,但不会安装内核驱动。

  • NVIDIA:Ollama 要求计算能力 5.0 或更高、驱动版本 550 或更新(GPU 页面)。该页面没有列出 B200 或 B300(0.32.3 版本的发布说明提到通过 CUDA 12 支持 B200);在这两款显卡上,请用 ollama ps(见下文)确认模型已加载到 GPU 上。
  • AMD:Ollama 需要 ROCm v7 驱动。GPU 页面列出了 Instinct MI350X 以及 MI355X 同样使用的 gfx950 目标,但没有明确列出 MI355X 这一型号:在依赖它之前,请先查看该页面。

配置 Ollama:OLLAMA_HOST、模型存放在 NVMe 上、GPU 设置

Ollama 通过环境变量读取配置。请把它们写在 systemd 的 drop-in 覆盖文件中,而不要写进 ollama.service,因为安装脚本每次运行都会重写这个文件(sudo systemctl edit ollama 会在编辑器中打开 drop-in 文件)。模型放在 NVMe 数据盘上(参见存储与数据),归 ollama 用户所有:

sudo mkdir -p /data/ollama/models
sudo chown -R ollama:ollama /data/ollama

sudo mkdir -p /etc/systemd/system/ollama.service.d
sudo tee /etc/systemd/system/ollama.service.d/override.conf >/dev/null <<'EOF'
[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
Environment="OLLAMA_MODELS=/data/ollama/models"
Environment="OLLAMA_NO_CLOUD=1"
Environment="OLLAMA_CONTEXT_LENGTH=32768"
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama
journalctl -u ollama -b --no-pager | grep -i "cloud disabled"    # 应看到 Ollama cloud disabled: true
变量作用
OLLAMA_HOSTAPI 地址(默认 127.0.0.1:11434)。请保持在 localhost:Ollama 不校验任何 API 密钥。
OLLAMA_MODELS模型目录(默认 /usr/share/ollama/.ollama/models;已经拉取的模型仍留在原处)。
OLLAMA_NO_CLOUD设为 1 会关闭 Ollama 的云端模型和联网搜索,让模型只在您的 GPU 上运行。
OLLAMA_CONTEXT_LENGTH上下文窗口(单位为 token);默认值:GPU 显存低于 24 GiB 时为 4k,24–48 GiB 时为 32k,48 GiB 及以上时为 256k(上下文长度)。
OLLAMA_NUM_PARALLEL每个模型同时处理的请求数(默认 1)。上下文所占的显存随该值乘以上下文长度而增长。
OLLAMA_KEEP_ALIVE空闲模型保持加载的时长(默认 5m;设为 -1 则一直保持加载)。
OLLAMA_MAX_LOADED_MODELS在放得下的前提下,可同时加载的模型数(默认每块 GPU 3 个)。
OLLAMA_FLASH_ATTENTION在支持的情况下自动开启;1 强制开启,0 关闭。
OLLAMA_KV_CACHE_TYPE开启 Flash Attention 时 KV 缓存的精度:f16(默认)、q8_0(显存约减半,损失极小)或 q4_0(约为四分之一)。
CUDA_VISIBLE_DEVICES、ROCR_VISIBLE_DEVICES限制 Ollama 只使用部分 GPU;用 nvidia-smi -L 或 rocminfo 查到的 UUID 比编号更可靠。

多块 GPU

只要放得下,Ollama 就会把模型加载到一块 GPU 上,其常见问题称这样通常性能最好(经过 PCI 总线的数据更少);只有放不下时,它才会把模型分布到所有 GPU 上。其余 GPU 则用来加载其他模型,数量上限为 OLLAMA_MAX_LOADED_MODELS。

拉取并运行模型

ollama pull gpt-oss:20b
ollama run gpt-oss:20b "Explain a KV cache in two sentences."
ollama ls                     # 磁盘上的模型
ollama ps                     # 已加载的模型:SIZE、PROCESSOR、CONTEXT、UNTIL
ollama stop gpt-oss:20b       # 立即卸载
ollama rm gpt-oss:20b         # 从磁盘删除

不带提示词时,ollama run 会进入交互式对话。在 ollama ps 的输出中,PROCESSOR 应显示 100% GPU;如果显示 48%/52% CPU/GPU 这样的拆分,说明模型有一部分在 CPU 上、从系统内存中运行(参见“故障排查”)。CONTEXT 是分配给它的上下文长度。

默认标签通常是 4-bit(qwen3.5:9b 为 Q4_K_M)。标签列表中还提供 q8_0 和 bf16 版本:占用显存更多,但更接近原始权重。如果放得下,请用您自己的提示词把它们和默认版本做对比。

Ollama 会把整个标签对应的模型保存在 GPU 显存中,此外还有随上下文增长的 KV 缓存。CryptGPU 的选型规则在标签大小的基础上增加 20%,并按 92% 的 GPU 显存计为可用:

标签模型库中的大小能放下的最便宜单块 NVIDIA GPU
qwen3.5:9b6.6–7.6 GBRTX 5080(16 GB)
gpt-oss:20b14 GBRTX 4090(24 GB)
gemma4:31b19–20 GBRTX 5090(32 GB)
gemma4:31b-it-bf1663 GBRTX PRO 6000(96 GB)
gpt-oss:120b65 GBRTX PRO 6000(96 GB)

长上下文、OLLAMA_NUM_PARALLEL 大于 1 以及同时加载多个模型时,都需要更多显存。选型助手和模型页面会显示目录中每个模型的需求。

在 Docker 中运行 Open WebUI

请先安装 Docker(参见容器);Open WebUI 本身不需要 GPU。

Open WebUI 的快速入门通过 host.docker.internal(主机在 Docker 内部的地址)访问 Ollama,而不是 Ollama 实际监听的 127.0.0.1。其连接问题指南给出了解决办法:使用 host 网络模式,并设置 OLLAMA_BASE_URL=http://127.0.0.1:11434。这样 Docker 不会发布任何端口,应用直接在主机上监听,因此要用 HOST 和 PORT 把它绑定到 localhost,这两个变量由镜像的启动脚本读取:

# 只需执行一次:固定的密钥(仅 root 可读的文件)能让用户在更新后保持登录
sudo install -m 600 /dev/null /etc/open-webui.env
echo "WEBUI_SECRET_KEY=$(openssl rand -hex 32)" | sudo tee /etc/open-webui.env >/dev/null

sudo docker run -d --network=host \
  --env-file /etc/open-webui.env \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  -e HOST=127.0.0.1 -e PORT=3000 \
  -v open-webui:/app/backend/data \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main

sudo docker logs -f open-webui       # 等待启动完成,然后按 Ctrl-C
ss -tln | grep -E "3000|11434"       # 两者都应只监听 127.0.0.1

open-webui 数据卷保存账户、聊天记录和设置。通过 SSH 隧道(见下一节)打开 http://localhost:3000,并立即创建您的账户:第一个账户会成为管理员,而且创建后新用户注册会自动关闭。要添加成员,管理员需要在 Settings > Admin > Authentication 中重新开启注册;新账户在获得批准前会处于 Pending(待激活)状态。

不要采用连接问题指南中的另一种办法,即 OLLAMA_HOST=0.0.0.0:Ollama 不校验任何 API 密钥,这样一来,任何能访问 11434 端口的人都能调用它的 API,挡在中间的只有防火墙。如果您改用桥接网络运行 Open WebUI,请以 -p 127.0.0.1:3000:8080 的方式发布端口:Docker 的端口规则会绕过 ufw。

远程访问 Ollama 和 Open WebUI

两个服务都只监听 127.0.0.1。请通过 SSH 访问它们,或者在 Open WebUI 前面放一个经过身份验证的 TLS 代理,但绝不要放在 Ollama 前面。

SSH 隧道:适合您自己和几位同事

# 在您的电脑上执行;gpu1 是 SSH 指南中配置的主机条目
ssh -N -L 3000:127.0.0.1:3000 -L 11434:127.0.0.1:11434 gpu1

然后打开 http://localhost:3000。第二条转发用于下文的 API 示例;如果您的电脑上也运行着 Ollama,请换一个本地端口,例如 -L 11435:127.0.0.1:11434。密钥和 ~/.ssh/config 的配置见 SSH 访问。

带 TLS 的 Caddy:适合团队

Open WebUI 本身不做 TLS 终止,其安全加固指南要求在面向互联网时,在它前面额外加一层访问控制,例如只放行已知 IP 段的白名单。把一个 DNS 名称指向服务器,并从官方仓库安装 Caddy;它会自动获取证书,而且无需额外设置就能透传 WebSocket 和流式输出(Open WebUI 的 Caddy 页面)。

sudo tee /etc/caddy/Caddyfile >/dev/null <<'EOF'
chat.example.com {
    @team remote_ip 198.51.100.7 203.0.113.0/24
    handle @team {
        reverse_proxy 127.0.0.1:3000
    }
    handle {
        respond 403
    }
}
EOF
sudo systemctl reload caddy
sudo ufw allow 80,443/tcp

# 为 WebSocket 放行公网来源(origin),然后重新创建容器(见“更新”)
echo "CORS_ALLOW_ORIGIN=https://chat.example.com;http://localhost:3000" | sudo tee -a /etc/open-webui.env

把您团队的地址写在 remote_ip 后面;每个人仍需用自己的 Open WebUI 账户登录。

在代理后面也要让 Open WebUI 保持 HOST=127.0.0.1,这样代理才是唯一的入口;绝不要代理或对外发布 Ollama 的 11434 端口。

使用 Ollama 兼容 OpenAI 的 API

Ollama 在 /v1 下提供兼容 OpenAI 的 API,包括 chat completions、completions、models、embeddings 和 responses。通过上面的隧道调用:

curl -s http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "gpt-oss:20b", "messages": [{"role": "user", "content": "Say hello in five words."}]}'

curl -s http://localhost:11434/api/tags     # 原生 API:磁盘上的模型

在 OpenAI 客户端中,把 base_url 设为 http://localhost:11434/v1/,api_key 随便设一个值即可,例如 ollama:这个字段必须填写,但会被忽略。

对于没有 SSH 访问权限的人或服务,请在 Caddy 代理后面使用 Open WebUI 自己兼容 OpenAI 的接口 /api/chat/completions。它会校验每个用户在 Settings > Account 中创建的 API 密钥;非管理员用户需要先由管理员允许使用密钥(API 接口)。

更新与故障排查

更新

curl -fsSL https://ollama.com/install.sh | sh    # 更新 Ollama;drop-in 配置会保留
ollama -v

# Open WebUI:先备份数据卷,再替换容器
sudo docker run --rm -v open-webui:/data -v /data/backups:/backup alpine \
  tar czf /backup/openwebui-$(date +%Y%m%d).tar.gz /data
sudo docker rm -f open-webui
sudo docker pull ghcr.io/open-webui/open-webui:main
# 然后重新执行“在 Docker 中运行 Open WebUI”一节中的 docker run 命令

Open WebUI 的更新指南提醒,数据库迁移是单向的,所以要先备份。如果想固定在已知版本,可以用 curl -fsSL https://ollama.com/install.sh | OLLAMA_VERSION=<version> sh 安装 Ollama,并把 :main 替换为发布版本标签 :v<x.y.z>。如果租期没有续费,模型和 Open WebUI 数据卷会随服务器一起被清除:请在别处保留副本。

故障排查

现象检查什么
ollama ps 显示 100% CPU没有可用的 GPU,或者其显存已被占用。检查 nvidia-smi 或 amd-smi list,再查看 journalctl -u ollama --no-pager --follow --pager-end;如需更详细的信息,可在 drop-in 文件中加入 Environment="OLLAMA_DEBUG=1"。在 AMD 上,id ollama 的输出中必须包含 render 和 video。
出现 CPU/GPU 拆分,或报内存不足(OOM)错误模型及其上下文放不下。调低 OLLAMA_CONTEXT_LENGTH 或 OLLAMA_NUM_PARALLEL,设置 OLLAMA_KV_CACHE_TYPE=q8_0,用 ollama stop 卸载其他模型,停止其他 GPU 任务,或者换用更小的标签。
Open WebUI 中没有列出任何模型在服务器上,curl -s http://127.0.0.1:11434/api/tags 必须能列出模型。然后检查 Settings > Admin > Connections 中的 Ollama URL,以及 sudo docker logs open-webui 的输出。
请求一直等待,或返回 503 错误每个模型同时处理 OLLAMA_NUM_PARALLEL 个请求(默认 1)。其余请求排队等待;超过 OLLAMA_MAX_QUEUE(默认 512)后,Ollama 会返回 503。

更多解决办法(例如重新加载 nvidia_uvm 模块)见 Ollama 的故障排查页面。

对这篇指南有疑问?

请通过联系表单告诉我们您使用的 GPU、运行的命令以及得到的输出结果。

客户中心

登录 CryptGPU

您的订单、账单和服务器,一站式管理。

还没有 CryptGPU 账户?

账户是在结账时创建的:先选择您的服务器和软件,然后在首次下单的账户步骤中创建账户。

部署服务器