将tfrecord文件拆分为碎片有什么好处?


17

我正在使用Tensorflow进行语音识别,并计划使用海浪数据集训练LSTM NN。由于性能提高,我计划使用tfrecords。互联网上有几个示例(例如Inception),其中tfrecords文件被拆分为多个碎片。我的问题是:将tfrecords文件放入分片有什么好处?此拆分是否有其他性能提升?

Answers:


11

在研究拆分为多个文件的好处时,唯一合理的答案来自一位Google员工。

他们说,性能提升是微不足道的,但是我同意拆分文件可以提供帮助,尤其是如果您要将数据集转移到另一个位置。

请记住,现在不需要在保存之前进行洗牌,因为(当前)推荐的读取TFRecords的方法使用tf.data.TFRecordDataset实现非常有用的.shuffle()方法。


2
.shuffle()如果您有一个大的tfrecord文件,则此方法不是理想的解决方案。如果您不使用较大的缓冲区大小,则经过改组的输出在某种程度上与原始顺序有关。我认为,如果您的数据集很大,则在存储到tfrecord或拆分为碎片之前,必须先对数据进行预混洗。
Bruce Chou

7

对于那些仍然想知道的人:它是为了让您可以重新整理数据。将您的TFrecords放在一个文件中,您无法将订单洗牌。对于SGD,这通常是必需的。

但是,使用分片,您可以对分片的顺序进行混洗,从而可以近似地对数据进行混洗,就好像您可以访问各个TFRecords。显然这总比没有好,并且显然您拥有的碎片越多,这种近似就越好。

替代方法是通过复制数据或不使用TFRecords来对数据进行预混洗。


4

将TFRecord文件拆分为碎片可帮助您重新整理不适合内存的大型数据集。

想象一下,您已经在磁盘上保存了数百万个培训示例,并且您想在培训过程中重复运行它们。此外,假设对于训练数据的每次重复(即每个时期),您都希望以完全随机的顺序加载数据。

一种方法是每个训练示例拥有一个文件,并生成所有文件名的列表。然后,在每个纪元的开始,您将随机排列文件名列表并加载各个文件。这种方法的问题在于,您正在从磁盘上的随机位置加载数百万个文件。这可能会很慢,尤其是在硬盘驱动器上。如果要从随机位置加载数百万个小文件,则即使RAID 0阵列也无法提高速度。如果您通过网络连接访问文件,问题将变得更加严重。

另一种方法是从一个大TFRecord文件中依次读取训练示例,然后使用随机缓冲将随机示例洗入内存。但是,混洗缓冲区通常不能大于CPU可用的DDR内存。并且,如果混洗缓冲区远小于数据集,则可能无法充分混洗数据。数据可以“本地”混洗,而不能“全局”混洗。也就是说,数据集开头的示例可能不会与数据集结尾的示例混在一起。

一个好的解决方案是通过将数据集拆分为多个TFRecord文件(称为分片)来使用上述两种方法的平衡组合。在每个时期,您可以对分片文件名进行混排以获得全局混排,并使用混排缓冲区获得局部混排。良好的平衡将使分片足够大以防止磁盘速度问题,但将使分片保持足够小以允许混洗缓冲区充分混洗。

具体步骤如下:

  1. 将所有训练示例随机放入多个TFRecord文件(碎片)中。
  2. 在每个纪元的开始,对分片文件名列表进行混洗。
  3. 阅读分片中的训练示例,然后将这些示例传递到随机缓冲区中。通常,混洗缓冲区应大于分片大小,以确保跨分片进行良好的混洗。
  4. 将经过改组的示例传递到您的培训过程中。

3

将TFRecords文件拆分为多个分片实质上具有3个优点:

  1. 更容易洗牌。正如其他人指出的那样,它可以很容易地在粗略级别上对数据进行混洗(在使用混洗缓冲区之前)。
  2. 下载速度更快。如果文件分布在多个服务器上,则从不同服务器并行下载多个文件将优化带宽使用(而不是从单个服务器下载一个文件)。与从单个服务器下载数据相比,这可以显着提高性能。
  3. 操作更简单。处理10,000个100MB的文件比处理单个1TB的文件要容易得多。巨大的文件可能很难处理:尤其是,传输失败的可能性更大。当所有数据都在一个文件中时,也很难操作数据的子集。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.