AMD 显卡突然"消失"?从软件到硬件的完整排查指南
前言
家里有一台 Intel NUC9,装了飞牛 fnOS 系统,插了一张 AMD RX 6600 独显,日常用 Docker 跑 llama.cpp + ROCm 做本地大模型推理。一直用得好好的,直到某天 ——
llama.cpp 启动报错了。上去一查,AMD 显卡凭空消失了。 系统里只剩下 Intel 核显 UHD 630,RX 6600 就像从来没插过一样。
接下来的排障过程从软件翻到硬件,最终找到真凶。把排查思路和命令整理出来,下次遇到类似问题可以直接照做。
第一阶段:软件排查
显卡不识别,大部分人的第一反应是” 驱动掉了”。先走完软件链路,确定不是配置问题再碰硬件。
1.1 内核模块有没有加载?
lsmod | grep amdgpu- 有输出 → amdgpu 驱动已加载,跳到 1.2
- 无输出 → 尝试手动加载:
sudo modprobe amdgpu如果 modprobe 报 Module not found,检查内核版本和驱动文件:
uname -rfind /lib/modules/$(uname -r) -name "amdgpu.ko*"找不到 .ko 文件说明当前内核没编译 amdgpu,需要换内核或重装驱动。
1.2 设备节点有没有创建?
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 总线上能不能看到显卡?
这是最关键的一步,直接决定问题在软件还是硬件:
lspci | grep -i vgalspci | grep -i amd正常输出示例(NUC9 + RX 6600):
00:02.0 VGA compatible controller: Intel Corporation ... UHD Graphics 63001:00.0 PCI bridge: Advanced Micro Devices, Inc. ... Navi 10 XL Upstream Port02:00.0 PCI bridge: Advanced Micro Devices, Inc. ... Navi 10 XL Downstream Port03:00.0 VGA compatible controller: Advanced Micro Devices, Inc. ... RX 66001.4 内核日志有没有报错?
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 系统会自动更新内核。如果问题恰好出现在一次重启后,检查是否换了内核:
uname -r # 当前内核ls -la /boot/vmlinuz* # 所有可用内核ls /lib/modules/ # 已安装的内核模块如果有旧内核,回滚试一下:在 GRUB 启动菜单选「Advanced options」→ 旧内核启动即可。
1.6 Docker 容器能不能看到 GPU?
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 有 AMD | amdgpu 已加载 | /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 显卡物理连接
-
重新插拔显卡:拔出 RX 6600,检查金手指有没有氧化发黑,用橡皮擦轻轻擦拭。重新插入,听到卡扣” 咔” 一声锁死才算到位。
-
检查 PCIe 供电线:RX 6600 需要一条 8pin(6 + 2),确认两端都插紧 —— 显卡端和电源端都要查。
-
换槽测试(如果有第二个 PCIe 槽):排除插槽本身损坏。
3.4 最小排除法
如果以上都不行,把显卡拆下来插到另一台机器上:
- 别的机器能认 → 问题在原机器的 PCIe 槽/电源/BIOS
- 别的机器也不认 → 显卡本身挂了
终局
重新插拔 RX 6600 后,lspci | grep -i amd 立刻输出四条设备信息。重启后 amdgpu 自动加载,/dev/kfd 出现,ROCm 推理恢复如初。
附录:修复后验证清单
# 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 -d1 collapsed line
curl http://localhost:11890/v1/models关键教训
-
先软后硬,但别在软件上死磕。 当
lspci空白时,再查驱动就是浪费时间。那一张决策矩阵比十个 Stack Overflow 帖子都管用。 -
内核升级是常见背锅侠,但未必是真凶。 用旧内核交叉验证,一条命令就能排除。
-
NAS 放角落很久不动,震动、温差都可能导致接触不良。 物理重插的成本只有 5 分钟,值得放在排查链路最前面。
-
顺手清洁金手指,橡皮擦就行。 简单有效,不需要任何化学试剂。