1680 字
约 5 分钟
8
S23-J33 · 本机自托管推理栈:Ollama 与 Open WebUI

适用读者:想在自己机器/内网跑模型的人;要把"本地跑"接到业务里的人。
前置:S23-J01(推理指标与显存预算)、S23-J02(量化)、S15-J04(Docker 基础)。
覆盖旧文:4356(如何在本地自托管 AI:Ollama、Open WebUI 完全指南(2026),17,126 字符)。
扩展点:E-S23-013(Ollama 的定位:单机易用 vs 高并发不足)、E-S23-014(显存/内存估算与量化格式取舍)、E-S23-015(Open WebUI 的边界:是控制台不是生产网关)。
下一篇:S23 系列验收(v3)。


1. 一句话结论

Ollama 是"单机推理的开箱即用工具",不是"生产推理网关":它把拉模型、跑模型、暴露 HTTP 三件事做成一条命令,但在并发吞吐、批处理、多副本调度上远不如 vLLM/SGLang。判据:个人与内网验证用 Ollama;对外服务、要高并发与批处理,用 vLLM 一类引擎。 Open WebUI 的价值是"图形界面 + 多模型管理 + 权限",它不能替代网关的鉴权、限流与审计。

出处:A-4356。


2. 最小可运行(命令 + 预期)

# 环境:Linux / macOS,Docker 24+;或直接安装 ollama(0.3+ 版本口径)
docker run -d --name ollama -p 11434:11434 -v ollama:/root/.ollama ollama/ollama:latest

ollama pull qwen2.5:7b-instruct-q4_K_M      # 拉取量化权重(约 4.7 GB)
ollama list                                  # 预期:NAME/ID/SIZE 三列,无报错即成功
ollama run qwen2.5:7b-instruct-q4_K_M "用一句话解释什么是 KV Cache"
# 预期:流式输出一句话答案;首 token 约 0.3~2 s(取决于显存与是否首次加载)

HTTP 接口(OpenAI 兼容路径在 /v1):

curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen2.5:7b-instruct-q4_K_M",
  "prompt": "你好,请用三行说明 Ollama 是什么",
  "stream": false
}' | head -c 300
# 预期:返回 JSON,含 "response" 与 "eval_count"、"eval_duration" 等统计字段

curl -s http://localhost:11434/v1/chat/completions -H 'Content-Type: application/json' -d '{
  "model": "qwen2.5:7b-instruct-q4_K_M",
  "messages": [{"role":"user","content":"hi"}]
}' | head -c 200
# 预期:OpenAI 格式响应,可直接被现有 SDK 复用

判据:"能跑通"的标志是 /v1/chat/completions 返回 OpenAI 兼容结构——这样上层代码不用改(同 S22-B01 的统一调用层)。


3. 显存与量化:先算再拉(E-S23-014)

权重显存 ≈ 参数量 × 每参字节数
  FP16 = 2 B/参数   → 7B ≈ 14 GB
  INT8 ≈ 1 B/参数   → 7B ≈ 7 GB
  Q4_K_M ≈ 0.55 B/参数 → 7B ≈ 4 GB(质量损失小,最常用)
KV Cache ≈ 2 × 层数 × 头数 × 头维 × 序列长 × 每元素字节 × 并发数
  → 长上下文与高并发时,KV Cache 可能超过权重本身
显存 可跑(Q4) 说明
8 GB 7B(4K 上下文) 常见笔记本独显
16 GB 13B / 7B 长上下文 上下文越长,KV 越吃
24 GB 32B(Q4)或 13B 高并发 单卡 4090 档
仅 CPU 7B 可用但慢(数 token/s) 内存需 ≥ 权重 1.2 倍

判据:"先按 Q4 算权重,再按上下文算 KV,最后留 20% 余量"——直接拉最大模型,多半 OOM 或疯狂换页。

量化格式取舍(GGUF):Q4_K_M 是默认平衡点;Q5_K_M 质量更好、显存 +15%;Q8 接近 FP16 但收益递减。判据:"Q4 与 Q8 的差别,通常小于换更大模型的差别"。


4. Open WebUI:控制台,不是网关(E-S23-015)

docker run -d --name open-webui -p 3000:8080 \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  -v openwebui:/app/backend/data --add-host=host.docker.internal:host-gateway \
  ghcr.io/open-webui/open-webui:main
# 预期:浏览器打开 http://localhost:3000,注册首个账号(即管理员)
能力 有 说明
多模型切换、对话历史 ✅ 本地存储(SQLite/Postgres)
用户与角色 ✅ 适合小团队
RAG(上传文档) ✅ 内置向量库,规模有限
工具/函数调用 ✅ 通过配置接入
高并发网关、限流、审计 ❌ 需前置 nginx/网关(同 S26)
模型副本调度/批处理 ❌ 需 vLLM 一类引擎

判据:"控制台给的是体验,网关给的是治理"——把 Open WebUI 直接暴露公网,等于把管理后台公开(同 S15-X02 §4 的容器三件套判据)。

安全三条:

① 不暴露 11434 到公网(Ollama 默认无鉴权)
② 反向代理加鉴权 + TLS(S26 证书流程)
③ 数据卷定期备份(对话与知识库都在 /app/backend/data)

5. Ollama vs vLLM:选型表(E-S23-013)

维度 Ollama vLLM / SGLang
上手成本 一条命令 需配置引擎与服务
并发吞吐 低(默认单请求串行化倾向) 高(PagedAttention + 连续批处理)
批处理/离线任务 不适合 强项
多卡/多副本调度 弱 需 K8s + 编排
量化格式 GGUF(CPU/GPU 混合) AWQ/GPTQ/FP8
适合 个人、内网验证、边缘设备 生产 API、规模化服务

判据:"先用 Ollama 验证 prompt 与数据,再迁到 vLLM 做服务"——两阶段成本最低;反过来(先上 vLLM 调 prompt)会浪费大量工程时间。


6. 反例:八种"本地跑起来就出事"

做法 后果
11434 暴露公网 无鉴权,任何人都能跑你的卡
不设并发上限 一个批量脚本打满显存,所有人卡住
用 FP16 拉 7B 到 8 GB 卡 OOM 或疯狂换页
上下文设 128K 但显存 8 GB KV Cache 直接爆
把 Open WebUI 当生产网关 无审计、无限流
不做卷备份 对话与知识库丢失
用 Ollama 做离线批处理 吞吐极低,跑一夜
量化到 Q2 追省显存 质量断崖,答非所问

7. 自测

  1. Ollama 与 vLLM 的定位差别?迁移顺序应该怎样?
  2. 权重显存与 KV Cache 各怎么估?为什么留 20%?
  3. Q4_K_M 为什么是默认?何时升 Q5/Q8?
  4. Open WebUI 能做什么、不能做什么?
  5. 三条安全底线?
答案
  1. 单机易用 vs 高并发服务;先用 Ollama 验 prompt,再迁 vLLM。
  2. 参数量×每参字节;2×层×头×头维×序列×字节×并发;留余量防峰值。
  3. 质量/显存平衡点;需要更高质量且显存够时升 Q5。
  4. 体验与多模型管理;无网关级鉴权/限流/审计、无副本调度。
  5. 不暴露 11434、反代加鉴权与 TLS、数据卷备份。

8. 下一篇

S23 系列验收(v3) —— 教材 12 章 + 自托管补编后的整体验收。

S23-J33 · 本机自托管推理栈:Ollama 与 Open WebUI
https://www.clxhxhhr.top/posts/5560/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。