代码之家  ›  专栏  ›  技术社区  ›  Patwie

tensorflow操作“isexpensive()”的含义?

  •  13
  • Patwie  · 技术社区  · 8 年前

    有一个 method in 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_; }
    

    似乎默认情况下 GPU are considered as inexpensive 而cpu、sysl则被标记为昂贵。

    很难弄清楚 expensive . 是不是 information in the guide 是的。

    1. IsExpensive 应该是 false, true 是吗?
    2. 如果一个手术被标记为昂贵,会有什么影响?到目前为止,我只能说,活动概要使用这个 just as a hint 是吗?查询此属性的唯一位置是 in the scheduler 但是没有解释 内联 手段。
    3. 与“1”一起。我应该在我的自定义操作中关心它吗?
    4. 有道理的是, AsyncOp (就像 RemoteFusedGraphExecuteOp )很贵, MPIAllgatherOp 似乎被定义为不贵。这不是矛盾吗?

    我在问,因为 IdentityOp 明确标记为便宜。我想知道,是否应该在自定义操作中重写此方法,因为每个CPU版本(甚至 任何 自定义代码)被标记为昂贵。

    xla的整个逻辑似乎是关于 an instruction is expensive 或者不。所以这可能是一个重要的部分。因此,在我的自定义操作中,掷硬币判断真/假可能不是决定返回值的最佳方法。

    1 回复  |  直到 8 年前
        1
  •  9
  •   user32434999    8 年前

    在回答您的问题之前,我认为有必要了解tensorflow如何使用线程来完成您的工作。为此,我建议你读 this related and very good SO post 是的。

    您会发现tensorflow使用线程池来完成工作。昂贵的操作被安排在线程池上执行,而廉价的操作是“内联”执行的,这意味着由调度任务的同一线程执行(侧注:从链接的源文件中,您只发现一个异常,即 inline_ready 队列为空线程可以自己执行最后一个昂贵的操作。)

    有鉴于此,让我们试着回答你的问题。

    1. 有没有什么具体的指导方针,当我的解释应该是错误的,真的?

    我在tensorflow手册中找不到具体的指导原则,但是,从我们上面讨论的内容来看,当调度任务到线程池的偏移量与任务需要执行的时间相比是可以忽略的时,op应该标记为昂贵的。

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

    效果如下,每次行动 IsExpensive 方法返回 false 可能会被推到 内联准备 排队,可能会阻止线程执行进一步的任务,从而导致程序暂停。相反,如果 很夸张 方法返回true,它将被安排在线程池上执行,并且调度线程可以继续在进程循环中执行其任务。

    1. 与“1”一起。我应该在我的自定义操作中关心它吗?

    我认为您应该关心并尽可能多地考虑您的操作的执行时间。 很夸张 方法。

    1. 虽然任何异步操作(比如remotefusedgraphexecuteop)都很昂贵,但mpiallgaterop似乎被定义为不昂贵。这不是矛盾吗?

    不,这不是矛盾。如果你读到 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.
    

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

    推荐文章