实用技术手册 / Self-hosted LLM

自托管 LLM 实用指南

判断是否值得自托管,规划硬件、完成部署试点,再算清自己的实际成本。

文档核对 · 2026-10-23参考指南 · 硬件实测待补充
通往可运行模型的路线
01

做出部署决策

02

完成小规模试运行

03

测量后再扩容

你的任务、你的基础设施、你的真实成本。先明确要解决什么,再决定运行什么。

从这里开始

自托管是基础设施选择。是否更便宜,要看真实任务和实际支付的账单。

你该自托管 LLM 吗?

先明确任务,再考虑 GPU。自托管适用于需要控制推理路径、有合适模型且有维护能力的情况。省钱则是需要单独验证的假设。 下方四个问题分别检查数据控制、工作负载、模型质量与运维责任。低使用量也可能因隐私而值得部署;高使用量也会因模型不合格而失败。

01推理数据必须留在可控环境内吗?
02你有可以测量的稳定使用量吗?
03可获取权重的模型通过任务测试了吗?
04有人负责更新、权限和故障吗?
建议起点

买 GPU 前,先回答四个问题。

回答全部问题后查看建议。这只是规划辅助,不是成本或合规保证。

继续检查取舍

什么是自托管 LLM?

自托管 LLM 指在自己负责管理的基础设施上运行推理,可以是工作站、服务器或租用算力。你加载权重并决定应用如何访问运行时,不需要从零训练模型。 模型、推理运行时和应用是不同层次。聊天界面可能连接本地推理,也可能连接外部 API。只有相关处理都遵守预定边界,才能称为完整的本地处理。

本地界面不等于本地推理。自托管聊天应用如果连接外部 API,推理请求仍会发给该供应商。嵌入、联网搜索、遥测与备份的数据路径要分别检查。
查看部署参考

如何自托管 LLM:先做 Docker 试点

从一个运行时、一个小模型和一个聊天界面开始。模型服务保留在容器网络中,持久化数据,在建立推理基线前不要对外开放。参考配置通过服务名连接 Open WebUI 和 Ollama。 平台页签说明系统差异,不会把 CPU 配置变成 GPU 部署。先验证基础路径,每次只改变一个加速设置。一次成功不能证明生产容量。

参考环境为 Docker Engine 和 Compose,配置默认仅使用 CPU。NVIDIA 加速需兼容驱动、Container Toolkit 和 GPU 资源配置,安装容器不会自动启用 GPU。

双容器 CPU 参考配置已核对官方文档,尚未完成端到端验证。另一次 macOS 冒烟测试使用原生 Ollama 0.34.3 与 Docker Open WebUI 0.12.3,记录日期为 2026-10-23;它不能证明 Linux GPU 性能或独立显存需求。

本地 Open WebUI 实际聊天截图,SmolLM2 模型成功返回文字。
Mac 冒烟测试:Docker Open WebUI 0.12.3、原生 Ollama 0.34.3、SmolLM2 135M F16,上下文 2048,关闭 Builtin Tools。记录于 2026-10-23。
  1. 创建独立试点目录

    将下方 compose 文件下载到这个目录。界面使用 3080 端口,以免与本站冲突。

    mkdir llm-pilot
    cd llm-pilot
    docker version
    docker compose version

    Docker 客户端与服务端都响应,Compose 显示版本。

  2. 设置稳定的应用密钥

    启动前创建本地环境文件,妥善保管,并在更新容器时保持同一个密钥。

    umask 077
    printf "WEBUI_SECRET_KEY=" > .env
    openssl rand -hex 32 >> .env
    docker compose config --quiet

    Compose 校验成功,没有缺失密钥错误。密钥仅保存在本地 .env 中。

  3. 启动运行时并下载小型测试模型

    下载需要联网和磁盘空间。先用小模型验证连通性,不代表它满足你的任务质量。

    docker compose up -d
    docker compose exec ollama ollama pull llama3.2:1b
    docker compose exec ollama ollama run llama3.2:1b "Reply with: ready"

    下载完成,推理返回文字。实际措辞和速度会不同。

  4. 验证界面并保存运行证据

    打开 http://localhost:3080,创建本地账户并选择模型。使用合成提示词,记录镜像摘要、系统、上下文和并发。Mac 的容器内存不是 GPU 显存。 若模型不支持工具调用,先在 Workspace → Models → Edit → Capabilities 中关闭 Builtin Tools,再测试聊天。

    docker compose ps
    docker compose images
    docker compose exec ollama ollama --version
    docker compose exec ollama ollama ps
    docker stats --no-stream

    界面连接到模型,聊天返回文字,版本与内存观测可保存。

