caicloud / tensorflow-tutorial

Example TensorFlow codes and Caicloud TensorFlow as a Service dev environment.
2.93k stars 2.08k forks source link

第10章第三小节:多GPU并行的问题 #35

Closed skx300 closed 7 years ago

skx300 commented 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.

perhapszzy commented 7 years ago

同步模式的“同步”指的不是同时调用,而是指的同时更新参数

skx300 commented 7 years ago

谢谢泽宇。这里feed给每个GPU的数据都是一样的吗?

perhapszzy commented 7 years ago

数据需要是不一样的,否则每一个GPU算出来的梯度就是一样的了