`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
? (我也想使用图形模式,但不确定是否相关。)
现在我也找到了_GeneratorDataset
。 That 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 实现。
通读 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 finalDataset
in the input pipeline.
这表明所有其他数据集都无法处理此类基于 GPU 的数据集。
查看代码时,似乎有一些内部数据集,例如_CopyToDeviceDataset
和 _MapOnGpuDataset
,可能会处理 GPU 数据集。
如果我想在 GPU 上进行预处理(例如数据增强,其他一些聪明的非平凡的东西),这意味着我不能使用 tf.data
? (我也想使用图形模式,但不确定是否相关。)
现在我也找到了_GeneratorDataset
。 That 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 实现。