Использование чередования Tensorflow для повышения производительности - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть входной канал, который работает плохо при низкой загрузке процессора, графического процессора и диска. Я читал тензорный поток «Лучшая производительность с 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) --- кажется необходимым, но не очевидным, какое значение использовать? Есть ли лучший общий план?

Обратите внимание, что наборы данных очень большие и не помещаются в ОЗУ.

1 Ответ

0 голосов
/ 14 февраля 2020

Чередование позволяет обрабатывать каждый файл в отдельном логическом потоке (параллельно), а затем объединять данные из файлов в один набор данных. Поскольку ваши данные поступают из двух соответствующих файлов, вы должны быть осторожны, чтобы сохранить порядок.

Вот пример того, как вы могли бы поместить перемежение в конец набора данных:

img_files = ...
out_files = ...
files = tf.data.Dataset.zip(img_files, out_files)

def parse_img_file(img_file):
  imgd = tf.data.FixedLengthRecordDataset(img_files, inrez*inrez)
  ...

def parse_out_file(out_file):
  ...

def parse_files_fn(img_file, out_file):
  img_file_dataset = parse_img_file(img_file)
  out_file_dataset = parse_out_file(out_file)
  return tf.data.Dataset.zip(img_file_dataset, out_file_dataset)

dataset = files.interleave(parse_files_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset = dataset.repeat()

Каждый поток перемежения будет производить элементы из другой пары (img, out ), и элементы, созданные из каждой пары файлов, будут чередоваться вместе.

...