我在Tensorflow中遇到了两个数据并行性的例子。
1)CIFAR-10示例:https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10_multi_gpu_train.py#L65
2)有效的Tensorflow https://github.com/vahidk/EffectiveTensorflow
正如我在[1]中所理解的那样,我们为每个GPU创建一个新模型副本,然后收集并最小化损失 在[2]中,我们将一个小批量分解成不同GPU的块。
[2]似乎对我来说更简单。
一种方法比另一种方法有什么优势吗?
答案 0 :(得分:0)
两种实现都使用与minibatch相同的并行化方式。在两者中,每个gpu都有自己的模型图,但是id> = 1的所有gpus都获得了reuse=True
的变量范围,因此所有gpu都可以处理相同的变量。
第170行的[1]中的循环几乎与[2]中for i in range(num_gpus):
函数内的循环make_parallel
相同。唯一的区别是[1]将tf.train.AdamOptimizer(0.1).minimize(tf.reduce_mean(loss))
分为先获得渐变(第187行为opt.compute_gradients
),然后在并行循环(opt.apply_gradients
第205行)之后应用它们。他们这样做是为了在应用之前平均一个小批量的所有梯度。