`tf.data.Dataset` 在 CPU 上运行,除了 `PrefetchDataset`?

`tf.data.Dataset` runs on CPU, except of `PrefetchDataset`?

通读 tf.data 文档 (here for TF 1.15) 相关的 TF 代码(Python 和 C++)后,我意识到其中大部分似乎 运行纯粹基于 CPU,除了 PrefetchDataset.

这是真的吗?

prefetch_to_device 的文档说:

NOTE: Although the transformation creates a tf.data.Dataset, the transformation must be the final Dataset in the input pipeline.

这表明所有其他数据集都无法处理此类基于 GPU 的数据集。

查看代码时,似乎有一些内部数据集,例如_CopyToDeviceDataset_MapOnGpuDataset,可能会处理 GPU 数据集。

如果我想在 GPU 上进行预处理(例如数据增强,其他一些聪明的非平凡的东西),这意味着我不能使用 tf.data? (我也想使用图形模式,但不确定是否相关。)

现在我也找到了_GeneratorDatasetThat kernel also is defined on GPU。那么这意味着如果我的 next_func returns 是 GPU 上的张量,它会一直留在 GPU 上吗?

您是对的,tf.data 目前在 CPU 上进行所有处理。通常这是为了避免与 GPU 争用,并且因为在 CPU 上更容易实现许多预处理。然而,没有任何东西可以从根本上阻止 tf.data 在 GPU 上进行处理——这只是实现此类支持的问题。从外观上看,map_on_gpu does offer a way to apply a map function on GPU, though map_on_gpu isn't yet exported in the public API. If you're interested in such functionality, please create a Github Issue 描述了您的用例

回答你的最后一个问题,如果你有一个放在 GPU 上的 _GeneratorDataset,它产生的张量也会在 GPU 上。但是,您不能应用 prefetch 以外的其他数据集转换,因为这些数据集转换没有 GPU 实现。