Python 是否可以在tensorflow中跨多个GPU拆分网络?
我计划运行一个非常大的循环网络(例如2048x5),是否可以在tensorflow的一个GPU上定义一个层?我应该如何实施该模型以实现最佳效率。我知道GPU之间或GPU-CPU-GPU之间的通信会有开销。在TensorFlow中,跨多个GPU拆分大型模型当然是可能的,但如何优化这一点是一个很难研究的问题。通常,您需要执行以下操作:Python 是否可以在tensorflow中跨多个GPU拆分网络?,python,neural-network,tensorflow,Python,Neural Network,Tensorflow,我计划运行一个非常大的循环网络(例如2048x5),是否可以在tensorflow的一个GPU上定义一个层?我应该如何实施该模型以实现最佳效率。我知道GPU之间或GPU-CPU-GPU之间的通信会有开销。在TensorFlow中,跨多个GPU拆分大型模型当然是可能的,但如何优化这一点是一个很难研究的问题。通常,您需要执行以下操作: 将代码的大型连续区域包装在一个块中,命名不同的GPU: with tf.device("/gpu:0"): # Define first layer. with
with tf.device("/gpu:0"):
# Define first layer.
with tf.device("/gpu:1"):
# Define second layer.
# Define other layers, etc.
colocate\u gradients\u with\u ops=True
传递给方法:
tf.ConfigProto
中启用“软放置”:
config = tf.ConfigProto(allow_soft_placement=True)
sess = tf.Session(config=config)
这是说明书。这就是一个例子。数据并行比函数并行容易得多。我了解with tf.device()的用法。然而,在我定义了不同GPU上的层之后,我发现梯度仍然存储在第一个GPU上。你能给出一个在不同GPU上分割梯度计算的具体例子吗?在构建模型时,你也可以尝试将
colocate\u gradients\u with\u ops=True
传递给optimizer.minimize()
方法。@mrry它能工作!现在,我看到计算是均匀分布的。如果你应用clip\u by\u norm
,你如何确保每个gpu剪裁各自的梯度,这样你就不会浪费时间来回传输张量?我在2个gpu上运行我的网络,正向和反向计算都分布在2个gpu上。然而经过几个小时的训练,我发现GPU的利用率真的很低。我发现队列占用率(#队列中的批次)为0,这意味着队列填充不够快。我正在使用线程将数据泵入队列。我是否应该明确定义CPU上的队列、排队和出列操作?是的,我们发现将输入管道固定到CPU可以提高模型训练的整体性能(否则会受到可以在CPU上运行的输入管道部分的干扰)。“将输入管道固定到CPU”,你能再详细一点吗?你会使用一个和tf.device(“/cpu:0”):
块在输入管道中包装ops的构造。使用这种“深度”方法而不是将批分割成更小的批有什么区别?我觉得这里的内存效率更高,因为我不必将相同的网络复制到每个GPU。如果是这样,为什么keras/tensorflow实施了塔楼
?
config = tf.ConfigProto(allow_soft_placement=True)
sess = tf.Session(config=config)