Я экспериментирую с этой моделью HTR , и я думаю, что тренировка занимает слишком много времени.Код изначально был написан для процессора, но я выполняю его на графическом процессоре и сохраняю набор данных в оперативной памяти, чтобы значительно повысить производительность.Однако sess.run () для пакета из 50 изображений все еще требуется ~ 0,18 секунды.Кроме того, графический процессор показывает нагрузку ~ 30% при обучении, а время предварительной обработки незначительно (~ 0,008 секунды).
Следует отметить, что размеры пакетов из 25 и 100 изображений дают примерно одинаковую производительность иразмер пакета 250 составляет ~ 0,25 секунды для sess.run ().
Итак, мои вопросы таковы:
- Это "нормальная" производительность?Может ли он быть значительно ускорен и как?
- Является ли конвейер правильным вариантом с учетом незначительной продолжительности предварительной обработки?
- Если так, как настроить конвейер?(см. ниже)
Я попытался настроить конвейер, но безуспешно.
В модели: __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()