RTX 5090 深度学习环境显卡掉线排查记录

先交代一下这套深度学习环境的硬件配置:

  • 显卡:技嘉 RTX 5090 纯血版(国外背回来的)
  • CPU:AMD 9950X
  • 主板:华硕 X870E-PLUS WIFI7
  • 固态:三星 990 Pro 2TB
  • 机械硬盘:西部数据紫盘 2TB
  • 机箱:安钛克 FLUX SE
  • 电源:安钛克 NE 1300 金牌(1300W,ATX 3.0,原生 12V-2x6)
  • 风冷散热:九州风神 阿萨辛4
  • 内存:美商海盗船 DDR5 5200 32G×2
  • 系统:Ubuntu 24.04.4 LTS,内核 6.17.0-29-generic
  • 驱动:NVIDIA 590.48.01(开源内核模块 + GSP),CUDA Runtime 13.1

最近在跑深度学习训练时,接连遇到几类不同表现的黑屏和 GPU 掉盘问题。起初我以为在 BIOS 里禁用核显就能解决,但实际测试下来发现问题仍然存在。经过日志排查和限功耗验证,最终确认:这不是显存不足,也不是代码问题,而是 RTX 5090 满功耗下的瞬时功耗尖峰触发供电保护,导致 GPU 掉出 PCIe 总线(Xid 79)

一、最初遇到的三类现象

情况一:直接掉盘,找不到 GPU 节点

这是比较棘手的一种情况。当时正在跑训练,中途桌面突然消失,机箱风扇维持高转速。通过终端 SSH 连进去后,输入 nvidia-smi 提示找不到显卡设备,表现为典型的 GPU 掉盘。

初步分析,这多半是在负载突变或者供电出现瞬时波动时,触发了主板或电源的某种保护机制,导致 PCIe 设备被系统断开。针对这种硬件级别的保护掉线,最直接的恢复方式只能是硬重启机器。

情况二:能识别显卡,但无信号输入且无桌面

这种情况表现为:开机后 nvidia-smi 能正常找到显卡并输出状态,但是显示器提示无信号输入,使用 ToDesk 远程连接时也显示没有桌面环境。

遇到这种状况,我的处理方式是彻底断电重置:关机,拔掉主机电源线,静置等待一分钟左右,然后再插上电源开机。通常这样操作一次就能恢复正常。推测可能是主板静电或某些电容的残余电荷干扰了显示输出,拔电静置可以帮助主板彻底放电。

情况三:远程有桌面,但本地显示器黑屏

第三种情况有些特殊:本地显示器依然毫无反应(无输入信号),但是通过 ToDesk 远程连接,居然可以正常看到并操作 Ubuntu 桌面。

经过摸索,这主要可能是 Ubuntu 下的显示服务器配置异常,或者显卡驱动与 Wayland 发生冲突。可以在 ToDesk 里打开终端,尝试重置相关配置:

  1. 清理旧的 xorg 配置文件:

    1
    sudo rm /etc/X11/xorg.conf
  2. 重新生成 NVIDIA 的 xconfig:

    1
    sudo nvidia-xconfig
  3. 关闭 Wayland,强制系统使用 X11 协议。编辑 gdm3 的配置文件:

    1
    sudo nano /etc/gdm3/custom.conf

    找到里面被注释掉的 #WaylandEnable=false 这一行,去掉前面的 # 号,变成 WaylandEnable=false,然后保存退出。

  4. 重启系统:

    1
    sudo reboot

    补充说明:重启的时候,建议给显示器换一个 DP 接口重新插拔一次,通常就能正常点亮。

二、再次复现:batch 增大后频繁掉盘

后续又遇到了一次更稳定可复现的问题:batch 设为 6 时,可以轻松跑完 40k 步,此时显存只用约 10GB;将 batch 改为 12 后,显存占用约 18GB,训练跑到约 8000 步时显示器黑屏,nvidia-smi 找不到显卡。

当时 SSH 仍能连上,风扇狂转,训练实际已经停止。物理强制关机重启后一切恢复正常,但再次开跑仍会出现上述情况,这说明它已经不是偶发现象。

