翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon での分散トレーニング SageMaker
SageMaker は分散トレーニングライブラリを提供し、コンピュータビジョン (CV) や自然言語処理 () など、深層学習タスク用のさまざまな分散トレーニングオプションをサポートしますNLP。 SageMakerの分散トレーニングライブラリを使用すると、高度にスケーラブルで費用対効果の高いカスタムデータ並列およびモデル並列深層学習トレーニングジョブを実行できます。()、、 (DDP)、パラメータサーバーなど PyTorch DistributedDataParalleltorchrun
、他の分散トレーニングフレームワークMPImpirun
やパッケージを使用することもできます。ドキュメント全体で、手順と例は、 SageMaker Python を使用して深層学習タスクの分散トレーニングオプションを設定する方法に焦点を当てていますSDK。
ヒント
機械学習 (ML) の分散コンピューティングのトレーニングと処理ジョブ全般のベストプラクティスについては、「 SageMaker ベストプラクティスによる分散コンピューティング」を参照してください。
始める前に
SageMaker トレーニングは、1 つのインスタンスと複数のインスタンスで分散トレーニングをサポートしているため、任意のサイズのトレーニングを大規模に実行できます。さまざまな分散トレーニングオプションを備えたトレーニングジョブランチャーである SageMaker Python TensorFlowCreateTrainingJob
APIで を実行し、現在のセッションが実行されているリージョンを検索し、 AWS 深層学習フレームワーク、分散トレーニングフレームワーク、EFAドライバーなどの多数のライブラリがあらかじめパッケージ化された構築済みの深層学習コンテナの 1 つを取得します。FSx ファイルシステムをトレーニングインスタンスにマウントする場合は、VPCサブネットとセキュリティグループ ID を推定器に渡す必要があります。で分散トレーニングジョブを実行する前に SageMaker、基本的なインフラストラクチャ設定に関する以下の一般的なガイダンスをお読みください。
アベイラビリティーゾーンとネットワークバックプレーン
複数のインスタンス (ノード とも呼ばれます) を使用する場合は、インスタンスを接続するネットワーク、トレーニングデータの読み取り方法、およびインスタンス間での情報の共有方法を理解することが重要です。例えば、分散データ並列トレーニングジョブを実行する場合、AllReduce
オペレーションを実行するためのコンピューティングクラスターのノード間の通信や、Amazon Simple Storage Service または Amazon FSx for Lustre のノードとデータストレージ間のデータ転送など、さまざまな要因が、コンピューティングリソースの最適な使用とトレーニング速度の向上を実現する上で重要な役割を果たします。通信オーバーヘッドを減らすには、インスタンス、VPCサブネット、データストレージを同じ と AWS リージョン アベイラビリティーゾーンに設定してください。
GPU より高速なネットワークと高スループットストレージを備えた インスタンス
技術的には、どのインスタンスでも分散トレーニングに使用できます。大規模な言語モデル (LLMs) や拡散モデルなど、ノード間のコミューテーションを高速化する必要がある大規模なモデルをトレーニングするためにマルチノード分散トレーニングジョブを実行する必要がある場合は、 EFAでサポートされている 対応GPUインスタンス SageMaker
Amazon での分散トレーニングの開始方法 SageMaker
既に分散トレーニングに慣れている場合は、以下のオプションからお好みの戦略やフレームワークに合わせて 1 つを選択して始めてください。分散型トレーニング全般について知りたい場合は、分散トレーニングの基本概念 を参照してください。
SageMaker 分散トレーニングライブラリは SageMaker トレーニング環境に合わせて最適化されており、分散トレーニングジョブを に適応させ SageMaker、トレーニングの速度とスループットを向上させます。ライブラリは、データ並列とモデル並列の両方のトレーニング戦略を提供します。ソフトウェアとハードウェアテクノロジーを組み合わせてノード間GPUおよびノード間の通信を改善し、 SageMakerトレーニングスクリプトのコード変更を最小限に抑える組み込みオプションを使用して のトレーニング機能を拡張します。
SageMaker 分散データ並列処理 (SMDDP) ライブラリを使用する
このSMDDPライブラリは、 AWS ネットワークインフラストラクチャAllReduce
と Amazon SageMaker ML インスタンストポロジーに最適化された の実装とAllGather
集合的な通信オペレーションにより、ノード間の通信を改善します。SMDDP ライブラリは、分散データ並列 ()、完全シャーディングデータ並列処理 ()、、Megatron- などの PyTorchベースの分散トレーニングパッケージのバックエンドとして使用できます。 PyTorch DDPml.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
パラメータを設定します。サポートされているフレームワーク推定器は PyTorchml.p4d.24xlarge
インスタンスでモデル並列処理ライブラリを使用して分散トレーニング用のフレームワーク推定器を構築する方法を示しています。
from sagemaker.
framework
importFramework
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 は、バックエンドtorchrun
で mpirun
および を運用するための以下のオプションもサポートしています。
-
バックエンド 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 PyTorchTrn1 での分散トレーニングに関する注意事項
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ドキュメント への次のリンクを使用します。
-
MXNet 分散トレーニング
とSageMaker MXNet推定器の 引 distribution
数 -
PyTorch 分散トレーニング
とSageMaker PyTorch 推定器の 引 distribution
数 -
TensorFlow 分散トレーニング
とSageMaker TensorFlow 推定器の distribution
引数。
-
分散トレーニングの基本概念
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):
-
NVIDIA TensorCore搭載のハードウェアでは、混合精度トレーニング
を使用すると、高速化とメモリ消費量の削減の両方を実現できます。 -
SageMakerの分散データ並列処理ライブラリは、すぐに使用できる自動混合精度 (AMP) をサポートしています。トレーニングスクリプトへのフレームワークレベルの変更AMP以外に、 を有効にするための追加のアクションは必要ありません。勾配が にある場合FP16、 SageMaker データ並列処理ライブラリは でその
AllReduce
オペレーションを実行しますFP16。トレーニングスクリプトAMPAPIsへの の実装の詳細については、以下のリソースを参照してください。-
フレームワーク - Deep Learning Performance ドキュメントの TensorFlow
NVIDIA「」 -
NVIDIA デベロッパードキュメントの深層学習の自動混合精度
-
ブログNVIDIAの「 でのトレーニングを高速化するためのネイティブ PyTorch 自動混合精度GPUs
のPyTorch 紹介」 -
TensorFlow ドキュメントのTensorFlow 混合精度 APIs
入力サイズを減らしてみる:
-
NLP シーケンスリンクを増やす場合、バッチサイズを小さく調整する必要がある場合、またはバッチを分散させるために GPUs を上に調整する必要がある場合は、シーケンスの長さを短くします。
-
イメージの解像度を下げます。
バッチ正規化を使うかどうかをチェックします。これは収束に影響する可能性があるためです。分散トレーニングを使用すると、バッチが分割GPUsされ、バッチサイズが大幅に小さくなると、エラー率が高くなり、モデルの収束が中断される可能性があります。例えば、バッチサイズが 64 の単一の でネットワークGPUをプロトタイプ化し、4 つの p3dn.24xlarge を使用するようにスケールアップした場合、32 GPUsになり、バッチごとのGPUサイズが 64 から 2 に減少します。これでは、単一ノードの場合に見られた収束が崩れる可能性が高くなります。
次の場合にモデル並列トレーニングを開始します。
-
モデルが 1 つのデバイスに収まらない。
-
モデルのサイズにより、モデルの重みがGPUメモリの大部分を占める場合や、最適ではない小さいバッチサイズを強制的に選択する場合など、より大きなバッチサイズを選択する際の制限に直面しています。
SageMaker 分散ライブラリの詳細については、以下を参照してください。
分散トレーニングを最適化する
ユースケースとデータに合わせてハイパーパラメータをカスタマイズすることで、最高のスケーリング効率を実現できます。以下の説明では、最も影響の大きいトレーニング変数をいくつか紹介し、 state-of-the-art 実装への参照を提供します。これにより、オプションの詳細を確認できます。また、選好するフレームワークの分散トレーニングのドキュメントを参照することをお勧めします。
バッチサイズ
SageMaker 分散ツールキットを使用すると、通常、より大きなバッチでトレーニングできます。例えば、モデルが 1 つのデバイス内に収まるが、小さなバッチサイズでしかトレーニングできない場合、モデル並列トレーニングまたはデータ並列トレーニングを使うことで、より大きなバッチサイズを試すことができます。
バッチサイズは、各反復でのモデル更新のノイズの量をコントロールすることにより、モデルの精度に直接影響することに注意してください。バッチサイズを大きくすると、勾配推定のノイズの量が減少します。これは、非常に小さなバッチサイズから大きくする場合には有効ですが、バッチサイズが大きな値になるにしたがい、モデルの精度が低下する可能性があります。
ヒント
ハイパーパラメータを調整して、バッチサイズを大きくしても、必ずモデルが満足のいく収束にトレーニングされるようにします。
バッチを大きくする際にモデルの収束を良好に保つために、多くの手法が開発されています。
ミニバッチサイズ
ではSGD、ミニバッチサイズは勾配推定に存在するノイズの量を定量化します。ミニバッチが小さいと、非常にノイズの多いミニバッチ勾配となり、データセット全体の正しい勾配を表すものではありません。ミニバッチが大きいと、ミニバッチ勾配はデータセット全体の正しい勾配に近くなり、十分なノイズがない可能性があり、無関係な最小値でロックされたままになる場合があります。
これらの手法の詳細については、次のドキュメントを参照してください。
-
PowerAI、DDL
Cho et al. -
大規模ミニバッチのスケールアウトSGD: 精度の向上とトレーニング時間の短縮により、 ImageNet-1K での残差ネットワークトレーニング
、Codreanu ら。 -
ImageNet 分単位のトレーニング
、You et al. -
畳み込みネットワークの大規模バッチトレーニング
、You ら。 -
深層学習の大規模バッチ最適化: 76 分BERTでのトレーニング
、You et al. -
深層勾配圧縮
、Linet ら。
シナリオ
以下のセクションでは、トレーニングをスケールアップするシナリオと、 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.16xlarge
と instance_count =
2
を設定すると、1 つの GPUsで 8 つの の代わりにp3.16xlarge
、2 つの同一のインスタンスGPUsに 16 個の があります。次の表は、1 つのインスタンスで 8 から始まり、合計 256 個の で 64 個のインスタンスに増加するスケーリングとスループットGPUs
カスタムトレーニングスクリプト
SageMaker ではインスタンス数と を簡単にデプロイおよびスケーリングできますがGPUs、選択したフレームワークによっては、データと結果の管理が非常に難しい場合があるため、外部サポートライブラリがよく使用されます。この最も基本的な分散トレーニングでは、データ分散を管理するためにトレーニングスクリプトを変更する必要があります。
SageMaker は、Horovod と、各主要な深層学習フレームワークにネイティブな分散トレーニングの実装もサポートしています。これらのフレームワークの例を使用する場合は、 SageMakerの Deep Learning Containers コンテナガイドと、実装を示すさまざまなサンプルノートブック