tfrecordファイルをシャードに分割する利点は何ですか?


17

私はTensorflowで音声認識に取り組んでおり、LSTM NNを大規模なウェーブデータセットでトレーニングする予定です。パフォーマンスが向上するため、tfrecordsを使用する予定です。tfrecordsファイルが断片に分割されるインターネット(例:Inception)にはいくつかの例があります。私の質問は、tfrecordsファイルをシャードに入れることの利点は何ですか?この分割によりパフォーマンスが向上しますか?

回答:


11

複数のファイルに分割することの利点を研究する中で、妥当な答えはGoogleの仲間の1人からでした。

パフォーマンスの向上はごくわずかですが、データセットを別の場所に転送する場合は特に、ファイルの分割が役立つことに同意します。

(現在)tf.data.TFRecordDataset非常に便利な.shuffle()メソッドを実装するTFRecordsの読み取り方法が推奨されているため、保存する前にシャッフルする必要がないことに注意してください。


2
.shuffle()1つの大きなtfrecordファイルがある場合、この方法は理想的なソリューションではありません。シャッフルされた出力は、大きなバッファーサイズを使用しない場合、元の順序に多少関連しています。大きなデータセットがある場合は、tfrecordに保存する前、またはシャードに分割する前にデータを事前にシャッフルする必要があると思います。
ブルースチョウ

7

まだ疑問に思っている人のために:それはあなたのデータをシャッフルできるようにするためです。1つのファイルにTFrecordsがあると、注文をシャッフルできません。これは通常、SGDで必要です。

ただし、シャードを使用すると、シャードの順序を入れ替えることができます。これにより、個々のTFRecordにアクセスできるかのようにデータをシャッフルできます。これは、何もないよりも明らかに優れており、明らかに破片が多いほどこの近似値が優れています。

別の方法は、データを複製してデータを事前にシャッフルするか、TFRecordsをまったく使用しないことです。


4

TFRecordファイルをシャードに分割すると、メモリに収まらない大きなデータセットをシャッフルできます。

数百万のトレーニングサンプルがディスクに保存されており、トレーニングプロセスを繰り返し実行したいとします。さらに、トレーニングデータの各反復(つまり各エポック)に対して、完全にランダムな順序でデータをロードするとします。

1つのアプローチは、トレーニング例ごとに1つのファイルを用意し、すべてのファイル名のリストを生成することです。次に、各エポックの開始時に、ファイル名のリストをシャッフルし、個々のファイルをロードします。このアプローチの問題は、ディスク上のランダムな場所から何百万ものファイルをロードしていることです。これは、特にハードディスクドライブで遅くなる可能性があります。ランダムな場所から何百万もの小さなファイルをロードしている場合、RAID 0アレイでさえ速度の向上には役立ちません。ネットワーク接続を介してファイルにアクセスしている場合、問題はさらに悪化します。

別のアプローチは、1つの大きなTFRecordファイルからトレーニングサンプルを順番に読み取り、シャッフルバッファーを使用してメモリ内のサンプルをシャッフルすることです。ただし、シャッフルバッファーは通常、CPUで使用可能なDDRメモリより大きくすることはできません。また、シャッフルバッファーがデータセットよりも大幅に小さい場合、データが適切にシャッフルされない可能性があります。データは「ローカルに」シャッフルされますが、「グローバルに」シャッフルされない場合があります。つまり、データセットの最初のサンプルは、データセットの最後のサンプルとシャッフルされない場合があります。

良い解決策は、データセットを複数のTFRecordファイル(シャードと呼ばれる)に分割することにより、上記の2つのアプローチのバランスの取れた組み合わせを使用することです。各エポック中に、シャードファイル名をシャッフルしてグローバルシャッフルを取得し、シャッフルバッファーを使用してローカルシャッフルを取得できます。適切なバランスにより、ディスク速度の問題を防ぐのに十分な大きさの断片が作成されますが、シャッフルバッファーによる適切なシャッフルを可能にするのに十分なほど断片が小さく保持されます。

正確な手順は次のとおりです。

  1. すべてのトレーニング例をランダムに複数のTFRecordファイル(シャード)に配置します。
  2. 各エポックの開始時に、シャードファイル名のリストをシャッフルします。
  3. シャードからトレーニングサンプルを読み取り、シャッフルバッファーにサンプルを渡します。通常、シャッフルバッファーは、シャード間で良好なシャッフルを確保するために、シャードサイズよりも大きくする必要があります。
  4. シャッフルされた例をトレーニングプロセスに渡します。

3

TFRecordsファイルを複数のシャードに分割することには、本質的に3つの利点があります。

  1. シャッフルしやすい。他の人が指摘したように、(シャッフルバッファーを使用する前に)粗いレベルでデータをシャッフルすることが容易になります。
  2. ダウンロードが速い。ファイルが複数のサーバーに分散している場合、複数のファイルを異なるサーバーから並行してダウンロードすると、帯域幅の使用率が最適化されます(単一のサーバーから1つのファイルをダウンロードするのではなく)。これにより、単一のサーバーからデータをダウンロードする場合と比較して、パフォーマンスが大幅に向上します。
  3. 操作が簡単。1 TBの単一ファイルではなく、100 MBの10,000ファイルを処理する方が簡単です。巨大なファイルは扱いが面倒な場合があります。特に、転送が失敗する可能性がはるかに高くなります。また、データがすべて単一のファイルにある場合、データのサブセットを操作することも困難です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.