控制依赖关系

在某些情况下,即使所有依赖的操作都已执行,推迟对操作的求值可能也是明智之举。例如,如果它使用大量内存,但在图形中只需要更多内存,则最好在最后一刻对其进行求值,以避免不必要地占用其他操作可能需要的 RAM。 另一个例子是依赖位于设备外部的数据的一组操作。 如果它们全部同时运行,它们可能会使设备的通信带宽达到饱和,并最终导致所有等待 I/O。 其他需要传递数据的操作也将被阻止。 顺序执行这些通信繁重的操作将是比较好的,这样允许设备并行执行其他操作。

推迟对某些节点的求值,一个简单的解决方案是添加控制依赖关系。 例如,下面的代码告诉 TensorFlow 仅在求值完ab之后才求值xy

  1. a = tf.constant(1.0)
  2. b = a + 2.0
  3. with tf.control_dependencies([a, b]):
  4. x = tf.constant(3.0)
  5. y = tf.constant(4.0)
  6. z = x + y

显然,由于z依赖于xy,所以求值z也意味着等待ab进行求值,即使它并未显式存在于control_dependencies()块中。 此外,由于b依赖于a,所以我们可以通过在[b]而不是[a,b]上创建控制依赖关系来简化前面的代码,但在某些情况下,“显式比隐式更好”。

很好!现在你知道了:

  • 如何以任何您喜欢的方式在多个设备上进行操作
  • 这些操作如何并行执行
  • 如何创建控制依赖性来优化并行执行

是时候将计算分布在多个服务器上了!