TensorFlow操作的意义是'IsExpensive()`?

Pat*_*wie 14 c++ tensorflow

有一种方法OpKernel

 // Returns true iff this op kernel is considered "expensive". The
 // runtime may use this flag to optimize graph execution for example
 // to "inline" inexpensive kernels.
 virtual bool IsExpensive() { return expensive_; }
Run Code Online (Sandbox Code Playgroud)

似乎默认情况下GPU上的所有操作都被认为是便宜的,而CPU,SYSL被标记为昂贵.

要弄清楚它的定义和效果有点难expensive.指南中没有信息.

  1. 什么时候IsExpensive应该有什么具体的指导方针false, true
  2. 如果操作标记为昂贵,会有什么影响?到目前为止,我只能说,活动分析使用它作为提示 ?查询此属性的唯一位置是在调度程序中,但没有解释内联的含义.
  3. 与"1"结合使用 我应该在我的自定义操作中关注它吗?
  4. 虽然它是有道理的,任何AsyncOp(像RemoteFusedGraphExecuteOp)昂贵,MPIAllgatherOp似乎被定义为不昂贵.这不是矛盾吗?

我问,因为IdentityOp明确标记为便宜.我想知道,如果我应该在我的自定义操作中覆盖此方法,因为每个CPU版本(甚至任何自定义代码)都被标记为昂贵.

XLA的整个逻辑似乎是关于指令是否昂贵.所以它可能是一个需要考虑的重要部分.因此,关于真/假的抛硬币可能不是决定我的自定义操作中的返回值的最佳方法.

use*_*999 9

在回答您的问题之前,我认为值得尝试了解TensorFlow如何使用线程来完成您的工作.为此,我建议你阅读这篇相关且非常好的SO帖子.

您会发现TensorFlow使用线程池来完成工作.昂贵的Ops被安排在线程池上执行,而廉价的Ops被执行"内联"意味着由调度任务的同一个线程执行(旁注:从您链接的源文件中找到只有一个例外,即如果inline_ready队列为空,则线程可以自己执行最后一个昂贵的Op.).

考虑到这一点,让我们尝试回答您的问题.

  1. 当IsExpensive应该是假的,是否有任何具体的指导,是真的吗?

我在TensorFlow手册中找不到具体的指导方针,但是,从我们上面讨论的内容开始,Op应该标记为昂贵的,当调度任务到线程池的偏移量与时间相比时可以忽略不计.任务需要执行.

  1. 如果操作标记为昂贵,会有什么影响?到目前为止,我只能说,活动分析使用它作为提示?查询此属性的唯一位置是在调度程序中,但没有解释内联的含义.

效果如下,每次Ops IsExpensive方法返回时,false它可能被推送到inline_ready队列并可能阻止线程执行进一步的任务,从而停止您的程序.相反,如果Ops IsExpensive方法返回true,它将被调度在线程池上执行,并且调度线程可以继续在进程循环中继续执行其任务.

  1. 与"1"结合使用 我应该在我的自定义操作中关注它吗?

我认为你应该关心并尝试尽可能多地推断你的执行时间.之后决定如何实现该IsExpensive方法.

  1. 虽然有意义,任何AsyncOp(如RemoteFusedGraphExecuteOp)都很昂贵,MPIAllgatherOp似乎被定义为并不昂贵.这不是矛盾吗?

不,这不是矛盾.如果您阅读评论,MPIAllgatherOp您会发现以下内容:

// Although this op is handled asynchronously, the ComputeAsync call is
// very inexpensive. It only sets up a CollectiveOpRecord and places it
// in the table for the background thread to handle. Thus, we do not need
// a TF pool thread to perform the op.
Run Code Online (Sandbox Code Playgroud)

这清楚地表明,为线程池安排此任务几乎只是开销.因此,内联执行它很有意义.