【问题标题】:Is it possible to split a network across multiple GPUs in tensorflow?是否可以在张量流中跨多个 GPU 拆分网络?
【发布时间】:2016-03-30 15:55:10
【问题描述】:

我计划运行一个非常大的循环网络(例如 2048x5),是否可以在 tensorflow 中在一个 GPU 上定义一层?我应该如何实现模型以达到最佳效率。我了解 GPU 间或 GPU-CPU-GPU 通信存在开销。

【问题讨论】:

  • here 是说明。 here 就是一个例子。数据并行比功能并行容易得多。
  • 我了解 with tf.device() 的用法。但是,在我在不同的 GPU 上定义层之后,我发现渐变仍然存储在第一个 GPU 上。你能举一个在不同 GPU 上分割梯度计算的具体例子吗?
  • 您也可以在构建模型时尝试将colocate_gradients_with_ops=True 传递给optimizer.minimize() 方法。
  • @mrry 它有效!现在我看到计算是均匀分布的。
  • 你应用 clip_by_norm 的情况怎么样——你如何确保每个 gpu 剪辑各自的梯度,这样你就不会浪费时间来回传输张量?

标签: python neural-network tensorflow


【解决方案1】:

在 TensorFlow 中跨多个 GPU 拆分大型模型当然是可能的,但以最佳方式进行拆分是一项艰巨的研究问题。一般来说,您需要执行以下操作:

  1. 将代码的大块连续区域包装在 with tf.device(...): 块中,命名不同的 GPU:

    with tf.device("/gpu:0"):
      # Define first layer.
    
    with tf.device("/gpu:1"):
      # Define second layer.
    
    # Define other layers, etc.
    
  2. 在构建优化器时,将可选参数 colocate_gradients_with_ops=True 传递给 optimizer.minimize() 方法:

    loss = ...
    optimizer = tf.train.AdaGradOptimizer(0.01)
    train_op = optimizer.minimize(loss, colocate_gradients_with_ops=True)
    
  3. (可选。)如果您的模型中的任何操作无法在 GPU 上运行,您可能需要在创建 tf.Session 时在 tf.ConfigProto 中启用“软放置”:

    config = tf.ConfigProto(allow_soft_placement=True)
    sess = tf.Session(config=config)
    

【讨论】:

  • 我在 2 个 GPU 上运行我的网络,前向和后向计算都分布在 2 个 GPU 上。然而,经过几个小时的训练,我发现 GPU 利用率真的很低。我发现队列占用率(队列中的# 个批次)为 0,这意味着队列没有足够快地填充。我正在使用线程将数据泵入队列。我应该明确定义 CPU 上的队列、入队和出队操作吗?
  • 是的,我们发现将输入管道固定到 CPU 以提高我们模型训练的整体性能(否则您会受到可以在 CPU 上运行的输入管道部分的干扰)。跨度>
  • “将输入管道固定到 CPU”,请您详细说明一下吗?
  • 您将使用with tf.device("/cpu:0"): 块来包装输入管道中操作的构造。
  • 使用这种“深度”方法而不是将批次分成更小的方法有什么区别?我有一种感觉,这里的内存效率更高,因为我不必将相同的网络复制到每个 GPU。如果是这样,为什么 keras/tensorflow 实现了towers
猜你喜欢
  • 2018-05-05
  • 2017-05-01
  • 2018-04-18
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多