在使用服务器显卡的时候遇到的这个问题。一般来说,遇到这个问题,无非就是下边这几种原因和解决方案: 1、硬件设备不行,显存本身就不大,比如你本身就是3G的显存,或者几个G的显存,但是你得特征维度很多,batchsize设置的很大,这时候你可以通过调小batchsize来解决。 2、你得硬件设备没问题,例如你现在用的是服务器,有十多G的显存,这时候你发现跑着跑着就被kill掉了,明明在别的比这个配置低的机器都可以,但是在这个配置更好的服务器上就是不行。 这种原因大概都是因为你的代码没有指定GPU,而你的服务器默认找了默认的第一块显卡(逻辑编号),所以你们两个人在争夺使用这块显卡的资源,导致最终一个人的训练程序被杀死。 指定GPU有两种情况,一种是你可以通过nvidia-smi的命令,查看显卡逻辑编号,如下图: 这时候你会发现第一列‘Fan’其实就是显卡逻辑编号,你可以在代码中设置,或者是在运行代码时候指定,都可以。
os.environ['CUDA_VISIBLE_DEVICES'] = '1,2'
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
第二种就是在运行代码的时候指定,这是在第一种方式不好使的情况下,备选方案:
CUDA_VISIBLE_DEVICES=6 python your_code.py
CUDA_VISIBLE_DEVICES=1,2 python your_code.py
服务器结点指定GPU: 我们使用服务器结点的时候,往往一个结点,会有很多块GPU,而且都是通过qsub命令来提交脚本的,这个脚本大部分情况下只是指定的结点的逻辑编号,默认使用的是这个结点里面的0号GPU,所以,就会造成像前边说的,明明配置很高,但就是out of memory,说白了,就是使用了默认的gpu,你和别人在争夺GPU,或者你设置错了GPU结点编号,程序在训练时没找到对应的GPU。 这时候可以这样设置:(记得在提交的脚本中设置好服务器结点)
device = torch.device('cuda:1' if torch.cuda.is_available() else 'cpu')
qstat -f
3、网上说的提升pytorch版本,重装cuda toolkit,我有点搞不懂,这种问题为啥要去升级pytorch版本呢?升级了之后,岂不是对应的geometric以及很多依赖包,都得重新装???误人子弟!!! 升级pytorch版本的做法,只不过是高版本的pytorch对这些异常情况,进行了一定的处理,内部的做法基本和我前边说的基本差不多,但是重装的麻烦程度。。。可想而知。。。
|