ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

多GPU平台搭建避坑指南:从PCIe通道到供电散热的完整方案

多GPU平台搭建避坑指南:从PCIe通道到供电散热的完整方案

OpenRig 这个名字在很多人眼里可能是某个具体框架的缩写,但在我的语境里,它指的是一套开放规格的多 GPU 计算平台——从主板选型、供电设计、风道布局,到系统安装、驱动配置、监控告警,全部打包成一套可以自己拼装、也能批量复制的方案。我第一次用四张卡跑大模型训练的时候,天真地以为这就是把卡插进主板、接好电源线那么简单。真正开机之后才发现,消费级主机思路在四卡甚至更密的场景里几乎全线失灵:PCIe 带宽分配不够、电源瞬时输出顶不住、风道散不掉热,机器要么掉卡,要么自动重启,要么在高温里慢慢降频。后来我把这套多卡平台的做法整理成了一份可复用的参考方案,包括硬件选型、装机方式、监控策略,还有一批难查的故障记录。这篇内容适合正在搭 GPU 工作站、AI 训练节点,或者打算把几台机器做成小规模算力池的人看,也适合第一次面对多卡服务器时两眼一抹黑的运维同学。

1. 为什么多卡平台不能按游戏主机来搭

先讲最核心的问题:一样的显卡,插在游戏主机里能用,插在计算节点里不一定能用得稳。这两套场景对硬件的需求方向完全不同。

1.1 同一块主板上,PCIe 通道才是真正稀缺的资源

在消费级平台上,CPU 直连的 PCIe 通道数量很有限。Z890 平台 CPU 直连通道大概 20 条,AMD X870E 在 24 条左右。你要插 4 张 GPU,通常只能把 CPU 直连通道拆成 x8/x8/x8/x8,这是运气不错的情况;如果有的卡插在芯片组转出来的槽位上,带宽还会进一步打折。x8 的 PCIe 4.0 理论带宽约 16GB/s,单卡训练时这个带宽还能接受;可一旦平台老一档,通道只剩 20 条还要分给 NVMe 和万兆网卡,GPU 只能拆成 x4 甚至 x1。卡是认到了,但训练时通信链路堵得要命,损失的时间成本远远超过当初省下的主板差价。

真正的转折点是 8 卡平台。要一次性插满 8 张卡,PCIe lane 数量根本没有余量留给“顺手插个 NVMe”这种操作。所以我在 OpenRig 方案里的第一条建议永远是:先看 CPU 和主板总共能给多少条 PCIe 通道,再看这些通道分配给了哪些槽位,最后才看卡本身。别的不说,光这一条就能挡住一半以上的多卡翻车现场。

这里给你一个实操检查方法:系统装好后用lspci -vvv查看每张卡的实际运行链路宽度,重点看LnkSta里报的速度和宽度是不是你预期的 x16/x16。很多人以为插在 x16 物理槽里就是 x16 带宽,结果不少主板在插满时会静默降级成 x8 甚至 x4,这种问题不查链路矩阵根本发现不了。

1.2 电源不是“瓦数够就行”,动态响应和持续功率同样关键

游戏 PC 选电源,看品牌、金牌认证、模组线,负载一般不会一直拉满。计算节点恰恰相反:训练任务一跑就是几天,电源长期处在 80% 以上负载。拿四张 450W 的 GPU 为例,光显卡合计就是 1800W,加上 CPU 150W,其他外设几十瓦,整机持续功耗轻松超过 2000W。这时候如果只按“1200W 金牌带 4 卡”来配,表面算下来单卡 300W 好像够——但 GPU 负载不是线性爬升的,做反向传播时整卡功耗可以在毫秒级从 200W 冲到 600W,四张卡叠加就会出现几秒钟的功率尖峰。电源动态响应跟不上,过流保护直接触发,表现就是整机断电重启,没有任何日志可查。

所以多卡平台的功耗算法我总结成一个公式:总供电能力 ≥(ΣGPU TDP + CPU TDP + 外设功耗)× 1.3。四卡平台直接采用双电源方案更稳妥——两个 1200W 或 1600W,一个是为了分散单一电源的压力,另一个原因是多卡机开机时多个电源同时上电会产生巨大浪涌电流,双电源配同步启动器可以错峰上电。后面我会单独讲一个很容易让人深夜崩溃的故障:满载重启,十有八九就是电源保护性断电。

