资讯动态

openrig实战:统一管理Ollama、vLLM与llama.cpp多引擎推理服务

发布时间:2026/10/8 16:31:03 来源:尧图企业网站定制
1. 从装了十套推理引擎到全家桶大一统openrig到底解决什么问题如果你跟我一样过去一年里把Ollama、llama.cpp、vLLM、LocalAI、Jan、GPT4All这些推理引擎挨个装了个遍手里还有两三台机器在跑不同的大模型那你大概率也遇到过下面这种让人头疼的场景这台机器上跑着Ollama的Qwen那台机器上挂着vLLM的Llama还有一台老Mac上用llama.cpp跑着GGUF量化版模型。想统一管理没有。想看一眼每台机器的显存占用和推理负载得SSH上去一个个敲nvidia-smi。想从手机或平板上调用某个模型更麻烦得自己写转发脚本要么用frp反代要么手工改端口映射。我大概折腾了两周之后彻底烦了。就在这个时候openrig这个名字进入了我的视野。简单说openrig做的是这样一件事把散落在不同机器、不同引擎、不同端口上的本地大模型服务全部收敛到一个统一的管理入口里。它本身不是一个推理引擎而是一个调度中枢 统一面板。你不需要关掉手头的Ollama也不用把vLLM的部署连根拔起openrig充当的是坐在所有引擎之上那把交椅的角色——你只需要在openrig的界面里点上几个按钮它就会帮你代理、转发、监控、记录所有后端引擎的请求。这一下就戳中了我的刚需我不用再到处翻配置文件了不用再对着四个不同格式的API文档查请求体怎么写了。我为数不多能感知到的变化就是以后跟模型交互只需要面对一个统一地址至于是Ollama在处理还是vLLM在处理openrig帮我兜着。如果你也在本地或小规模私有环境里部署了多个大模型服务又觉得每一个模型单独配一个入口这件事太原始这篇文章就是为你准备的。我会按自己的理解把openrig的结构、部署、配置、调优全部拆开讲一遍包括我实测过程中的踩坑记录和一些常规文档里不会写的细节。2. 初识openrig核心架构与设计逻辑在动手部署之前我建议你先花五分钟搞清楚openrig的定位。因为它和市面上很多一体包办的AI部署工具不同它是一个纯粹的管理面不是数据面。2.1 什么是管理面和数据面的区别用个直白的类比如果你把本地大模型部署比作开餐厅那推理引擎就是后厨的灶台模型权重是食材API请求是顾客订单。市面上很多工具做的是给你一个预制菜中央厨房连灶台带食材一起帮你装好。而openrig的思路不一样它不碰你的灶台它只做前厅叫号系统 营业数据看板 多门店调度台。也就是说openrig默认你已经有能力把某个引擎跑起来或者你愿意跟着它的文档去装它关心的是怎么让A桌的订单公平地分到空闲的厨师手上、怎么让门口等位的顾客看到实时进度、怎么把今天各档口的产出统计成一张能看懂的报表。这个设计逻辑带来的好处很明显openrig对底层引擎的侵入性极低。它不会要你放弃某个已经调好参数的Ollama实例也不会强制你统一用某种格式的模型权重。它要做的只是接住你已经存在的服务。2.2 openrig内部核心模块一览我把自己实际接触到的openrig组件按功能分成了四块理解这四块之后后面的部署和配置就顺理成章了管理面板这是你日常面对最多的界面负责展示所有已接入引擎的状态、模型列表、请求日志和负载曲线。这个面板本质是一个Web服务跑在某个固定的端口上支持浏览器直接访问。引擎适配层这是openrig的灵魂。每个推理引擎Ollama、vLLM、llama.cpp等的API格式、健康检查路径、并发模型都不一样适配层负责把不同的后端协议统一转成openrig内部的标准化请求格式。你在面板上加一个后端引擎本质上就是告诉适配层这里有一台机器在跑Ollama请按Ollama的语法跟它对话。调度与代理层当统一入口收到你的请求后调度层决定这个请求该丢给哪个后端。可以简单做轮询也可以按预先设定的路由规则来分发。这块做得好的话多台推理机之间可以实现简单的负载均衡一台满载了就把请求导到另一台。观测与日志模块记录每次请求的时间、来源、命中哪台后端、生成了多少token、消耗了多长时间。我平时调优模型和排查故障最依赖的就是这部分数据。2.3 为什么我不建议直接跳过装环境一步openrig官方文档在各种发行版上都有安装说明但它的Docker方式最省心。我不是说裸机装不行而是openrig依赖的基础组件不少——Node/Python运行时、数据库存储、消息队列、监控代理——用Docker Compose一键拉起整个栈至少能省掉我半天跟环境变量搏斗的时间。后面我除了讲Docker方式也会把裸机部署的主要步骤带一遍方便你在没有容器环境的机器上临时跑起来。3. 动手部署两种方式完整走一遍我实际部署openrig用了一台Linux服务器Ubuntu 22.04不带NVIDIA GPU纯CPU推理那台和一台带RTX 4090的Windows工作站。先说结论生产环境建议Linux Docker Compose开发调试建议任何能跑Python 3.10以上的机器直接裸机装。3.1 Docker Compose方式的完整配置第一步找个干净的目录创建docker-compose.yml。以下是我实际用过的配置做了些脱敏处理但整体结构完整version: 3.8 services: openrig-server: image: openrig/server:latest container_name: openrig-server restart: unless-stopped ports: - 8080:8080 - 8443:8443 volumes: - ./data:/app/data - ./config:/app/config - /var/run/docker.sock:/var/run/docker.sock:ro environment: - OR_DEBUGfalse - OR_DB_PATH/app/data/openrig.db - OR_TOKENyour-admin-token-please-change-me depends_on: - openrig-redis openrig-redis: image: redis:7-alpine container_name: openrig-redis restart: unless-stopped volumes: - redis-data:/data openrig-worker: image: openrig/worker:latest container_name: openrig-worker restart: unless-stopped environment: - OR_REDIS_ADDRopenrig-redis:6379 volumes: - ./config:/app/config depends_on: - openrig-server - openrig-redis volumes: redis-data:这里有几个细节值得展开说一下为什么需要挂载Docker Socket因为openrig-server在首次启动时可以自动发现本机上正在运行的容器——比如你已经用Docker跑了一个Ollama容器openrig会尝试通过Docker API去探测这个容器的端口映射和健康状态然后直接帮你把它接入进来。这是一种零配置发现不是必须的但很方便。担心安全性的话可以去掉这个挂载改为手动添加后端。Redis在里面扮演什么角色默认情况下openrig会依赖Redis做请求队列。你可能会想我这只有一台服务器、几十个请求并发用得着消息队列吗说实话大部分场景下用不着。但是openrig的架构从一开始就是为多节点并行做准备的worker和server之间通过Redis做任务分发后面要扩展成多机负载均衡时就不用在架构上推倒重来了。你只有单机的话把Redis理解成一个轻量级消息中转站就好它不会拖慢速度反而让任务状态的变化可以实时推送到面板上。启动命令就一条docker compose up -d启动后访问http://服务器IP:8080第一次进入会让你重置管理员密码这个token就是你刚才在环境变量里设的OR_TOKEN。我强烈建议你把这个值改成一个足够长的随机字符串因为它相当于openrig所有后端引擎的通行令牌。3.2 单机模式不装Docker的裸机部署如果你的机器上没有Docker或者你只是想在自己的开发机上快速看看openrig长什么样可以直接用Python虚拟环境跑。openrig的代码对Python 3.10到3.12都兼容得不错我是用pyenv建了一个3.11的虚拟环境来跑的git clone https://github.com/openrig/openrig.git cd openrig python -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # 修改 .env 里的 OR_TOKEN 和其他配置 python run_server.py第一次启动后要注意看两个日志字段。一个是Worker registration status如果显示registered说明worker和server之间的连接是通畅的如果一直pending多半是Redis没起来检查一下本机的redis-server进程。另一个是Backend connectivity这一项默认是空的因为你还没添加任何后端引擎需要你自己手动接入。Docker用户基本不太会遇到这两个问题因为Compose一次性把依赖全部带起来了裸机用户更需要花时间检查依赖项。3.3 接入第一个后端引擎以Ollama为例这是整个部署流程里最有成就感的一步。你需要在openrig的面板左侧菜单里找到Backend或引擎管理入口然后选择新增。我以Ollama为例填表时的几个关键字段引擎类型选择 Ollama名称比如本机Force或4090主机Base URLOllama服务地址例如http://127.0.0.1:11434或http://192.168.1.100:11434是否启用心跳检测默认开启openrig会每10秒访问一次Ollama的健康检查端点保存之后openrig会自动拉取这个Ollama实例上的模型列表并显示在Models标签页里。到了这一步你就能在openrig的chat界面直接选模型、发消息了底层调用的就是Ollama的API。这个过程让我很直观地理解了openrig的适配层是怎么回事——它不自带模型而是把已有模型挂到自己的目录下来统一入口的体验瞬间就有了。4. 深入实测openrig把多模型统一入口变成现实的底层原理如果只看表面openrig的界面跟市面上的ChatUI差别不大左边模型列表、中间聊天窗口、右边参数面板。但真正深入用了几天之后我才理解它为什么值得单独写一篇交流贴。4.1 路由分发同一模型多实例的负载分担我有两台推理机器一台是4090另一台是3060都装了Qwen2.5-72B的量化版。按照惯常做法两个Ollama实例各自独立提供服务前端要连哪个就写死哪个地址。openrig的调度逻辑改变了这个局面。在openrig里我可以把两个Ollama后端都添加进去然后同一个模型名称会出现在两条后端记录里。接下来要做的就是设置路由策略。我实际用的是优先级路由模式默认请求全部走4090只有当4090的剩余显存低于阈值或者排队长度超过预设值时才把新请求分流到3060。这在openrig的配置项里叫weighted权重设成9:14090吃九成流量。请求进来之后openrig会把Prompt原样转发给选中的Ollama实例并把返回的token流通过流式响应的方式推回给调用方。从客户端角度来看它感知不到两台后端的存在只知道自己跟一个固定的地址在对话。4.2 协议转换为什么vLLM和Ollama都能接进来举个例子Ollama的chat接口长这样curl http://localhost:11434/api/chat -d { model: qwen2.5, messages: [{role: user, content: 你好}] }而vLLM走的是OpenAI兼容格式curl http://localhost:8000/v1/chat/completions -H Content-Type: application/json -d { model: meta-llama/Llama-3.1-8B-Instruct, messages: [{role: user, content: 你好}] }这两种格式的差异不小路径不同、鉴权方式不同、返回的流式格式也不同。而openrig的适配层一旦选定引擎类型就会在内部把请求转换成对应引擎的格式再转成统一的内部结构回传给前端。我试过在面板上同时挂一个Ollama后端、一个vLLM后端、一个llama.cpp的llama-server后端三者的响应格式各不相同但openrig前端都能正常展示。这说明适配层的隔离做得比较干净是个很扎实的设计。4.3 观测面板和请求日志的实际价值openrig的日志记录粒度是每次请求一条完整的链路记录包括时间戳、来源IP、模型名、命中哪个后端、prompt和completion的token数、响应总时长。我喜欢定期导出这些日志做统计一是看哪些模型调用频率最高、哪条后端链路延迟最大二是排查问题的时候特别有用。举个例子我有一阵发现4090的利用率经常冲到100%但3060那边几乎闲置。查了一番发现不是路由权重的问题而是3060的模型加载方式是run-on-demand首次请求冷启动要等模型权重加载到显存体验很差所以我在openrig的健康检查配置里给3060设置了min_health_interval30s当冷启动期间健康检查不通过时openrig自动把请求全部导到4090。这个逻辑在文档里写得不明显是我从日志数据里推断出来的。5. 部署时最容易踩的坑我把所有报错都替你试了一遍任何开源项目文档写得再好实际用起来总会遇到一些文档没覆盖的角落。openrig给我最大的感受是安装即成功但接入各种后端时会有各种小脾气。下面这几条是我真金白银换来的教训。5.1 坑位一Docker容器IP访问宿主机上的服务不通这个问题出现的场景是这样的你的openrig用Docker方式跑在Linux服务器上而你要接入的Ollama/vLLM不是用Docker跑的是直接装在宿主机上的。你在openrig面板里填后端地址时填了http://127.0.0.1:11434结果发现一直连不通。原因不复杂Docker容器里的127.0.0.1指向的是容器自己不是宿主机。正确填法是用Docker内部网关地址通常为http://172.17.0.1:11434或者如果你用的是host网络模式那就直接用127.0.0.1。检查方法很简单docker exec openrig-server curl http://172.17.0.1:11434/api/version如果这条命令能返回版本信息说明网段是对的。还有一种更简单的方案把宿主机上所有推理引擎也全部用Docker部署并加入openrig-server所在的同一个自定义网络容器之间直接用服务名互相访问。我在自己的一台测试机上就把Ollama和vLLM都容器化然后加入openrig_default网络终端里配置地址直接填http://ollama:11434稳得一批。5.2 坑位二健康检查频率过高导致推理引擎假死openrig默认每隔5到10秒就向所有后端访问一轮健康检查接口这个频率在大多数场景下没毛病。但如果你接的是llama.cpp的llama-server要特别小心llama-server在处理健康检查请求时如果当前正在生成一个很长的流式响应有些版本会直接拒绝新请求甚至会出现健康检查失败的误报然后openrig就会把该后端标记为不可用。我一开始被这个问题坑得很惨一个大模型还在输出长文时openrig那边已经好几个周期没收到健康检查的200响应直接把后端踢出路由池了。解决方式有三个方向调长健康检查间隔openrig的后端配置里有个health_interval_secs参数默认是10我调成了30检查你的llama-server版本是否过旧很多网络并发问题在新版里已修复给对应后端设置一个较高的unhealthy_threshold允许连续三次失败后才判定不可用。实测下来调成30秒之后误报率基本降为零对故障发现的影响也几乎可以忽略。5.3 坑位三多后端同模型时openrig把鉴权令牌传串了如果你跟我一样给不同后端设置了不同的API Key——比如vLLM用sk-vllm-xxxxOllama虽然默认不鉴权但要设一个OR_OLLAMA_AUTH_TOKEN——那么在openrig里配置后端时有一个容易忽略的细节openrig在转发请求时会带上它统一配置的OR_TOKEN除非你在后端的高级设置里显式关闭转发。我一开始没意识到结果所有下游后端都收到了一个来自openrig的Authorization头把各后端自己的鉴权逻辑都打乱了。排查到这一步的时候我在vLLM日志里看到了一堆401以为是Key配错了搞了半天才发现是openrig统一转发惹的祸。解决方法是如果各后端有独立的鉴权体系就在后端高级配置里把pass_through_auth关掉如果你希望全链路统一用openrig的令牌那就在接入vLLM时把vLLM的API Key也设置成openrig的OR_TOKEN让它俩保持一致。没有绝对正确只有口径统一。5.4 坑位四非流式请求超时如果你常用openrig的API去接一些自动化脚本或Agent框架而对方的HTTP客户端没有启用流式模式就要注意了。openrig默认的读超时是120秒大模型生成一段长文本往往会超过这个时间一旦超时客户端就会断开连接但后端引擎其实还在继续生成导致计算结果白白丢失。这个问题的修复并不难openrig的配置里有一个request_timeout_secs我直接改成300。如果你跑的是复杂Agent任务建议把超时调到600秒。另外客户端方面尽量启用streamtrue这样首token只要几秒就会返回不会触发读超时。5.5 坑位五Docker更新镜像版本后配置消失openrig迭代速度不算慢我中途升级过一次镜像用的是latest标签结果容器重建之后发现配置回到了默认状态所有后端记录都丢了。这个问题的根因很简单容器内的默认数据目录和配置目录没有映射到宿主机卷上。我在上面的Compose文件里已经写了./data:/app/data和./config:/app/config如果你是自己docker run的一定要加上这两个-v映射。升级前先备份这两个目录恢复时也方便。从这之后我养成了一个习惯每次升级前执行一次配置导出openrig面板里有导出按钮作为最保险的兜底方案。6. 进阶玩法用openrig同时管理私有化集群里的多种引擎单机玩顺了之后我开始琢磨怎么把openrig用到真正的多节点场景里。这个过程最有价值的收获是我发现openrig的设计其实从一开始就为这种跨机器形态做好了铺垫。6.1 多机接入的关键网络打通openrig的server和worker可以部署在不同网络分层里。我在公司内网搭过一个测试环境两台推理服务器在子网A192.168.10.xopenrig的server跑在子网B192.168.20.x两者之间没有公网IP只有内网路由。这种场景下openrig的worker机制就很关键了。我不用穿透server的端口到推理机反而是在推理机上各跑一个openrig workerworker会主动向server建立长连接上报自己的状态。推理机对外只需要开放8080这一条到web面板的通道引擎的实际端口可以被防火墙完全挡住。这种反向连接注册的设计让我很感慨很多单机向多机演进的项目最难的不是功能实现而是网络拓扑的调整。openrig通过让worker主动跟server通信绕开了繁琐的NAT映射和防火墙规则部署体验确实不错。6.2 统一入口涉及API的使用方式接入全部后端之后我在统一入口上最常用的API是/api/models它会返回当前所有引擎上所有可用模型的列表每个模型会带上它来自哪个后端的信息。我做了一个简单的调度组件根据请求的具体能力需求自动选择合适的模型组import requests openrig_base http://your-openrig-host:8080 headers { Authorization: fBearer {OPENRIG_TOKEN} } def list_all_models(): resp requests.get(f{openrig_base}/api/models, headersheaders) resp.raise_for_status() return resp.json() def chat(model_name, messages, engine_filterNone): payload { model: model_name, messages: messages, # engine_filter 可选指定走哪个后端默认由openrig路由 } if engine_filter: payload[engine] engine_filter resp requests.post(f{openrig_base}/api/chat, jsonpayload, headersheaders, streamTrue) for chunk in resp.iter_lines(): if chunk: yield chunk.decode(utf-8)这段代码的实际价值在于你不再需要针对不同引擎写各自的客户端。这个统一接口帮我把多个Agent脚本从每个脚本配一个base_url里解放出来了。6.3 与监控面板联动的小尝试openrig的观测模块会输出标准的指标格式包括token throughput、queue depth、backend response time、healthy status。这些指标可以交给Prometheus去采集我手头的服务器本来就在跑Grafana接上之后能看到一组比较直观的看板总请求量、总token吞吐、平均首token延迟每个后端引擎的负载占比和健康状态变化按请求模型维度的token消耗趋势这套东西单机部署时感受不深一旦后端数量超过四个有了看板和没有看板的差异就非常明显了。以前需要挨个ssh进去查的数据现在一张图上全都清楚。7. 使用openrig半年的心得总结与硬核建议最后这部分我不想写什么展望未来之类的虚话只分享几个我这半年用下来觉得最重要的经验。第一把openrig当成控制面来用而不是数据面。不要指望它帮你解决所有引擎层面的问题它擅长的是调度、接入、观测、纠错。底层引擎的模型量化方式、显存管理、推理参数调优还是要回到各引擎自己的生态里去解决。这个边界搞清楚之后你对openrig的期望值会比较合理使用起来的甄别和排查效率也会高很多。第二版本升级要克制。openrig这个项目功能演进很活跃但每次升级前最好先看一眼ChangeLog里有没有涉及数据库结构变更或后端协议调整的内容。我因为没看就直接升遇到过一次模型列表全空的情况最后发现是后端健康检查标记出了问题。现在我的策略是功能只要稳定就不升级需要新功能才升升之前先用容器快照做备份。第三多后端接入时后端命名规范不是小事。我在openrig里接入超过5个后端之后就给自己定了一个清晰的命名规则[硬件位置]-[外层引擎类型]-[用途]例如4090-ollama-chat、3060-vllm-agents。这样在路由规则配置和日志排查时一眼就能看懂。没有命名规范的时候模型列表一长你会发现连刚才那个请求到底走了哪台机器都很难说清楚。第四从项目第一天就把请求日志持久化打开。openrig支持日志写到本地文件或导出我这几个月累计下来的日志数据在调试后端响应不一致、对比不同引擎的生成质量时给了我很多帮助。日志就是真相不要等到出了问题才想起来没开。如果你现在手头正同时管理着两三台推理服务器又受够了在多个管理页面之间切来切去openrig值得花一个晚上试试。先跑通一个Ollama后端体验一下统一入口的感觉再逐步把vLLM和llama.cpp的服务接进来很快你就会感受到有一把统一中转的控制台和手动裸连各个引擎之间的差距了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