SageMaker AI による分散コンピューティングのベストプラクティス - Amazon SageMaker AI

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

SageMaker AI による分散コンピューティングのベストプラクティス

このベストプラクティスのページでは、機械学習 (ML) ジョブ全般におけるさまざまな分散コンピューティングについて説明しています。このページの「分散コンピューティング」という用語には、機械学習タスクの分散トレーニングと、データ処理、データ生成、特徴量エンジニアリング、強化学習のパラレルコンピューティングが含まれます。このページでは、分散コンピューティングの一般的な課題と、SageMaker トレーニングと SageMaker 処理で利用できるオプションについて説明します。分散コンピューティングに関するその他の参考資料については、「分散コンピューティングとは何ですか?」を参照してください。

ML タスクを複数のノード (インスタンス)、アクセラレータ (NVIDIA GPU、AWS Trainium チップ)、vCPU コアに分散して実行するように設定できます。分散計算を実行することで、演算処理の高速化、大規模なデータセットの処理、大規模な ML モデルのトレーニングなど、さまざまな目標を達成できます。

次のリストは、ML トレーニングジョブを大規模に実行するときに直面する可能性のある一般的な課題をまとめたものです。

  • ML タスク、使用するソフトウェアライブラリ、コンピューティングリソースに応じて、計算の分散方法を決定する必要があります。

  • すべての ML タスクが簡単に分散できるわけではありません。また、すべての ML ライブラリが分散計算をサポートしているわけではありません。

  • 分散計算では、必ずしも計算効率が直線的に向上するとは限りません。特に、データ I/O と GPU 間の通信がボトルネックになっていないか、オーバーヘッドの原因となっていないかを特定する必要があります。

  • 分散計算は数値処理を妨害し、モデルの精度を変える可能性があります。特にデータ並列ニューラルネットワークのトレーニングでは、より大きな計算クラスターにスケールアップする際にグローバルバッチサイズを変更する場合、それに応じて学習レートを調整する必要もあります。

SageMaker AI は、さまざまなユースケースでこのような課題を緩和するための分散トレーニングソリューションを提供しています。以下のオプションの中から、ユースケースに最も適したものを選択します。

オプション 1: 分散トレーニングをサポートする SageMaker AI 組み込みアルゴリズムを使用する

SageMaker AI には組み込みアルゴリズムが用意されており、SageMaker AI コンソールまたは SageMaker Python SDK からそのまま使用できます。組み込みアルゴリズムを使用すれば、コードのカスタマイズ、モデルの背後にあるサイエンスの理解、プロビジョニングされた Amazon EC2 インスタンスでの Docker の実行に時間を費やす必要はありません。

SageMaker AI の組み込みアルゴリズムのサブセットは、分散トレーニングをサポートします。選択したアルゴリズムが分散トレーニングをサポートしているかどうかを確認するには、「Common Information About Built-in Algorithms」の表の並列処理可能列を参照してください。並列処理可能列に示されているように、一部のアルゴリズムはマルチインスタンス分散トレーニングをサポートしていますが、その他の並列化可能なアルゴリズムは 1 つのインスタンスで複数の GPU にわたる並列処理をサポートします。

オプション 2: SageMaker AI マネージドトレーニングまたは処理環境でカスタム ML コードを実行する

SageMaker AI ジョブは、特定のユースケースやフレームワークに合わせて分散トレーニング環境をインスタンス化できます。この環境は、独自の ML コードを持ち込んで実行できる、すぐに使用できるホワイトボードとして機能します。

ML コードに深層学習フレームワークが使用されている場合

SageMaker トレーニング用の深層学習コンテナ (DLC) を使用して分散トレーニングジョブを起動できます。このコンテナは、SageMaker AI Python SDK 専用の Python モジュールを使用するか、AWS CLIAWS SDK for Python (Boto3) を使用した SageMaker API を介してオーケストレーションできます。SageMaker AI は PyTorchTensorFlowHugging Face TransformersApache MXNet などの機械学習フレームワーク用のトレーニングコンテナを提供しています。分散トレーニング用の深層学習コードを作成する方法は 2 つあります。

  • SageMaker AI 分散トレーニングライブラリ

    SageMaker AI 分散トレーニングライブラリは、ニューラルネットワークデータ並列処理およびモデル並列処理のための AWS マネージドコードを提案します。SageMaker AI 分散トレーニングには SageMaker Python SDK に組み込まれているランチャークライアントも付属しているため、並列起動コードを作成する必要はありません。詳細については、「SageMaker AI's data parallelism library」と「SageMaker AI's model parallelism library」を参照してください。

  • オープンソースの分散トレーニングライブラリ

    オープンソースフレームワークには、PyTorch の DistributedDataParallelism (DDP) や TensorFlow の tf.distribute モジュールなど、独自の分散メカニズムがあります。これらの分散トレーニングフレームワークは、SageMaker AI 管理のフレームワークコンテナで実行することができます。例えば、SageMaker AI で MaskRCNN をトレーニングするサンプルコードは、SageMaker PyTorch フレームワークコンテナ内の PyTorch DDP と SageMaker TensorFlow フレームワークコンテナ内の Horovod の両方を使用する方法を示しています。

