记一次服务器GPU问题

"工作记录"

Posted by xxc on August 18, 2021

问题陈述

在服务器上帮师姐做之前论文DiSCO的实验,生成数据时是需要cuda+cython加速的,在自己的台式机上测试是几十ms的操作,服务器上需要13s。

空中机器人与地面移动机器人的信息匹配具有几个难点:

  1. 空中机器人与地面移动机器人的感知视角差异较大。(Elevation Map -> 俯视图像)
  2. 空中与地面机器人携带异构的传感器,异构传感器匹配困难。(该方法 - DPCN)

发现问题

首先想到可能是GPU显存占满了,因为一个师弟最近一直在训练,于是nvidia-smi查看了一下gpu状态。

此时发现nvidia-smi特别慢,要7s+才能显示,显示后发现原本4块卡的服务器只有3块在线。

想到可能是因为显卡驱动的问题。询问师弟训练情况,说没什么问题,线索断了。

重启试一下呗,重启后依然有问题,nvidia-smi还是很慢但是比以前快一些3s+,4块卡倒是全了。说明驱动应该没什么毛病。测试一下DiSCO的操作,需要3s+,与nvidia-smi的延迟相关。说明可能就是nvidia-smi的加载导致了程序的延迟。

查了一下GPU驱动会有应用启动延迟:由于ECC清理行为,触发GPU初始化的应用程序可能会导致每个GPU短暂(1-3秒的数量级)启动成本。如果GPU已初始化,则不会进行清理。这个启动成本时间和出现的情况大致一致。找到了问题。

解决问题

Linux在默认情况下会启用X模式,即在GPU上运行一个/usr/lib/xorg/Xorg进程,使得GPU驱动程序从计算机启动到关闭都保持活动状态。在没有长期存在的类似X的客户端维护目标GPU句柄的情况下,每次目标GPU应用程序启动和停止时,驱动程序都会初始化和取消初始化目标GPU。在HPC环境中,这种情况非常普遍。由于在这种情况下通常需要使GPU初始化,因此会导致一定的加载延迟。为了避免这类情况,NVIDIA提供了两种更改驱动程序行为的选项: 持久模式(传统)和持久守护程序。

  • 持久模式 (传统方式 - 不推荐)

    • nvidia-smi -i <target gpu> -pm ENABLED
          Enabled persistence mode for GPU <target gpu>.
          All done.
      
  • 持久性守护程序

    • nvidia-persistenced --user foo
      nvidia-smi -pm 0