1.3 风道设计决定了机器能跑多久

散热在游戏主机里是“体验问题”,风扇吵一点,温度到 80 度,不影响你出装。在计算节点里散热是“稳定性问题”,GPU 核心过了温度墙会主动降频,训练吞吐立刻波动。多卡并排插的时候,显卡之间只有一两厘米的间隔,热量完全是叠加的,前端的卡排出来的热风会直接被后面的卡吸进去。所以多卡机器我更推荐开放式机架方案而不是标准 ATX 机箱:机箱风道短、体积小、没死角,但塞进 4 张三槽卡之后,内部基本就是一个烤箱。

开放式机架的好处是风扇能直接对着卡屁股吹,气流路径短,换卡不用拆侧板,排查故障时眼睛能看到所有接线。缺点也明显:灰尘大、噪音直出、有裸露高压点。但如果放在机房角落或者实验室专门区域,这些代价完全可接受。我做 OpenRig 项目时对机架只提三个要求:供电线好走,风扇好装,卡好拆。任何不满足这三条的“好看”机架,都会在你第一次拆卡时让你想砸东西。

2. 硬件底座选型:从 PCIe 通道数开始倒推

2.1 主板方案:先看通道分配表,再谈品牌型号

主板是整个平台的骨架,选型顺序必须从 PCIe lane 数量开始倒推。我把三个档位拉出来对比一下:

  • 消费级平台:AMD X870E 约 24 条 CPU 直连通道,适合 1 到 2 张 GPU。插 4 张也能拆分到 x8,能跑但不是理想状态。
  • 工作站级平台:TRX50/WRX90 到 128 条 CPU 直连,支持 4 卡全 x16,Windows 和 Linux 生态都很成熟。
  • 服务器级平台:AMD EPYC 7002/7003 单颗 128 条 PCIe 4.0,双路则是 256 条;Intel Xeon 平台也类似。8 张全 x16 还能富余给 OCP 网卡和 NVMe。

选主板时一定要看说明书里的“PCIe Lane Allocation”表格,也就是告诉你哪个槽位用什么速度、插了哪张卡会让其他槽降速的对照表。这里最容易出问题的是 M.2 插口和 PCIe 插槽共用通道的设计。很多主板写着“插两张 M.2 NVMe 后最后一个 x16 槽只能跑 x4”,如果你恰好把 GPU 插在那个槽上,性能损失大到你无法忽略,而且很难查出来。

BIOS 里有两个必须打开的项目:Above 4G Decoding和Resizable BAR。老 BIOS 默认可能只开传统 BAR 空间,多卡的大显存地址映射不进去,显卡就会在系统里失踪或者报错误码 43。Resizable BAR 让 CPU 能访问整块显存,虽然对训练任务帮助不算大,但对推理和渲染有明显提升,既然多卡都上了,这个选项就顺手开着。

2.2 电源与线材:算清楚持续功率和峰值功率

这里直接给一张参考表,以四卡场景为例:

卡的类型单卡 TDP四卡整机持续功耗约推荐供电方案
RTX 4090450W2050W双 1200W 或单 2000W
RTX 4080320W1500W双 1000W 或单 1600W
A6000 Ada300W1400W双 1000W 或单 1600W
H800700W3100W双 2200W 或专用电源

表里没算进去的是动态尖峰。观察实际功耗时不要只看平均功率,nvidia-smi里的 Power Usage 抓的是瞬时值,你在负载波动时能看到明显脉冲。配电源宁大勿小,而且要看 12V 输出能力而不是总标称功率。有些消费电源标称 1600W,其中 12V 输出可能只有 1300W——多卡平台全靠 12V 供电,这个数字算错了整机就废。

线材也很关键。显卡供电线要用独立的模组线,不要用一分二转接线把两张卡插到同一路输出上,否则电流会超过单路线材的额定值。多卡机里的供电线接触电阻本身就大,接头发热是常见故障点。如果用了 12VHPWR 或 12V-2x6 接口,插到底以后要确认卡扣扣上,有条件的话最好在跑负载之前用手摸一下接头温度。这个接口在高负载下本身就容易发热,线序或者压接工艺再有一点问题,轻则掉卡,重则烧端子。

