Tensorflow-GPU相关设置问题

这几天遇到多GPU跑Tensorflow代码问题,主要涉及两个问题,组里老大给讲解后整理如下:
1、为什么普通代码,直接指定多个GPU,训练速度没有提升?
默认tensorflow会占用所有卡的所有显存,所以要指定卡和每张卡的占用量,比如你指定两张卡,默认情况下,两张卡上都会有模型参数,同一份数据会送到两张卡上进行运算,做重复的工作
2、如何使用多个GPU进行运算?
如果要使用两张卡训练,提高效率,就要给两张卡分别送不同的数据,而且要对两张卡计算的梯度进行合并,然后通过反向传播更新两张卡的参数
3、但GPU出现OOM内存溢出问题,直接增加GPU个数,为什么不能解决问题
拿单卡的代码,直接用多张卡,完全不会增加内存,反而可能会造成OOM等一些奇怪的bug,所以千万不要出现OOM就加显卡。先尝试调整参数量,如bitch_size,hidden_size等

os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' 备注:使用 GPU 0,1

下面介绍设置GPU设置的相关操作:

1、查看GPU使用情况

nvidia-smi #查看GPU此时的使用情况
watch nvidia-smi #实时返回GPU使用情况

2、指定GPU训练

方法一、在python程序中设置:

os.environ['CUDA_VISIBLE_DEVICES'] = '0' #备注:使用 GPU 0
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' #备注:使用 GPU 0

方法二、在执行python程序时候:
下面命令是在批量处理文件中的方法,比如linux中的.sh文件,win的bat文件。

#备注:'='的左右不允许有空格
CUDA_VISIBLE_DEVICES=2 python yourcode.py
CUDA_VISIBLE_DEVICES=0,1 python yourcode.py

方法三、推荐

#config的GPUOptions中的visible_device_list可以定义GPU编号从visible到virtual的映射
#即可以设置tensorflow可见的GPU device,从而全局设置了tensorflow可见的GPU编号
config = tf.ConfigProto()
config.gpu_options.visible_device_list="0"
config.gpu_options.visible_device_list = str(device_num) #device_num:卡的标号

3.两种限定GPU占用量的方法:

#log_device_placement = True:是否打印设备分配日志
#allow_soft_placement = True:如果指定的设备不存在,允许TF自动分配设备
tf.ConfigProto(log_device_placement = True, allow_soft_placement = True)
config.gpu_options.allow_growth = True #使用allow_growth option,刚一开始分配少量的GPU容量,然后按需慢慢的增加,由于不会释放内存,所以会导致碎片
config.gpu_options.per_process_gpu_memory_fraction = 0.5 # 设置每个GPU应该拿出多少容量给进程使用,0.5代表50%

你可能感兴趣的:(深度学习)