PyTorch 1.8 チュートリアル : 並列と分散訓練 : PyTorch 分散概要 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/08/2021 (1.8.1+cu102)
* 本ページは、PyTorch 1.8 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:
- Parallel and Distributed Training : PyTorch Distributed Overview
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
スケジュールは弊社 公式 Web サイト でご確認頂けます。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
人工知能研究開発支援 | 人工知能研修サービス | テレワーク & オンライン授業を支援 |
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。) |
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ ; Facebook |
並列と分散訓練 : PyTorch 分散概要
これは torch.distributed パッケージのための概要ページです。異なる場所で追加された非常に多くのドキュメント、サンプルとチュートリアルがありますので、特定の問題のためにどのドキュメントやチュートリアルを参考にするか、あるいはこれらの内容を読むのに最善の順序は何かが不明瞭になっています。このページの目標はドキュメントを様々なトピックにカテゴライズしてこの問題に対処し、そしてそれらの各々を簡潔に説明することです。これが PyTorch を使用して分散訓練アプリケーションを構築する貴方の最初の回であるなら、貴方のユースケースに最善に役立つことができるテクノロジーにナビゲートするためにこのドキュメントを利用することを勧めます。
イントロダクション
PyTorch v1.6.0 の時点で、torch.distributed の機能は 3 つの主要なコンポーネントにカテゴリー分けできます。
- 分散データ並列訓練 (DDP, Distributed Data-Parallel Training) は広く採用されている単一プログラムのマルチデータ訓練パラダイムです。DDP では、モデルは総てのプロセスで複製されて、総てのモデルレプリカは入力データサンプルの異なるセットを供給されます。DDP はモデルレプリカが同期されることを維持するために勾配通信を処理しそして訓練をスピードアップするためにそれを勾配計算とオーバーラップさせます。
- RPC-ベース分散訓練 (RPC) は、分散パイプライン並列処理、パラメータサーバ・パラダイム、そして DDP と他の訓練パラダイムの組合せのような、データ並列訓練に収まらない一般的な訓練構造をサポートするために開発されました。それは遠隔オブジェクトのライフタイムを管理してマシン境界を越えて autograd エンジンを拡張するのに役立ちます。
- コレクティブ通信 (c10d, Collective Communication) ライブラリはグループ内でプロセス間で tensor を送信することをサポートします。それはコレクティブ通信 API (e.g., all_reduce と all_gather) と P2P 通信 API (e.g. send と isend) の両者を提供します。DDP と RPC (ProcessGroup バックエンド) は v1.6.0 の時点で c10d 上に構築されています、そこでは前者はコレクティブ通信を利用して後者は P2P 通信を利用しています。通常は、開発者はこの raw 通信 API を直接使用する必要はありません、何故なら上の DDP と RPC 機能は多くの分散訓練シナリオに対応できるからです。けれども、この API が依然として役に立つユースケースがあります。一つの例は分散パラメータ平均でしょう、そこではアプリケーションは勾配を伝えるために DDP を使用する代わりに backward パスの後総てのモデルのパラメータの平均値を計算することを望みます。これは計算から通信を切り離して何を通信するかに渡りより極め細かい制御を可能にしますが、その一方で、それは DDP により与えられるパフォーマンス最適化を断念もします。 Writing Distributed Applications with PyTorch は c10d 通信 API を使用する例を示します。
既存のドキュメントの殆どは DDP か RPC のいずれかのために書かれていますので、このページの残りはこれら 2 つのコンポーネントのための資料を詳述します。
データ並列訓練
PyTorch はデータ並列訓練のために幾つかのオプションを提供します。単純から複雑へそしてプロトタイプから製品へ徐々に成長するアプリケーションについて、一般的な開発の軌跡は以下になります :
- 単一デバイス訓練を利用します、データとモデルが 1 つの GPU に収まり、訓練スピードが問題ではない場合。
- 単一マシン・マルチ GPU DataParallel を利用します、もしサーバ上に複数の GPU があり、最小限のコード変更で訓練をスピードアップしたい場合。
- 単一マシン・マルチ GPU DistributedDataParallel を利用します、もし訓練を更にスピードアップしたくてそれをセットアップするためにもう少し多いコードを書く意志がある場合。
- マルチマシン DistributedDataParallel と 起動スクリプト を利用します、アプリケーションがマシン境界を越えてスケールする必要がある場合。
- 分散訓練を起動するために torchelastic を利用します、エラー (e.g., OOM) が想定されるか、あるいは訓練の間にリソースが動的に加わったり離れたりする場合。
Note: データ並列訓練はまた 自動混合精度 (AMP, Automatic Mixed Precision) とも動作します。
torch.nn.DataParallel
DataParallel パッケージは単一マシン・マルチ GPU 並列処理を最低のコーディング・ハードルで有効にします。それはアプリケーション・コードへの 1 行の変更を必要とするだけです。チュートリアル オプション: データ並列 はサンプルを示します。注意する点は、DataParallel は利用するに非常に容易ですが、最善のパフォーマンスを通常は提供しないことです。これは DataParallel の実装が総ての forward パスでモデルを複製し、そしてその単一プロセス・マルチスレッド並列処理は必然的に GIL 競合に悩まされます。より良いパフォーマンスを得るには、DistributedDataParallel の使用を考えてください。
torch.nn.parallel.DistributedDataParallel
DataParallel と比較して、DistributedDataParallel はセットアップするためにもう 1 ステップ必要です、すなわち init_process_group を呼び出します。DDP はマルチプロセス並列処理を使用し、そしてそれ故にモデルレプリカの間の GIL 競合がありません。更にモデルは総ての forward パスでの代わりに DDP 構築時にブロードキャストされます、これはまた訓練のスピードアップにも役立ちます。DDP は幾つかのパフォーマンス最適化テクノロジーが標準装備です。より深い説明については、この DDP 論文 (VLDB’20) を参照してください。
DDP 資料は下でリストされます :
- DDP ノート はスターター・サンプルとそのデザインと実装の幾つかの簡潔な説明を提供します。これが DDP を使用する貴方の最初の回ならば、このドキュメントから始めてください。
- Getting Started with 分散データ並列 (処理) は不均衡なワークロード、チェックポイント (の実行)、そしてマルチデバイス・モデルを含む DDP 訓練に伴う幾つかの一般的な問題を説明します。DDP は単一マシン・マルチデバイス・モデル並列処理と容易に組み合わせることができることに注意してください、これは 単一マシン・モデル並列 (処理) ベストプラクティス チュートリアルで説明されます。
- 分散データ並列 (処理) アプリケーションの起動と configure ドキュメントは DDP 起動スクリプトをどのように利用するかを示します。
- Shard Optimizer States With ZeroRedundancyOptimizer レシピは ZeroRedundancyOptimizer が分散データ並列処理訓練のための optimizer メモリ消費量を減じるためにどのように役立つかを実演します。
TorchElastic
アプリケーションの複雑さやスケールの増大とともに、障害回復は必須の要件になります。時に、DDP を使用するとき OOM のようなエラーにぶつかることは不可避ですが、DDP 自身はそれらのエラーから復旧できませんし基本的な try-except ブロックも動作しません。これは DDP が総てのプロセスに密接に同期する流儀で動作することを必要とし、そして異なるプロセスで起動された総ての AllReduce 通信がマッチしなければならないからです。グループのプロセスの一つが OOM 例外を投げる場合、desynchronization (ミスマッチの AllReduce 演算) に繋がりがちです、これは次にクラッシュかハングを引き起こすでしょう。訓練の間に障害が発生することを想定する場合やリソースが動的に離れて加わるかもしれない場合、torchelastic を使用して分散データ並列訓練を開始してください。
一般的な分散訓練
多くの訓練パラダイムはデータ並列に適合しません、例えば、パラメータサーバ・パラダイム、分散パイプライン並列処理、複数のオブザーバーとエージェントを持つ強化学習アプリケーション等です。torch.distributed.rpc は一般的な分散訓練シナリオをサポートすることを目的としています。
torch.distributed.rpc パッケージは 4 つの主要な柱を持ちます :
- RPC は遠隔ワーカー上で指定された関数の実行をサポートします。
- RRef は遠隔オブジェクトのライフタイムを管理するのに役立ちます。参照カウント・プロトコルは RRef ノート で表されています。
- 分散 Autograd はマシン境界を越えて autograd エンジンを拡張します。より詳細は 分散 Autograd デザイン を参照してください。
- 分散 Optimizer は、分散 autograd エンジンにより計算された勾配を使用してパラメータを更新するために総ての参加しているワーカーに自動的に到達します。
RPC チュートリアルは以下にリストアップされます :
- Getting Started with 分散 RPC フレームワーク チュートリアルは RPC と RRef を実演するためにまず単純な強化学習 (RL) サンプルを使用します。それから、それは分散 autograd と分散 optimizer をどのように利用するかを示すために RNN サンプルに基本的な分散モデル並列を適用します。
- 分散 RPC フレームワークを使用したパラメータ・サーバの実装 チュートリアルは HogWild! 訓練 のスピリットを借りてそれを非同期パラメータサーバ (PS) 訓練アプリケーションに適用します。
- RPC を使用する分散パイプライン並列化 チュートリアルは (単一マシン・モデル並列 (処理) ベストプラクティス で表されている) 単一マシン・パイプライン並列サンプルを分散環境に拡張してそれを RPC を使用してどのように実装するかを示します。
- 非同期実行を使用したバッチ RPC 処理の実装 チュートリアルは @rpc.functions.async_execution デコレータを使用して RPC バッチ処理をどのように実装するかを実演します、これは推論と訓練をスピードアップするのに役立つことができます。それは上のチュートリアル 1 と 2 で利用されたのと同様な RL と PS サンプルを使用します。
- 分散 DataParallel を分散 RPC フレームワークと組み合わせる チュートリアルは分散モデル並列化と組み合わせた分散データ並列化を使用してモデルを訓練するために DDP を RPC とどのように組み合わせるかを実演します。
以上