TensorFlow设备上下文

时间:2016-09-08 20:42:22

标签: tensorflow

我正在为TensorFlow添加新硬件,而我在设备上下文方面遇到了问题。

为了确保我理解他们的目的,从代码中,他们似乎管理计算图中给定节点的设备和数据。即,在设备上下文中指定用于输入数据和输出数据的设备,并且执行器处理在这些设备之间来回传递张量。每个OpKernelContext似乎都包含一个设备上下文,用于管理给定内核的特定执行。

目前,对于我的新硬件,设备上下文都是null,这最终会导致段错误。根据现有C ++的风格,我希望有些宏可以让我“注册”特定设备类型的设备上下文(即GPU,CPU),但我找不到这些。我的问题是,如何在为我的设备创建OpKernelContext时将其添加到OpKernelContext中。

请注意,我没有编写特定于我的硬件的Device Context类。我注意到ThreadPoolDevice似乎没有特定于它的DeviceContext实现。我假设这是因为为ThreadPools实现了基类DeviceContext。

我很感激DeviceContexts的任何澄清。

1 个答案:

答案 0 :(得分:2)

DeviceContext 对象 有两个目的:

  1. 目前,大多数调用者可能会忽略一些StreamExecutor特定的位(gpu :: Stream / MaintainLifetime),因为它们特定于GPU。

    您需要一个OpKernels中底层设备资源的句柄,而DeviceContext对象包含用于计算的“stream”对象。

    我们还没有在DeviceContext中实现一个其他设备应该作为其资源实现的不透明句柄,但这就是所需要的。不幸的是,在我们可以让非基于StreamExecutor的设备工作之前,这是一个TODO。

  2. 另一个组件是处理从设备到CPU的复制的代码。你是对的,因为CPU不存在DeviceContexts,因为CPU是主机设备,从这个角度来看不需要特别对待。

    但作为一个例子,我们可以看看GPU的代码。 tensorflow/core/common_runtime/gpu_device_context.h是GPU设备上下文的一个示例,它实现了DeviceContext接口。接口的实现是here,它委托GPUUtil类中的代码来实际执行memcopies。碰巧使用StreamExecutor框架来处理底层副本,但是您自己的设备会使用您拥有的任何API来复制主机到设备。

    如果要从设备复制到设备,则需要对此进行特殊注册。 GPU到GPU的一个例子是: here 用于实现,here用于注册该功能。

  3. 在某些时候,我们可能会重构这一点,使其更加清晰,因此注册都是统一的(CPU到设备,设备到CPU,设备到设备)。目前它有点临时性。

    因此,目前正在开展支持其他设备的工作,但我们很高兴与您和其他人合作,充实这种支持。