在Ubuntu系统下进行模型训练会出现显卡突然消失的情形,有许多帖子说出现这个问题是由于显卡过热,或者驱动程序造成的,只要降低功率,提高散热效率就可以解决过热问题。更新驱动就可以解决第二个问题。但是,显卡的丢失往往并非是因为上述原因造成的。需要进行分析才能得出结论,继而找出相应的处理方法。今天我们用实例来分享分析过程。
硬件平台:AMD R7 内存16GB 固态:1T 迷你主机
雷蛇外置显卡坞 TITAN RTX 显卡
软件环境:Ubuntu22.04 CUDA12.3 VULKAN Pytorch C++
故障描述:系统在运行一段时间后会停止。查看信息显示没有显卡。出此之外,系统都运行正常。
首先,我们需要考虑的是,机器是否因为环境影响造成灰尘堆积是的金手指氧化接触不良,引发偶然故障,其次有是不是因为过载运行,并且热量散发不出去造成温度过高,硬件自我保护而产生的故障,第三是否是因为驱动程序bug问题造成的该问题。于是我们开始按照上面的构思进行排查。
经过除尘,清理、降低功率、提高散热、更新驱动、升级操作系统之后我们开始新一轮测试,但是在运行6个小时后依然出现显卡丢失的问题。由于可以看出,显卡的丢失是一个比较深层次的原因,需要从底层入手排查。
排查流程:
执行:
nvidia-smi -pm 1
Persistence mode is already Enabled for GPU 00000000:06:00.0.
All done.
查看显卡运行日志确认是否过热保护造成显卡丢失
执行命令:nvidia-smi -q -l 2 -d TEMPERATURE -f nvidiatemp.log
调整显卡的性能,降低功率
nvidia-smi -pl 200
提高显卡转速后台记录日志
nohup sudo $(which coolgpus) --speed 100 100 &
输出内核启动环境信息
键入:vim /var/log/syslog
可以看到系统已经加载了eGPU,但是,提示出许多错误信息如下所示:
Nov 23 23:56:57 MINML kernel: [ 9418.843994] pcieport 0000:00:03.1: AER: Corrected error received: 0000:05:01.0
Nov 23 23:56:57 MINML kernel: [ 9418.844009] pcieport 0000:05:01.0: PCIe Bus Error: severity=Corrected, type=Data Link Layer, (Receiver ID)
Nov 23 23:56:57 MINML kernel: [ 9418.844013] pcieport 0000:05:01.0: device [8086:15da] error status/mask=00000080/00002000
Nov 23 23:56:57 MINML kernel: [ 9418.844018] pcieport 0000:05:01.0: [ 7] BadDLLP
由此可以断定,系统在运行时PCI总线错误,因此,我们查看一下系统加载内核信息。
键入
dmesg
显示如下信息:
Nov 23 23:56:57 MINML kernel: [ 9418.887698] pcieport 0000:05:01.0: [ 7] BadDLLP
Nov 23 23:56:57 MINML kernel: [ 9419.054679] pcieport 0000:00:03.1: AER: Corrected error received: 0000:05:01.0
Nov 23 23:56:57 MINML kernel: [ 9419.054697] pcieport 0000:05:01.0: PCIe Bus Error: severity=Corrected, type=Data Link Layer, (Receiver ID)
Nov 23 23:56:57 MINML kernel: [ 9419.054701] pcieport 0000:05:01.0: device [8086:15da] error status/mask=00000080/00002000
键入 lspci -D
0000:00:03.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 14cd
由此我们可以看出,是AMD的PCI网桥出现问题,
在信息中我们看到 AER:Corrected error received: 0000:05:01.0说明是pci 校验错误引起的。
系统在运行中PCI边带信号校验发生错误时,会造成数据传输重传,若传输时间超过时钟周期,就会出现通信异常,使得eGPU与计算机传输中断,从而使得显卡在无任何信息输出时突然消失,至此我们找到了信息根源。
解决方法:
1. `sudo vim /etc/default/grub`
2. 编辑grub。 在`GRUB_CMDLINE_LINUX_DEFAULT`末尾添加`pci=noaer`
`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=noaer"` 或者 pci=nomsi
3. `sudo update-grub`
4. 马上重启
什么是 nomsi与noaer呢?
简而言之,`nomsi`禁用[MSI](https://en.wikipedia.org/wiki/Message_Signaled_Interrupts)(从硬件到内核的信号中断的特殊方式,如果我没记错的话)并`noaer`禁用[高级错误报告](https://www.kernel.org/doc/Documentation/PCI/pcieaer-howto.txt)。我怀疑高级错误报告会导致启动问题。我的猜测是有些硬件没有很好地实现 MSI,或者内核无法使用 MSI 与该硬件通信,但这只是一个猜测。
nomsi [MSI] 如果启用了 PCI_MSI 内核配置参数,则此内核引导选项可用于在系统范围内禁用 MSI 中断。
noaer [PCIE] 如果启用了 PCIEAER 内核配置参数,此内核引导选项可用于禁用 PCIE 高级错误报告的使用。
至此,我们对显卡丢失的问题分析完毕,关于AER错误方面的知识请参见下文
引用地址
https://zhuanlan.zhihu.com/p/613945823?utm_id=0