2.3 CPU 与内存:计算节点里的“搬运工”配置

训练节点的 CPU 不会去算矩阵乘法,它的职责是把数据从 NVMe 读出来、做预处理、把权重加载进显存,然后把这个过程重复几千次。所以 CPU 选型的核心不是频率也不是核心数,而是内存带宽和 PCIe 通道数量。

一个容易忽略的点是模型加载。几十 GB 的模型权重要从 CPU 内存搬进 GPU 显存,CPU 内存就是中转站。多卡并行时,每张卡都要分到一份权重,内存容量至少要等于最大模型大小乘卡数量的近似值。比如你跑一个 70B 量级模型的推理,量化后权重可能有 40GB,四卡节点建议至少配 128GB 系统内存,八卡直接上 256GB,否则模型反复在内存和磁盘之间换页,训练中断会让你崩溃。

内存通道数也别将就。单路 EPYC 平台 8 通道 DDR4 或者 12 通道 DDR5 带来的带宽优势,在大量数据搬运的时候非常明显。预算紧的话 CPU 降一档可以接受,内存通道缩水是真的疼。另外网卡优先插在 CPU 直连通道上,别插芯片组转出来的槽,大数据量通信时延迟和带宽都有明显损失。

2.4 开放式机架与风扇:拆装效率和散热能力的平衡

装 4 卡以上的机器,我强烈建议直接上开放式多卡机架。市面上很多多卡算力机架结构都差不多:水平方向分成若干层,每层一个大风扇位,GPU 横着或竖着固定。选的时候重点看两点:板卡固定架的间距能不能容纳三槽厚的卡;电源位是不是能放两个 ATX 或者一个服务器电源。这两点不满足,后面所有硬件都会被安装方式卡住。

风扇选择上,我常用台达和建准的高转速工业风扇。这些风扇风压大,在开放式机架上能直接把热风从卡间吹出去,但噪音也大,放在办公室肯定受不了。有条件的用 4 线 PWM 风扇,可以调速;3 线风扇不支持调速,只能外接控制器。多卡机里风扇集线器尽量选外接供电的型号,这一点我第五部分会专门讲——它曾经坑过我整整一个晚上。

3. 系统层配置:装机、驱动、监控一条线

3.1 批量安装系统:从 U 盘时代过渡到 PXE 和无盘

单台机器装系统,U 盘启动毫无问题。但如果要搭三台、五台 OpenRig 节点,一台一台插 U 盘手动选安装选项,重复劳动量大到让人烦躁。我的做法是 PXE 网络装机:在一台管理机上跑网络启动服务,节点开机通过 DHCP 拿到 IP,然后从 TFTP 下载引导程序,再从 HTTP 服务器拉取系统安装镜像。每台新节点只需要插电开机,十几分钟自动装完,过程中显示器都不用接。

更进一步可以做无盘启动:节点系统直接跑在管理机提供的 NFS 或者 iSCSI 存储上。好处是换系统只改存储上的镜像,节点本身没有本地磁盘,显卡节点出问题重启后回到干净状态。缺点是对网络带宽敏感,跑大数据集建议用 10GbE 以上网络。无盘节点挂掉时,日志会落在管理机上,反而方便排查,因为你不必跑到机器前面插键盘看屏幕。

PXE 环境里最常见的坑是 DHCP 和 TFTP 配置中next-server参数写错,导致引导文件死活下载不下来。排查时不要盯着配置文件发呆,直接抓包看 PXE 请求流程里客户端的 DHCP 响应,问题很快就明确了。

3.2 驱动与 CUDA 部署的几个多卡关键点

装 NVIDIA 驱动本身不算难,多卡场景里要注意的其实是几个状态设置。

第一是持久化模式:执行nvidia-smi -pm 1,让 GPU 驱动常驻内存,避免每起一个进程就重新初始化显卡。多任务调度场景下这个开关能显著降低任务切换的延迟。第二是环境变量:脚本里尽量用 GPU UUID 而不是索引。索引会随启动顺序变化,你插拔一张卡后索引全乱,UUID 永远是固定的,多卡任务的容错能力就差在这儿。第三是驱动版本:服务器主板芯片组驱动和 GPU 驱动要分开看,不要因为追求最新驱动导致显卡在旧内核上编译失败;生产节点保守一点,选 LTS 驱动分支。

