У меня есть входной канал, который работает плохо при низкой загрузке процессора, графического процессора и диска. Я читал тензорный поток «Лучшая производительность с API tf.data» do c и документы Dataset, но я не понимаю, что происходит достаточно хорошо, чтобы применить его в моей ситуации. Вот мои текущие настройки:
img_files = sorted(tf.io.gfile.glob(...))
imgd = tf.data.FixedLengthRecordDataset(img_files, inrez*inrez)
#POINT1A
imgd = imgd.map(lambda s: tf.reshape(tf.io.decode_raw(s, tf.int8), (inrez,inrez,1)))
imgd = imgd.map(lambda x: tf.cast(x, dtype=tf.float32))
out_files = sorted(tf.io.gfile.glob(...))
outd = tf.data.FixedLengthRecordDataset(out_files, 4, compression_type="GZIP")
#POINT1B
outd = outd.map(lambda s: tf.io.decode_raw(s, tf.float32))
xsrc = tf.data.Dataset.zip((imgd, outd)).batch(batchsize)
xsrc = xsrc.repeat() # indefinitely
#POINT2
xsrc = xsrc.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
Должен ли я чередовать всю трубу прямо в конце (POINT2), до предварительной выборки? Или чередовать imgd и outd отдельно после каждого FixedLengthRecordDataset (POINT1A, POINT1B) и распараллеливать карты? (необходимо синхронизировать imgd и outd!) Что случилось с Dataset.range (rvalue) --- кажется необходимым, но не очевидным, какое значение использовать? Есть ли лучший общий план?
Обратите внимание, что наборы данных очень большие и не помещаются в ОЗУ.