Что лучше при чтении с удаленных хостов, таких как HDFS, TFRecordDataset + num_parallel_read?Или параллельный_интерлейв - PullRequest
0 голосов
/ 26 января 2019

Цель состоит в том, чтобы эффективно считывать данные с удаленного устройства (например, HDFS). С набором данных tenorflow я могу либо следовать указаниям здесь и использовать parallel_interleave для чтения из разных файлов на удаленном хосте, например

def input_fn():
  files = tf.data.Dataset.list_files("hdfs:///path/to/dataset/train-*.tfrecord")
  dataset = filenames.apply(
      tf.data.experimental.parallel_interleave(
          lambda filename: tf.data.TFRecordDataset(filename),
          cycle_length=4))
  dataset = dataset.map(map_func=parse_fn)
  dataset = dataset.batch(batch_size=FLAGS.batch_size)
  dataset = dataset.prefetch(buffer_size=FLAGS.prefetch_buffer_size)
  return dataset

Или я могу использовать num_parallel_reads, ссылку , чтобы читать из разных файлов на удаленном хосте, например

def input_fn():
  files = tf.data.Dataset.list_files("hdfs:///path/to/dataset/train-*.tfrecord")
  dataset = tf.data.TFRecordDataset(files, num_parallel_reads=4)
  dataset = dataset.map(map_func=parse_fn)
  dataset = dataset.batch(batch_size=FLAGS.batch_size)
  dataset = dataset.prefetch(buffer_size=FLAGS.prefetch_buffer_size)
  return dataset

Я предполагаю, что они оба будут служить одной и той же цели, когда 4 потока моего процессора будут получать данные из 4 разных файлов, поэтому имеют лучшую пропускную способность, чем чтение 1 файла. Есть ли разница в этом случае, чтобы пойти на любой подход?

Я также предполагаю, что первый метод будет считывать из разных файлов в каждом пакете, больше похоже на поиск в удаленных файлах в ширину, а второй подход больше похож на поиск в моих удаленных файлах в глубину. Когда это локальная файловая система с низкой задержкой, может быть, это не имеет значения, но для удаленной, как HDFS, какой путь предпочтительнее?

1 Ответ

0 голосов
/ 27 января 2019

Я только что просмотрел исходный код TFRecordDataset и parallel_interleave .Обратите внимание, что я смотрю на tf.data.experimental, так как tf.contrib.data устарел.Как ни странно, они оба вызывают один и тот же класс ParallelInterleaveDataset , чтобы использовать параллельное чтение.Я полагаю, что тогда это станет вариантом того, как лучше вы можете оптимизировать свой конвейер, потому что вы можете использовать такие параметры, как block_length, sloppy, buffer_output_elements и prefetch_input_elements, когда используете parallel_interleave, чтобы потенциально ускорить ваш конвейер, а также привнести некоторую случайность в упорядочение.

...