翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
異種クラスターを使用したトレーニング
SageMaker トレーニングの異種クラスター機能を使用すると、複数のタイプの ML インスタンスでトレーニングジョブを実行して、さまざまな ML トレーニングタスクや目的でリソースのスケーリングと使用率を向上させることができます。例えば、GPU インスタンスを使用したクラスター上のトレーニングジョブで、GPU 使用率が低く、CPU 負荷の高いタスクにより CPU がボトルネックになる問題が発生した場合、異種クラスターを使用することで、コスト効率の高い CPU インスタンスグループを追加し CPU 負荷の高いタスクをオフロードし、このようなボトルネックの問題を解決して、GPU の使用率を高めることができます。
注記
この機能は SageMaker Python SDK v2.98.0 以降で使用できます。
注記
この機能は、 SageMaker PyTorch
異種クラスターの設定方法
このセクションでは、複数のインスタンスタイプで構成される異種クラスターを使用してトレーニングジョブを実行する方法について説明します。
SageMaker Python SDK の使用
SageMaker Python SDK を使用して異種クラスターのインスタンスグループを設定する方法の手順に従います。
-
異種クラスターのインスタンスグループをトレーニングジョブ用に設定するには、
sagemaker.instance_group.InstanceGroup
クラスを使用します。各インスタンスグループのカスタム名、インスタンスタイプ、インスタンス数を指定できます。詳細については、SageMakerPython SDK ドキュメントの「sagemaker.instance_groupInstanceGroup」を参照してください。 注記
異種クラスターで設定できる利用可能なインスタンスタイプとインスタンスグループの最大数の詳細については、 InstanceGroup API リファレンスを参照してください。
以下のコード例は、次の図のように
instance_group_1
という名前の 2 つのml.c5.18xlarge
CPU 専用インスタンスと、instance_group_2
という名前の 1 つのml.p3dn.24xlarge
GPU インスタンスで構成される 2 つのインスタンスグループを設定する方法を示しています。from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "
instance_group_1
", "ml.c5.18xlarge
",2
) instance_group_2 = InstanceGroup( "instance_group_2
", "ml.p3dn.24xlarge
",1
) -
インスタンスグループオブジェクトを使用して、トレーニング入力チャネルを設定し、sagemaker.inputs.TrainingInput
クラスの instance_group_names
引数を使用してインスタンスグループをチャネルに割り当てます。instance_group_names
引数には、インスタンスグループ名の文字列のリストを使用できます。以下の例では、2 つのトレーニング入力チャンネルを設定し、前のステップの例で作成したインスタンスグループを割り当てる方法を示します。インスタンスグループの
s3_data
引数に Amazon S3 バケットパスを指定することで、利用目的に応じたデータを処理を行うこともできます。from sagemaker.inputs import TrainingInput training_input_channel_1 = TrainingInput( s3_data_type='
S3Prefix
', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile s3_data='s3://your-training-data-storage/folder1
', distribution='FullyReplicated
', # Available Options: FullyReplicated | ShardedByS3Key input_mode='File
', # Available Options: File | Pipe | FastFile instance_groups=["instance_group_1
"] ) training_input_channel_2 = TrainingInput( s3_data_type='S3Prefix
', s3_data='s3://your-training-data-storage/folder2
', distribution='FullyReplicated
', input_mode='File
', instance_groups=["instance_group_2
"] )TrainingInput
の引数の詳細については、以下のリンクを参照してください。-
SageMaker Python SDK ドキュメントの sagemaker.inputs.TrainingInput
クラス -
API リファレンスの S3DataSource API SageMaker
-
-
次のコード例に示すように、
instance_groups
引数を使用して SageMaker 推定器を設定します。instance_groups
引数にはInstanceGroup
オブジェクトのリストを使用できます。注記
instance_type
およびinstance_count
引数のペアと推定器クラスのinstance_groups
引数は SageMaker相互に排他的です。同種クラスタートレーニングには、instance_type
とinstance_count
引数のペアを使用します。異種クラスタートレーニングには、instance_groups
を使用します。注記
使用可能なフレームワークコンテナ、フレームワークバージョン、Python バージョンの完全なリストについては、 AWS Deep Learning SageMaker Containers リポジトリ
の「フレームワークコンテナ」を参照してください。 GitHub -
インスタンスグループで設定したトレーニング入力チャネルで
estimator.fit
メソッドを設定し、トレーニングジョブを開始します。estimator.fit( inputs={ 'training':
training_input_channel_1
, 'dummy-input-channel
':training_input_channel_2
} )
低レベル SageMaker APIs
AWS Command Line Interface または を使用し AWS SDK for Python (Boto3) 、低レベル SageMaker APIs を使用して異種クラスターでトレーニングジョブリクエストを送信する場合は、次の API リファレンスを参照してください。
異種クラスターによる分散トレーニング
SageMaker 推定器クラスの distribution
引数を使用して、分散トレーニングを実行する特定のインスタンスグループを割り当てることができます。例えば、次の 2 つのインスタンスグループがあり、片方でマルチ GPU トレーニングを実行するとします。
from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup("instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup("instance_group_2", "ml.p3dn.24xlarge", 2)
分散トレーニング設定はインスタンスグループの 1 つに設定することができます。例えば、以下のコード例では、2 つの ml.p3dn.24xlarge
インスタンスを持つ training_group_2
を分散トレーニング設定に割り当てる方法を示しています。
注記
現在、ディストリビューション設定に指定できるのは、異種クラスターの 1 つのインスタンスグループだけです。
MPI 使用時
SageMaker データ並列ライブラリの使用
注記
SageMaker データ並列ライブラリを使用する場合は、インスタンスグループがライブラリ でサポートされているインスタンスタイプで構成されていることを確認してください。
SageMaker データ並列ライブラリの詳細については、SageMaker 「データ並列トレーニング」を参照してください。
SageMaker モデル並列ライブラリを使用
SageMaker モデル並列ライブラリの詳細については、SageMaker 「モデル並列トレーニング」を参照してください。
トレーニングスクリプトを変更してインスタンスグループを割り当てる
前のセクションの異種クラスター設定では、 SageMaker トレーニングジョブのトレーニング環境とインスタンスを準備しました。インスタンスグループを特定のトレーニングとデータ処理タスクにさらに割り当てるために、次のステップでトレーニングスクリプトを変更します。デフォルトでは、トレーニングジョブはインスタンスのサイズに関係なくすべてのノードのトレーニングスクリプトのレプリカを作成するので、パフォーマンスが低下する可能性があります。
例えば、深層ニューラルネットワークトレーニングスクリプトを SageMaker 推定器の entry_point
引数に渡しながら、異種クラスター内の CPU インスタンスと GPU インスタンスを混在させると、entry_point
スクリプトは各インスタンスにレプリケートされます。つまり、適切なタスク割り当てを行わないと、CPU インスタンスはスクリプト全体も実行し、GPU インスタンスでの分散トレーニング用に設計されたトレーニングジョブを開始します。そのため、オフロードして CPU インスタンス上で実行したい特定の処理関数に変更を加える必要があります。 SageMaker 環境変数を使用して異種クラスターの情報を取得し、それに応じて特定のプロセスを実行させることができます。
トレーニングジョブの初期化フェーズ中にインスタンスグループの情報をクエリする SageMaker
トレーニングジョブが開始されると、トレーニングスクリプトは異種クラスター設定を含む SageMaker トレーニング環境情報を読み取ります。この設定には、現在のインスタンスグループ、各グループの現在のホスト、現在のホストがどのグループに属しているかなどの情報が含まれます。
インスタンスグループ情報は次の方法で取得できます。
(推奨) SageMaker トレーニングツールキットを使用したインスタンスグループ情報の読み取り
SageMaker トレーニングツールキットライブラリ
from sagemaker_training import environment env = environment.Environment()
一般的な SageMaker トレーニングクラスターと異種クラスターに関連する環境変数:
-
env.is_hetero
– 異種クラスターが設定されているかどうかを Boolean で返します。 -
env.current_host
– 現在のホストを返します。 -
env.current_instance_type
– 現在のホストのインスタンスのタイプを返します。 -
env.current_instance_group
– 現在のインスタンスグループの名前を返します。 -
env.current_instance_group_hosts
– 現在のインスタンスグループ内のホストのリストを返します。 -
env.instance_groups
– トレーニングに使用するインスタンスグループ名のリストを返します。 -
env.instance_groups_dict
– トレーニングジョブの異種クラスター構成全体を返します。 -
env.distribution_instance_groups
– SageMaker 推定器クラスのdistribution
パラメータに割り当てられたインスタンスグループのリストを返します。 -
env.distribution_hosts
– SageMaker 推定器クラスのdistribution
パラメータに割り当てられたインスタンスグループに属するホストのリストを返します。
例えば、次の 2 つのインスタンスグループで構成される異種クラスターの例を考えてみましょう。
from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 2)
この例の異種クラスターの env.instance_groups_dict
出力は、以下のようになっている必要があります。
{ "instance_group_1": { "hosts": [ "algo-2" ], "instance_group_name": "instance_group_1", "instance_type": "ml.c5.18xlarge" }, "instance_group_2": { "hosts": [ "algo-3", "algo-1" ], "instance_group_name": "instance_group_2", "instance_type": "ml.p3dn.24xlarge" } }
(オプション) リソース設定 JSON ファイルからのインスタンスグループ情報の読み取り
JSON 形式で環境変数を取得したい場合は、リソース設定 JSON ファイルを直接使用できます。 SageMaker トレーニングインスタンスの JSON ファイルは/opt/ml/input/config/resourceconfig.json
、デフォルトで にあります。
file_path = '/opt/ml/input/config/resourceconfig.json' config = read_file_as_json(file_path) print(json.dumps(config, indent=4, sort_keys=True))
考慮事項
異種クラスター機能を使用するときは、以下の点を考慮してください。
-
すべてのインスタンスグループは同じ Docker イメージとトレーニングスクリプトを共有します。そのため、トレーニングスクリプトは、そのスクリプトがどのインスタンスグループに属しているかを検出し、それに応じて実行をフォークするように変更する必要があります。
-
異種クラスター機能は、 SageMaker ローカルモードではサポートされていません。
-
異種クラスタートレーニングジョブの Amazon CloudWatch ログストリームは、インスタンスグループ別にグループ化されません。どのノードがどのグループに属しているかをログから把握する必要があります。
-
異種クラスター機能は、 および TensorFlow
フレームワーク推定器クラスを通じて SageMaker PyTorch 使用できます。サポートされているフレームワークは PyTorch v1.10 以降および TensorFlow v2.6 以降です。使用可能なフレームワークコンテナ、フレームワークバージョン、Python バージョンの完全なリストについては、 AWS Deep Learning SageMaker Containers リポジトリ の「フレームワークコンテナ」を参照してください。 GitHub -
分散型トレーニング戦略は 1 つのインスタンスグループにのみ適用できます。
例、ブログ、ケーススタディ
次のブログでは、 SageMaker 異種クラスタートレーニングの使用に関する導入事例について説明します。
Amazon SageMaker 異種クラスターを使用したモデルトレーニングの価格パフォーマンスの向上
(2022 年 10 月 27 日)