Тренинг Tensorflow CNN по GPU: повышение производительности и настройка конвейера - PullRequest
0 голосов
/ 25 мая 2019

Я экспериментирую с этой моделью HTR , и я думаю, что тренировка занимает слишком много времени.Код изначально был написан для процессора, но я выполняю его на графическом процессоре и сохраняю набор данных в оперативной памяти, чтобы значительно повысить производительность.Однако sess.run () для пакета из 50 изображений все еще требуется ~ 0,18 секунды.Кроме того, графический процессор показывает нагрузку ~ 30% при обучении, а время предварительной обработки незначительно (~ 0,008 секунды).

Следует отметить, что размеры пакетов из 25 и 100 изображений дают примерно одинаковую производительность иразмер пакета 250 составляет ~ 0,25 секунды для sess.run ().

Итак, мои вопросы таковы:

  1. Это "нормальная" производительность?Может ли он быть значительно ускорен и как?
  2. Является ли конвейер правильным вариантом с учетом незначительной продолжительности предварительной обработки?
  3. Если так, как настроить конвейер?(см. ниже)

Я попытался настроить конвейер, но безуспешно.

В модели: __init__ (с enqueue_op = loader.getNext из main.py)

        self.q = tf.FIFOQueue(capacity=5, dtypes=[tf.float32, tf.int64, tf.int32, tf.int64, tf.int32]) # enqueue 5 batches
        self.enq_op = enqueue_op
        self.enqueue_op = self.q.enqueue(self.create_dict)
        self.numberOfThreads = 2
        self.qr = tf.train.QueueRunner(self.q, [self.enqueue_op] * self.numberOfThreads)
        tf.train.add_queue_runner(self.qr)
        self.inputImgs_tmp, self.indices_gTP_tmp, self.values_gTP_tmp, self.shape_gTP_tmp, self.sqLen_tmp = self.q.dequeue()        

В модели: startCoordinator, stopCoordinator, createDict

    def startCoordinator(self):
        self.coord = tf.train.Coordinator()
        self.threads = tf.train.start_queue_runners(sess=self.sess, coord=self.coord)

    def stopCoordinator(self):
        self.coord.request_stop()
        self.coord.join(self.threads)

    def create_dict(self):
        batch = self.enq_op()
        numBatchElements = len(batch.imgs)
        sparse = self.toSparse(batch.gtTexts)
        return batch.imgs, sparse[0], sparse[1], sparse[2], [Model.maxTextLen] * numBatchElements

В main.py, поезд (модель, загрузчик)

    while True:
        epoch += 1
        print('Epoch:', epoch)

        model.startCoordinator()

        # train
        print('Train NN')
        batches_startTime = time.time()
        loader.trainSet()
        while loader.hasNext():
            batch_startTime = time.time()
            iterInfo = loader.getIteratorInfo()
            batch_trainStartTime = time.time()
            loss = model.trainBatch()
            print('Batch:', iterInfo[0],'/', iterInfo[1], 'Loss: %.3f' % loss, '\t batch dur: %.3f' % (time.time() - batch_startTime), ' preprocess dur: %.3f' % (batch_trainStartTime - batch_startTime), ' train dur: %.3f' % (time.time() - batch_trainStartTime))

        model.stopCoordinator()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...