如果做多机多卡训练,记得检查 NCCL 能不能识别到正确的设备数和拓扑。执行nvidia-smi topo -m可以看到 GPU 之间的通信矩阵,如果卡插在不对的 PCIe switch 下面,NCCL 会退化成走 CPU 内存的路径,通信速度直接掉一截,这是很多分布式训练性能崩掉但看不出来的原因。

3.3 监控告警与自愈:没有它不敢跑长任务

多卡节点跑一个 72 小时训练任务,中途掉卡、过热、死机任何一个都可能让整个任务白跑。所以监控必须自动化。我的小规模方案是:node_exporter 采集主机指标,NVIDIA DCGM 采集显卡指标——温度、功耗、利用率和 ECC 错误数都能拿到;Prometheus 负责存储和触发告警,Alertmanager 把消息推到群里。这套组合虽然是给数据中心设计的,两三台节点也能跑起来,配置量并不大。

更高要求是“自愈”。显卡一旦 hang 住,驱动可能死锁,节点看起来活着但卡已经不能用了。我写过一个简单的看门狗脚本,定期调nvidia-smi检查返回码和温度,异常时通过 IPMI 远程硬重启,避免整个周末的训练被一张卡拖住。核心逻辑就是循环检查加条件触发:

#!/bin/bash while true; do if ! nvidia-smi -L >/dev/null 2>&1; then echo "GPU hang, reboot $(date)" >> /var/log/gpu_watchdog.log ipmitool chassis power cycle fi sleep 60 done

监控界面上更要关注 GPU 受限原因字段:nvidia-smi --query-gpu=clocks_throttle_reasons.hw_thermal,clocks_throttle_reasons.sw_power_cap。这两个字段直接告诉你降频是因为热还是因为功耗墙。多卡机长期运行,我建议先处理功耗墙再堆风扇——降功耗往往比疯狂加大风量更有效,也省钱。

3.4 功耗策略:先限功率,再谈性能

多卡平台的第一个稳定策略是限制每张卡的功率上限。四张 4090 默认单卡 450W,我用nvidia-smi -pl 350把功率限制到 350W 之后,实测训练吞吐损失在 5% 到 10% 之间,但整机功耗从 1800W 降到 1400W,风扇转速能低一档,机柜散热压力小很多,电源余量也更充足。看起来亏了不到 10% 的性能,换来的却是长时间运行的稳定性和显著更低的硬件故障率,这个交换在计算节点里非常划算。

推理服务场景更值得锁功耗:固定 batch 的推理负载波动比训练小,限制功耗后响应时间更稳定,调度器看到的性能抖动也小很多。OpenRig 软件包里的默认配置就是限功率加持久化模式加温度阈值报警三件套。很多人不理解为什么一开始就限功率,但等到某个深夜被电源保护拉闸之后,你就明白这一刀切得有多值。

4. 我的 OpenRig 落地记录:从双卡到四卡的全过程

4.1 最终选型和组装顺序

我自己主力节点的配置是这样:超微 H12SSL-i 主板,AMD EPYC 7302(16 核,128 条 PCIe 4.0),8 条 32GB DDR4-3200,4 张 RTX 4090,双电源(一个 1200W ATX 加一个 1600W,通过同步启动器接在一起),6U 开放式机架,四把台达高风压风扇,网络用双口万兆网卡,一个口走管理,一个口走数据。这套配置的核心价值是 PCIe 通道完全够用,四卡全 x16 跑满,还留了富余给 NVMe 和网卡。

组装顺序这里有个经验,可能听起来很小但实际影响很大:先把主板固定在托盘上,接好供电线,最后再插显卡。你要是先把卡插满再走线,会发现电源线在显卡和主板之间根本伸不进去,只能用镊子硬怼。顺序没有绝对的对错,但多卡机一旦卡插上,手就很难伸进去了,能提前完成的接线全部提前。

4.2 第一次压力测试就掉卡,问题出在线材

装好后的第一晚,我用 gpu-burn 做压力测试,第四张卡跑到第 40 分钟时突然从nvidia-smi里消失了,系统日志冒出一行 NVRM 错误。当时第一反应是显卡本身有问题或者插槽接触不良,把卡换到另一个槽,跑了三个小时居然很稳定。我以为就是槽位接触的问题,插回原槽想复测,结果又复现了。

