Closed skx300 closed 7 years ago
文章中说此节用的是同步模式来训练神经网络。根据前一小节的介绍,如果我没理解错的话,同步模式为所有的GPU同时读取参数的取值,之后根据所有的GPU得到的更新参数或者是梯度来计算平均值,然后再更新参数。这里的GPU运行应该没有先后顺序的吧。
下面是10.3小节中的代码片段
# 将神经网络的优化过程跑在不同的GPU上。 for i in range(N_GPU): # 将优化过程指定在一个GPU上。 with tf.device('/gpu:%d' % i): with tf.name_scope('GPU_%d' % i) as scope: cur_loss = get_loss(x, y_, regularizer, scope, reuse_variables) # 在第一次声明变量之后,将控制变量重用的参数设置为True。这样可以让不同 # 的GPU更新同一组参数。注意tf.name_scope函数不会影响tf.get_variable # 的命名空间。 reuse_variables = True # 使用当前GPU计算所有变量的梯度。 grads = opt.compute_gradients(cur_loss) tower_grads.append(grads)
这里使用了for循环来调用GPU。for循环的运行机制是一步一步循环下去,这样的话,这里的GPU调用就是相当于先调用第一个GPU,第一个GPU调用完成之后再调用第二个GPU,之后再调用第三个GPU。如此往复地一一调用GPU下去。但是同步模式的训练不应该是没有这种顺序的么?是不是应该一起同时调用4个GPU?
还有,感觉这里每个GPU使用的都是相同的输入x.
同步模式的“同步”指的不是同时调用,而是指的同时更新参数
谢谢泽宇。这里feed给每个GPU的数据都是一样的吗?
数据需要是不一样的,否则每一个GPU算出来的梯度就是一样的了
文章中说此节用的是同步模式来训练神经网络。根据前一小节的介绍,如果我没理解错的话,同步模式为所有的GPU同时读取参数的取值,之后根据所有的GPU得到的更新参数或者是梯度来计算平均值,然后再更新参数。这里的GPU运行应该没有先后顺序的吧。
下面是10.3小节中的代码片段
这里使用了for循环来调用GPU。for循环的运行机制是一步一步循环下去,这样的话,这里的GPU调用就是相当于先调用第一个GPU,第一个GPU调用完成之后再调用第二个GPU,之后再调用第三个GPU。如此往复地一一调用GPU下去。但是同步模式的训练不应该是没有这种顺序的么?是不是应该一起同时调用4个GPU?
还有,感觉这里每个GPU使用的都是相同的输入x.