科研分享如何切换GPU以及如何在Tensorflow实验中节约GPU资源
Posted JinyuZ1996
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了科研分享如何切换GPU以及如何在Tensorflow实验中节约GPU资源相关的知识,希望对你有一定的参考价值。
大家跑深度学习进行科研的时候,单机的算力往往无法支持我们进行例如图神经网络、强化学习网络等复杂模型的训练任务。所以常常需要使用服务器的GPU来训练模型,但是多人共用的服务器该如何避免冲突呢?这里给出一段常用的代码可以方便大家在查看NVIDIA 显卡GPU的使用情况之后,合理的切换gpu来预防冲突,同时本文还介绍了如何降低模型显存消耗的办法,主要针对Tensorflow框架。
如何在多个GPU间进行选择
如图1所示,就是同时有两块儿NVIDIA显卡可用的情况。(如何查看请参考我的另一篇文章):【科研分享】监控服务器GPU、CPU和内存使用情况的方法(Windows和Liunix环境)_JinyuZ1996的博客-CSDN博客 最近在实验过程中发现,其实本来不太消耗资源的任务,由于Tensorflow的反人类默认设计也经常会直接独占一整块儿GPU的资源,而且独占那么多资源也还是一样的速度,没什么效率。然后去搜索了一下,找到了一些在用服务器跑代码的时候的小技巧和解决方案,给在这里用于自查:实时监控资源动态 大家的服务器一般都是Liunix系统较多,所以在这里普及一个常用的命令可以方便大家实时的查看GPU使用情况,防止互相占用的问题发生:watch -n 1 nvidia-smi 其中,-n后面的1是刷新速率https://blog.csdn.net/qq_39381654/article/details/115957538
其中,可以观察到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.
笔者也是站在巨人的肩膀上学习,有其他收获会在此补充,随时更新。
以上是关于科研分享如何切换GPU以及如何在Tensorflow实验中节约GPU资源的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow 2:如何将执行从 GPU 切换到 CPU 并返回?
TensorFlow 的 ./configure 在哪里以及如何启用 GPU 支持?