【问题标题】:what's the difference between a ref edge and non-ref edge in tensorflow?张量流中的参考边缘和非参考边缘有什么区别?
【发布时间】:2017-03-05 03:16:58
【问题描述】:

正如标题所说,我想知道 TensorFlow 中“参考边缘”和“非参考边缘”之间的概念差异。

我正在阅读 TensorFlow 中的图形分区算法。 这里(line 826 of graph_partition.cc)是提到的评论 “非参考边缘”:

 825   // For a node dst, 'ref_recvs' remembers the recvs introduced by a ref
 826   // edge to dst. 'ref_control_inputs' remembers the inputs by a non-ref
 827   // edge to dst. We will add a control edge for every pair in
 828   // (ref_recvs x ref_control_inputs).
 829   std::vector<NodeDef*> ref_recvs;
 830   std::vector<string> ref_control_inputs;

有人可以更清楚地解释差异吗?非常感谢。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    在 TensorFlow 中,大多数边是“非参考”边,这意味着沿该边流动的值是一个常数。如果您将 TensorFlow 图中的顶点(操作)视为函数,您可以将非参考边视为表示函数参数,在 C 或 C++ 等传统编程语言中为 passed by value。例如,z = tf.matmul(x, y) 操作的输入和输出都是非参考边。

    TensorFlow 中的“参考边”允许沿该边流动的值发生变异。继续函数类比,一个 ref 边表示一个函数参数,它是 passed by reference(我们取名为“ref”边)。引用边最常见的用途是在tf.Variable 的当前内部实现中:内部Variable kernel 拥有一个可变缓冲区,并在引用边上输出对该缓冲区的引用。诸如tf.assign(var, val) 之类的操作期望它们的var 参数沿引用边缘传递,因为它们需要改变var 中的值。

    图分割算法特别对待 ref 边,因为它们对应的值可能会随着图的执行而改变。由于非参考边是一个常数值,TensorFlow 可以假设跨两个设备的同一操作中的所有非参考边都可以组合成一条边,从而节省网络/内存带宽。由于 ref 边上的值可能会发生变化(例如,如果变量在步骤中间更新),TensorFlow 必须小心不要合并边,以便远程设备可以看到新值。与 C/C++ 类比,TensorFlow 图分区器将 ref-edge 视为代表 volatile 变量,以进行优化。

    最后,从上面的解释中可以看出,参考边非常复杂,并且正在努力将它们从 TensorFlow 执行模型中移除。替代品是“资源类型边”,它允许非张量值沿边流动(统一变量、队列、读取器和 TensorFlow 中的其他复杂对象),以及将可变资源作为输入并读取其的显式操作值(作为非参考输出边沿)。新“资源变量”的实现可见here in Pythonhere in C++

    【讨论】:

    • 资源类型边是否提高了性能?或者只是避免原始设计的复杂性?并感谢您的回答。
    • 一开始它们应该对性能保持中立,但通过简化内存模型(并使更多张量成为只读),将来应该可以进一步优化图表。
    • 我对将更多张量设为只读感到困惑。据我所知(来自stackoverflow),在人们进行培训时发生了许多内存不足的情况。并且使更多的张量只读表示使用了更多的内存。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多