大家跑深度学习进行科研的时候,单机的算力往往无法支持我们进行例如图神经网络、强化学习网络等复杂模型的训练任务。所以常常需要使用服务器的GPU来训练模型,但是多人共用的服务器该如何避免冲突呢?这里给出一段常用的代码可以方便大家在查看NVIDIA 显卡GPU的使用情况之后,合理的切换gpu来预防冲突,同时本文还介绍了如何降低模型显存消耗的办法,主要针对Tensorflow框架。

如何在多个GPU间进行选择


device多个GPU gpu有两个怎么利用_服务器

图1:一个服务器中存在多块GPU可用的情况

  如图1所示,就是同时有两块儿NVIDIA显卡可用的情况。(如何查看请参考我的另一篇文章):【科研分享】监控服务器GPU、CPU和内存使用情况的方法(Windows和Liunix环境)_JinyuZ1996的博客  最近在实验过程中发现,其实本来不太消耗资源的任务,由于Tensorflow的反人类默认设计也经常会直接独占一整块儿GPU的资源,而且独占那么多资源也还是一样的速度,没什么效率。然后去搜索了一下,找到了一些在用服务器跑代码的时候的小技巧和解决方案,给在这里用于自查:实时监控资源动态  大家的服务器一般都是Liunix系统较多,所以在这里普及一个常用的命令可以方便大家实时的查看GPU使用情况,防止互相占用的问题发生:watch -n 1 nvidia-smi  其中,-n后面的1是刷新速率

  其中,可以观察到gpu_num的编号为0和1。那么通常为了避免冲突,我们选择空闲的那一块儿来进行使用(如图所示卡0目前正在被使用,此时正准备跑实验的我们应该选择适用卡1),则只需要输入代码:

os.environ['CUDA_VISIBLE_DEVICES'] = '0'

  该行代码后面的编号为几就是用第几号卡。如果该编号下的GPU资源耗尽或编号越界情况的话,则会返回找不到device的log.到时候再进行调整就行了,建议跑代码的时候挂一个watch,随时观察GPU的占用情况。

如何节约GPU显存占用

  Tensorflow默认会让一个任务占用整个GPU的所有显存资源,但事实上算上笔者的强化学习项目,也不会占用那么多资源。举例来说,笔者的卡有24G显存,本质只需要其中301M,但每次跑代码上来就先把23.9G申请下来留着用,这是非常浪费的。而且效率也没有任何提升,于是通过查找,我在大佬博客里发现了一种可以动态调整GPU消耗的方法:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True

  如果上述方法无效,也可以写作:

gpu_options = tf.GPUOptions(allow_growth=True)  
config = tf.ConfigProto(gpu_options=gpu_options)

 当我们配置好了这个Config的时候还需要将它应用到Tensorflow中去,需要在Sess执行的时候加入Config,例如:

with tf.Session(config=config) as sess:

  但其实动态分配GPU显存也有其本身的弊端,它的策略不再是上来就申请独占,而是刚一开始先分配少量的GPU显存给任务,然后按需慢慢的增加,由于不会释放内存,所以会导致碎片显存占用的产生,也就是说在你的Task结束前,被占用的显存都不会释放,而如果卡内其他空间已经被其他人占用了,你的任务却还需要更多的显存时,你的task会因为显存不足而shut.    

  笔者也是站在巨人的肩膀上学习,有其他收获会在此补充,随时更新。