最初怀疑过几类原因:

  1. 散热不佳:主机原本放在桌子下面,空间狭小,通风不良。
  2. 电源余量不足:满载时整机功耗过大,1300W 电源可能不够。
  3. 硬件连接问题:显卡支架不稳、供电线插接不牢或弯折过大,但检查后暂未发现明显问题。

当时的计划是先把主机从桌子底下挪到机架上,并加装风扇。如果之后不再出现“显存总共 32GB、刚用了 20GB 左右就桌面崩溃”的情况,就说明大概率是散热或通风问题;如果仍然不好,再考虑联系售后或上门维修。

三、关键复现:开训 14 秒就崩溃

后来我已经把机器搬到了机架上,也更换了工位。再次启动训练时,又遭遇桌面突然消失、显示器黑屏、风扇狂转,而且这次仅仅开训 14 秒就崩了。

这时基本可以确定:这不是普通的显存 OOM。OOM 通常只会让 Python 进程报错退出,不会让整机黑屏、GPU 掉盘、风扇狂转并且必须硬关机。

崩溃前内核日志出现大量 NVIDIA GSP 相关错误:

1
NVRM: _issueRpcAndWait: rpcSendMessage failed with status 0x0000000f for fn 76

这表示 NVIDIA GSP(GPU System Processor)固件 RPC 通信失败或超时。换句话说,GPU 的 GSP 固件已经挂掉,驱动只能疯狂重试。一旦 GSP 死掉,挂在 GPU 上的 Xorg 显示就会冻结(黑屏、ToDesk 掉线),风扇也可能因为失去控制进入 100% 失效保护状态。

继续往前看崩溃第一现场,在 16:12:16,也就是启动训练那一刻,出现了更关键的日志:

1
2
3
NVRM: Xid (PCI:0000:01:00): 79, pid=..., name=cursor, GPU has fallen off the bus.
NVRM: GPU 0000:01:00.0: GPU has fallen off the bus.
NVRM: Xid (PCI:0000:01:00): 154, GPU recovery action changed from 0x0 (None) to 0x2 (Node Reboot Required)

其中 Xid 79 = GPU 从 PCIe 总线上掉了。这基本可以解释所有现象:GPU 整个从总线消失后,后面那一大片 GSP RPC 失败只是驱动在对一个“已经不存在的 GPU”疯狂重试的连锁反应。Node Reboot Required 也解释了为什么必须硬关机才能恢复。

几个关键细节:

  • 训练日志目录时间戳是 16:12:02,而 GPU 掉总线发生在 16:12:16,开训仅 14 秒就崩了。
  • 崩溃前没有过热迹象,HW Thermal Slowdown 全程为 0。
  • 崩溃前无任何 PCIe AER 报错,属于“毫无征兆瞬间掉总线”。
  • 当前 GPU 功率上限为 600W,最低可限制到 400W。
  • 当时 PCIe 链路状态为 pcie.link.gen.current = 5,也就是 PCIe Gen5 x16。

四、排除项与根因判断

1. 排除显存不足

显存不足只会让 Python 进程报错退出,最多导致训练进程中断,不会导致整机黑屏、ToDesk 掉线、风扇狂转,也不会让 GPU 从 PCIe 总线上消失。

因此,这次问题不是普通 OOM,也不是配置文件里 batch 太大导致的常规训练错误。

2. 排除单纯过热

虽然最初怀疑过散热,但这次关键复现只训练了 14 秒就崩溃,而且日志里没有 HW Thermal Slowdown。GPU 还没来得及热起来,因此单纯过热不是主要原因。

3. 排除电源容量不足,但保留瞬时尖峰判断

安钛克 NE1300G 是 1300W 金牌 ATX 3.0 电源,带 RTX 5090 + AMD 9950X 的额定容量理论上绰绰有余。同时,电源线是原生 12V-2x6,并且已经重新检查确认插紧。

