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 WebUI | vLLM | |
|---|---|---|
| 模型 | 按标签从 Ollama 模型库拉取;默认标签通常是 4-bit | Hugging 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_HOST | API 地址(默认 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:9b | 6.6–7.6 GB | RTX 5080(16 GB) |
gpt-oss:20b | 14 GB | RTX 4090(24 GB) |
gemma4:31b | 19–20 GB | RTX 5090(32 GB) |
gemma4:31b-it-bf16 | 63 GB | RTX PRO 6000(96 GB) |
gpt-oss:120b | 65 GB | RTX 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、运行的命令以及得到的输出结果。