compose.yaml
下载
# Reference CPU-only stack. No model port is exposed to the host.
# Replace image tags with validated digests before production use.
services:
  ollama:
    image: ${OLLAMA_IMAGE:-ollama/ollama:latest}
    volumes:
      - model-data:/root/.ollama
    restart: unless-stopped
  webui:
    image: ${WEBUI_IMAGE:-ghcr.io/open-webui/open-webui:main-slim}
    ports:
      - "127.0.0.1:3080:8080"
    environment:
      OLLAMA_BASE_URL: http://ollama:11434
      WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY:?Set WEBUI_SECRET_KEY in .env}
    volumes:
      - chat-data:/app/backend/data
    depends_on:
      - ollama
    restart: unless-stopped
volumes:
  model-data:
  chat-data:

官方参考: Ollama Docker · Open WebUI Quick Start

计算自己的成本

自己托管 LLM 到底更便宜吗?

比较相同任务和相近质量目标。检索问答往往输入较长,聊天可能输出较多,混合 token 单价容易失真。把实际要付出的基础设施、维护和迁移成本全部填入。 包月 GPU 即使闲置仍需付费。有效利用率解释单位完成请求的成本,不会减少固定账单。可暂停的按小时实例也需计入空闲计费时间。计算器固定一套部署成本,超过容量假设就停止认定它可行。

你的任务 / 你的盈亏平衡点

默认值仅为示例,不是实时价格。固定容量的比较假设任务质量相近,请替换为自己的报价和负载测试容量。

1. API 工作负载

2. 自托管账单

API 月成本$66.00
自托管月成本$650.00
算术盈亏平衡点295,455每月请求数

当前月请求量: 30,000. 距离阈值还差: 265,455.

有效时间 / 付费时间: 16.7%

容量内没有可达的盈亏平衡点,或 API 单价为零。请先调整假设。

查看公式与利用率说明

API = 30 × 日请求数 ×(输入 token × 输入单价 + 输出 token × 输出单价)/ 1,000,000。暂不建模缓存折扣和批处理价。

自托管 = GPU 固定月租,或小时价 × 计费小时,再加运维及迁移月摊销。有效时间不能给包月账单打折;按小时需计入空闲但仍计费的时间,有效小时不应超过付费小时。

平衡请求数 = 向上取整(月托管成本 / API 单请求成本),仅在测得容量内成立。这是成本交点,不是回本日期,也不代表两种模型质量相同。按每月 30 天计算。

对比十档月请求规模
每月请求数API 月成本自托管月成本容量假设
10,000$22.00$650.00在假设容量内
50,000$110.00$650.00在假设容量内
100,000$220.00$650.00在假设容量内
250,000$550.00—需要扩容
500,000$1,100.00—需要扩容
1,000,000$2,200.00—需要扩容
2,500,000$5,500.00—需要扩容
5,000,000$11,000.00—需要扩容
10,000,000$22,000.00—需要扩容
30,000,000$66,000.00—需要扩容
想把这些数字变成可运行的方案?查看固定范围部署服务。检查内存预算

自托管 LLM 硬件:别只算权重