所以“电源额定容量不够”基本可以排除。但 RTX 5090 标称功耗约 575–600W,毫秒级瞬时尖峰可能冲到 900W+,仍然可能触发电源 OCP 或造成瞬时掉电,让 GPU 掉出 PCIe 总线。

4. PCIe Gen5 链路也曾被怀疑

因为当前 GPU 正跑在 PCIe Gen5 x16,而 RTX 50 系 + AM5 / X870E 平台对信号完整性要求很高,所以也曾怀疑过 PCIe Gen5 链路在满载瞬间不稳定。

不过,后续限功耗实验给出了更直接的判断:限制功率上限到 400W 后,同一份训练配置已经稳定运行 1 小时以上。这说明主因更偏向满功耗下的瞬时功耗尖峰,而不是显存、代码、驱动或单纯 PCIe Gen5 链路问题。

五、决定性验证:限制功耗到 400W 后稳定训练

执行以下命令,将 RTX 5090 的功耗上限从 600W 限制到 400W:

1
2
sudo nvidia-smi -pm 1        # 持久模式
sudo nvidia-smi -pl 400 # 功耗上限 400W(该卡可设范围 400–600W)

然后重新启动同一份训练:

1
2
cd /home/kxh/Projects/gqa
python tools/train.py my_configs/segformer/segformer_mit-b2_multinatsmoke_align.py

结果:同一份配置已经稳定训练 1 小时以上,没有再次黑屏或掉盘。

这个实验基本确认了根因:

RTX 5090 在满功耗下的瞬时功耗尖峰触发供电保护或瞬时掉电,导致 GPU 掉出 PCIe 总线(Xid 79)。限制功耗上限后,尖峰被削平,系统恢复稳定。

这与显存不足、训练代码、数据集本身都无关。降功耗主要影响训练速度,不影响模型精度结果,仍然可以正常用于论文复现和实验对比。

六、短期解决方案:先稳定训练

1. 临时设置

每次重启后手动执行:

1
2
sudo nvidia-smi -pm 1
sudo nvidia-smi -pl 400

验证当前功耗上限:

1
nvidia-smi -q | grep "Current Power Limit"

如果显示接近 400.00 W,说明设置已经生效。

2. 开机自动生效

因为 nvidia-smi -pl 400 重启后会失效,如果不固化,下次重启又会恢复 600W,可能再次崩溃。推荐写成 systemd 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo tee /etc/systemd/system/nvidia-powerlimit.service >/dev/null <<'EOF'
[Unit]
Description=Cap NVIDIA GPU power limit to 400W (avoid 5090 transient brownout)
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -pm 1
ExecStart=/usr/bin/nvidia-smi -pl 400
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now nvidia-powerlimit.service

检查服务状态:

1
systemctl status nvidia-powerlimit.service

七、在稳定前提下兼顾速度

400W 相比满血 600W 可能会慢一些,大约影响训练速度 10–20%,但不影响精度。如果后续希望兼顾速度,可以用二分法逐步上探稳定功耗:

1
sudo nvidia-smi -pl 480

跑训练观察至少 30 分钟:

  • 如果崩溃,就退回 400W;
  • 如果稳定,可以再尝试 500W、520W 或更高;
  • 找到稳定值后,把 systemd 服务里的 -pl 400 改成该值。

不过在论文复现和实验验证阶段,建议先稳定在 400W,把实验完整跑完。速度优化可以之后再做。

八、长期治本方案

如果后续想恢复更高功耗,甚至接近满血 600W,可以按成本从低到高逐项尝试。

1. BIOS 中将显卡槽降到 PCIe Gen4

这是 50 系显卡掉总线问题中比较常见、也比较有效的稳定性修复方式。

操作路径大致为:

1
2
3
4
5
6
重启按 Del 进入 ASUS BIOS
-> Advanced(高级)
-> PCI Subsystem Settings
-> PCIe Link Speed / PCIEX16_1 Link Speed
-> 从 Auto / Gen5 改成 Gen4
-> 保存并重启

对单卡训练来说,PCIe Gen4 x16 的带宽基本够用,对训练性能影响很小,但可能显著提升稳定性。

2. 更新主板 BIOS

