AMD 显卡突然"消失"?从软件到硬件的完整排查指南

前言

家里有一台 Intel NUC9,装了飞牛 fnOS 系统,插了一张 AMD RX 6600 独显,日常用 Docker 跑 llama.cpp + ROCm 做本地大模型推理。一直用得好好的,直到某天 ——

llama.cpp 启动报错了。上去一查,AMD 显卡凭空消失了。 系统里只剩下 Intel 核显 UHD 630,RX 6600 就像从来没插过一样。

接下来的排障过程从软件翻到硬件,最终找到真凶。把排查思路和命令整理出来,下次遇到类似问题可以直接照做。


第一阶段:软件排查

显卡不识别,大部分人的第一反应是” 驱动掉了”。先走完软件链路,确定不是配置问题再碰硬件。

1.1 内核模块有没有加载?

Terminal window
lsmod | grep amdgpu
  • 有输出 → amdgpu 驱动已加载,跳到 1.2
  • 无输出 → 尝试手动加载:
Terminal window
sudo modprobe amdgpu

如果 modprobeModule not found,检查内核版本和驱动文件:

Terminal window
uname -r
find /lib/modules/$(uname -r) -name "amdgpu.ko*"

找不到 .ko 文件说明当前内核没编译 amdgpu,需要换内核或重装驱动。

1.2 设备节点有没有创建?

Terminal window
ls -la /dev/dri/
ls -la /dev/kfd

正常情况:

  • /dev/dri/card0 — Intel 核显
  • /dev/dri/card1 — AMD 独显(数字可能不同)
  • /dev/dri/renderD128 — Intel 渲染节点
  • /dev/dri/renderD129 — AMD 渲染节点
  • /dev/kfd — AMD ROCm 计算接口,必须存在才能跑推理

如果 /dev/kfd 不存在,说明 amdgpu 没有为这张卡创建计算接口,继续往下查。

1.3 PCIe 总线上能不能看到显卡?

这是最关键的一步,直接决定问题在软件还是硬件:

Terminal window
lspci | grep -i vga
lspci | grep -i amd

正常输出示例(NUC9 + RX 6600):

00:02.0 VGA compatible controller: Intel Corporation ... UHD Graphics 630
01:00.0 PCI bridge: Advanced Micro Devices, Inc. ... Navi 10 XL Upstream Port
02:00.0 PCI bridge: Advanced Micro Devices, Inc. ... Navi 10 XL Downstream Port
03:00.0 VGA compatible controller: Advanced Micro Devices, Inc. ... RX 6600

1.4 内核日志有没有报错?

Terminal window
sudo dmesg | grep -iE "amdgpu|error|fail|pci.*amd" | tail -30

关注关键词:

  • amdgpu: probe of ... failed — 驱动加载失败
  • pci ... BAR ... can't allocate — PCIe 资源分配失败
  • firmware: failed to load — 缺固件
  • VFIO 相关 — 显卡被直通 / 占用了

如果日志干干净净没有任何 amdgpu 相关内容,说明内核根本没检测到这个 PCIe 设备 —— 问题在更底层。

1.5 是不是内核升级的锅?

很多 NAS 系统会自动更新内核。如果问题恰好出现在一次重启后,检查是否换了内核:

Terminal window
uname -r # 当前内核
ls -la /boot/vmlinuz* # 所有可用内核
ls /lib/modules/ # 已安装的内核模块

如果有旧内核,回滚试一下:在 GRUB 启动菜单选「Advanced options」→ 旧内核启动即可。

1.6 Docker 容器能不能看到 GPU?

Terminal window
docker run --rm \
--device=/dev/kfd \
--device=/dev/dri \
--security-opt seccomp=unconfined \
--group-add video \
rocm/devubuntu-22.04:latest \
rocminfo

如果 rocminfo 没报错且有 GPU 信息,说明 ROCm 链路也正常。


第二阶段:软件排查总结

lspci 里完全没有 AMD 设备时,软件排查到此结束。下面这张决策矩阵可以帮你快速定位:

lspci 有 AMDamdgpu 已加载/dev/kfd 存在诊断
正常,检查应用层配置
驱动 / 内核问题
权限 / 用户组问题
硬件或 BIOS 问题

我的情况是第四行 ——软件完全无辜,问题在物理层。


第三阶段:硬件排查

3.1 先确认不是 BIOS 设置问题

进 BIOS(启动时按 Del / F2),检查:

  • PCIe 插槽是否启用:Advanced → Onboard Devices → PCI Express x16 Slot → Enabled
  • Above 4G Decoding:开(大显存 + ROCm 需要)
  • Resizable BAR / Smart Access Memory:可选,开了能提升性能

3.2 NUC 特有:Compute Element 接触不良

NUC9 结构特殊 ——CPU / 芯片组在一块可拆卸的 Compute Element 上,通过一个大接口插到底板。这个接口松动会导致:

  • PCIe x16 插槽没电
  • 网卡、SATA 全部一起挂

处理方式:关机断电,打开顶盖,把银色 Compute Element 方块按紧。

3.3 显卡物理连接

  1. 重新插拔显卡:拔出 RX 6600,检查金手指有没有氧化发黑,用橡皮擦轻轻擦拭。重新插入,听到卡扣” 咔” 一声锁死才算到位。

  2. 检查 PCIe 供电线:RX 6600 需要一条 8pin(6 + 2),确认两端都插紧 —— 显卡端和电源端都要查。

  3. 换槽测试(如果有第二个 PCIe 槽):排除插槽本身损坏。

3.4 最小排除法

如果以上都不行,把显卡拆下来插到另一台机器上:

  • 别的机器能认 → 问题在原机器的 PCIe 槽/电源/BIOS
  • 别的机器也不认 → 显卡本身挂了

终局

重新插拔 RX 6600 后,lspci | grep -i amd 立刻输出四条设备信息。重启后 amdgpu 自动加载,/dev/kfd 出现,ROCm 推理恢复如初。


附录:修复后验证清单

Terminal window
# 1. 确认 PCIe 识别
lspci | grep -i amd
# 2. 确认驱动加载
lsmod | grep amdgpu
# 3. 确认设备节点
ls -la /dev/dri/
ls -la /dev/kfd
# 4. 确认 ROCm 可用
/opt/rocm/bin/rocminfo 2>/dev/null | grep "Name:"
# 5. 启动实际负载验证(以 llama.cpp Docker 为例)
cd /path/to/llama-docker && docker compose up -d
1 collapsed line
curl http://localhost:11890/v1/models

关键教训

  1. 先软后硬,但别在软件上死磕。lspci 空白时,再查驱动就是浪费时间。那一张决策矩阵比十个 Stack Overflow 帖子都管用。

  2. 内核升级是常见背锅侠,但未必是真凶。 用旧内核交叉验证,一条命令就能排除。

  3. NAS 放角落很久不动,震动、温差都可能导致接触不良。 物理重插的成本只有 5 分钟,值得放在排查链路最前面。

  4. 顺手清洁金手指,橡皮擦就行。 简单有效,不需要任何化学试剂。