权重存储只是起点。量化元数据、运行时工作区、注意力实现、上下文和并发都会影响峰值。MoE 的活跃参数描述计算量,不代表需要保存的完整权重。 表格只是数学估算,不是硬件推荐。另算 KV cache 和运行时余量,再测量。比较配置时固定提示词、生成长度与并发;统一内存、主机 RAM 和独立显存不是同一个指标。

仅为权重存储理论值,不是实测显存需求。按稠密模型与二进制 GiB 计算。
参数量4-bit8-bit16-bit
3B1.4 GiB2.8 GiB5.6 GiB
8B3.7 GiB7.5 GiB14.9 GiB
14B6.5 GiB13.0 GiB26.1 GiB
32B14.9 GiB29.8 GiB59.6 GiB
70B32.6 GiB65.2 GiB130.4 GiB

权重 GiB = 参数量 × 每参数位数 ÷ 8 ÷ 2³⁰。量化元数据、运行时缓冲和 KV cache 需另外计算;装得下不代表达到性能目标。

KV cache 应单列:普通全注意力模型的简化估算为 2 × 层数 × KV 头数 × 头维度 × 上下文 token × 并发序列 × 每元素字节数。模型架构、缓存量化、前缀共享与内存分配策略都会改变结果,不能只按参数量猜测。
查看部署参考

添加服务前,先画数据路径

单人使用可能只需要界面与运行时。团队使用要先明确身份、权限边界和可观测性,再增加组件。向量数据库、Agent 框架和集群编排都需要实际理由。 画清提示词、文档、嵌入、日志和输出流向,标出每一次外部连接和身份。架构图应帮助你确定在哪里限制请求、检查权限与执行删除。

01

访问边界

用户 → 身份验证 → 网关。推理端点保持私有;本地配置只将界面绑定到回环地址。

02

模型服务

网关 → 运行时 → 模型权重。根据实测需求设置上下文、并发与队列,不按宣传的最大上下文配置。

03

数据与检索

有需要再加检索。文档进入模型上下文前执行权限检查,并保持删除和保留策略一致。

查看部署参考

公开部署前的十二项检查

自托管转移了责任,不会自动带来隐私或合规。试点先只绑定回环地址。远程使用前检查下列项目;命令仅用于检查此参考配置,不是控制措施有效的通用证明。 应用权限需要反向测试,备份需要真实恢复。容器显示运行正常无法证明这两件事。

检查暴露端口

试点只应把界面绑定到宿主机回环地址,模型端口不应出现在已发布端口中。开放远程访问前还需从其他设备验证。

docker compose ps
要求应用身份验证

验证未登录请求不能读取聊天或执行模型操作。一次重定向不足以证明授权有效。

curl -I http://127.0.0.1:3080/
保持应用密钥稳定

确认文件存在,但不要把密钥打印到共享日志。轮换需明确会话和恢复方案。

test -s .env && echo "Environment file exists"
记录镜像确切版本

保留镜像摘要,更新前阅读上游变更。浮动标签适合试点,不是可复现基准。

docker compose images
检查监听进程

确认本地监听进程以及代理是否改变访问边界。Windows 需使用对应的主机工具。

lsof -nP -iTCP -sTCP:LISTEN
分开模型与聊天存储

确认持久卷已挂载。容器若未使用预期卷,替换时可能丢失数据。

docker volume ls --filter name=llm
检查日志敏感信息

使用合成提示词在本地检查。分享前删除 token、用户内容与身份信息。

docker compose logs --tail=50
验证文档权限

使用权限不同的两个用户,验证 A 的受限文档不会被 B 检索出来。进程状态不能证明权限。

# Manual negative test: two users, one restricted document
设置请求和队列限制

检查应用网关的超时、并发和输入长度策略,再使用合成数据测试预定限制。

docker compose exec ollama ollama ps
测量资源压力

