目标是高效地从远程(例如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_reads、link从远程主机上的不同文件中读取数据,如下所示
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,哪种方法应该是首选的?
发布于 2019-01-27 08:43:38
我刚刚浏览了TFRecordDataset和parallel_interleave的源代码。请注意,我正在查看tf.data.experimental,因为tf.contrib.data one已被弃用。有趣的是,它们都调用同一个类ParallelInterleaveDataset来利用并行读取。我猜这就变成了如何更好地优化流水线的选择,因为当使用parallel_interleave来潜在地加速流水线时,你可以使用像block_length,sloppy,buffer_output_elements和prefetch_input_elements这样的参数,同时在排序中也赋予了一些随机性。
https://stackoverflow.com/questions/54381036
复制相似问题