问题陈述
在服务器上帮师姐做之前论文DiSCO的实验,生成数据时是需要cuda+cython加速的,在自己的台式机上测试是几十ms的操作,服务器上需要13s。
空中机器人与地面移动机器人的信息匹配具有几个难点:
- 空中机器人与地面移动机器人的感知视角差异较大。(Elevation Map -> 俯视图像)
- 空中与地面机器人携带异构的传感器,异构传感器匹配困难。(该方法 - 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
-