Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在tensorflow中跨多个GPU拆分网络?_Python_Neural Network_Tensorflow - Fatal编程技术网

Python 是否可以在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

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

在TensorFlow中,跨多个GPU拆分大型模型当然是可能的,但如何优化这一点是一个很难研究的问题。通常,您需要执行以下操作:

  • 将代码的大型连续区域包装在一个块中,命名不同的GPU:

    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
    传递给方法:

  • (可选)如果您的模型中的任何操作无法在GPU上运行,您可能需要在创建时在
    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)