【发布时间】:2019-04-05 23:25:52
【问题描述】:
我有一个codebase,我尝试在其中复制 GAN 论文。我最近买了第二个 gpu,我正在尝试更新我的代码以利用额外的硬件。我尝试了 Tensorflow cifar10 multi-gpu example 中概述的方法。但是,当我使用 2 个 gpu 运行我的代码时,它并没有运行得更快,事实上,它比使用单个 gpu 运行时慢了大约 10%。查看资源管理器,它说我的两个 GPU 都以大约 50% 的容量运行。
我在 Windows 10 上运行,使用 python 3.7、TF 1.13。我正在使用 2 个 2080ti 和 2950 cpu。
我的第一个想法是我的输入管道有问题,所以我尝试了许多变体,例如使用多个数据迭代器、使用 tf.data.experimental.prefetch_to_device()、不输入我的潜在向量等. 没有任何影响,因为我的 CPU 使用率大约是 5%,我很确定我没有瓶颈。
我也尝试了一些不同的方法来设置塔的变量范围,但这没有帮助。
我还尝试将批量大小加倍,以防我没有通过 GPU 输入足够的数据,但这导致计算每个批量所需的时间增加了 2 倍,而 GPU 利用率相同,为 50%。
我的代码是here,相关部分是:
d_grads = []
g_grads = []
for i in range(FLAGS.num_gpus):
with tf.device('/gpu:{:d}'.format(i)):
with tf.variable_scope('D', reuse=tf.AUTO_REUSE):
Dx, Dx_logits = self.discriminator(xs[i], yxs[i])
with tf.variable_scope('G', reuse=tf.AUTO_REUSE):
G = self.generator(z[i], labels[i])
with tf.variable_scope('D', reuse=tf.AUTO_REUSE):
Dg, Dg_logits = self.discriminator(G, labels[i])
loss_d, loss_g = self.losses(Dx_logits, Dg_logits, Dx, Dg)
vars = tf.trainable_variables()
for v in vars:
print(v.name)
d_params = [v for v in vars if v.name.startswith('D/')]
g_params = [v for v in vars if v.name.startswith('G/')]
d_grads.append(d_adam.compute_gradients(loss_d, var_list=d_params))
g_grads.append(g_adam.compute_gradients(loss_g, var_list=g_params))
d_opt = d_adam.apply_gradients(average_gradients(d_grads))
g_opt = g_adam.apply_gradients(average_gradients(g_grads))
【问题讨论】:
标签: tensorflow