
通过 frp 远程调用服务端的 ollama 模型
延
"存在即反抗。"
前情提要:
我为了出门轻便于是用的是 MacBook Air,我也做好了接受无法跑重量级项目的准备,所以我希望把能跑在云上的都跑在云上。大部分服务可以通过 AI 算力提供商的 API 来解决,但针对一些不希望上传到第三方云端的信息那么就需要本地部署的大模型来处理了。
在我家里的台式电脑为了低成本的大 VRAM 特意选配了NVIDIA RTX 4060Ti 16GiB,跑一些 20B+ 的模型甚至一些量化过的 30B+ 模型还是绰绰有余的。
最近 Google DeepMind 团队推出了 Gemma 4 的系列模型,除了为边缘计算设备准备的 E2B、E4B,以及对我电脑来说负担有些重的 31B 以外,还有一个中等量级的 26B,当通过 ollama 部署在本地时,会调用 30%CPU + 70%GPU,用起来推理速度和响应速度也非常快,于是我便打算采用本地部署 gemma4:26b 并在 MacBook Air 上通过 frp 端口转发远程调用的方案。
准备:
- 一台算力满足你要求的电脑
- VPS
( VPS 不要做一些有被封 IP 风险的事,最后需要关闭代理。)
Step 1 - 服务端的准备:
1. 在你的服务端安装 ollama :
# macOS & Linux
curl -fsSL https://ollama.com/install.sh | sh# Windows PowerShell
irm https://ollama.com/install.ps1 | iex在中国大陆网络环境下载时请使用代理
2. 更改环境变量:
将一个关键的环境变量 OLLAMA_HOST 更改为 0.0.0.0 (默认为127.0.0.1):
# macOS & Linux
export OLLAMA_HOST="http://0.0.0.0:11434"可以将其写入 ~/.bashrc 或 ~/.zshrc 等,来自动设置变量。
# Windows PowerShell
# 仅用于当前会话
$env:OLLAMA_HOST="0.0.0.0"
# 用于当前用户的所有会话
[Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0", "User")默认的设置只能通过本机访问 ollama 服务,但我们要从互联网访问这个服务,所以需要将其改为 0.0.0.0 (这里我使用了默认的11434端口,若希望自定义,请在后续的 frpc.toml 文件中将本地端口改为自定义的端口)。
3. 运行 ollama:
ollama serve如果看到那一串日志中有 Listening on [:]:11434 字段,就代表成功了。
* ⚠️ 如果 Windows 系统报错:
listen tcp 0.0.0.0:11434: bind: only one usage of each socket address (protocol/network address/port) is normally permitted.那请在托盘右键小图标退出 ollama 再重新运行上面那行命令,它和命令行中运行的 ollama 是不同的进程,我们作为服务端是用不到它的 GUI 软件的,这个进程会与我们从命令行启动的服务端抢占 11434 端口。
Step 2.1 - 配置frp内网穿透——服务端:
如果拥有公网 IP 那么配置一个 DDNS 服务即可,但大多数情况下是获取不到公网 IPv4 的,所以内网穿透是个不错的方案。
我一开始想着使用公益的第三方内网穿透服务,比如 SakuraFRP。但国内节点在访问时都要求备案,这是一个很麻烦的事情,我个人也很讨厌备案,于是利用了自己用于部署个人网站的 VPS 来部署内网穿透服务。
1. ssh 登录到 VPS:
# 替换为自己的用户名和服务器 IP 地址
# 建议使用 root 用户
ssh <user>@<Server IP>2.1. 获取 frp 并解压缩:
# 下载 frp
wget https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
# 解压缩
tar -xzvf frp_0.68.1_linux_amd64.tar.gz
# 将解压缩后的文件夹直接改名为 frp 方便管理
mv frp_0.68.1_linux_amd64 frp
# 删除压缩包
rm frp_0.68.1_linux_amd64.tar.gz
# 把 frp/ 放在 /usr/local 中
mv frp /usr/local
# 进入 frp 目录
cd /usr/local/frp 这个目录里既有服务端也有客户端,我们只需要在 VPS 上配置服务端。
2.2. 配置 frps.toml :
vim ./frps.toml配置下列选项:
# 与客户端通信的端口,默认7000
bindPort = 7000
# 认证方式,默认使用令牌(token)
auth.method = "token"
# 设置你的令牌,也就是密码
auth.token = "your_secure_token"这时候其实就可以运行了^_^
./frps -c ./frps.toml这时当然可以用 screen 工具使其后台运行,但那样即不优雅也不安全,我们还是停止这个进程来创建一个 守护进程(daemon) 吧:
vim /etc/systemd/system/frps.service在里面写如下内容:
[Unit]
Description=FRP Server Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
Restart=always
RestartSec=2s
User=nobody
[Install]
WantedBy=multi-user.target启用 frps.service:
systemctl enable --now frps.service这时,我们 VPS 上的 frp 服务就配置好了。
Step 2.2 - 配置 frp 内网穿透——客户端:
1. 下载 frp 压缩包到算力主机上:
Windows(amd64):
https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_windows_amd64.zip
Linux(amd64):
https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
macOS(Apple Sillicon):
https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_darwin_arm64.tar.gz
如需其它平台可以在仓库里自行返翻找。我不觉得会有人拿 Intel 芯片的 macOS 跑 LLM。真的有吗?
解压后进入目录,我们需要用两个文件。分别是可执行文件 frpc 或 frpc.exe ,以及它的配置文件 frpc.toml ,编辑 frpc.toml :
serverAddr = "127.0.0.1"
# 与之前在 VPS 上配置的 frps.toml 中的 bindPort 端口号相同
serverPort = 7000
[[proxies]]
name = "ollama"
type = "tcp"
localIP = "127.0.0.1"
# 如果之前更改了 ollama 的监听端口,在这里也要修改成相同的
localPort = 11434
# 远程端口,可以自定义,我用的还是 11434
# 后续 ollama 客户端上的环境变量中的端口须于此相同
remotePort = 11434保存并退出,即可运行 frp 客户端了:
# macOS & Linux
./frpc -c ./frpc.toml# Windows PowerShell
.\frpc.exe -c .\frpc.toml也可将其写作快捷脚本乃至守护进程/系统服务。
此时,ollama 的 0.0.0.0:11434 将被转发至 <VPS 的 IP 地址>:<远程端口>。我们可以进行下一步了,也就是最后在便携平台上连接我们配置的 ollama 服务。
Step 3 - ollama 客户端:
1. 更改希望作为 ollama 客户端的电脑的环境变量:
# macOS & Linux
# 将 VPS IP 和 remotePort 分别替换为 VPS 的 IPv4 地址和之前设置的远程端口
export OLLAMA_HOST="http://<VPS IP>:<remotePort>"# Windows PowerShell
# 将 VPS IP 和 remotePort 分别替换为 VPS 的 IPv4 地址和之前设置的远程端口
[Environment]::SetEnvironmentVariable("OLLAMA_HOST", "http://<VPS IP>:<remotePort>", "User")2. 运行 LLM 吧!
这时就可以使用 ollama 命令来远程运行自己搭建的 LLM 服务了:
ollama run <模型的具体名称>也可以在 opencode 之类的 agent 中启动它:
ollama launch opencode