分别观察空闲和活跃状态。容器内存不是 GPU 显存,GPU 需使用设备遥测。

docker stats --no-stream
验证备份恢复

停止写入或使用应用一致性备份,在独立项目恢复,不要删除原卷来测试。

# Record backup identifier, isolated restore result and recovery time
检查远程入口与回退

试点保持本地私有。远程使用前,从另一客户端验证身份、TLS、防火墙和回退。

# Manual external check: only intended authenticated entry points respond
查看部署参考

先测请求,再测队列

区分首 token 延迟、生成速度与端到端延迟。单请求快,不代表多用户同时到达时也快。预填充、解码、批处理和内存压力影响不同阶段。 使用有代表性的任务集,固定输入输出长度,分别记录冷启动和热运行,再逐渐提高并发并观察延迟分位数与错误率。按任务实测选择运行时,不照搬其他硬件的速度。

查看部署参考

购买硬件、按小时租用还是包月?

自有硬件包括购买、电力、散热、更换与管理成本。按明确使用寿命摊销购买价,并计入整机。讨论长期总成本时,已有 GPU 也不能直接按零计算。 按小时租用适合间歇任务的前提是确实可以停止计费。包月账单稳定但低使用量可能昂贵。托管私有部署用服务费换取部分运维工作,比较时需看支持范围与最低承诺。

查看部署参考

最适合的模型取决于任务

用实际工作构建小型测试集,例如信息提取、基于资料回答、代码修改。比较前定义合格答案与失败条件,同时验证许可、工具调用和格式约束。 每次只改变一个变量。在同样内存与延迟预算下比较模型版本、量化和提示格式,保存稳定基线。排行榜可以提供候选,但不能替代评测。

可复现的模型比较应同时记录模型版本、量化、运行时、测试任务、上下文、并发与峰值内存。缺少的测量结果应保留为未知,不能用理论内存估算代替。
查看部署参考

第一次聊天成功后要记录什么?

记录镜像摘要、模型标识与版本、量化、操作系统、驱动、运行时配置和提示词。每次内存观测都附上上下文和并发。缺少这些条件的截图很难复现。 验证正常重启后数据仍在,导出备份并在隔离环境恢复。记录加载失败、超时与队列饱和。更新前跑同一测试集,并保留回退路径。

查看部署参考

哪些情况不适合自己托管 LLM?

没有模型满足质量、无人维护,或预算内达不到延迟目标时,应先暂停。便宜但失败的请求不是节省。低使用量或波动大的任务可能更适合 API,但不存在通用的每日 token 分界线。 隐私约束可能优先于成本,也可能禁止外部回退。设计混合架构前写清边界,不能通过默默外发敏感数据解决容量问题。

查看部署参考

自托管、API 与混合架构怎么选?

把质量、数据处理、延迟、容量、可用性与总成本分开评估。自托管改变运营责任,不会移除资源限制。API 减少基础设施工作,但应用仍需监控和用量控制。 混合路由要明确哪些请求允许外发、失败怎么处理、成本如何归因。三种方案使用相同任务评测,让比较回答自己的问题。

外部 API

适合作为质量与成本基线。分别计量输入输出,评估限流与供应商的数据政策。

自托管

你选择运行时、权重和基础设施,也负责容量、权限、更新、备份与恢复。

混合架构

按规则路由任务。外部 API 回退必须遵守原请求的数据边界。

查看部署参考

先运行一个试点,保留证据。

选择一个实际任务和明确的数据边界,完成判据卡,填入自己的成本,再运行一个小规模试点。购买容量或迁移用户前,先保存运行证据。 如果仍无法决定,找出缺少的事实:任务质量、峰值并发、响应时间,或真实托管账单。下一步去测量它,而不是继续添加服务。

本文是技术参考,不是性能实测报告。命令需在你的系统与硬件上验证。成本输入为示例美元假设,并非实时供应商报价。网页不会创建付费基础设施。