Amazon での分散トレーニング SageMaker - Amazon SageMaker

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

Amazon での分散トレーニング SageMaker

SageMaker は分散トレーニングライブラリを提供し、コンピュータビジョン (CV) や自然言語処理 () など、深層学習タスク用のさまざまな分散トレーニングオプションをサポートしますNLP。 SageMakerの分散トレーニングライブラリを使用すると、高度にスケーラブルで費用対効果の高いカスタムデータ並列およびモデル並列深層学習トレーニングジョブを実行できます。()、、 (DDP)、パラメータサーバーなど PyTorch DistributedDataParalleltorchrun、他の分散トレーニングフレームワークMPImpirunやパッケージを使用することもできます。ドキュメント全体で、手順と例は、 SageMaker Python を使用して深層学習タスクの分散トレーニングオプションを設定する方法に焦点を当てていますSDK。

ヒント

機械学習 (ML) の分散コンピューティングのトレーニングと処理ジョブ全般のベストプラクティスについては、「 SageMaker ベストプラクティスによる分散コンピューティング」を参照してください。

始める前に

SageMaker トレーニングは、1 つのインスタンスと複数のインスタンスで分散トレーニングをサポートしているため、任意のサイズのトレーニングを大規模に実行できます。さまざまな分散トレーニングオプションを備えたトレーニングジョブランチャーである SageMaker Python TensorFlowではSDK、 PyTorchや などのフレームワーク推定器クラスを使用することをお勧めします。推定器オブジェクトを作成すると、オブジェクトは分散トレーニングインフラストラクチャを設定し、バックエンドCreateTrainingJobAPIで を実行し、現在のセッションが実行されているリージョンを検索し、 AWS 深層学習フレームワーク、分散トレーニングフレームワーク、EFAドライバーなどの多数のライブラリがあらかじめパッケージ化された構築済みの深層学習コンテナの 1 つを取得します。FSx ファイルシステムをトレーニングインスタンスにマウントする場合は、VPCサブネットとセキュリティグループ ID を推定器に渡す必要があります。で分散トレーニングジョブを実行する前に SageMaker、基本的なインフラストラクチャ設定に関する以下の一般的なガイダンスをお読みください。

アベイラビリティーゾーンとネットワークバックプレーン

複数のインスタンス (ノード とも呼ばれます) を使用する場合は、インスタンスを接続するネットワーク、トレーニングデータの読み取り方法、およびインスタンス間での情報の共有方法を理解することが重要です。例えば、分散データ並列トレーニングジョブを実行する場合、AllReduceオペレーションを実行するためのコンピューティングクラスターのノード間の通信や、Amazon Simple Storage Service または Amazon FSx for Lustre のノードとデータストレージ間のデータ転送など、さまざまな要因が、コンピューティングリソースの最適な使用とトレーニング速度の向上を実現する上で重要な役割を果たします。通信オーバーヘッドを減らすには、インスタンス、VPCサブネット、データストレージを同じ と AWS リージョン アベイラビリティーゾーンに設定してください。

GPU より高速なネットワークと高スループットストレージを備えた インスタンス

技術的には、どのインスタンスでも分散トレーニングに使用できます。大規模な言語モデル (LLMs) や拡散モデルなど、ノード間のコミューテーションを高速化する必要がある大規模なモデルをトレーニングするためにマルチノード分散トレーニングジョブを実行する必要がある場合は、 EFAでサポートされている 対応GPUインスタンス SageMakerをお勧めします。特に、 で最もパフォーマンスの高い分散トレーニングジョブを実現するには SageMaker、NVIDIAA100 を搭載した P4d および P4de インスタンスGPUsをお勧めします。これらには、高スループット、低レイテンシーのローカルインスタンスストレージ、およびより高速なノード内ネットワークも搭載されています。データストレージには、トレーニングデータセットとモデルチェックポイントを保存するための高スループットを提供する Amazon FSx for Lustre をお勧めします。

Amazon での分散トレーニングの開始方法 SageMaker

既に分散トレーニングに慣れている場合は、以下のオプションからお好みの戦略やフレームワークに合わせて 1 つを選択して始めてください。分散型トレーニング全般について知りたい場合は、分散トレーニングの基本概念 を参照してください。

