从HDFS,TFRecordDataset+num_parallel_read等远程主机读取时哪个更好?或者parall



目标是有效地从远程读取数据(例如HDFS)。使用tensorflow数据集,我可以按照此处的指南进行操作,并使用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

我假设它们都有相同的目的,其中我的 cpu 的 4 个线程将从 4 个不同的文件中获取数据,因此比读取 1 个文件具有更好的吞吐量。在这种情况下,采用这两种方法是否有区别?

我还假设第一种方法会从每批的不同文件中读取,更像是对我的远程文件的广度优先搜索,而第二种方法更像是对我的远程文件的深度优先搜索。当它是低延迟的本地文件系统时,也许这并不重要,但对于远程,如 HDFS,哪种方式应该是首选方法?

我刚刚浏览了TFRecordDataset和parallel_interleave的源代码。请注意,我正在查看tf.data.experimental,因为tf.contrib.data已被弃用。有趣的是,它们都调用同一个类 ParallelInterleaveDataset 来利用并行读取。我想它将成为您如何更好地优化管道的选项,因为您可以在使用parallel_interleave时使用block_length、草率、buffer_output_elements和prefetch_input_elements等参数来潜在地加快管道速度,同时还在排序中赋予一些随机性。

最新更新