1

出于性能原因,我想将基于队列的旧管道更改为 tensorflow 上的新数据集 API。但是,一旦我的代码更改,它会在 8 小时内运行,而不是 2 小时。

我的 GPU 的使用率约为 30/40%,现在在 0% 到 6% 之间。

我发现了让它变得如此缓慢的线,这是当我在我的数据集上应用高斯模糊时:

def gaussian_blur(imgs,lbls):
   imgs = tf.nn.conv2d(imgs,k_conv,
                                   strides=[1, 1, 1, 1], 
                                   padding='SAME',
                                   data_format='NHWC'
                                   )
   return imgs, lbls

ds = ds.map(gaussian_blur)

使用我旧的基于队列的管道,这条线几乎不会减慢我的程序。

我认为这是因为这条线曾经在 GPU 上运行,但新的数据集 API 强制它在 CPU 上运行,这速度慢得多,并且已经 100% 使用。

您对如何在不降低性能的情况下应用高斯模糊有任何想法吗?我应该保留旧的基于队列的管道吗?

4

1 回答 1

0

虽然我没有在 tf 数据集上尝试过,但这应该是适用的。我发现这种组合是高性能和简单的:

import tensorflow as tf
import tensorflow_addons as tfa

dummy_dataset = tf.ones((1000, 224, 224, 3))
blurred_dummy_dataset = tf.map_fn(tfa.image.gaussian_filter2d, dummy_dataset)
# ~ 3 second runtime in Google Colab on a Tesla K80

https://www.tensorflow.org/addons/api_docs/python/tfa/image/gaussian_filter2d https://www.tensorflow.org/api_docs/python/tf/map_fn

于 2022-02-11T04:15:26.370 回答