【问题标题】:How does a static member in a TensorFlow OpKernel behave?TensorFlow OpKernel 中的静态成员如何表现?
【发布时间】:2016-03-09 11:16:09
【问题描述】:

具体来说,如果我有一个从 OpKernel 继承的 Op,并且在其中我有一些声明为 static 的私有成员。我可以安全地假设这个内核的所有实例都将访问同一个静态成员吗​​?所有内核是否都放置在同一地址空间/进程中的同一台机器/工作者(可能是不同的 CPU)上?显然,这不适用于在分布式设置中映射到不同机器的内核。例如

class MyOpKernel : public OpKernel {
  public:
    explicit MyOpKernel(OpKernelConstruction* ctx) : OpKernel(ctx) {
      if (!BigRODataObject)
        BigRODataObject = some_init_func();
    }

    void Compute( ... ) { // uses BigRODataObject }

  private:
    static BRODOType* BigRODataObject = null; 
};

最后,在实现 OpKernel 时,有没有比static 更好的方法来在同类型的 OpKernel 之间共享内存中的一块只读数据?数据太大,无法在内存中容纳多个副本。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    tensorflow::OpKernelstatic 成员在同一进程中该内核的所有实例之间共享。如果您正在运行单个 TensorFlow 进程,那么所有实例(包括分配给 CPU 或 GPU 的实例,以及来自不同会话的实例)将共享同一个 static 成员。

    使用static 成员不会在会话关闭时处理销毁,并且不允许在不同会话中使用不同的对象,所以我不推荐这种风格;但是,替代方案要复杂一些。对于共享状态,我们通常使用ResourceMgr(通过OpKernelContext::resource_manager())来存储对象。典型的实现使用“构造函数”操作,它在第一次使用时实例化对象,拥有它,并输出一个(字符串)句柄。共享状态的用户获取句柄上的数据依赖,并在ResourceMgr 中查找以访问该对象。然后在删除“构造函数”操作时删除该对象。这是用于tf.Variabletf.FIFOQueue 等有状态操作的方法。

    【讨论】:

    • 太棒了,这就是我要找的信息。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多