目标是有效地从远程(例如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这样的远程系统,应该是首选方法吗?
答案 0 :(得分:1)
我刚刚浏览了TFRecordDataset和parallel_interleave的源代码。注意,我正在看tf.data.experimental,因为不推荐使用tf.contrib.data。有趣的是,它们都调用同一类ParallelInterleaveDataset来利用并行读取。我猜这将成为更好地优化管道的选择,因为在使用parallel_interleave可以潜在地加速管道的同时,还可以使用诸如block_length,sloppy,buffer_output_elements和prefetch_input_elements之类的参数,同时还可以在排序中赋予一些随机性。