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

时间:2019-01-26 17:49:28

标签: python tensorflow hdfs tensorflow-datasets tfrecord

目标是有效地从远程(例如HDFS)读取数据。对于tensorflow数据集,我可以按照指南here并使用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_readslink来读取远程主机中的不同文件,就像这样

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这样的远程系统,应该是首选方法吗?

1 个答案:

答案 0 :(得分:1)

我刚刚浏览了TFRecordDatasetparallel_interleave的源代码。注意,我正在看tf.data.experimental,因为不推荐使用tf.contrib.data。有趣的是,它们都调用同一类ParallelInterleaveDataset来利用并行读取。我猜这将成为更好地优化管道的选择,因为在使用parallel_interleave可以潜在地加速管道的同时,还可以使用诸如block_length,sloppy,buffer_output_elements和prefetch_input_elements之类的参数,同时还可以在排序中赋予一些随机性。