X870E 早期 BIOS 对 Gen5 显卡稳定性可能存在兼容性问题,华硕后续 AGESA 更新修复了不少相关问题。建议去华硕官网下载安装 X870E-PLUS WIFI7 的最新 BIOS。

3. 关闭 ASPM

可以在 GRUB 内核启动参数中追加:

1
pcie_aspm=off

这样可以排除 PCIe 省电状态切换导致掉链路的可能性。不过这一步属于系统配置调整,建议在前面几步无效后再做。

4. 逐步解开功耗上限

完成上面几项后,可以尝试逐步上调功耗上限:

1
2
3
sudo nvidia-smi -pl 500
sudo nvidia-smi -pl 550
sudo nvidia-smi -pl 600

每一档都要跑训练观察稳定性,找到能稳定训练的最高功耗值。

九、是否需要联系售后

当前暂时不需要。

限功耗到 400W 后能够稳定运行,说明硬件大概率没有直接损坏。更像是 5090 满功耗瞬态尖峰叠加默认功耗上限带来的稳定性问题,先通过软件层面限制功耗即可解决。

只有在以下情况才建议考虑联系售后或上门检测:

  • 已经限制功耗到 400W;
  • 已经将 PCIe 从 Gen5 降到 Gen4;
  • 已经更新主板 BIOS;
  • 必要时也关闭了 ASPM;
  • 但系统仍然频繁黑屏、掉盘、需要硬关机。

如果这些操作都无效,才更可能是这块 5090 或这台电源存在个体瑕疵,再走保修、换件检测会更有意义。

十、训练和测试命令

功耗限制固化后,可以正常训练和测试。

训练(论文对齐 B2):

1
2
cd /home/kxh/Projects/gqa
python tools/train.py my_configs/segformer/segformer_mit-b2_multinatsmoke_align.py

分尺度测试(对齐论文口径):

1
2
3
python tools/smoke_test_multiscale.py \
my_configs/segformer/segformer_mit-b2_multinatsmoke_align.py \
work_dirs/MultiNatSmoke/segformer_mit_b2_align/best_mns_IoU_epoch_*.pth

十一、未来再次崩溃时的快速自查命令

如果之后再次崩溃,可以优先看上一次启动的 Xid 错误:

1
journalctl -b -1 -k | grep -iE "Xid|fallen off the bus"

实时查看功耗、限频和链路状态:

1
2
nvidia-smi -q | grep -iE "Power Limit|Power Draw|Throttle|Slowdown"
nvidia-smi --query-gpu=pcie.link.gen.current,pcie.link.width.current --format=csv

确认功耗上限服务状态:

1
systemctl status nvidia-powerlimit.service

常见 Xid 速查:

  • Xid 79:GPU 掉出总线,常见于供电、链路或接触问题。
  • Xid 154:GPU 恢复需要节点重启。
  • Xid 13 / 31 / 43:更偏向显存、非法访问或软件层面问题,与这次现象不同。

十二、状态总览

项目 状态
根因 已确认:满功耗瞬态尖峰导致 GPU 掉总线(Xid 79)
短期方案 功耗限制到 400W,已稳定训练 1h+
固化方案 建议配置 nvidia-powerlimit.service 开机自动限功耗
长期优化 可选:BIOS 降 Gen4、更新 BIOS、关闭 ASPM 后逐步解锁功耗
是否维修 暂不需要
对实验结果影响 不影响精度,只影响训练速度,可正常与论文对比

总结

这次问题的关键不是“显存不够”,也不是训练代码本身,而是 RTX 5090 满功耗瞬时尖峰导致 GPU 从 PCIe 总线上掉了(Xid 79)

目前最稳妥的处理方式是:先把功耗上限固定在 400W,保证训练稳定完成;等实验跑完后,再考虑通过 BIOS 降 Gen4、更新 BIOS、关闭 ASPM、逐步上调功耗上限等方式,寻找速度和稳定性的平衡点。

关联阅读:语义分割评价指标梳理与代码实现记录发挥 AI+MMSegmentation 的快速验证想法的优势