TensorFlow多GPU并行的实现

来源:互联网 发布:php导出excel表格乱码 编辑:程序博客网 时间:2024/05/19 00:14

深度学习算法由于数据量非常大、算法复杂度高等特点,常常需要采用并行机制。
常用的并行化深度学习模型训练方式有两种:同步模式和异步模式。

深度模型训练方法

深度学习模型的训练是一个迭代的过程,在每一轮迭代过程中,前向传播算法会根据当前参数的取值,计算出在一小部分训练数据上的预测值,然后反向传播算法,再根据损失函数计算参数的梯度并且更新参数。
这里写图片描述

异步模式训练方法

在并行化地训练深度学习模型时,不同设备(GPU或CPU)可以再不同训练数据上,运行整个迭代的过程,而不同并行模式的区别在于不同的参数更新方式。
异步模式训练流程图如下:
这里写图片描述
* 在每一轮迭代时,不同设备会读取参数最新的取值
* 因为设备不同,读取参数取值时间不一样,所以得到的值也可能不一样
* 根据当前参数的取值,和随机获取的一小部分训练数据,不同设备各自运行反向传播的过程,并且独立地更新参数
* 可以认为异步模式,就是单机模式复制了多份,每一份使用不同的训练数据进行训练。
* 在异步模式下,不同设备之前是完全独立的

同步模式训练方法

在同步模式下,所有的设备同时读取参数的取值,并且当反向传播算法完成之后同步更新参数的取值,单个设备不会单独对参数进行更新,而会等所有设备都完成反向传播之后再统一更新参数。
同步模式训练流程图如下:
这里写图片描述
* 图中在迭代每一轮时,不同设备首先统一读取当前参数的取值,并随机获取一小部分数据
* 然后在不同设备上运行反向传播过程得到在各自训练数据上的参数的梯度
* 注意:虽然所有设备使用的参数是一致的,但是因为训练数据不同,所以得到的参数的梯度可能不一样
* 当所有设备完成反向传播的计算之后,需要计算出不同设备上参数梯度的平均值
* 最后再根据平均值对参数进行更新

同步/异步优劣比较

  • 同步模式解决了异步模式中存在的参数更新问题,然而同步模式的效率却低于异步模式
  • 在同步模式下,每一轮迭代都需要设备统一开始、统一结束
  • 如果设备的运行速度不一致,那么每一轮训练都需要等待最慢的设备结束才能开始更新参数,于是很多时间将被花在等待上
  • 虽然理论上异步模式存在缺陷,但是因为训练深度学习模型时,使用的随机梯度下降本身就是梯度下降的一个近似解法,而且即使是梯度下降也无法保证达到全局最优
  • 所以在实际应用中,相同时间内,使用异步模式训练的模型不一定比同步模式差

代码示例

#将神经网络的优化过程跑在不同的GPU上for i in range(N_GPU):    with tf.debice('/gpu:%d'%i)        with tf.name_scope('GPU_%d'%i) as scope:            cur_loss = get_loss(x,y_regularizer,scope)            #tf.get_variable的命名空间            tf.get_variable_scope().reuse_variables()            #使用当前gpu计算所有变量的梯度            grads= opt.compute_gradients(cur_loss)            tower_grads.append(grads)#计算变量的平均梯度grads = average_gradients(tower_grads)#使用平均梯度更新参数apply_gradient_op = opt.apply_gradients(grads,global_step = global)
原创粉丝点击