Ollama Cloud 与自建服务器有什么区别?
Ollama Cloud 与自托管 Ollama 共用同一 CLI 和 API,但模型名称、凭据位置及数据流向不同。本文说明哪些设置会变、哪些请求会离开您的机器。
Ollama Cloud 的变化,以及不会变化的内容
Ollama Cloud 在 ollama.com 上运行模型,而不是在您自己的硬件上运行,同时保留您已经使用的相同 ollama 命令和 REST API。只有两点会变化:您请求的模型名称,以及凭据的存储位置。应用程序的其他部分完全不变。
这种便利性也带来了风险。在代码中,向云端模型发送的请求与向本地模型发送的请求看起来完全相同,因此您很容易混淆哪些提示词会在您控制的机器上运行,哪些提示词会发送给您无法控制的公司。本指南会明确这条边界,然后说明如何保留本地模型作为回退方案,使一个配置值决定您使用哪一侧。
如果您还没有部署本地环境,请先阅读在您自己的 VPS 上运行 Ollama。以下内容均假定您已经在 Linux 主机上运行正常的 ollama。
访问 Ollama Cloud 的两种方式
访问托管模型有两种路径,二者不能互换。选择哪种路径,决定凭据存储在哪里、填写什么模型名称,以及在服务器上进行数据包捕获时能看到什么。
路径一:本地守护进程转发请求。您只需登录一次,然后请求名称以 -cloud 结尾的模型。
ollama signin
ollama pull gpt-oss:120b-cloud
ollama run gpt-oss:120b-cloudollama signin 将此计算机关联到您的 ollama.com 帐户。ollama signout 解除关联。登录后,您的应用仍连接到一直使用的本地端口:
curl http://localhost:11434/api/chat -d '{
"model": "gpt-oss:120b-cloud",
"messages": [{"role": "user", "content": "Why is the sky blue?"}],
"stream": false
}'再次查看该 URL。它显示的是 localhost,推理并不在那里执行。本地守护进程识别 -cloud 后缀,将请求转发到 ollama.com,再将响应流式传回。路径一的意义就在于此:已经指向 11434 端口上的 Ollama API 的应用无需修改任何代码,只需更改模型字符串。
路径二:客户端直接调用 ollama.com。此时完全不会经过本地守护进程。在 https://ollama.com/settings/keys 创建密钥,然后将其作为 bearer 令牌发送。
export OLLAMA_API_KEY=your_api_key
curl https://ollama.com/api/chat \
-H "Authorization: Bearer $OLLAMA_API_KEY" \
-d '{
"model": "gpt-oss:120b",
"messages": [{"role": "user", "content": "Why is the sky blue?"}],
"stream": false
}'注意模型名称。路径二使用 gpt-oss:120b,不带 -cloud 后缀。该后缀用于告知本地守护进程将请求转发到上游,因此只能用于路径一。调用 https://ollama.com 时,您已经在云端,应填写不带后缀的名称。这些名称的权威列表由主机本身提供:
curl https://ollama.com/api/tags请运行该命令,不要相信文章(包括本文)中列出的模型列表。模型目录会变化,而 api/tags 始终显示最新内容。
客户端调用哪些会变化,哪些不会
官方 Python 和 JavaScript 库会在构造客户端时接收主机地址和请求头。此行之后的代码没有任何差异。路径一中,构造函数为空,因为默认连接本地 daemon:
from ollama import Client
client = Client()
messages = [{'role': 'user', 'content': 'Why is the sky blue?'}]
for part in client.chat('gpt-oss:120b-cloud', messages=messages, stream=True):
print(part['message']['content'], end='', flush=True)路径二中,构造函数包含主机地址和令牌:
import os
from ollama import Client
client = Client(
host="https://ollama.com",
headers={'Authorization': 'Bearer ' + os.environ.get('OLLAMA_API_KEY')}
)
messages = [{'role': 'user', 'content': 'Why is the sky blue?'}]
for part in client.chat('gpt-oss:120b', messages=messages, stream=True):
print(part['message']['content'], end='', flush=True)两种路径中的 client.chat() 调用、流式循环、消息列表和响应结构完全相同。因此,从托管服务迁移到自托管服务,或执行反向迁移,只需修改配置,无需重写代码。本地环境中的 OpenAI 兼容接口也以相同方式工作:让 OpenAI SDK 指向 http://localhost:11434/v1/,并传入 api_key='ollama';本地服务器要求传入该参数,但会忽略其值。
凭据存放在哪里,以及谁可以使用它
在路径二中,凭据位于你的环境变量 OLLAMA_API_KEY 中。不要让它出现在 shell 历史记录或代码仓库中。对于 systemd 服务,可将其写入 Environment= 行,或写入由 root 所有且权限为 600 的环境文件。
路径一更容易让人意外。登录凭据属于守护进程,而不是你本人。Ollama FAQ 说明了 Linux 上的服务身份:凭据位于 /usr/share/ollama/.ollama/id_ed25519.pub,由 ollama 服务用户拥有。本地 API 不对每个请求进行身份验证,因此任何能够访问 11434 端口的调用方都会继承你的账户并消耗你的配额。只要守护进程监听 loopback,这样通常没有问题。一旦将 OLLAMA_HOST=0.0.0.0:11434 设置为允许其他机器访问,开放端口就意味着任何访问者都可能产生计费,因此在扩大绑定地址前,应先阅读 如何在 Ollama 端点前配置身份验证。
为什么同一个模型在本地可用的上下文更少
如果认为模型在两种路径上的行为完全相同,就会忽略这个差异。实际并非如此,原因在于内存。
Ollama 会根据在主机上检测到的显存,为本地模型选择默认上下文长度。
The data behind this chart
[
{
"label": "Under 24 GiB VRAM",
"default_context_tokens": "4,096"
},
{
"label": "24 to 48 GiB VRAM",
"default_context_tokens": "32,768"
},
{
"label": "48 GiB VRAM or more",
"default_context_tokens": "262,144"
}
]没有 GPU 的 VPS 处于最低档,因此本地模型的上下文默认从 4,096 个 token 开始;配备大容量显卡的机器则从 262,144 个 token 开始。云端模型不受这些档位限制:Ollama 文档说明,云端模型默认使用其最大上下文长度,因为存放上下文的内存不由您承担。
因此,针对 gpt-oss:120b-cloud 能正常工作的同一个提示词,在小型主机上的本地模型中可能会被静默截断。请显式提高本地上限:
OLLAMA_CONTEXT_LENGTH=32768 ollama serve在 systemd 下,使用 systemctl edit ollama.service 将其设置为 Environment="OLLAMA_CONTEXT_LENGTH=32768",然后执行 systemctl daemon-reload && systemctl restart ollama。请注意这会带来什么影响:上下文越长,键值缓存越大;除模型权重外,模型还需要为该缓存分配 RAM。设置过高会导致生成速度变慢,或模型加载失败。正确设置 num_ctx 和 OLLAMA_CONTEXT_LENGTH介绍了相关计算方法,哪些模型适合您实际拥有的内存介绍了模型权重占用方面的内容。
实际离开您机器的数据
必须准确理解这一点,因为这正是大多数读者选择自行托管的首要原因。
在本地运行时,不会有内容离开机器。 Ollama 的隐私政策明确说明,对于本地使用,“我们不会收集、存储、传输或访问您在本地处理的提示词、响应、模型交互或其他内容。”但有一点需要注意:拉取模型仍然是从 ollama.com 下载内容,而且该政策将“模型下载元数据”和您的 IP 地址列为收集项目。模型仓库会知道您获取了哪些模型,但不知道您向模型询问了什么。
通过云端路径运行时,完整提示词和完整补全结果都会发送给第三方。 不存在只发送部分内容的情况。您发送的每个 token 和收到的每个 token 都会在 ollama.com 上处理。该政策称,公司会“临时处理您的提示词和响应以提供服务”,并且“不会使用您的输入或输出训练任何 AI 模型”;同时还说明采用了“旨在尽量减少提示词和响应内容保留时间的技术措施”。这是合理的承诺,但仍是其他主体针对您交付的数据作出的承诺,而不是您自己机器固有的属性。请像评估其他供应商承诺一样评估它,并在发送任何按合同或法律要求必须保留在自有基础设施中的内容之前重新阅读该政策。
陷阱在路径一。您的代码显示为 http://localhost:11434,防火墙规则没有变化,但提示词仍然会经过互联网,因为模型名称末尾的 -cloud 后缀负责路由。localhost URL 无法说明推理发生在哪里。模型名称才可以。
将本地模型作为回退方案
由于两条路径使用同一个 API,因此可以将选择逻辑设为运行时配置,而不必在代码中维护两个分支。
最简单的方式完全不需要修改代码。让应用继续指向本地守护进程,并将模型名称放在配置中。将其设置为 llama3.2 时,应用使用本机上的模型。将其设置为 gpt-oss:120b-cloud 时,同一个守护进程会将请求转发到 ollama.com。只需设置一个环境变量,无需重新部署。
如果希望本地模型作为默认选项,并在请求超出本地处理能力时改用云端,可以同时创建两个客户端,再按请求进行选择:
import os
from httpx import ConnectError
from ollama import Client, ResponseError
LOCAL_MODEL = os.environ.get("LOCAL_MODEL", "llama3.2")
CLOUD_MODEL = os.environ.get("CLOUD_MODEL", "gpt-oss:120b")
local = Client(host="http://127.0.0.1:11434")
cloud = Client(
host="https://ollama.com",
headers={"Authorization": "Bearer " + os.environ["OLLAMA_API_KEY"]},
)
def chat(messages):
try:
return local.chat(LOCAL_MODEL, messages=messages)
except (ConnectError, ResponseError) as err:
print(f"local inference failed ({err}); sending this prompt to ollama.com")
return cloud.chat(CLOUD_MODEL, messages=messages)httpx 随 ollama 软件包一起提供,因此无需额外安装。ConnectError 处理守护进程已停止的情况。ResponseError 处理守护进程正在运行但拒绝请求的情况,例如尚未拉取本地模型时。
print 这一行并非可有可无。静默回退意味着:在升级期间守护进程重启时,原本应保留在本机硬件上的提示词,第一次触发故障就会悄然发送给第三方。应记录每次回退;对于敏感内容,应直接报告错误,而不是回退。对于以隐私为优先的部署,最安全的回退策略是明确失败。
还有一点可以让本地模型真正适合作为默认选项:让模型常驻内存。仅使用 CPU 的 VPS 冷启动模型可能需要几十秒,这正是用户一开始选择云端路径的原因。使用 keep_alive 让模型常驻内存 可以消除首次请求的延迟。
提交前需要比较的内容
不要只比较价格,也不要盲目信任文章中的价格,包括本文标注的日期。比较以下四项,并在供应商自己的页面上逐项核实:
- 模型可用性。 运行
curl https://ollama.com/api/tags查看当前托管模型目录。可在本地运行的模型则受 RAM 和 VRAM 限制。 - 上下文限制。 托管模型默认使用其最大上下文长度。本地模型则根据上文所述的 VRAM 级别设置默认值。如果您的工作负载是长文档,这一项本身就能决定选择。
- 速率限制。 托管推理按用量计费并受限流控制。超过限制后,API 会返回
429 Too Many Requests。您自己的服务器没有速率限制,但有固定的并发上限。这是另一种故障,而且通常更严重。 - 数据保留政策。 阅读实际的政策文本,记录阅读日期,并在续费前重新核查。
对于成本部分,不要在这里重复计算。GPU VPS 何时超过按令牌计费会正确计算盈亏平衡点,其中也包括人们容易忽略的一点:空闲 GPU 服务器和繁忙 GPU 服务器的计费相同。
前置多个提供商时使用路由器怎么样?
第三种方案是使用路由器。它是一种代理,向您的应用提供统一的 API,再将请求分发到多个后端。自行托管的 LiteLLM 代理或 OpenRouter 等托管服务都可以实现这一点。它的优势很明显:客户端只需配置一次,即可使用多个模型;当某个提供商暂时出现故障时,还可以进行故障转移。这是上文回退模式的自然扩展,只是将其从两个后端推广到了更多后端。
不过,请明确了解其中的代价。托管路由器是另一个可以看到您提示词的服务运营方。因此,您向一个供应商询问的数据保留问题,现在也必须向第二个供应商询问。自行托管的路由器可以将这一跳保留在您自己的机器上,但您需要额外运行、修补和监控一个服务。路由器可以解决模型选择和可用性问题,但无法解决隐私问题,因为提示词最终仍会发送到路由所指向的位置。
实际会看到的错误
API 文档说明了状态码,每个状态码都对应不同的问题。429 Too Many Requests 表示触发了速率限制,因此应降低请求频率后重试,而不是循环重新连接。502 Bad Gateway 是本主题中特有的状态码:当无法访问云端模型时会返回该状态码。因此,在路径一中,它表示守护进程正常运行,但上游服务不可用。模型名称返回 404 Not Found,通常表示后缀与主机不匹配、将 -cloud 名称直接发送到 https://ollama.com,或将不带限定信息的名称发送给从未登录过的守护进程。错误以 JSON 格式返回。在流式响应过程中,错误会作为类似 {"error":"an error was encountered while running the model"} 的一行出现在 NDJSON 响应中。这也是简单的流式客户端可能打印部分答案后无提示停止的原因。请解析每一条流式响应,并检查是否包含 error 键。
在本地环境中,最常见的问题是 11434 端口连接被拒绝,这表示守护进程未运行:检查 systemctl status ollama。另一个常见问题是请求在 shell 中可以正常工作,但从容器中失败,因为容器的 localhost 不是主机的 localhost。
还有一种完全没有错误消息的故障:没有互联网连接。云端路径会完全停止工作,而本地路径不会受到影响。如果机器离开固定网络环境,或者服务提供商发生路由故障,这种差异就是整个产品的核心。
何时适合使用哪种方案
在工作负载突发、模型过大而无法运行在 VPS 上,或仍在评估某个模型是否值得投入时,应使用 Ollama Cloud。按请求付费,比为每天只运行 20 分钟的闲置 GPU 付费更划算;拥有 1200 亿参数的模型也无法装入一台只需支付一顿午餐价格即可租用的服务器。
当提示词不得离开基础设施、机器必须离线工作,或负载足够稳定而租用的 GPU 能持续运行时,应自行运行模型。稳定负载是最可靠的判断依据:按量计费的推理服务在持续运行时成本最高。如果达到这一阶段,Ollama 的单请求吞吐量成为瓶颈,vLLM 对并发负载的处理能力优于 Ollama;这只需要更换推理引擎,无需更换主机。
大多数实际部署最终会同时使用这两种方案,只要明确划分用途即可。将模型名称写入配置,记录每次回退,这样就始终能够回答这里唯一重要的问题:哪些提示词离开了这台服务器?
FAQ
Ollama Cloud 会看到我的提示词吗?
会。在托管路径中,完整提示词和完整补全结果都会发送到 ollama.com 并在那里处理。Ollama 的隐私政策表示,系统会“临时处理您的提示词和响应以提供服务”,并且“不使用您的输入或输出训练任何 AI 模型”,同时说明已采取措施尽量减少数据保留。这是供应商针对您已经交出的数据作出的承诺。对于本地模型,同一政策表示,公司“不收集、存储、传输或访问您在本地处理的提示词、响应、模型交互或其他内容”。如果要求内容绝不离开您的基础设施,只有本地路径能够满足这一要求。
为什么模型在云端运行,而我的应用仍然指向 localhost?
因为本地 daemon 充当代理。当您运行 ollama signin,然后请求名称以 -cloud 结尾的模型时,daemon 会将该请求转发到 ollama.com,并通过端口 11434 将答案流式传回。应用 URL 不会改变,这正是这种方式的作用:无需修改代码。这也意味着 localhost 地址无法说明推理实际发生在哪里。应检查模型名称,而不是 URL。-cloud 后缀表示提示词已通过互联网传输。
为什么同一个模型在本地提供的上下文短得多?
Ollama 会根据可用的视频内存选择本地默认值:VRAM 小于 24 GiB 时约为 4k token,介于 24 GiB 和 48 GiB 之间时为 32k,达到 48 GiB 及以上时为 256k。没有 GPU 的 VPS 属于最低档。云端模型默认使用最大上下文长度,因为用于保存上下文的内存属于供应商。使用 OLLAMA_CONTEXT_LENGTH 提高本地值,可以写成 OLLAMA_CONTEXT_LENGTH=32768 ollama serve,也可以在 systemctl edit ollama.service 下添加 Environment= 行。请注意,更长的上下文需要更大的 RAM 中键值缓存,因此在小型服务器上提高该值可能会降低生成速度,或导致模型无法加载。
云端不可访问时,我能否自动回退到本地模型?
可以,而且只需几行代码,因为两条路径使用相同的 API。创建两个 Client 对象:一个不带 host 参数,用于本地 daemon;另一个使用 host="https://ollama.com" 和 Authorization: Bearer header。然后在首次调用周围捕获 httpx.ConnectError 和 ollama.ResponseError。应有意决定回退方向。先使用本地模型、云端作为回退,意味着原本应保留私有的提示词可能会在 daemon 常规重启期间离开机器。因此,应记录每次回退;对于敏感工作负载,应直接抛出错误,而不是回退。