異種クラスターを使用したトレーニング - Amazon SageMaker

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

異種クラスターを使用したトレーニング

SageMaker トレーニングの異種クラスター機能を使用すると、複数のタイプの ML インスタンスでトレーニングジョブを実行して、さまざまな ML トレーニングタスクや目的でリソースのスケーリングと使用率を向上させることができます。例えば、GPU インスタンスを使用したクラスター上のトレーニングジョブで、GPU 使用率が低く、CPU 負荷の高いタスクにより CPU がボトルネックになる問題が発生した場合、異種クラスターを使用することで、コスト効率の高い CPU インスタンスグループを追加し CPU 負荷の高いタスクをオフロードし、このようなボトルネックの問題を解決して、GPU の使用率を高めることができます。

注記

この機能は SageMaker Python SDK v2.98.0 以降で使用できます。

注記

この機能は、 SageMaker PyTorchおよび TensorFlowフレームワーク推定器クラスを通じて使用できます。サポートされているフレームワークは PyTorch v1.10 以降および TensorFlow v2.6 以降です。

異種クラスターの設定方法

このセクションでは、複数のインスタンスタイプで構成される異種クラスターを使用してトレーニングジョブを実行する方法について説明します。

SageMaker Python SDK の使用

SageMaker Python SDK を使用して異種クラスターのインスタンスグループを設定する方法の手順に従います。

  1. 異種クラスターのインスタンスグループをトレーニングジョブ用に設定するには、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 つのインスタンスグループを設定する方法を示しています。

    The preceding diagram shows a conceptual example of how pre-training processes, such as data preprocessing, can be assigned to the CPU instance group and stream the preprocessed data to the GPU instance group.
    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 )
  2. インスタンスグループオブジェクトを使用して、トレーニング入力チャネルを設定し、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 の引数の詳細については、以下のリンクを参照してください。

  3. 次のコード例に示すように、 instance_groups引数を使用して SageMaker 推定器を設定します。instance_groups 引数には InstanceGroup オブジェクトのリストを使用できます。

    PyTorch
    from sagemaker.pytorch import PyTorch estimator = PyTorch( ... entry_point='my-training-script.py', framework_version='x.y.z', # 1.10.0 or later py_version='pyxy', job_name='my-training-job-with-heterogeneous-cluster', instance_groups=[instance_group_1, instance_group_2] )
    TensorFlow
    from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... entry_point='my-training-script.py', framework_version='x.y.z', # 2.6.0 or later py_version='pyxy', job_name='my-training-job-with-heterogeneous-cluster', instance_groups=[instance_group_1, instance_group_2] )
    注記

    instance_type および instance_count引数のペアと推定器クラスの instance_groups引数は SageMaker相互に排他的です。同種クラスタートレーニングには、instance_typeinstance_count 引数のペアを使用します。異種クラスタートレーニングには、instance_groups を使用します。

    注記

    使用可能なフレームワークコンテナ、フレームワークバージョン、Python バージョンの完全なリストについては、 AWS Deep Learning SageMaker Containers リポジトリの「フレームワークコンテナ」を参照してください。 GitHub

  4. インスタンスグループで設定したトレーニング入力チャネルで 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 使用時

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "mpi": { "enabled": True, "processes_per_host": 8 }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "mpi": { "enabled": True, "processes_per_host": 8 }, "instance_groups": [instance_group_2] } )

SageMaker データ並列ライブラリの使用

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "dataparallel": { "enabled": True } }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "dataparallel": { "enabled": True } }, "instance_groups": [instance_group_2] } )
注記

SageMaker データ並列ライブラリを使用する場合は、インスタンスグループがライブラリ でサポートされているインスタンスタイプで構成されていることを確認してください。

SageMaker データ並列ライブラリの詳細については、SageMaker 「データ並列トレーニング」を参照してください。

SageMaker モデル並列ライブラリを使用

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker model parallel parameters } } }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker model parallel parameters } } }, "instance_groups": [instance_group_2] } )

SageMaker モデル並列ライブラリの詳細については、SageMaker 「モデル並列トレーニング」を参照してください。

トレーニングスクリプトを変更してインスタンスグループを割り当てる

前のセクションの異種クラスター設定では、 SageMaker トレーニングジョブのトレーニング環境とインスタンスを準備しました。インスタンスグループを特定のトレーニングとデータ処理タスクにさらに割り当てるために、次のステップでトレーニングスクリプトを変更します。デフォルトでは、トレーニングジョブはインスタンスのサイズに関係なくすべてのノードのトレーニングスクリプトのレプリカを作成するので、パフォーマンスが低下する可能性があります。

例えば、深層ニューラルネットワークトレーニングスクリプトを SageMaker 推定器の entry_point引数に渡しながら、異種クラスター内の CPU インスタンスと GPU インスタンスを混在させると、entry_pointスクリプトは各インスタンスにレプリケートされます。つまり、適切なタスク割り当てを行わないと、CPU インスタンスはスクリプト全体も実行し、GPU インスタンスでの分散トレーニング用に設計されたトレーニングジョブを開始します。そのため、オフロードして CPU インスタンス上で実行したい特定の処理関数に変更を加える必要があります。 SageMaker 環境変数を使用して異種クラスターの情報を取得し、それに応じて特定のプロセスを実行させることができます。

トレーニングジョブの初期化フェーズ中にインスタンスグループの情報をクエリする SageMaker

トレーニングジョブが開始されると、トレーニングスクリプトは異種クラスター設定を含む SageMaker トレーニング環境情報を読み取ります。この設定には、現在のインスタンスグループ、各グループの現在のホスト、現在のホストがどのグループに属しているかなどの情報が含まれます。

インスタンスグループ情報は次の方法で取得できます。

(推奨) SageMaker トレーニングツールキットを使用したインスタンスグループ情報の読み取り

SageMaker トレーニングツールキットライブラリが提供する環境 Python モジュールを使用します。ツールキットライブラリは、 TensorFlow および のSageMaker フレームワークコンテナにプレインストールされているため PyTorch、構築済みのコンテナを使用するときに追加のインストール手順は必要ありません。これは、トレーニングスクリプトのコード変更を減らして 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 異種クラスタートレーニングの使用に関する導入事例について説明します。