首页 文章

TensorFlow设备上下文

提问于
浏览
1

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

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

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

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

我很感激DeviceContexts的任何澄清 .

1 回答

  • 2

    DeviceContext对象有两个目的:

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

    您需要OpKernel中底层设备资源的句柄,并且DeviceContext对象包含用于计算on的“stream”对象 .

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

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

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

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

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

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

相关问题