Как измерить производительность функции карты в новом API DataSet от Tensorflow? - PullRequest
0 голосов
/ 19 января 2019

Я использую версию Tensorflow 1.12 в своем экземпляре графического процессора, у меня есть около 130 файлов TfRecords, содержащих данные ImageNet, что составляет 1,2 миллиона. Сначала я применяю функцию карты, а затем flat_map, чтобы увеличить набор данных, который в конечном итоге составит 1,2 миллиона x 2048 изображений.

self.filenames = tf.placeholder(tf.string, shape=[None])
self.eval_filenames = tf.placeholder(tf.string, shape = [None])
dataset = tf.data.TFRecordDataset(self.filenames)
eval_dataset = tf.data.TFRecordDataset(self.eval_filenames)
print("inside dataset ", dataset.output_shapes)
dataset = dataset.map(self.decode, num_parallel_calls=10)
dataset = dataset.flat_map(self.apply_flip_crop)
dataset = dataset.batch(self.config["batch_size"])
dataset = dataset.prefetch(2)
iterator = dataset.make_initializable_iterator()

Здесь функция декодирования возвращает уплощенный массив изображения и закодированную метку в горячем виде. Однако функция, переданная в flat_map, выполняет довольно сложную задачу, например: два цикла для создания срезов и обратный из них, каждый из которых дает 1024 тензора. Окончательный результат для одного изображения будет тензор [2048, 224, 224, 3]. Функция выглядит так:

   def apply_flip_crop(self, tf_example, lable):
        """
        Calls a helper function random_crop flips which randomly crops and flips
        the images, and returns the agumented tensors.

        Parameters
        ----------
        :param tf_example: A tensor of shape [batchsize, flattedimageshape]
        :type tf_example: Tensors [batchsize, flattedimageshape]
        :param lable: A Constant integer representing the class_id of the image.
        :type lable: tf.int32
        :return: Tensors of shape [flattedimageshape], label of image tf.int32
        :rtype: Tensors

        """

        data = tf.reshape(tf_example, [256, 256, 3])
        data = self.random_crop_flip(data)
        lables = [lable for i in range(2048)]
        return tf.data.Dataset.from_tensor_slices((data, lables))


    def random_crop_flip(self, image):
        """
        Apply random crop and random flip to the image tensor.

        Parameters
        ----------
        :param image: A tensor representing a flattened image array.
        :type image: Tensor of shape [imageflattenedarray]
        :return: List of 2048 tensors of shape [imageflattenedarray]
        :rtype: List

        """
        crops = []

        for i in range(256 - 224):
            for j in range(256 - 224):
                crop = tf.slice(image, [i, j, 0], [224, 224, 3])
                crop2 = tf.reverse(crop, axis=[1])
                crops.append(crop)
                crops.append(crop2)
        return crops

Теперь проблема в том, что тренировочный процесс очень медленный. Я читал, что dataset.from_tensor_slices довольно плохо с такой необходимостью. Но я думаю, что есть много вещей, которые можно улучшить здесь. Для этого мне нужно визуализировать выполнение каждой из этих операций. В основном из функции flat_map. Я использую RunTime Статистика тензорного потока, как это:

sess.run(iterator.initializer, feed_dict={data_gen.filenames:
                                                      training_filenames},
                 options=run_options, run_metadata=run_metadata)
next_element = iterator.get_next()
for i in range(1):

     datapoint = sess.run(next_element, options=run_options, 
                run_metadata=run_metadata)

      summary_writer.add_run_metadata(run_metadata, 'step%d' % i)

Который регистрирует время, затраченное на подготовку набора данных, однако он не регистрирует время, затраченное на выполнение операции flat_map, что, как я подозреваю, вызывает у меня беспокойство, это место, где производительность отстает. enter image description here

Буду признателен за помощь в отношении Предложения по производительности , а также измерения времени, проведенного в функции flat_map .

Заранее спасибо.

1 Ответ

0 голосов
/ 19 января 2019

Попробуйте использовать временную шкалу TensorFlow: Как профиль TensorFlow

...