排查到最后发现是供电线的问题:我用的是显卡 8pin 转 12VHPWR 转接线,其中一根线的端子压接不牢,高负载电流下过热,接触电阻变大,驱动检测到供电异常就把卡禁用了。换回原装的 12V-2x6 线材之后问题彻底消失。这件事之后我再也不用杂牌转接线了,因为省下的那几十块最终都会在排查时间里还回去,而且带薪排查比线钱贵得多。

4.3 温度与风扇策略的调整笔记

首版风扇策略完全依赖 BIOS 默认,GPU 满载时 CPU 风扇转速跟着上来了,但机架上的四把机架风扇还在半速转。手动在系统里调 PWM,发现机架风扇全速时整机温度能降 8 到 10 度,但噪音巨大。后来把机架风扇接到 BMC 控制的 4Pin 口,写了一条自定义温度转速曲线:50 度以下维持低速,60 度开始线性爬升,到 70 度直接拉满。几周观察下来,GPU 核心温度稳定在 70 度上下,显存温度在 85 度以下,没有再出现过降频。

功耗策略的最终值也一并记录:四张卡全部限制在 360W,显存频率不做超频,Persistence Mode 开启。跑一个 72 小时的微调任务,整机功耗稳定在 1600W 左右,电源余量非常充足,机柜温度不再报警。这套参数到现在已经稳定运行了四个月,中间没有出现过一次因为温度或功耗导致的训练中断。

5. 三个最隐蔽的故障排查链路

5.1 故障一:BIOS 只识别一半显卡,问题叠着问题

现象:六卡主板,BIOS 引导列表里只能看到四张卡,进系统后nvidia-smi同样只有四张。一开始怀疑卡坏了,把“消失”的卡逐张换到别的槽测试,发现每张卡单独插都能被识别——排除显卡故障。全插回去,现象依旧。

排查链路里最关键的一步是打开 BIOS 的Above 4G Decoding选项。这个开关开启后,系统才能把多张显卡的大显存映射到 64 位寻址空间,否则映射不完整,显卡自然不被识别。以前 32 位时代不存在这个问题,但现代显卡显存动辄 24GB,多卡叠加后地址空间早就不够用了。

但开完这个选项还有后续:系统里六卡倒是齐了,可其中一张卡的链路宽度只有 x4。查主板说明书才明白,那个槽位和两个 M.2 接口共享通道,插了 M.2 之后槽位只能跑 x4。拆掉一块 M.2 后链路回到 x16。这个案例的教训是多卡平台很多时候不是“主板支持六个 x16”,而是“主板有六个槽,但为了某些插口牺牲了带宽”。说明书里的通道分配表,装机之前一定要逐行读完。

5.2 故障二:满载十分钟整机重启,电源保护触发全过程

现象:跑负载测试时,整机像被拔了电源一样瞬间黑屏断电,过几秒又自动重启。没有任何系统崩溃日志,也没有温度报警。

排查链路走完整条:

  1. 先做单卡满载测试,稳定;四卡满载必定复现。排除显卡个体故障。
  2. 观察整机功耗曲线,发现四卡同时进入峰值时,瞬时功耗高出电源额定值一大截。
  3. 换一台更高规格电源后故障消失。

这个场景最骗人的地方在于日志。因为电源直接断电,系统根本来不及记录,内核日志里只有停电前的最后几行,看起来像“无原因断电”。如果电源带数字监控软件,能直接看到过流保护事件;如果是没有记录功能的普通电源,就只能靠换电源验证。这也是我在前面强调电源余量 1.3 倍的原因——多卡平台的功耗尖峰是持续的、规律性的,不是偶然一次突刺,电源必须为这个脉冲留好余量。

解决手段其实有两套:一套是换大电源,另一套是软件层nvidia-smi -pl把功耗尖峰压下来。我最终两个都用:限制了功率,也换了更大规格的电源。你如果预算有限,先做软件限功率也能搞定,但长期稳定性还是靠硬件余量兜底。

5.3 故障三:风扇转速异常,风道再好也散不出热

