有一种方法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.指南中没有信息.
IsExpensive应该有什么具体的指导方针false, true?AsyncOp(像RemoteFusedGraphExecuteOp)昂贵,MPIAllgatherOp似乎被定义为不昂贵.这不是矛盾吗?我问,因为IdentityOp明确标记为便宜.我想知道,如果我应该在我的自定义操作中覆盖此方法,因为每个CPU版本(甚至任何自定义代码)都被标记为昂贵.
XLA的整个逻辑似乎是关于指令是否昂贵.所以它可能是一个需要考虑的重要部分.因此,关于真/假的抛硬币可能不是决定我的自定义操作中的返回值的最佳方法.
在回答您的问题之前,我认为值得尝试了解TensorFlow如何使用线程来完成您的工作.为此,我建议你阅读这篇相关且非常好的SO帖子.
您会发现TensorFlow使用线程池来完成工作.昂贵的Ops被安排在线程池上执行,而廉价的Ops被执行"内联"意味着由调度任务的同一个线程执行(旁注:从您链接的源文件中找到只有一个例外,即如果inline_ready队列为空,则线程可以自己执行最后一个昂贵的Op.).
考虑到这一点,让我们尝试回答您的问题.
- 当IsExpensive应该是假的,是否有任何具体的指导,是真的吗?
我在TensorFlow手册中找不到具体的指导方针,但是,从我们上面讨论的内容开始,Op应该标记为昂贵的,当调度任务到线程池的偏移量与时间相比时可以忽略不计.任务需要执行.
- 如果操作标记为昂贵,会有什么影响?到目前为止,我只能说,活动分析使用它作为提示?查询此属性的唯一位置是在调度程序中,但没有解释内联的含义.
效果如下,每次Ops IsExpensive方法返回时,false它可能被推送到inline_ready队列并可能阻止线程执行进一步的任务,从而停止您的程序.相反,如果Ops IsExpensive方法返回true,它将被调度在线程池上执行,并且调度线程可以继续在进程循环中继续执行其任务.
- 与"1"结合使用 我应该在我的自定义操作中关注它吗?
我认为你应该关心并尝试尽可能多地推断你的执行时间.之后决定如何实现该IsExpensive方法.
- 虽然有意义,任何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)
这清楚地表明,为线程池安排此任务几乎只是开销.因此,内联执行它很有意义.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |