
如果你在某个开源社区或技术群里搜 OpenRig大概率会得到一堆含混的结果有人拿它指模拟赛车驾驶舱有人拿它指多显卡整机架还有人只是随手给电脑主机起了个名字。我这儿说的 OpenRig是我自己整理的一套多GPU开源工作站方案——用开放式铝型材支架、普通台式机部件和一套清一色开源软件拼出一台能同时扛住渲染、AI训练、视频转码的机器。这台 Rig 在我桌子下面嗡嗡转了半年多八张卡常年 75 度上下中间只因为一次插拔顺序失误掉过一卡整体稳定得让我意外。之所以把整套东西的搭建过程写出来是因为我发现很多人被多卡工作站吓住了总觉得非得上品牌服务器或者去找云厂商租实例。实际上只要把几个关键点想清楚——PCIe通道分配、电源线缆规划、散热风道、驱动版本、远程调度——个人完全能自己装出一台风险可控的多卡设备。下面就把我从零搭建 OpenRig 的完整经历、选型思路和踩坑记录摊开聊。1. 为什么我需要一台 Rig而不是一台服务器1.1 单卡工作站被渲染任务压垮之后我前半年靠一台单卡工作站做建筑动画渲染一张卡跑一帧就要几分钟一个镜头序列常常挂着几十个小时。中间只要软件崩一次、显存溢出一回前面十几个小时的计算量全白费心态崩了好几次。后来开始接轻量AI推理和批量转码单卡更是捉襟见肘GPU 占用率长期 100%排队队列越拖越长。我看了一圈品牌服务器双路至强几百G内存企业级硬盘背板动不动六位数的报价。我只需要算力不需要那么豪华的存储和冗余电源。再一看云GPU实例按小时计价短期用很香长期挂着跑渲染算法成本比想象中高得多。于是自己动手攒一台多GPU设备就成了最自然的选择。OpenRig 说白了就是一台没有机箱的多GPU电脑按任务需求自由加卡坏了哪块换哪块不被品牌绑死。1.2 Rig 的本质是模块化不是廉价服务器很多人问Rig 和服务器到底差在哪我的理解是服务器追求的是可靠性、集中管理和可预测的交付形态所以它用专用主板、专用固件接口、热插拔硬盘笼而 Rig 追求的是模块化的自由度它把整机服务器拆成可以自由拼装的零件主板、CPU、内存、显卡、电源、支架各自独立坏了哪个换哪个。打个比方品牌服务器像精装房——省心但每个细节都是开发商定的想改格局很费劲Rig 像用宜家家具自己组装的房间——便宜、灵活、改起来方便但你需要自己懂一点尺寸兼容和承重知识。后面我选开放式铝型材支架也是这个思路不买成品机箱直接用 4040 铝型材搭框架长度、层高随时可以调整。1.3 一台典型 OpenRig 长什么样我的第二版 OpenRig 配置如下表给想抄作业的人一个参考。核心思路是主板和电源选当前能买到的最稳妥方案显卡按需插满支架和散热自己搭。部件型号/规格数量备注主板X99 二手工作站板或 C621 平台1看重 PCIe 通道数至少 7 条 x16CPUXeon 或线程撕裂者入门款1渲染、模拟多线程依赖内存DDR4/DDR5 128GB4 条渲染缓存和并行任务吃内存系统盘NVMe SSD 1TB1装系统和容器镜像数据盘企业级 SATA/SAS 8TB2素材和渲染输出显卡RTX 4070 Ti SUPER 16GB8显存大、功耗可控电源1600W 钛金电源2双电源同步供电支架4040 铝型材 T型螺母1 套开放式三层结构风扇12038 风扇8机后统一向外排风这套下来峰值功耗大约 2200 瓦到 2500 瓦比一台同样规模的品牌服务器便宜一半以上而且核心部件全是普通市场件坏了随手能换。2. 硬件选型从一张卡到八张卡的平衡点2.1 先数 PCIe 通道再下单主板这是整个 OpenRig 最容易翻车的地方。很多人看到一块板子上有四个 PCIe x16 插槽就以为可以插四张卡实际上决定带宽的不是插槽数量而是 CPU 能提供多少条 PCIe 通道。普通家用平台比如 LGA1700一个 CPU 也就 20 条 PCIe 通道插一张卡正好用满 x16插两张卡就有一张只能跑 x8 或者 x4再往上直接就是共享总线多卡通信性能会很难看。我一开始用消费级平台插三张卡跑分布式推理的时候发现互联带宽严重拖后腿。后来换到工作站平台选了一颗能拆出 64 条 PCIe 通道的处理器才真正做到 8 张卡全部 x16 直连。选板子的时候别只看插槽数去官网查 CPU 的 PCIe Lan 数再数数几个插槽是否由独立通道引出这是多卡机器的第一道命门。如果不确定可以跑lspci -vvv看每张卡的 Link Speed 和 Widthx8 和 x16 的差距在显存交换、分布式梯度同步时非常明显。2.2 CPU、内存和系统盘配角不能省既然核心是 GPUCPU 选个够用的就行不用顶配。但两个点务必留意一是内存容量二是系统盘剩余空间。我们做 3D 渲染和 AI 训练时很多中间数据会先落内存显存不够就溢到内存内存不够系统直接开始换页整机卡成幻灯片。我这边 128GB 内存是起步机器上跑 4 个容器的时候经常吃到 90GB 以上。系统盘建议单独一块 1TB NVMe只放系统、驱动、Docker 镜像不要混着放素材。因为 CUDA 容器镜像动辄几个 GB再加 pip/conda 缓存500GB 很容易就满了。缓存堵死之后最容易出现的怪问题就是容器启动特别慢GPU 利用率忽高忽低看 dmesg 全是一堆 io 超时。2.3 电源功率不是简单相加还得看线缆电源这块我踩过一个大跟头。最早用一只 1200W 电源带 4 张卡按 TDP 算富余得很结果一跑高负载就重启。后来才明白显卡瞬时功耗可以冲到 TDP 的 1.5 倍以上一张 300W 的卡瞬间能拉到 450W如果几颗核心里多个电压转换器同时抽风电源过流保护立刻触发。我现在的计算方式是所有 GPU TDP 总和 CPU TDP 主板/内存/风扇预估 150W再乘以 1.3 的瞬时余量系数。比如 8 张 250W 的卡加一颗 200W CPU算出来大概是 8×250 200 150 2350W乘 1.3 就是 3055W所以两台 1600W 电源是必需的。另外一个容易被忽略的点是 PCIe 供电线一条模组线通常只能稳定供给一张 300W 级别的显卡绝对不要用一条线去分接两张卡。因为 12V 端子电流上限在那摆着分接最容易烧的是端子本身烧完线不一定会立刻断电但驱动会莫名其妙报Xid错误。2.4 开放式铝型材支架便宜、好散热、好改线成品服务器机箱对显卡的兼容性和风道限制很大。一张显卡长度 300mm 很正常很多机箱装进去以后理线空间为零长时间运行积热严重。OpenRig 我直接用 4040 铝型材搭了一个三层框架底层放电源和硬盘中间放主板最上层给显卡预留 2U 高度的散热空腔。铝型材配合 T 型螺母和角码能随心所欲调整横梁位置这是成品机箱完全做不到的。散热风道设计要点是单一方向把支架进风侧朝房间空调冷气方向出风侧挂一排 12038 风扇统一向外排。显卡在开放式支架里直接暴露温度反而比闷罐机箱低 8 到 12 度。缺点也不是没有灰大我在进风口贴了一层可清洗的防尘棉每两周抽出来水冲一次。3. 系统环境与开源软件栈速配3.1 Ubuntu Server 与驱动版本稳定大于最新系统我选了 Ubuntu Server 长期支持版原因无非三点NVIDIA 驱动和 CUDA 对 Ubuntu 的适配最早Docker 原生支持最好遇到问题能搜到大量现成解法。驱动不要追最新版用官方推荐的和 CUDA 版本配套的稳定分支。我的经验是CUDA 12.4 配 550 或 555 驱动CUDA 12.6 配 560 驱动基本不会翻车。特别提醒别装那种一键安装的开源脚本换个内核版本后驱动挂了都不知道去哪找日志。驱动装完第一件事不是跑应用而是开nvidia-persistenced。这是多卡机器的必备服务它让驱动在无人访问时也保持初始化状态。没有它偶尔会出现某张卡进入低功耗后下一次任务提交时找不到设备的问题。启动命令很简单sudo systemctl enable nvidia-persistenced sudo systemctl start nvidia-persistenced之后输入nvidia-smi如果能看到全部 8 张卡且 Perf 状态列不是 P8 而是正常范围说明驱动和显卡通讯没问题。3.2 Docker Compose 统一跑 CUDA 容器驱动装好后我不在宿主机上直接装 Python 环境所有任务都走 Docker。这样做的好处是环境隔离A 任务要 PyTorch 2.1B 任务要 TensorFlow 2.15C 任务要 CUDA 11.8三个容器可以共存互不干扰删掉也就是一条命令的事。我维护了一份 docker-compose 文件每张卡分配独立容器方便单独重启services: gpu-1: image: nvidia/cuda:12.4.1-runtime-ubuntu22.04 runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICES0 - NVIDIA_DRIVER_CAPABILITIEScompute,utility volumes: - /data:/workspace command: sleep infinity restart: unless-stopped这里面的NVIDIA_VISIBLE_DEVICES0就是指定容器只使用物理编号 0 的显卡。后面接任务的时候只要确认哪几张卡空闲就docker exec进对应容器跑对应进程天然完成最简单的任务到卡的绑定。3.3 GPU 监控Prometheus 加 exporter 看每一张卡多卡机器最怕的就是某张卡悄悄降频或者显存被占满而人浑然不知。我用 Prometheus node_exporter nvidia_gpu_exporter Grafana 搭了一套最简单的监控面板每 15 秒采集一次数据。看板上有四个关键指标GPU 使用率、显存占用、核心温度、风扇转速。如果某项任务提交后某张卡显存一直上不去很可能是显存分配碎片化或者驱动把任务排到了别的设备上。装 nvidia_gpu_exporter 不需要编译官方容器一条命令就能跑起来docker run -d --name nvidia-gpu-exporter --runtimenvidia -p 9400:9400 nvidia/dcgm-exporter:3.3.5-1.0然后在 Prometheus 的scrape_configs里加一个 job 指向这台机器的 9400 端口即可。手动看当前状态用nvidia-smi dmon输出是字符表能看到每张卡每秒钟的功耗和温度波动排查问题时比 Grafana 更直接。3.4 无头管理不接显示器也能干活多卡机器通常塞在桌子底下或者机房角落没有显示器鼠标键盘。我的做法是BIOS 里打开通电自启动 网络唤醒机器插电后自己起来我远程 SSH 进去。需要重启某个容器就docker restart需要重启机器就systemctl reboot全程无头化。有个小坑是主板需要打开Resume On AC Power Loss选项不然断电后机器不会自动恢复远程根本没法救。另一个建议是装tailscale或同类内网穿透工具这样人不在同一个局域网也能直接 SSH 回去。我试过在出差路上连回家里的 Rig 提交一批渲染任务体验和在公司内网差别不大。之后再谈安全问题必开防火墙白名单只暴露自己设备能访问的端口。4. 多卡调度与共享存储把 Rig 变成生产力4.1 先用拓扑命令摸清卡间关系8 张卡不是说插上就能均匀分配卡间通信效率差距很大。装好驱动和 CUDA 后第一步跑nvidia-smi topo -m它会输出一张矩阵用距离码标出每张卡和相邻卡之间的连接方式。比如 NV 表示两张卡之间有 NVLink带宽最高PHB 表示一个 PCIe 根控制器下的连接稍慢PIX 表示卡在同一 PCIe Switch 下速度也不错PXB 表示跨根控制器会吃延迟SYS 则表示走了系统总线速度很慢。我实际跑下来发现GPU0 和 GPU1 因为同在一个 PCIe Switch 下梯度同步速度快过 GPU4 和 GPU5 不少。分布式训练框架一般会自动选择最佳通信路径但自定义任务里如果手动把数据切给多卡一定要参考这张拓扑矩阵规划卡组别让差路径成为瓶颈。4.2 没有 Slurm 也能排队跑任务有人一听说多卡调度就想到 Slurm但单机多卡小团队真没必要装集群调度维护成本高配置还得学一堆概念。我目前的方案是一个不到 100 行的脚本它扫描 8 张卡的显存利用率找到空闲卡后执行任务命令任务结束释放标记然后继续扫队列。核心逻辑类似for job in ${QUEUE[]}; do while true; do gpu_id$(nvidia-smi --query-gpuindex,memory.used --formatcsv,noheader | \ awk -F, $2 512 {print $1; exit}) [ -n $gpu_id ] break sleep 30 done run_job_with_gpu $job $gpu_id done缺点是没有优先级和资源预留但胜在透明、可控、不引入新系统。如果哪天确实需要排队、优先级、日志回溯都完整的能力可以把这套机子接入 Slurm但那是后话了。小团队在起步阶段先用简单队列把卡用满比先上重型系统实在得多。4.3 数据同步素材本地放一份输出集中收OpenRig 上跑的大任务素材动辄几百 GB。我最初犯的错是让所有机器直接远程挂载 NAS 上的素材局域网千兆跑 4K 序列I/O 等待直接拉垮 CPU。现在的策略是每台 Rig 都会在本地数据盘保留一份常用素材副本通过 rsync 增量同步渲染输出统一写到一台存储服务器跑完一批就同步过去。另外给容器内的/tmp和缓存目录挂载到内存盘会有奇效。比如把渲染临时缓存放到/dev/shm速度比 SSD 快一个数量级。需要注意内存盘容量是内存的一半别挂太大目录小心 OOM。我把一个 32GB 内存的节点单独留出 8GB 给临时文件视频转码速度肉眼可见提升。5. 实测中的坑掉卡、过热和掉电5.1 显卡从系统里消失的完整排查链路多卡机器用得越久越可能遇见任务跑到一半报CUDA error: an illegal memory access再一看nvidia-smi原来 8 张卡只剩 7 张掉的那张彻底不见了。这种问题第一反应别盲目重启按顺序查dmesg | tail -100看有没有 NVRM、Xid、PCIe 相关的错误行lspci | grep -i nvidia确认 PCIe 总线上还能不能识别到这张卡断电把这张卡拔下来检查金手指和 PCIe 槽位是否有污垢和氧化痕迹换一个 PCIe 槽位重新插入开机能识别再去跑压力测试我遇到过最典型的情况是机箱共振导致显卡轻微松动插槽触点虚接。重新插拔后顶住卡尾部问题消失。另外注意插拔顺序一定要先断电等电源指示灯完全熄灭再动硬件否则带电插拔极大概率烧板卡。5.2 风扇策略别让显卡被动降频开放式支架虽然散热比机箱好但核心温度和显存温度是两回事。有些显卡风扇默认策略在开放环境下并不激进核心 60 度时风扇还是低速显存却已经 90 度。我跑了半年后给一套监控脚本加了温度巡检每 30 秒检查一次任意一张卡显存温度超过 92 度就调高整排风扇转速。用 nvidia-smi 直接锁功耗墙也可行比如把每张卡功耗限制在 TDP 的 70%跑推理和转码这类我认为不太敏感的负载性能损失很小温度却能压到 65 度左右nvidia-smi -pm 1 nvidia-smi -pl 210有一点要特别注意不同驱动版本下-pl支持的范围不一样锁定前先用nvidia-smi -q -d POWER查看当前和最大功率上限。如果锁过头任务因为供电不足反而更慢那就得不偿失了。5.3 供电和噪音住宅环境的隐形天花板机器跑到满载时我用功率计实测整机功耗大约 2300W这意味着普通五孔插座很容易过载。一个 10A 的插座规格也才 2200W 左右长时满载一定会跳闸。我给 Rig 单独走了 16A 的空调竖线而且一个回路只接这一台设备断路器在测试中承受住了满载 2 小时不发热。噪音则是另一道坎。8 张卡满载加排风扇声音大约在 60 到 70dB基本是正常谈话声水平偏上。我自己后来把机器放到一个通风良好但离办公区较远的角落人耳感受好很多。如果你住公寓建议要么锁功耗墙降噪要么给支架三面贴隔音棉要有防火等级否则晚上渲染任务开着你根本睡不着觉。6. 再往后OpenRig 的模块化进化方向6.1 从手工搭建到配置即代码第一次搭 OpenRig 我纯靠手记笔记后来重装系统才发现一堆细节没记录BIOS 里开了哪些选项、驱动用的哪个版本、Docker daemon 改了什么参数、crontab 里定时同步脚本怎么写的。现在我把这些都收进了 Ansible playbook 里装完系统一条命令拉起来就是一套可复现环境。好处是以后哪块硬件坏了重装时间从一整天缩到半小时。这套方法我也推荐给想抄作业的人比截图备忘和聊天记录可靠得多。核心是把以下几件事写成代码维护驱动安装、nvidia-persistenced 服务、Docker 和 compose 工程、监控 exporter、同步脚本、SSH 密钥。6.2 双电源同步的正确打开方式8 卡 Rig 基本绕不开双电源。最稳妥的做法是买一个双电源同步转接板或者带有双 ATX 启动同步功能的主板让两颗电源在开机的瞬间同时上电。别用那种简单并联 12V 的改装线电流分配不均烧电源的风险极高。我的接法电源 A 给主板、CPU、系统盘、4 张显卡供电电源 B 给另外 4 张显卡供电。这样两边的负载相对均衡如果一个电源挂了至少系统盘不直接断电有机会安全关机。注意电源 A 的风扇信号线不能省否则主板会误认为 CPU 风扇故障而不给启动。6.3 让 Rig 变成团队共享资源OpenRig 的优势是便宜、可拆、扩展灵活缺点是管理界面粗糙。如果想让团队其他人也能用我给容器加了一个简单的 token 验证并向局域网开放了 SSH 端口和渲染端口的访问权限。安全起见绑定端口只监听到内网地址再用防火墙限制来源 IP。我后来把任务队列脚本和监控面板暴露在一个简单的 Web 页面上组员们打开页面就能看到当前哪张卡空闲、哪个任务在跑点一下就可以提交新任务。这个页面的技术含量很低就是一个 Python Flask 服务加一套回调脚本但实用度确实高。今后如果再买一台新 Rig只要把它接入同样的软件栈整个团队算力就从一台机器变成了一组可编排的GPU节点OpenRig 才真正算得上开源可复制。最后再分享一个我的个人体会多卡 Rig 说白了就是个体力活加细心活硬件本身并不神秘真正决定成败的是通道规划、供电余量和散热风道这三件事。第一次组装时多花点时间画清楚接线图后面少折腾一百回。如果哪天你的 OpenRig 突然掉卡了别急着满世界找驱动先断电把那张卡从槽里拔出来重新插紧大概率它又活蹦乱跳了。