SageMaker 分散トレーニングライブラリは SageMaker トレーニング環境に合わせて最適化されており、分散トレーニングジョブを に適応させ SageMaker、トレーニングの速度とスループットを向上させます。ライブラリは、データ並列とモデル並列の両方のトレーニング戦略を提供します。ソフトウェアとハードウェアテクノロジーを組み合わせてノード間GPUおよびノード間の通信を改善し、 SageMakerトレーニングスクリプトのコード変更を最小限に抑える組み込みオプションを使用して のトレーニング機能を拡張します。 

SageMaker 分散データ並列処理 (SMDDP) ライブラリを使用する

このSMDDPライブラリは、 AWS ネットワークインフラストラクチャAllReduceと Amazon SageMaker ML インスタンストポロジーに最適化された の実装とAllGather集合的な通信オペレーションにより、ノード間の通信を改善します。SMDDP ライブラリは、分散データ並列 ()、完全シャーディングデータ並列処理 ()、、Megatron- などの PyTorchベースの分散トレーニングパッケージのバックエンドとして使用できます。 PyTorch DDP PyTorch FSDP DeepSpeed DeepSpeed次のコード例は、2 つのml.p4d.24xlargeインスタンスで分散トレーニングジョブを起動するためのPyTorch推定器を設定する方法を示しています。

from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=2, instance_type="ml.p4d.24xlarge", # Activate distributed training with SMDDP distribution={ "pytorchddp": { "enabled": True } } # mpirun, activates SMDDP AllReduce OR AllGather # distribution={ "torch_distributed": { "enabled": True } } # torchrun, activates SMDDP AllGather # distribution={ "smdistributed": { "dataparallel": { "enabled": True } } } # mpirun, activates SMDDP AllReduce OR AllGather )

トレーニングスクリプトを準備し、 で分散データ並列トレーニングジョブを起動する方法については SageMaker、「」を参照してください SageMaker 分散データ並列処理ライブラリによる分散トレーニングの実行

SageMaker モデル並列処理ライブラリを使用する (SMP)

SageMaker はSMPライブラリを提供し、シャーディングデータ並列処理、パイプライン処理、テンソル並列処理、オプティマイザ状態シャーディングなど、さまざまな分散トレーニング手法をサポートします。SMP ライブラリが提供する機能の詳細については、「」を参照してくださいModel SageMaker Parallelism Library の主な機能

SageMakerのモデル並列処理ライブラリを使用するには、 SageMaker フレームワーク推定器の distributionパラメータを設定します。サポートされているフレームワーク推定器は PyTorchおよび ですTensorFlow。次のコード例は、2 つの ml.p4d.24xlarge インスタンスでモデル並列処理ライブラリを使用して分散トレーニング用のフレームワーク推定器を構築する方法を示しています。

from sagemaker.framework import Framework distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # enter parameter key-value pairs here } }, }, "mpi": { "enabled" : True, ... # enter parameter key-value pairs here } } estimator = Framework( ..., instance_count=2, instance_type="ml.p4d.24xlarge", distribution=distribution )

トレーニングスクリプトを適応させ、 estimator クラスで分散パラメータを設定し、分散トレーニングジョブを起動する方法については、SageMaker「」の「 モデル並列処理ライブラリ」を参照してください (SageMaker Python SDKドキュメント「分散トレーニングAPIs」も参照してください)。

オープンソースの分散型トレーニングフレームワークを使用する

