是否可以在tensorflow中跨多个GPU拆分网络?

rea*_*ead 9 python neural-network tensorflow

我计划运行一个非常大的循环网络(例如2048x5),是否可以在张量流中的一个GPU上定义一个层?我应该如何实施该模型以实现最佳效率.据我所知,GPU间或GPU-GPU-GPU通信存在开销.

mrr*_*rry 19

在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.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 构建优化程序时,将可选参数传递colocate_gradients_with_ops=Trueoptimizer.minimize()方法:

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

    config = tf.ConfigProto(allow_soft_placement=True)
    sess = tf.Session(config=config)
    
    Run Code Online (Sandbox Code Playgroud)

  • 使用这种“深度”方法而不是将批次分成较小的批次有什么区别?我有 ** 感觉** 这里的内存效率更高,因为我不必将相同的网络复制到每个 GPU。如果是这样,为什么 keras/tensorflow 实现了 `towers`? (2认同)