GPU 异常诊断与单卡复位方法

0 阅读2分钟

主机:(4×RTX 4090,WDDM 模式)

驱动版本:576.52,CUDA 12.9

异常症状识别

正常满载的 RTX 4090 应表现为:功耗 200–400W、温度 60–80°C、性能状态 P0。当 GPU 利用率很高但功耗/温度异常低时,需警惕 GPU 已陷入 TDR 崩溃-恢复循环(Timeout Detection & Recovery)。

对比表

指标正常满载GPU 1 异常表现根因
GPU 利用率80–100%100%驱动报告计算单元"忙碌",实际在崩溃循环中
FB 内存带宽利用率>50%0%显存控制器未做有效读写
功耗200–400W99W(TDP 450W)硬件层面无事可做
温度60–80°C39°C无真实热负载
性能状态P0P2被降级,非最高性能态
温度限制寄存器正值-7 / -2 / 0°C传感器读数被崩溃损坏
PCIe 吞吐视负载而定Tx 1.3 GB/s, Rx 1.2 GB/s大量无效数据搬运

确认诊断:查看 Windows 事件日志

wevtutil qe System /c:20 /rd:true /f:text /q:"*[System[Provider[@Name='nvlddmkm']]]"

关键事件 ID

事件 ID含义指示
153GPU 停止响应,触发 TDR 恢复密集爆发(本案例 15:36–15:37 共 18 次)→ 确认崩溃循环
13图形异常 / 驱动检测到故障崩溃后的残留错误

单 GPU 复位(无需重启整机)

原理

通过 Windows PnP(即插即用)接口禁用再启用目标 GPU 的物理设备,触发驱动重新初始化该 GPU,清空 CUDA context、复位传感器、恢复时钟。

步骤

1. 确认 GPU 未连接显示器

nvidia-smi -q -i 1 | findstr "Display"

输出应为:

Display Attached : No
Display Active   : Disabled

若 Display Attached = Yes,禁用设备可能导致屏幕黑屏,应先将屏幕转移到其它显卡。

2. 获取 GPU 的 PCI 总线编号

nvidia-smi --query-gpu=index,pci.bus_id --format=csv,noheader

示例输出:

0, 00000000:34:00.0
1, 00000000:36:00.0    ← GPU 1,总线 0x36 = 54 (十进制)
2, 00000000:9C:00.0
3, 00000000:9E:00.0

3. 匹配 PnP InstanceId

powershell -Command "
$devs = Get-PnpDevice -Class 'Display' -Status OK,Unknown |
    Where-Object { $_.FriendlyName -like '*NVIDIA*' }
foreach ($d in $devs) {
    $prop = Get-PnpDeviceProperty -InstanceId $d.InstanceId `
        -KeyName 'DEVPKEY_Device_LocationInfo' -ErrorAction SilentlyContinue
    Write-Host ('{0} | {1} | {2}' -f $d.Status, $d.InstanceId, $prop.Data)
}"

找到对应 PCI 总线的 InstanceId。例如 GPU 1(总线 54):

OK | PCI\VEN_10DE&DEV_2684&SUBSYS_16F310DE&REV_A1\6&2295E862&0&00180010 | PCI bus 54, device 0, function 0

4. 禁用设备

powershell -Command "
Disable-PnpDevice -InstanceId '<InstanceId>' -Confirm:`$false
"

5. 等待 3 秒,重新启用

powershell -Command "
Start-Sleep -Seconds 3
Enable-PnpDevice -InstanceId '<InstanceId>' -Confirm:`$false
"

6. 验证复位结果

nvidia-smi -i 1

预期结果:

  • 利用率 → 0%
  • 显存 → ~25 MiB(仅 DWM 占用)
  • 功耗 → 待机水平(~64W)
  • 性能状态 → P0 或 P8
  • 无残留计算进程

完整脚本

将以上步骤整合为单条命令(将 <InstanceId> 替换为实际值):

powershell -Command "
`$id = '<InstanceId>'
Disable-PnpDevice -InstanceId `$id -Confirm:`$false
Start-Sleep -Seconds 3
Enable-PnpDevice -InstanceId `$id -Confirm:`$false
Write-Host 'GPU reset complete. Verify with: nvidia-smi -i <index>'
"

注意事项

  • 仅限 Display Attached = No 的 GPU。若 GPU 连接显示器,禁用将导致黑屏。
  • 复位会断开该 GPU 上所有 CUDA context,正在运行的计算任务将丢失。