你可能也遇到过我这种情况:手上有两块显卡,但一块在工作室渲染、一块在客厅的机器上闲置,每次想跑个AI绘图都得来回折腾;或者团队几个人共用一台渲染服务器,根本谈不上排队和权限管理,谁抢到就是谁的。OpenRIG就是这样一剂解药,它把零散的GPU资源编排成一个可以统一调度的渲染池,你只要打开浏览器,就能把任务丢给任意一台接入的机器,然后坐等结果。这类开源项目很适合想自建AI绘画渲染平台的小团队、有闲置显卡想“多卡并发”的个人玩家,以及不想被在线绘图平台按月收费的内容创作者。这篇文章我就完整记录我从规划、部署到上线使用的全过程,包括踩过的坑和排查方法,你可以直接照着抄。
1. OpenRIG到底解决了什么:渲染农场的真实痛点与核心设计
1.1 自建渲染资源池为什么这么难
在没有这类调度工具之前,我的工作流是相当原始的:A机器装了ComfyUI,我就得远程桌面到A机器,上传图片、改节点、点执行;B机器装的是Stable Diffusion WebUI,又得换一套操作方式。更麻烦的是,如果A机器正在跑一个长耗时的工作流,队列里的下一个任务只能干等,因为ComfyUI本身是单机单队列的逻辑,它不知道“哦,旁边还有一台空机器可以用”。
表面看这是“资源不够”的问题,但实际上就算资源充足,也只是显卡利用率低:一个任务占满了显存,其他任务过不去;任务类型五花八门,有的吃显存、有的吃CPU、有的主要是I/O,单一机器无法弹性分配。再加上团队协作时的账号管理、任务优先级、历史记录追溯,每一个点都是一个坑。OpenRIG这种开源调度项目,本质上就是把“渲染任务”与“物理显卡”解耦,让用户不再关心任务到底跑在哪张卡上,只关心结果什么时候出来。
1.2 OpenRIG的核心设计:调度与执行分离
OpenRIG的架构思路可以这样理解:整个系统分成“大脑”和“手脚”两个层面。
- 主控端(大脑):负责接收任务、维护任务队列、跟踪每个节点的状态、下发工作流、回收结果。它不需要高性能显卡,一台普通的小主机甚至NAS都能胜任。
- 执行节点(手脚):每台装了GPU和ComfyUI等推理后端的机器都是一个执行节点。节点启动后主动向主控注册,然后等待任务分配。当接到任务时,它会调用本地的ComfyUI API去执行,再把生成结果和日志回传。
这样的好处非常明显:执行节点不需要暴露复杂的端口给其他成员,工作流文件也不需要在每个人手里传来传去,所有操作都收敛到Web面板上。你甚至可以给某个节点设置“只在晚上参与调度”,白天它自己正常工作,晚上自动被拉进渲染池,把闲置算力利用起来。
我常用一个类比来解释这套设计:主控像外卖平台,执行节点像餐厅。你在App上下单,平台根据每家餐厅的出餐速度、排队情况分单,餐厅只负责做菜。平台不用关心餐厅后厨是怎么炒菜的,餐厅也不需要知道客户是谁——这就把“调度”和“执行”彻底切开了。
1.3 为什么选Web面板而不是传统命令行
有人可能会问:我直接用SSH到GPU机器上手动提交任务不行吗?当然行,但那只适合一个人玩一台机器。只要涉及多台机器、多个人,命令行方案的短板就会暴露:
- 权限太难控制。要么所有同事拿到同一把SSH密钥,要么每加一个人就要配一次key,安全性很难兼顾。
- 历史不可追溯。谁在什么时候提交过什么参数、生成了哪张图,命令行里没有友好记录。
- 操作门槛高。团队里做设计、做内容的人不一定熟悉终端,Web面板才是大家都能用的入口。
OpenRIG把调度逻辑封装成服务,把任务提交做成按钮和表单,团队成员只需要会拖动工作流文件就能用。对管理员来说,面板上的节点列表、队列状态、日志查询比挨个登录服务器高效得多。
2. 部署OpenRIG之前的规划:硬件、节点与网络方案
2.1 主控节点和执行节点的硬件分工
不要一上来就想着“我直接装在最强的显卡机器上做主控”,这是很多人第一步就会犯的错。OpenRIG的设计目的是让调度逻辑与显卡解耦,所以主控和执行完全可以是两台独立机器,甚至主控可以跑在云服务器上。我自己的推荐配置如下:
| 角色 | 最低配置 | 推荐配置 | 说明 |
|---|---|---|---|
| 主控节点 | 1核2G内存,20G磁盘 | 2核4G,SSD | 运行调度服务、Web面板、任务队列,不吃显卡也不吃CPU,但磁盘最好用SSD,因为要频繁读写工作流和日志 |
| 执行节点 | NVIDIA显卡,显存8G | 显存12G以上,PCIe 3.0 x16 | 显卡必须支持CUDA;显存大小直接决定能跑多大分辨率、多少批量大小 |
| 存储 | 普通机械盘 | NVMe SSD | 模型加载和出图落盘都吃I/O,机械盘会拖慢整个任务链路 |
这里要提醒一个容易忽略的点:执行节点的CPU和内存也不能太寒酸。ComfyUI加载模型时会把权重从磁盘读进显存,这个过程中如果内存不足,会非常容易触发swap风暴,表现为节点显示在线,但任务一直卡在“加载模型”阶段。
2.2 网络规划与端口
OpenRIG的部署并不复杂,但端口规划一定要提前想清楚,不然后面总有莫名其妙的连接失败。我用到的典型端口如下:
| 服务 | 默认端口 | 用途 |
|---|---|---|
| OpenRIG Web面板 | 3000 | 浏览器的管理界面 |
| 主控调度接口 | 8080 | 执行节点注册、心跳、任务下发 |
| ComfyUI API | 8188 | 执行节点本地推理服务,一般只对主控或本机开放 |
执行节点要访问主控的8080端口,所以主控所在机器的防火墙需要把8080对“执行节点网段”放行;Web面板的3000端口则按你的需要,对团队内部网段放行。ComfyUI的8188端口建议不要直接暴露到公网,因为ComfyUI的API不加防护,陌生人拿到访问权限就可以用你的显卡跑他自己的任务。
2.3 模型与工作流的目录规划
多节点部署最让人头疼的问题不是调度,而是“每个节点的模型目录不一致”。OpenRIG的职责是调度任务,它不会自动帮你把模型从A机器复制到B机器——至少我在使用中没指望它做这件事。所以每台执行节点上的模型路径必须约定好,比如大家都把模型放在/models/stable-diffusion和/models/loras下,并把主模型命名为可辨认的版本号。
如果你实在不想每台机器都放一份模型,也可以用共享存储挂载到执行节点的固定路径。不过这样做要小心并发问题:多台机器同时读取同一个大模型文件,会让网络存储的I/O压力剧增,严重时加载时间反而比本地盘更慢。我的经验是,如果执行节点少于五台,老老实实本地各放一份最省心,模型版本用目录名或软链统一管理。
3. 实操记录:搭建一套可用的OpenRIG并接入ComfyUI工作流
3.1 主控初始化:用容器跑起调度服务
这部分的实际操作记录来自我自己搭建时的环境。OpenRIG本身依赖一些服务组件,用Docker Compose来管理是最省事的方式。先创建一个工作目录,比如/opt/openrig,在里面放一份docker-compose.yml,内容类似这样:
services: openrig-master: image: openrig/master:latest container_name: openrig-master ports: - "3000:3000" - "8080:8080" volumes: - ./data:/data - ./workflows:/workflows environment: - OPENRIG_DATA_DIR=/data - OPENRIG_WORKFLOW_DIR=/workflows restart: unless-stopped然后执行:
docker compose up -d启动之后,等一两分钟,浏览器访问http://主控IP:3000,就能看到初始化页面。首次登录会让创建一个管理员账号,这里建议把账号密码放到密码管理器里,因为后面生成节点令牌、修改队列优先级都要用到管理员身份。
我习惯在初始化后立刻检查两件事:一是/data目录下是否生成了日志文件和数据库文件,二是8080端口是否正常监听。如果日志乱成一团,通常是端口被占用了,用docker compose logs -f去看实时输出会直观很多。
3.2 执行节点注册:令牌、ComfyUI与工作目录
执行节点的准备工作分三步:
- 确保ComfyUI能跑起来,并且
http://127.0.0.1:8188可以访问。 - 在主控面板的“节点管理”页生成一个登记令牌(Token)。
- 在每台执行节点上配置环境变量,把节点的地址、令牌和主控地址写清楚。
以Linux执行节点为例,可以这样设置:
export OPENRIG_MASTER_ADDR="http://192.168.1.10:8080" export OPENRIG_TOKEN="这里填你生成的节点令牌" export OPENRIG_COMFYUI_ADDR="http://127.0.0.1:8188"然后启动执行节点的容器或服务。等它在主控面板的“节点列表”里出现,并且状态变成online,注册就完成了。我遇到最多的问题就是忘记配置OPENRIG_COMFYUI_ADDR,导致节点虽然上线了,却一直报“无法连接后端推理服务”——节点在线和推理可用是两回事,这一点很容易让人误判。
关于为什么必须有令牌:如果没有令牌机制,任何设备只要知道主控地址就能加入你的渲染池,轻则蹭算力,重则提交恶意任务拖垮节点。所以主控那边一定要记得把令牌当成机密,不要随手贴在群里。
3.3 验证调度:提交第一个文生图任务
节点全部上线后,先在面板上传一个最简单的文生图工作流JSON,把模型、采样器参数都设好,然后提交。你可以在Web面板上看到队列状态的变化:从pending变成running,最后变成success,同时执行节点上ComfyUI的日志会同步打印出每一步的执行时间。
如果面板上跑通了,再试一下命令行提交,便于后面做批量调用。一个通用思路是调用 OpenRIG 的提交接口,把工作流JSON作为请求体发过去:
curl -X POST "http://主控IP:3000/api/tasks" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的访问令牌" \ -d @workflow.json当然具体接口路径以你自己的版本为准,可以在面板的请求日志里抓到。这一步的意义在于:后续批量出图、自动化出图脚本,都能走同一个入口,而不是每次手动打开浏览器点鼠标。
3.4 批量出图与多节点并行:把资源池跑满
OpenRIG的调度器会把队列里的任务尽可能分发给空闲节点,所以你不需要手动指定“这张图去哪台机器跑”。批量出图时,只要把多个任务依次提交,系统就会自动负载均衡。
这里分享一个我后来常用的批量策略:把同一个底模、同一个LoRA、不同种子或提示词的几百个任务一次提交,队列会瞬间堆满。然后观察任务分配:如果两节点的显卡规格不同,快的节点会先被分配更多任务,慢的节点处理的都是简单小图,整体效率比手动分开跑高很多。
要注意的是,批量任务对模型的加载逻辑是有压力的。每个新任务如果改了模型或LoRA,执行节点就要重新加载一次,可能带来额外延迟。所以我建议把任务按“模型相同、参数不同”分批提交,减少节点反复加载权重的次数,吞吐量会明显提升。
4. 多机协作与远程使用的权限设计实践
4.1 局域网内使用:最简单也最稳的方式
如果你的执行节点都在同一个局域网,比如工作室里几台机器接同一个交换机,那么OpenRIG主控跑在其中一台机器上,其他人直接用浏览器访问http://主控IP:3000就行。
局域网方案里最值得注意的不是配置,而是网络稳定性。不要用WiFi来承载批量任务调度,尤其不要用2.4GHz频段的WiFi。我之前试过用无线网络连接一个执行节点,任务跑大图时频繁出现“节点心跳超时”,调度器误判节点离线,把任务发给别处执行,导致同一张图生成了两份。后来换成网线直连问题马上消失。GPU机器做渲染节点,切记优先有线连接。
4.2 跨地域使用时怎么保证安全与稳定
如果你的执行节点分布在两个不同的城市,比如家里有一台机器、公司在另一座城市有一台机器,那就要考虑跨网调度。OpenRIG本身对网络环境的适配是相对宽容的,只要执行节点能访问到主控的8080端口,注册就可以建立。
但我不建议直接把8080端口暴露到公网上,更不建议不做任何鉴权就在云服务器上乱开端口。最稳妥的做法是让主控细节内网化,只通过HTTPS的反向代理来暴露Web面板,同时对执行节点的长连接做周期性心跳检查。如果你有云服务器,也可以把主控部署在云上,执行节点通过标准HTTPS协议与主控建立连接。
整个过程中有一点必须强调:任何远程调度方案都应当在你自己可控、合法合规的网络环境下使用。不要试图绕开网络边界去接一些不明来源的机器,也不要把调度端口随意暴露后不做访问控制。安全这关一旦失守,别人就可以借你的显卡跑非法内容,最后责任还是你自己背。
4.3 团队账号与操作审计
当团队成员多起来之后,账号管理和操作审计就会变成刚需。OpenRIG的权限模型里,我建议至少区分两类角色:管理员和普通成员。
- 管理员:能管理节点、生成令牌、查看所有日志、删除任务。
- 普通成员:只能提交任务、查看自己的任务历史和生成结果。
这套权限设计不只是为了防乱操作,更重要的是出了问题能追踪。比如某天一张参数离谱的图被提交,导致某个节点显存直接溢出,如果你能看到提交者是谁、提交时间是什么,排查起来会快得多。我在团队里还立了一条规矩:任何人的实验性工作流必须先在自己本机或指定测试节点上跑通,再进生产队列,避免你把半成品任务丢给一个正在跑甲方需求的节点。
5. OpenRIG高频问题排查与避坑实录
5.1 节点显示在线却一直不接任务
这个现象很迷惑:节点明明在面板上状态是online,但提交任务后任务一直停在pending,节点根本不消费。我排查下来的原因通常是:执行节点的ComfyUI地址配置不对,节点能跟主控握手,但握手后做健康检查时发现后端的ComfyUI不可达。
解决思路很简单:
- 先在执行节点本机执行
curl http://127.0.0.1:8188/system_stats,确认ComfyUI能通。 - 再检查执行节点服务里的
OPENRIG_COMFYUI_ADDR是不是写成了localhost而服务运行在容器里,容器里的localhost指向容器自身,不等于宿主机IP。改成http://宿主机IP:8188通常就好了。
5.2 显存溢出,但单机跑的时候明明可以
批量调度场景下的显存溢出,多半不是“显存不够”,而是“多任务并发时显存没有及时释放”。OpenRIG调度任务到节点后,执行节点连续处理多个请求,如果工作流里没有正确释放显存缓存,或者多个进程同时抢占显存,就会爆掉。
我的排查顺序是这样:
- 在ComfyUI日志里看是哪个节点在加载时失败。
- 检查该任务和上一个任务的模型是否完全不同,如果模型频繁切换,就给节点设置“任务间隔时间”,让显存有时间清理。
- 如果节点上同时起了多个ComfyUI实例,一定要给每个实例加
--reserve-memory或限制CUDA_VISIBLE_DEVICES,别让两个实例抢同一张卡。
5.3 队列堆积,任务排队却没有任何节点消费
这种问题要分几个方向查:第一,看所有节点的CPU/GPU利用率,如果都是0%,说明调度器没有分发任务,问题在主控侧或者节点注册状态;如果某个节点利用率是100%而队列还在堆积,说明该节点正在处理一个大任务,调度器在等待它的completion消息。
如果确认为主控侧的问题,我一般先做一次重启恢复操作:把主控服务和执行节点服务全部重启一遍,让它们重新握手。重启前记得看一眼任务队列是否有持久化,OpenRIG这类调度工具通常会把队列写到磁盘,重启之后任务不会丢,最多重新分发一次。如果任务确实丢了——别问我怎么知道的——赶紧写个定时脚本备份数据库和workflow目录,这比事后从JSON重建任务轻松多了。
5.4 同一份工作流在一台节点成功、在另一台节点报错
这种情况十有八九是模型路径不一致。工作流JSON里如果直接写死了一个绝对路径,比如/home/user/models/xxx.safetensors,而另一台机器的模型在/models/xxx.safetensors,那必然会失败。规避方案是全部改用相对路径,并且约定好统一的models目录基础路径。
另一个容易忽略的点是ComfyUI自定义节点的版本差异。两台机器上的“ComfyUI-ControlNet插件”版本不一样,接口参数有细微差别,也会导致同样的工作流一台能跑一台报错。我后来会用一个“镜像工具”定期同步执行节点的插件目录,并对版本做锁定,才彻底告别了这个坑。
5.5 一些容易被忽略的小细节
最后分享几个我吃了不少亏才记住的小细节:
- 执行节点的时钟要跟主控时钟保持同步,NTP服务最好开着。调度任务、心跳超时、日志排序都依赖时间,差几分钟都会造成追查困难。
- 不要在命令行里把节点令牌作为明文参数传给进程,这会被shell历史记录留下来,有泄露风险。建议用环境变量文件,并且设置文件权限为600。
- 批量任务生成结果的文件名建议包含任务ID,否则大量节点同时工作时,文件重名覆盖会非常让人抓狂。
- 如果使用的是Windows节点的ComfyUI,务必确认ComfyUI的路径中没有中文或空格,不然一些依赖库会处理不好。
现在我再回头看这套体系,发现OpenRIG真正带给我的不是某个具体功能,而是把“我有几台机器”这件事变成了一个平台级的资源抽象:任何新机器的加入,都只是多了一个节点;任何新成员的加入,都只是多了一个账号;任何任务的提交,都不需要关心底层执行细节。这套思路其实是可以继续扩展的,比如把调度器接到定时任务系统里,实现每天凌晨自动批量渲染;或者把面板再套一层简单的API网关,给其他业务系统调用。如果你也想把自己的闲置显卡利用起来,建议先按这篇文章把最小闭环跑通,剩下的玩法可以在使用中慢慢摸索。