Tensorflow CNN GPU培训:性能改进和管道设置

时间:2019-05-25 17:17:04

标签: python tensorflow optimization gpu handwriting-recognition

我正在尝试this HTR model,但我认为培训时间太长。该代码最初是为CPU编写的,但我在GPU上执行,并将数据集存储在RAM中以显着提高性能。但是,sess.run()需要50个图像批处理,仍然需要约0.18秒。此外,训练时GPU会显示约30%的负载,并且预处理时间可以忽略不计(约0.008秒)。

我应该指出,批处理大小为25和100的图像可获得大致相同的性能,批处理大小为250的sess.run()大约需要0.25秒。

所以我的问题是这些:

  1. 这是“正常”表现吗?可以大大加快速度吗?
  2. 在可以忽略的预处理持续时间内,管道是正确的选择吗?
  3. 如果是,该如何设置管道? (请参见下文)

我尝试设置管道,但未成功。

在模型中:__init __(带有main.py中的enqueue_op = loader.getNext)

        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()

0 个答案:

没有答案