现象:高负载下某两张卡温度升高,但机架风扇转速没有按策略拉满。手动在 BMC 界面把转速调到 100%,风扇也只是轻微上升。

排查链路:

  1. 确认风扇是 4 线 PWM 类型,支持调速。
  2. 用万用表测量 PWM 信号线,信号正常。
  3. 检查风扇集线器,发现所有风扇都接在一个小号集线器上,而集线器本身靠主板风扇座取电,输出电流根本不够四个工业风扇同时全速运行,电压直接被拉垮。
  4. 换成外接 SATA 供电的风扇集线器,问题当场消失。

工业级高转速风扇单只工作电流就能到 1A 以上,四只就是 4A,而主板风扇插座通常只能输出 1A 甚至更低。很多消费级风扇集线器把供电设计成从主板 PWM 口取电,带两三个消费级风扇没问题,一接工业扇就翻车。这个坑在普通装机里几乎不存在,但到多卡服务器场景就会被无限放大。所以你搭机的时候,风扇集线器一定要挑带独立供电输入的型号,别省这个钱。

6. 下一步:从“一台机器”走向“一个小算力池”

6.1 液冷和 PCIe 扩展柜:卡密度的两种提升思路

四卡之后有两条路可以走。一条是液冷:用分体水冷把每张卡的热量通过冷排带走,机柜内卡密度能拉高,噪音也能降下来,但首次投入和维护成本明显上升。漏液检测器必须装,维护周期要固定,不适合想省心的人。另一条是 PCIe 扩展柜:主机通过 PCIe switch 外接一个带多卡扩展柜,一台机器能挂到八卡甚至更多。好处是不用换主板,缺点是数据路径变长,带宽瓶颈要仔细设计——主机到扩展柜之间的线缆如果只有 x16 带宽,多卡并行训练时通信很容易变成短板。

对大多数团队来说,我的建议是不要盲目追求单机八卡。四卡平台的运维复杂度已经不算低了,先把手头的四卡节点跑稳定,再考虑扩容成六卡或者加第二台四卡节点,远比一上来就上八卡然后反复排查问题要省心。

6.2 SLURM 还是 Kubernetes:把多台节点管起来的经验

当你开始拥有两三台 OpenRig 节点,最直接的调度方式是 SLURM。安装流程不复杂:一台节点做 control,其他节点做 compute,在 slurm.conf 里配置分区和节点列表。要支持 GPU 资源,在 gres.conf 里声明显卡资源,然后任务通过--gres=gpu:N申请显卡即可。SLURM 最大的好处是调度逻辑成熟且轻量,运维学习成本低,训练任务提交就是一条命令行,团队很快能上手。

如果业务里有大量容器化部署,Kubernetes 是更通用的选择,但 NVIDIA device plugin、显存调度、节点污点这些概念会瞬间增加运维复杂度。我见过好几个团队上了 K8s 之后,排障时间比业务运行时间还长。小规模算力池用 SLURM 先跑起来完全够用,等真的需要容器隔离和动态伸缩再去迁移也不迟。

6.3 几点长期维护建议

最后分享几条维护规则,都是从实际使用里踩出来的:

一是开机前检查所有电源线和 PCIe 辅助供电口,很多故障是重启之后才暴露的松线问题。二是定期抓取 GPU ECC 错误计数和温度日志,显卡寿命损耗往往在数据上先露出苗头。三是给每台节点贴标签,记录卡的位置和序列号,插拔之后更新一张硬件台账,避免下次排查时连哪张卡在哪都分不清。四是在高温天气跑长任务之前提前处理散热,机架滤网和风扇灰尘至少一季度清一次,别等到温度报警了才想起清灰。这些小习惯看着琐碎,但长期运行的项目拼的就是这些琐碎事不出错。

最后聊一点个人体会。维护 OpenRig 这套多卡平台一年多,我最大的感受是:多卡机的故障几乎不来自算力本身,而来自基础设施——供电、散热、线材、BIOS 配置这些看起来不起眼的东西。只要把选型时的通道账、功耗账、风量账算清楚,把系统层的监控和限功率配置做好,机器长期跑下来其实非常稳定。如果你正在搭第一个多卡节点,我建议把前面那张电源参考表和通道分配检查表打印出来贴在机架上,这比任何性能优化技巧都实用。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进