翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
SageMaker ベストプラクティスによる分散コンピューティング
このベストプラクティスのページでは、機械学習 (ML) ジョブ全般におけるさまざまな分散コンピューティングについて説明しています。このページの「分散コンピューティング」という用語には、機械学習タスクの分散トレーニングと、データ処理、データ生成、特徴量エンジニアリング、強化学習のパラレルコンピューティングが含まれます。このページでは、分散コンピューティングの一般的な課題と、 SageMaker トレーニングと SageMaker 処理で使用可能なオプションについて説明します。分散コンピューティングに関するその他の参考資料については、「分散コンピューティングとは何ですか?
ML タスクは、複数のノード (インスタンス)、アクセラレーター (NVIDIA GPUs AWS Trainium チップ)、vCPU コアに分散して実行するように設定できます。分散計算を実行することで、演算処理の高速化、大規模なデータセットの処理、大規模な ML モデルのトレーニングなど、さまざまな目標を達成できます。
次のリストは、ML トレーニングジョブを大規模に実行するときに直面する可能性のある一般的な課題をまとめたものです。
-
ML タスク、使用するソフトウェアライブラリ、コンピューティングリソースに応じて、計算の分散方法を決定する必要があります。
-
すべての ML タスクが簡単に分散できるわけではありません。また、すべての ML ライブラリが分散計算をサポートしているわけではありません。
-
分散計算では、必ずしも計算効率が直線的に向上するとは限りません。特に、データ I/O と GPU 間の通信がボトルネックになっていないか、オーバーヘッドの原因となっていないかを特定する必要があります。
-
分散計算は数値処理を妨害し、モデルの精度を変える可能性があります。特にデータ並列ニューラルネットワークのトレーニングでは、より大きな計算クラスターにスケールアップする際にグローバルバッチサイズを変更する場合、それに応じて学習レートを調整する必要もあります。
SageMaker は、さまざまなユースケースでこのような課題を容易にする分散トレーニングソリューションを提供します。以下のオプションの中から、ユースケースに最も適したものを選択します。
トピック
オプション 1: 分散トレーニングをサポートする SageMaker 組み込みアルゴリズムを使用する
SageMaker には、コンソールまたは SageMaker Python SDK から SageMakerすぐに使用できる組み込みアルゴリズムが用意されています。組み込みアルゴリズムを使用すれば、コードのカスタマイズ、モデルの背後にあるサイエンスの理解、プロビジョニングされた Amazon EC2 インスタンスでの Docker の実行に時間を費やす必要はありません。
SageMaker 組み込みアルゴリズムのサブセットは、分散トレーニングをサポートします。選択したアルゴリズムが分散トレーニングをサポートしているかどうかを確認するには、「Common Information About Built-in Algorithms」の表の並列処理可能列を参照してください。並列処理可能列に示されているように、一部のアルゴリズムはマルチインスタンス分散トレーニングをサポートしていますが、その他の並列化可能なアルゴリズムは 1 つのインスタンスで複数の GPU にわたる並列処理をサポートします。
オプション 2: SageMaker マネージドトレーニングまたは処理環境でカスタム ML コードを実行する
SageMaker ジョブは、特定のユースケースやフレームワーク向けに分散トレーニング環境をインスタンス化できます。この環境は、独自の ML コードを導入して実行できる ready-to-use ホワイトボードとして機能します。
ML コードに深層学習フレームワークが使用されている場合
SageMaker トレーニング用 Deep Learning Containers (DLC)
-
SageMaker 分散トレーニングライブラリ
SageMaker 分散トレーニングライブラリは、ニューラルネットワークデータの並列処理とモデル並列処理用の AWSマネージドコードを提案します。 SageMaker 分散トレーニングには、 SageMaker Python SDK に組み込まれているランチャークライアントも付属しているため、並列起動コードを作成する必要はありません。詳細については、SageMaker「」のデータ並列処理ライブラリとSageMaker「」のモデル並列処理ライブラリを参照してください。
-
オープンソースの分散トレーニングライブラリ
オープンソースフレームワークには、 DistributedDataParallelism の (DDP) PyTorch
や の tf.distribute
モジュールなどの独自のディストリビューションメカニズムがあります TensorFlow。これらの分散トレーニングフレームワークは、 SageMakerマネージドフレームワークコンテナで実行できます。例えば、 で MaskRCNN をトレーニング SageMakerするためのサンプルコードは、 PyTorch フレームワークコンテナで SageMaker PyTorch DDP と SageMaker TensorFlow フレームワークコンテナで Horovod の両方を使用する方法を示しています。
SageMaker ML コンテナには MPI
GPU でのデータ並列ニューラルネットワークトレーニングに関する注意事項
-
必要に応じて、マルチ GPU やマルチマシンの並列処理にスケーリングする
ニューラルネットワークのトレーニングジョブは、複数の CPU や複数の GPU インスタンスで実行されることがよくあります。GPU ベースの各インスタンスには通常、複数の GPU デバイスが含まれています。そのため、分散 GPU コンピューティングは、複数の GPU を備えた単一の GPU インスタンス内で実行することも (単一ノードのマルチ GPU トレーニング)、それぞれに複数の GPU コアを持つ複数の GPU インスタンスで行うこともできます (マルチノードのマルチ GPU トレーニング)。単一インスタンスのトレーニングはコードの記述とデバッグが容易で、通常、ノード内の GPU から GPU へのスループットはノード間の GPU 間のスループットよりも速くなります。そのため、まずデータの並列処理を垂直方向にスケーリングし (1 つの GPU インスタンスを複数の GPU で使用する)、必要に応じて複数の GPU インスタンスに拡張することをお勧めします。これは、CPU 予算が高い場合 (例えば、データの前処理に膨大な負荷がかかる場合) や、マルチ GPU インスタンスの CPU と GPU の比率が低すぎる場合には当てはまらない可能性があります。いずれの場合も、独自の ML トレーニングのニーズとワークロードに基づいて、インスタンスタイプのさまざまな組み合わせを試してみる必要があります。
-
収束の品質の監視
データ並列処理を使用してニューラルネットワークに学習させる場合、GPU あたりのミニバッチサイズを一定に保ちながら GPU の数を増やすと、ミニバッチの確率的勾配降下法 (MSGD) プロセスのグローバルミニバッチのサイズが大きくなります。MSGD のミニバッチのサイズは、降下ノイズと収束に影響することが知られています。精度を保ちながら適切にスケーリングするには、学習レートなどの他のハイパーパラメータを調整する必要があります [Goyal et al.
(2017)]。 -
I/O ボトルネックの監視
GPU の数を増やすと、ストレージの読み取りと書き込みのスループットも向上するはずです。データソースとパイプラインがボトルネックにならないように確認します。
-
必要に応じてトレーニングスクリプトを変更する
シングル GPU トレーニング用に作成されたトレーニングスクリプトは、マルチノードマルチ GPU トレーニング用に変更する必要があります。ほとんどのデータ並列処理ライブラリでは、次の処理を行うためにスクリプトを変更する必要があります。
-
トレーニングデータのバッチを各 GPU に割り当てます。
-
複数の GPU にわたる勾配計算とパラメータ更新を処理できるオプティマイザを使用します。
-
チェックポイントの責任を特定のホストと GPU に割り当てます。
-
ML コードに表形式のデータ処理が含まれる場合
PySpark は、オープンソースの分散コンピューティングフレームワークである Apache Spark の Python フロントエンドです。 PySpark は、大規模な本番ワークロードの分散表形式のデータ処理に広く採用されています。表形式のデータ処理コードを実行する場合は、SageMaker 処理 PySpark コンテナの使用と並列ジョブの実行を検討してください。Amazon EMR
オプション 3: 独自のカスタム分散トレーニングコードを作成する
トレーニングジョブまたは処理ジョブを に送信すると SageMaker、 SageMaker トレーニング API と SageMaker処理 APIs Amazon EC2 コンピューティングインスタンスを起動します。独自の Docker コンテナを実行するか、 AWS マネージドコンテナに追加のライブラリをインストールすることで、インスタンスのトレーニング環境と処理環境をカスタマイズできます。Docker with SageMaker Training の詳細については、「 と連携するように独自の Docker コンテナを適応 SageMakerさせる」および「独自のアルゴリズムとモデルを使用してコンテナを作成する」を参照してください。処理付き SageMaker Docker の詳細については、「独自の処理コードを使用する」を参照してください。
すべての SageMaker トレーニングジョブ環境には の設定ファイルが含まれ/opt/ml/input/config/resourceconfig.json
、すべての SageMaker 処理ジョブ環境には にある同様の設定ファイルが含まれています/opt/ml/config/resourceconfig.json
。コードはこのファイルを読み取って hostnames
を見つけ、ノード間の通信を確立できます。JSON ファイルのスキーマを含む詳細については、「分散トレーニング設定」および「Amazon SageMaker Processing が処理コンテナを設定する方法」を参照してください。また、Ray
SageMaker トレーニングと SageMaker 処理を使用して、ワーカー間の通信を必要としないカスタム分散計算を実行することもできます。コンピューティングに関する文献では、これらのタスクは「驚異的並列」または「share-nothing」として説明されることがよくあります。例としては、データファイルの並列処理、異なる構成でのモデルの並列トレーニング、レコードのコレクションに対するバッチ推論の実行などがあります。このような共有なしのユースケースは、Amazon で簡単に並列化できます SageMaker。複数のノードを持つクラスターで SageMaker トレーニングジョブまたは SageMaker 処理ジョブを起動すると、 SageMaker はデフォルトでトレーニングコードをレプリケートし、すべてのノードで (Python または Docker で) 起動します。このような複数のノードへの入力データのランダム分散を必要とするタスクは、API の SageMaker TrainingInput
データ入力設定S3DataDistributionType=ShardedByS3Key
で を設定することで容易になります。
オプション 4: 複数のジョブを並列または順次起動する
ML コンピューティングワークフローを、それぞれ独自の SageMaker トレーニングジョブまたは SageMaker 処理ジョブで表される小さな並列またはシーケンシャルコンピューティングタスクに分散することもできます。タスクを複数のジョブに分割すると、次のような状況やタスクに役立ちます。
-
各サブタスクに特定のデータチャネルとメタデータエントリ (ハイパーパラメータ、モデル設定、インスタンスタイプなど) がある場合。
-
サブタスクレベルで再試行ステップを実装する場合。
-
バッチサイズの増加に関するトレーニングを行う場合など、ワークロードの進行中にサブタスクの設定を変更する場合。
-
1 つのトレーニングジョブで許容される最大トレーニング時間 (最長 28 日) よりも長くかかる ML タスクを実行する必要がある場合。
-
コンピューティングワークフローのさまざまなステップで必要なインスタンスタイプが異なる場合。
ハイパーパラメータ検索の特定のケースでは、SageMaker 自動モデル調整 を使用します。 SageMaker 自動モデル調整は、ランダム、ベイズ、または の検索ロジックに従って、ユーザーに代わって複数のトレーニングジョブを起動するサーバーレスパラメータ検索オーケストレーターです HyperBand。
さらに、複数のトレーニングジョブをオーケストレーションするために、Amazon Managed Workflows for Apache Airflow (MWAA) および SageMaker Workflows