SageMaker は、バックエンドtorchrunmpirunおよび を運用するための以下のオプションもサポートしています。

  • バックエンド SageMaker で PyTorch DistributedDataParallel (DDP) を使用するにはmpirun、 を推定器distribution={"pytorchddp": {"enabled": True}}に追加します PyTorch。詳細については、SageMaker Python SDKドキュメントPyTorch 「分散トレーニングと推定器の distribution引数」も参照してください。 SageMaker PyTorch

    注記

    このオプションは PyTorch 1.12.0 以降で使用できます。

    from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=2, instance_type="ml.p4d.24xlarge", distribution={"pytorchddp": {"enabled": True}} # runs mpirun in the backend )
  • SageMaker は、P3 や P4 などの GPUベースの Amazon EC2インスタンスでの分散トレーニング用のPyTorch torchrunランチャーと、Trainium デバイスを搭載した Trn1 をサポートしています。 AWS

    バックエンド SageMaker で PyTorch DistributedDataParallel (DDP) を使用するにはtorchrun、 を PyTorch 推定器distribution={"torch_distributed": {"enabled": True}}に追加します。

    注記

    このオプションは PyTorch 1.13.0 以降で使用できます。

    次のコードスニペットは、torch_distributed分散オプションを使用して 2 つのml.p4d.24xlargeインスタンスで分散トレーニングを実行する推定 SageMaker PyTorch 器を構築する例を示しています。

    from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=2, instance_type="ml.p4d.24xlarge", distribution={"torch_distributed": {"enabled": True}} # runs torchrun in the backend )

    詳細については、SageMaker Python SDKドキュメント「分散 PyTorch トレーニングと推定器の distribution引数」を参照してください。 SageMaker PyTorch

    Trn1 での分散トレーニングに関する注意事項

    Trn1 インスタンスは最大 16 台の Trainium デバイスで構成され、各 Trainium デバイスは 2 つの で構成されますNeuronCores。 AWS Trainium デバイスの仕様については、 Neuron ドキュメントの「Trainium アーキテクチャ」を参照してください。 AWS

    Trainium 搭載インスタンスでトレーニングするには、 SageMaker PyTorch 推定器クラスの instance_type引数への文字列ml.trn1.*で Trn1 インスタンスコード を指定するだけです。使用可能な Trn1 インスタンスタイプを見つけるには、「AWS Neuron ドキュメント」の「AWS Trn1 Architecture」を参照してください。

    注記

    SageMaker Amazon EC2 Trn1 インスタンスでのトレーニングは現在、 v1. PyTorch11.0 AWS 以降の Deep Learning Containers for PyTorch Neuron のフレームワークでのみ利用できます。サポートされている PyTorch Neuron のバージョンの完全なリストを確認するには、「 Deep Learning Containers リポジトリ」の「Neuron AWS Containers GitHub 」を参照してください。

    SageMaker Python を使用して Trn1 インスタンスでトレーニングジョブを起動するとSDK、 SageMaker は AWS Deep Learning Containers が提供する Neuron コンテナから適切なコンテナを自動的に取得して実行します。Neuron コンテナには、トレーニング環境の設定と依存関係があらかじめパッケージ化されているため、トレーニングジョブを SageMaker トレーニングプラットフォームと Amazon EC2 Trn1 インスタンスに簡単に適応させることができます。

    注記

    を使用して Trn1 インスタンスで PyTorch トレーニングジョブを実行するには SageMaker、トレーニングスクリプトを変更してxlaバックエンドでプロセスグループを初期化し、PyTorch/XLA を使用する必要があります。XLA 導入プロセスをサポートするために、 AWS Neuron SDKは、 PyTorch オペレーションを Trainium 命令に変換XLAするために を使用する PyTorch Neuron を提供します。トレーニングスクリプトを変更する方法については、 Neuron ドキュメントの「Developer Guide for Training with PyTorch Neuron (torch-neuronx」を参照してください。 AWS

    詳細については、SageMaker Python SDKドキュメントTrn1 インスタンスでの PyTorch Neuron による分散トレーニング」および「推定器 の distribution引数」を参照してください。 SageMaker PyTorch

  • MPI で を使用するには SageMaker、 distribution={"mpi": {"enabled": True}}を推定器に追加します。MPI ディストリビューションオプションは、、MXNet、 PyTorchおよび のフレームワークで使用できます TensorFlow。

  • でパラメータサーバーを使用するには SageMaker、 distribution={"parameter_server": {"enabled": True}}を推定器に追加します。パラメータサーバーオプションは、、MXNet PyTorch、および のフレームワークで使用できます TensorFlow。

    ヒント

    フレームワークごとの MPIおよび パラメータサーバーオプションの使用の詳細については、SageMaker Python SDKドキュメント への次のリンクを使用します。

分散トレーニングの基本概念

SageMakerの分散トレーニングライブラリでは、次の分散トレーニングの用語と機能を使用します。

データセットとバッチ

  • トレーニングデータセット: モデルのトレーニングに使うすべてのデータ。

  • グローバルバッチサイズ: GPUsクラスター内の に送信する各反復でトレーニングデータセットから選択されたレコードの数。これは、各反復での勾配の計算に使われるレコードの数です。データ並列処理を使う場合、モデルレプリカの総数にレプリカ単位のバッチサイズを掛けたものと等しくなります: global batch size = (the number of model replicas) * (per-replica batch size) 。グローバルバッチサイズの 1 つのバッチは、機械学習の文献ではよくミニバッチと呼ばれます。

  • レプリカ単位のバッチサイズ: データ並列処理を使う場合、これは各モデルレプリカに送信されるレコードの数です。各モデルレプリカは、このバッチでフォワードパスとバックワードパスを実行して、重みの更新を計算します。結果として得られた重みの更新は、次のレプリカ単位のバッチセットが処理される前に、すべてのレプリカ間で同期 (平均化) されます。

  • マイクロバッチ: ミニバッチのサブセット、またはモデルとデータのハイブリッド並列処理が使用されている場合は、レプリカ単位サイズのバッチのサブセットです。 SageMakerの分散モデル並列処理ライブラリを使用すると、各マイクロバッチがトレーニングパイプラインにフィード one-by-one され、ライブラリのランタイムで定義された実行スケジュールに従います。

トレーニング

  • エポック: データセット全体を通した 1 回のトレーニングサイクル。エポックごとに複数の反復を行うのが一般的です。トレーニングで使うエポックの数は、モデルやユースケースによって異なります。

  • 反復: グローバルバッチサイズのバッチ (ミニバッチ) のトレーニングデータを使って実行される 1 回のフォワードパスとバックワードパス。トレーニング中に実行される反復回数は、グローバルバッチサイズとトレーニングに使用されるエポックの数によって決まります。例えば、データセットに 5,000 のサンプルが含まれており、500 のグローバルバッチサイズを使う場合、1 つのエポックを完了するには 10 回の反復が必要です。

  • 学習レート: モデルの計算誤差に応じて重みを変化させる量を動かす変数。学習レートは、モデルの収束能力だけでなく、収束の速度と最適性にも重要な役割を果たします。

インスタンスと GPUs

  • インスタンス : AWS 機械学習コンピューティングインスタンス ノードとも呼ばれます。

  • クラスターサイズ : SageMakerの分散トレーニングライブラリを使用する場合、これはインスタンスの数に各インスタンスGPUsの の数を掛けたものです。例えば、トレーニングジョブで 2 つの ml.p3.8xlarge インスタンスを使用し、GPUsそれぞれに 4 つのインスタンスがある場合、クラスターサイズは 8 です。クラスターサイズを大きくするとトレーニング時間が短縮されますが、インスタンス間の通信を最適化する必要があります。そうしないと、ノード間の通信によってオーバーヘッドが増し、トレーニング時間が遅くなる可能性があります。 SageMaker 分散トレーニングライブラリは、Amazon ML EC2 コンピューティングインスタンス間の通信を最適化するように設計されているため、デバイス使用率が高くなり、トレーニング時間が短縮されます。

分散トレーニングソリューション

  • データ並列処理: 複数の Amazon ML インスタンスで構成されるコンピューティングクラスターGPUs内の複数の にトレーニングデータセットを分割する分散トレーニングEC2の戦略。各 にはモデルのレプリカGPUが含まれ、トレーニングデータのさまざまなバッチを受け取り、フォワードパスとバックワードパスを実行し、同期のために他のノードと重みの更新を共有してから、次のバッチと最終的には別のエポックに進みます。

  • モデル並列処理: 複数の Amazon EC2ML インスタンスで構成されるコンピューティングクラスターGPUs内の複数の にまたがってモデルをパーティション化する分散トレーニングの戦略。モデルは複雑で、隠れレイヤーや重みの数が多く、1 つのインスタンスのメモリに収まらない場合があります。各 はモデルのサブセットGPUを保持し、データフローと変換を共有してコンパイルします。モデル並列処理の効率は、GPU使用率とトレーニング時間の観点から、モデルのパーティション化方法と、フォワードパスとバックワードパスの実行に使用される実行スケジュールに大きく依存します。

  • パイプライン実行スケジュール (パイプライン処理): パイプライン実行スケジュールは、モデルトレーニング中に全デバイスにわたって行われる計算 (マイクロバッチ) とデータ処理の順序を決定します。パイプライン化は、モデル並列処理で真の並列化を実現し、異なるデータサンプルでGPUsコンピューティングを同時に実行することで、シーケンシャル計算によるパフォーマンスの低下を克服する手法です。詳細については、「パイプライン実行スケジュール」を参照してください。

高度な概念

Machine Learning (ML) の実務者は、モデルをトレーニングするときに、モデルサイズのスケーリングトレーニングデータのスケーリングという 2 つのスケーリングの課題に直面することがよくあります。モデルのサイズと複雑さにより精度が向上しますが、単一の CPUまたは に収まるモデルサイズには制限がありますGPU。さらに、モデルサイズをスケーリングすると、計算量が増え、トレーニング時間が長くなる可能性があります。

トレーニングにはすべてのトレーニングデータをメモリに取り込む必要があるため、すべてのモデルがトレーニングデータのスケーリングを同等にうまく処理できるわけではありません。このようなモデルは、垂直方向にのみ、ますます大きなインスタンスタイプにスケールします。ほとんどの場合、トレーニングデータをスケールすると、トレーニング時間が長くなります。

深層学習 (DL) は、複数レイヤーの人工ニューラルネットワークからなる 機械学習アルゴリズムの特有のファミリーです。最も一般的なトレーニング方法は、ミニバッチ確率勾配降下法 () を使用することですSGD。ミニバッチ ではSGD、エラーを減らす方向に係数の小さな反復的な変更を行うことでモデルをトレーニングします。これらの反復は、ミニバッチと呼ばれるトレーニングデータセットの同じサイズのサブサンプルで実行されます。ミニバッチごとに、モデルはミニバッチの各レコードで実行され、その誤差が測定され、誤差の勾配が推定されます。次に、ミニバッチのすべてのレコードにわたる平均勾配が測定され、各モデル係数の更新方向が示されます。トレーニングデータセットの 1 つのフルパスは、エポックと呼ばれます。モデルトレーニングは通常、数十から数百のエポックで構成されます。ミニバッチSGDにはいくつかの利点があります。1 つ目は、反復的な設計により、トレーニング時間が理論的にデータセットサイズの線形になります。次に、特定のミニバッチでは、各レコードはモデルによって個別に処理され、最終的な勾配平均以外には、レコード間通信を必要としません。そのため、ミニバッチの処理は、並列化と分散に特に適しています。 

ミニバッチのレコードを異なるコンピューティングデバイスに分散してSGDトレーニングを並列化することは、データ並列分散トレーニング と呼ばれ、最も一般的に使用される DL 分散パラダイムです。データ並列トレーニングは、ミニバッチサイズをスケールし、各ミニバッチをより速く処理するための関連する分散戦略です。ただし、データ並列トレーニングには、すべてのワーカーから来る勾配を使ってミニバッチ勾配の平均を計算し、それをすべてのワーカーに伝達しなければならない余分な複雑さが伴います。これは allreduce と呼ばれるステップで、トレーニングクラスターがスケールされるほどオーバーヘッドが増え、不適切な実装や不適切なハードウェアの減少で、トレーニング時間に大きな悪影響を与える可能性があります。 

データ並列ではSGD、デベロッパーは少なくともモデルと 1 つのレコードを、1 つの CPUや などのコンピューティングデバイスに収めることができる必要がありますGPU。自然言語処理 (NLP) の大規模トランスフォーマーや高解像度画像でのセグメンテーションモデルなど、非常に大規模なモデルをトレーニングする場合、これが不可能な状況が発生する可能性があります。このような場合、モデルを複数のコンピューティングデバイスに分割することで、ワークロードを分散させる方法があります。この方法は、モデル並列分散トレーニングと呼ばれます。

戦略

分散トレーニングは通常、データ並列とモデル並列という 2 つのアプローチに分割されます。データ並列は分散トレーニングの最も一般的なアプローチです。大量のデータがあり、バッチ処理して、データブロックを複数の CPUsまたは GPUs (ノード) に送信し、ニューラルネットワークまたは ML アルゴリズムで処理してから、結果を結合します。ニューラルネットワークは各ノード同じものになります。モデル並列アプローチは、ノードのメモリにひとかたまりで収まらないような大きなモデルで使用されます。モデルを分割し、異なるノードに異なるパーツを配置します。この場合、モデルのすべての部分でデータが処理されるように、データのバッチを各ノードに送る必要があります。

ネットワークとモデルという用語は、しばしば同じ意味で使われます。大規模なモデルとは、実際には多くのレイヤーとパラメータを持つ大規模なネットワークです。大規模なネットワークでトレーニングすると大規模なモデルが生成され、トレーニング済みのすべてのパラメータとその重みと共にモデルをネットワークにロードし直すと、大規模なモデルがメモリにロードされます。モデルを分解してノード間に分割する場合は、基礎となるネットワークも分解されます。ネットワークはレイヤーで構成されており、ネットワークを分割するには、異なるコンピューティングデバイスにレイヤーを配置します。

デバイス間でレイヤーを単純に分割する一般的な落とし穴は、使用率GPUが低いことです。トレーニングは、フォワードパスとバックワードパスの両方で本質的にシーケンシャルであり、特定の時点では、アクティブに計算GPUできるのは 1 つだけであり、他のものはアクティベーションの送信を待機します。最新のモデル並列ライブラリは、パイプライン実行スケジュールを使ってデバイスの使用率を向上させることで、この問題を解決しています。ただし、Amazon の SageMaker分散モデル並列ライブラリにのみ、自動モデル分割が含まれます。ライブラリの 2 つのコア機能である、自動モデル分割とパイプライン実行スケジューリングは、効率的なデバイス利用につながる自動決定を行うことで、モデル並列の実装プロセスを簡素化します。

データ並列とモデル並列でトレーニングする

大規模なデータセットを使ってトレーニングする場合は、データ並列アプローチから始めます。トレーニング中にメモリが不足した場合、モデル並列のアプローチに切り替えるか、モデルとデータのハイブリッド並列を試すこともできます。データ並列でのパフォーマンスを改善するには、以下を試すこともできます。

  • モデルのハイパーパラメータを変更する。

  • バッチサイズを減らす。

  • 収まるまでバッチサイズを減らし続ける。バッチサイズを 1 に減らしてもメモリが不足する場合は、モデル並列トレーニングを試してください。

勾配圧縮を試す (FP16、INT8):

入力サイズを減らしてみる:

  • NLP シーケンスリンクを増やす場合、バッチサイズを小さく調整する必要がある場合、またはバッチを分散させるために GPUs を上に調整する必要がある場合は、シーケンスの長さを短くします。

  • イメージの解像度を下げます。

バッチ正規化を使うかどうかをチェックします。これは収束に影響する可能性があるためです。分散トレーニングを使用すると、バッチが分割GPUsされ、バッチサイズが大幅に小さくなると、エラー率が高くなり、モデルの収束が中断される可能性があります。例えば、バッチサイズが 64 の単一の でネットワークGPUをプロトタイプ化し、4 つの p3dn.24xlarge を使用するようにスケールアップした場合、32 GPUsになり、バッチごとのGPUサイズが 64 から 2 に減少します。これでは、単一ノードの場合に見られた収束が崩れる可能性が高くなります。

次の場合にモデル並列トレーニングを開始します。

  • モデルが 1 つのデバイスに収まらない。

  • モデルのサイズにより、モデルの重みがGPUメモリの大部分を占める場合や、最適ではない小さいバッチサイズを強制的に選択する場合など、より大きなバッチサイズを選択する際の制限に直面しています。 

SageMaker 分散ライブラリの詳細については、以下を参照してください。

分散トレーニングを最適化する

ユースケースとデータに合わせてハイパーパラメータをカスタマイズすることで、最高のスケーリング効率を実現できます。以下の説明では、最も影響の大きいトレーニング変数をいくつか紹介し、 state-of-the-art 実装への参照を提供します。これにより、オプションの詳細を確認できます。また、選好するフレームワークの分散トレーニングのドキュメントを参照することをお勧めします。

バッチサイズ

SageMaker 分散ツールキットを使用すると、通常、より大きなバッチでトレーニングできます。例えば、モデルが 1 つのデバイス内に収まるが、小さなバッチサイズでしかトレーニングできない場合、モデル並列トレーニングまたはデータ並列トレーニングを使うことで、より大きなバッチサイズを試すことができます。

バッチサイズは、各反復でのモデル更新のノイズの量をコントロールすることにより、モデルの精度に直接影響することに注意してください。バッチサイズを大きくすると、勾配推定のノイズの量が減少します。これは、非常に小さなバッチサイズから大きくする場合には有効ですが、バッチサイズが大きな値になるにしたがい、モデルの精度が低下する可能性があります。 

ヒント

ハイパーパラメータを調整して、バッチサイズを大きくしても、必ずモデルが満足のいく収束にトレーニングされるようにします。

バッチを大きくする際にモデルの収束を良好に保つために、多くの手法が開発されています。

ミニバッチサイズ

ではSGD、ミニバッチサイズは勾配推定に存在するノイズの量を定量化します。ミニバッチが小さいと、非常にノイズの多いミニバッチ勾配となり、データセット全体の正しい勾配を表すものではありません。ミニバッチが大きいと、ミニバッチ勾配はデータセット全体の正しい勾配に近くなり、十分なノイズがない可能性があり、無関係な最小値でロックされたままになる場合があります。

これらの手法の詳細については、次のドキュメントを参照してください。

シナリオ

以下のセクションでは、トレーニングをスケールアップするシナリオと、 AWS リソースを使用してスケールアップする方法について説明します。

単一の から多数の GPU へのスケーリング GPUs

機械学習で使用するデータの量やモデルのサイズによって、モデルのトレーニング時間が待てないほど長くなる状況が生じることがあります。また、モデルやトレーニングデータが大きすぎるため、トレーニングがまったく機能しないことがあります。1 つの解決策は、トレーニングに使用する の数を増やすGPUsことです。8 つの を持つ のようにGPUs、複数の p3.16xlargeを持つインスタンスではGPUs、データと処理が 8 つの に分割されますGPUs。分散トレーニングライブラリを使うと、モデルのトレーニングにかかる時間内がほぼ直線的に高速化されます。1 つの p3.2xlargeで引き受けていた時間の 1/8 をわずかに超えますGPU。

インスタンスタイプ GPUs
p3.2xlarge 1
p3.8xlarge 4
p3.16xlarge 8
p3dn.24xlarge 8
注記

SageMaker トレーニングで使用される ml インスタンスタイプは、対応する p3 インスタンスタイプGPUsと同じ数です。例えば、 ml.p3.8xlargeは - 4 p3.8xlarge GPUsと同じ数を持ちます。

単一インスタンスから複数インスタンスへのスケーリング

トレーニングをさらにスケールする場合は、より多くのインスタンスを使用できます。ただし、インスタンスを追加する前に、より大きなインスタンスタイプを選択してください。前の表を確認して、GPUs各 p3 インスタンスタイプの の数を確認します。

GPU の 1 つの から の 4 GPUs つの p3.2xlargeにジャンプしたがp3.8xlarge、より多くの処理能力が必要であると判断した場合、インスタンス数を増やすp3.16xlarge前に を選択すると、パフォーマンスが向上し、コストが低下する可能性があります。使うライブラリによっては、トレーニングを 1 つのインスタンスで維持すると、複数のインスタンスを使うシナリオよりもパフォーマンスが向上し、コストが低くなります。

インスタンス数をスケールする準備ができたら、 を設定して SageMaker Python SDKestimator関数でこれを行うことができますinstance_count。例えば、instance_type = p3.16xlargeinstance_count = 2 を設定すると、1 つの GPUsで 8 つの の代わりにp3.16xlarge、2 つの同一のインスタンスGPUsに 16 個の があります。次の表は、1 つのインスタンスで 8 から始まり、合計 256 個の で 64 個のインスタンスに増加するスケーリングとスループットGPUsを示していますGPUs。

Chart showing how throughput increases and time to train decreases with more GPUs.

カスタムトレーニングスクリプト

SageMaker ではインスタンス数と を簡単にデプロイおよびスケーリングできますがGPUs、選択したフレームワークによっては、データと結果の管理が非常に難しい場合があるため、外部サポートライブラリがよく使用されます。この最も基本的な分散トレーニングでは、データ分散を管理するためにトレーニングスクリプトを変更する必要があります。

SageMaker は、Horovod と、各主要な深層学習フレームワークにネイティブな分散トレーニングの実装もサポートしています。これらのフレームワークの例を使用する場合は、 SageMakerの Deep Learning Containers コンテナガイドと、実装を示すさまざまなサンプルノートブックに従うことができます。