第7章. 高性能モデリング
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
実稼働シナリオでは、モデルから可能な限り最高のパフォーマンスを引き出すことが、少ないリソース要件で、高速な応答時間と低コストを実現するために重要である。高性能モデリングは、大規模モデルや大規模データセットを扱う場合など、コンピューティングリソース要件が大きく、推論の遅延やコスト要件が厳しい場合に特に重要になる。
この章では、データ並列とモデル並列を使用して、モデルをどのように高速化できるかについて説明する。また、分散戦略などの高性能モデリングテクニックや、TF Dataのような高性能インジェストパイプラインについても見ていく。最後に、巨大ニューラルネットの台頭と、その結果生じる効率的でスケーラブルなインフラの必要性に対処するためのアプローチについて考察する。
分散トレーニング
プロトタイピングを始めるとき、モデルのトレーニングは、特に小さなデータセットを扱っている場合は、迅速で簡単な作業かもしれない。しかし、モデルの完全なトレーニングは非常に時間がかかる。多くのドメインのデータセットとモデルアーキテクチャは、ますます大きくなっている。トレーニング用データセットとモデルのサイズが大きくなるにつれ、モデルのトレーニングにはますます時間がかかるようになる。また、各エポックの学習時間だけでなく、モデルのエポック数も結果として増加することが多い。この種の問題を解決するには、通常、分散学習が必要になる。分散トレーニングでは、より多くのコンピューティングリソースを活用することでトレーニングを高速化しながら、巨大なモデルをトレーニングすることができる。
高度なレベルでは、分散学習には主に2つの方法がある:データ並列とモデル並列だ。データ並列では、データをパーティション分割し、モデル全体をすべてのワーカーにコピーする。各ワーカーはデータの異なるパーティション分割を演算し、モデルの更新はワーカー間で同期される。このタイプの並列処理はモデルに依存せず、どのようなニューラルネットワークアーキテクチャにも適用できる。通常、データ並列の規模はバッチサイズに対応する。
モデル並列では、モデルを異なる部分に分割し、異なるワーカーで同時に学習させる。各ワーカーは同じデータで学習し、共有パラメータを同期させるだけでよい。通常、フォワードまたはバックプロパゲーションのステップごとに1回だけ同期させる。一般的にモデル並列化は、GPUやTPU(Tensor Processing Unit)などのアクセラレーターのメモリに収まらないような大きなモデルがある場合に使用する。モデル並列の実装は、データ並列に比べて比較的高度である。したがって、分散トレーニングテクニックについては、データ並列性に焦点を当てる。
データ並列性
前述したように、データの並列処理では、データはパーティション分割され、パーティション数は通常、計算クラスタで利用可能なワーカーの合計数となる。図7-1に示すように、モデルを各ワーカーノードにコピーし、各ワーカーがそれぞれのデータのサブセットで学習する。この場合、各ワーカーにはモデル全体をロードするのに十分なメモリが必要となり、大規模なモデルでは問題となることがある。
図7-1. ワーカーノード間でデータを分割する
各ワーカーは独立して、学習サンプルとラベル付けされたデータに対する予測間のエラーを計算し、そのエラーに基づいてモデルを更新するためにバックプロパゲーションを実行し、他のワーカーがモデルを更新できるように、すべての変更を他のワーカーに伝える。つまり、ワーカーは各バッチの終了時に勾配を同期させ、一貫したモデルを学習する必要がある。 ...