从 HDFS、TFRecordDataset+num_parallel_read 等远程主机读取时哪个更好?或者 parallel_interleave
Which is better when reading from remote hosts like HDFS, TFRecordDataset+num_parallel_read? Or parallel_interleave
目标是有效地从远程(例如 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)来说,哪种方式应该是首选?
我刚刚浏览了两者的源代码 TFRecordDataset and parallel_interleave. Note that I am looking at tf.data.experimental, as the tf.contrib.data one is deprecated. Funnily enough, they both call on the same class, ParallelInterleaveDataset 以利用并行阅读。我想这会成为您如何更好地优化管道的选项,因为您可以在使用 parallel_interleave 时使用 block_length、sloppy、buffer_output_elements 和 prefetch_input_elements 等参数来提高潜在速度提高你的管道,同时也赋予一些随机性。
目标是有效地从远程(例如 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)来说,哪种方式应该是首选?
我刚刚浏览了两者的源代码 TFRecordDataset and parallel_interleave. Note that I am looking at tf.data.experimental, as the tf.contrib.data one is deprecated. Funnily enough, they both call on the same class, ParallelInterleaveDataset 以利用并行阅读。我想这会成为您如何更好地优化管道的选项,因为您可以在使用 parallel_interleave 时使用 block_length、sloppy、buffer_output_elements 和 prefetch_input_elements 等参数来提高潜在速度提高你的管道,同时也赋予一些随机性。