1.Data Echoing:バッチデータを再利用する事でアクセラレータを最大限に活用(1/2)まとめ
・アクセラレータは並行して処理を増やす事とトレーニングをより速く処理する事で学習速度を向上できる
・並行して処理には限界がある事がわかっているが処理速度向上は前処理による影響を受ける
・前処理が完了するまでアクセラレータに待機状態が発生する場合はデータを再利用する事で改善が可能
2.Data Echoingとは?
以下、ai.googleblog.comより「Speeding Up Neural Network Training with Data Echoing」の意訳です。元記事の投稿は2020年5月12日、Dami ChoiさんとGeorge Dahlさんによる投稿です。
とてもエコーが響きそうな感じがするアイキャッチ画像のクレジットはPhoto by Jessica F on Unsplash
過去10年間でニューラルネットワークのトレーニング速度が劇的に向上したことで、多くの重要な問題にディープラーニング技術を適用することが可能になりました。ムーアの法則が黄昏て、汎用プロセッサの性能が従来のように劇的に改善できなくなるにつれて、機械学習コミュニティは、更なる高速化を実現するために専用ハードウェアにますます注目をするようになっています。
例えば、GPUとTPUは、ニューラルネットワークトレーニングアルゴリズムで非常に大切な行列演算を並列化する事に特に最適化します。
これらのアクセラレータは、2つの方法でトレーニングをスピードアップできます。1つ目は、より多くのトレーニングを並行して処理する事で、2つ目は各トレーニングをより速く処理する事です。より多くのトレーニングを並行して処理する手法は速度向上に限界があることがわかっています。しかし、より高速なアクセラレーターを開発する事でトレーニングスピードは向上し続ける事が可能なのでしょうか?
残念ながら、トレーニングパイプラインの全ての操作がアクセラレータを使って実行されるわけではありません。そのため、トレーニングの高速化を推進するために、より高速なアクセラレータに単純に依存することはできません。例えば、ディスクの読み書きやデータの前処理など、トレーニングパイプラインの初期段階には、GPUやTPUの恩恵を受ける事が出来ない操作が含まれます。アクセラレータの改善がCPUとディスクの改善を上回るにつれて、これらの初期段階はますますボトルネックになり、アクセラレータの容量を浪費し、トレーニング速度を制限します。
多くの大規模なコンピュータービジョンプログラムによくあるトレーニングパイプラインの例
ミニバッチで確率勾配降下法(SGD)を行う前の段階の作業は、通常、専用のハードウェアアクセラレータの恩恵を受けません。
アクセラレータで処理する前段階のコードに、アクセラレータで実行されるコードの2倍の時間がかかるシナリオを考えてみましょう。これは既に大きなモデルをトレーニングする際の現実的なシナリオです。
コードがパイプライン化されて「前段階の処理」と「アクセラレータを使って行われ処理」を並行して実行できる場合でも、前段階の処理が学習時間の大半を占め、アクセラレータはその時間の50%は入力データを待機している事になります。
この場合、より高速のアクセラレータを使用しても、トレーニング速度はまったく向上しません。エンジニアリング作業と計算リソースを追加する事で前処理を高速化することは可能かもしれませんが、そのような作業は時間がかかり、予測処理のパフォーマンスを向上させるという主目的から離れてしまいます。
非常に小さなデータセットの場合、拡張されたデータセットをオフラインで事前計算し、前処理されたデータセット全体をメモリに読み込む事で高速化ができますが、これはほとんどのMLトレーニングシナリオでは機能しません。
論文「Faster Neural Network Training with Data Echoing」では、シンプルな再利用(またはエコー:echoes)処理を行う事でこの改善を提案しています。前処理が出力する中間出力データを再利用して入力データ待ちのアクセラレータに与えて処理待ちを改善するのです。
更に多くのデータが利用可能になるのを待つのではなく、既にに利用可能なデータを利用して、アクセラレータをより有効に活用します。
左:データエコーがない場合、アクセラレータが実行する下流タスクの計算能力は半分は待機中です。
右:エコーファクター2でデータをエコーすると、下流タスクの計算能力が改善されます。
より速くトレーニングするためにデータを再利用する
「トレーニングデータのバッチの読み取りと前処理」に、「そのバッチで一度最適化ステップを実行する処理」の2倍の時間がかかる状況を想像してください。
この場合、前処理されたバッチが初回最適化ステップされた後に、バッチを再利用し、次のバッチの前処理が完了する前に2番目の最適化ステップを実行できます。
最良の場合のシナリオ、つまり学習用データが繰り返し使われても新しいデータと同じくらい有用であるケースでは、トレーニングが2倍のスピードアップします。実際には、繰り返しデータは新しいデータほど有用ではないので、データエコーはわずかに小さいスピードアップを提供しますが、それでも、アクセラレータを待機状態にすることと比較して大幅なスピードアップを提供できます。
特定のニューラルネットワークトレーニングパイプラインにデータエコーを実装するには、通常いくつかの方法があります。
私達が提案する手法には、トレーニングパイプラインのどこかでデータをシャッフルバッファー(shuffle buffer )に複製することが含まれますが、特定のパイプラインでボトルネックが発生させてしまう処理の後であればどこにでもこのバッファーを自由に挿入できます。
私達はバッチ処理の前にバッファを挿入するケースでは、このテクニックを「エコー(echoing)」と呼び、バッチ処理の後にバッファを挿入するケースでは、このテクニックを「バッチエコー(batch echoing)」と呼んでいます。
エコーの場合は、サンプルレベルでデータをシャッフルし、バッチエコーの場合は重複するバッチの並びをシャッフルします。
また、再利用するデータの各コピーがわずかに異なる(つまり、新しいデータに近い)ように、データ拡張の前にバッファーを挿入することもできます。異なる処理間にシャッフルバッファーを配置するデータエコーには様々な種類がありますが、最もスピードアップ出来るエコーは、トレーニングパイプラインによって異なります。
3.Data Echoing:バッチデータを再利用する事でアクセラレータを最大限に活用(1/2)関連リンク
1)ai.googleblog.com
Speeding Up Neural Network Training with Data Echoing
2)arxiv.org
Faster Neural Network Training with Data Echoing
コメント