SageMaker AI ML コンテナには MPI もプリインストールされているため、mpi4py を使用してエントリポイントスクリプトを並列化できます。MPI 統合トレーニングコンテナの使用は、サードパーティーの分散トレーニングランチャーを起動する場合や、SageMaker AI マネージドトレーニング環境でアドホック並列コードを記述する場合に最適なオプションです。

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 および AWS Glue と統合されている Amazon SageMaker Studio Classic で SageMaker トレーニングと SageMaker Processing の API を使用して、データ処理ジョブを並列して実行することもできます。

オプション 3: 独自のカスタム分散トレーニングコードを作成する

SageMaker AI にトレーニングまたは処理ジョブを送信すると、SageMaker トレーニングおよび SageMaker AI 処理 API は Amazon EC2 コンピューティングインスタンスを起動します。独自の Docker コンテナを実行するか、AWS マネージドコンテナに追加のライブラリをインストールすることで、インスタンスのトレーニング環境と処理環境をカスタマイズできます。SageMaker トレーニングによる Docker の詳細については、「Adapting your own Docker container to work with SageMaker AI」および「Create a container with your own algorithms and models」を参照してください。Docker と SageMaker AI 処理についての詳細は、「独自の処理コードを使用する」を参照してください。

すべての SageMaker トレーニングジョブ環境は、/opt/ml/input/config/resourceconfig.json に設定ファイルが含まれ、すべての SageMaker 処理ジョブ環境は、/opt/ml/config/resourceconfig.json に同様の設定ファイルが含まれています。コードはこのファイルを読み取って hostnames を見つけ、ノード間の通信を確立できます。JSON ファイルのスキーマを含む詳細については、「Distributed Training Configuration」および「How Amazon SageMaker Processing Configures Your Processing Container」を参照してください。SageMaker AI では、Ray や DeepSpeed などのサードパーティーの分散コンピューティングライブラリをインストールして使用することもできます。

SageMaker トレーニングと SageMaker 処理を使用して、ワーカー間の通信を必要としないカスタムの分散計算を実行することもできます。コンピューティングに関する文献では、これらのタスクは「驚異的並列」または「share-nothing」として説明されることがよくあります。例としては、データファイルの並列処理、異なる構成でのモデルの並列トレーニング、レコードのコレクションに対するバッチ推論の実行などがあります。このような share-nothing のユースケースは、Amazon SageMaker AI で簡単に並列化できます。複数のノードがあるクラスターで SageMaker トレーニングまたは SageMaker 処理ジョブを起動すると、SageMaker AI はデフォルトでトレーニングコード (Python または Docker) をすべてのノードに複製して起動します。入力データをこのような複数のノードにランダムに分散させる必要があるタスクは、SageMaker AI S3DataDistributionType=ShardedByS3Key API のデータ入力設定で TrainingInput の設定をすることで簡単に行えます。

オプション 4: 複数のジョブを並列または順次起動する

ML コンピューティングワークフローを、それぞれ独自の SageMaker トレーニングまたは SageMaker 処理ジョブで表される小規模な並列計算タスクまたは順次計算タスクに分散させることもできます。タスクを複数のジョブに分割すると、次のような状況やタスクに役立ちます。

  • 各サブタスクに特定のデータチャネルとメタデータエントリ (ハイパーパラメータ、モデル設定、インスタンスタイプなど) がある場合。

  • サブタスクレベルで再試行ステップを実装する場合。

  • バッチサイズの増加に関するトレーニングを行う場合など、ワークロードの進行中にサブタスクの設定を変更する場合。

  • 1 つのトレーニングジョブで許容される最大トレーニング時間 (最長 28 日) よりも長くかかる ML タスクを実行する必要がある場合。

  • コンピューティングワークフローのさまざまなステップで必要なインスタンスタイプが異なる場合。

ハイパーパラメータ検索の特定のケースでは、SageMaker AI 自動モデル調整を使用します。SageMaker AI 自動モデル調整は、ランダム、ベイズ、または HyperBand の検索ロジックに従って、ユーザーに代わって複数のトレーニングジョブを起動するサーバーレスのパラメータ検索オーケストレーターです。

さらに、複数のトレーニングジョブをオーケストレーションするには、SageMaker PipelinesAWS Step FunctionsAmazon Managed Workflows for Apache Airflow (MWAA) および SageMaker AI ワークフロー でサポートされている Apache Airflow などのワークフローオーケストレーションツールを検討することもできます。