Azure Machine Learning コンピューティング クラスターの作成

適用対象:Python SDK azureml v1

適用対象: Azure CLI ML 拡張機能 v2 (現行)

Azure Machine Learning ワークスペースでコンピューティング クラスターを作成および管理する方法について説明します。

Azure Machine Learning コンピューティング クラスターを使用して、クラウド内の CPU または GPU コンピューティング ノードのクラスター全体にトレーニングまたはバッチ推論のプロセスを分散させることができます。 GPU を含む VM サイズの詳細については、「GPU 最適化済み仮想マシンのサイズ」を参照してください。

この記事では、次のことについて説明します:

  • コンピューティング クラスターを作成する
  • コンピューティング クラスターのコストを削減する
  • クラスターのマネージド ID を設定する

前提条件

コンピューティング クラスターとは

Azure Machine Learning コンピューティング クラスターは、シングルノードまたはマルチノードのコンピューティングを簡単に作成できるマネージド コンピューティング インフラストラクチャです。 コンピューティング クラスターは、ワークスペース内の他のユーザーと共有できるリソースです。 コンピューティングはジョブが送信されると自動的にスケールアップされ、Azure 仮想ネットワークに配置できます。 コンピューティング クラスターでは、仮想ネットワークでもパブリック IP なし (プレビュー) のデプロイはサポートされません。 コンピューティングはコンテナー化環境で実行され、モデルの依存関係が Docker コンテナーにパッケージ化されます。

コンピューティング クラスターを使用することで、企業で SSH ポートを開かなくても、仮想ネットワーク環境でジョブを安全に実行できます。 ジョブはコンテナー化された環境で実行され、モデルの依存関係が Docker コンテナーにパッケージ化されます。

制限事項

  • このドキュメントに記載されている一部のシナリオは プレビューとしてマークされています。 プレビュー段階の機能はサービス レベル アグリーメントなしで提供されており、運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

  • コンピューティング クラスターは、ワークスペースとは別のリージョンに作成できます。 この機能はプレビュー段階であり、コンピューティング クラスターでのみ利用できます。コンピューティング インスタンスでは利用できません。 このプレビューは、プライベート エンドポイントが有効になっているワークスペースを使用している場合には使用できません。

    警告

    ワークスペースやデータストアと異なるリージョンでコンピューティング クラスターを使用すると、ネットワークの待機時間とデータ転送コストが増大する可能性があります。 待機時間とコストは、クラスターの作成時や、クラスターでのジョブの実行時に発生する可能性があります。

  • 現在、ARM テンプレート を使用したクラスターの作成 (更新ではなく) のみがサポートされています。 コンピューティングを更新する場合は、現時点では SDK、Azure CLI、または UX を使用することをお勧めします。

  • Azure Machine Learning コンピューティングには、割り当て可能なコア数などの既定の制限があります。 詳細については、「Azure リソースのクォータの管理と要求」を参照してください。

  • Azure を使用すると、リソースに "ロック" を設定して、削除できないようにしたり、読み取り専用にしたりすることができます。 ワークスペースが含まれているリソース グループにリソース ロックを適用しないでください。 ワークスペースが含まれているリソース グループにロックを適用すると、Azure ML コンピューティング クラスターのスケーリング操作ができなくなります。 リソースのロックの詳細については、「リソースのロックによる予期せぬ変更の防止」を参照してください。

ヒント

必要なコア数に十分に対応するクォータを備えている限り、クラスターは一般に、最大で 100 ノードまでスケールアップすることができます。 既定では、たとえば、MPI ジョブをサポートするために、クラスターは、そのノード間でノード間通信を有効にした状態でセットアップされます。 ただし、サポート チケットを作成し、ご利用のサブスクリプション、ワークスペース、またはノード間通信を無効にする特定のクラスターをリストに登録することを要求するだけで、ご利用のクラスターを数千のノードにスケーリングすることができます。

作成

推定所要時間: 約 5 分です。

Azure Machine Learning コンピューティングは、複数回の実行で再利用できます。 コンピューティングは、ワークスペース内の他のユーザーと共有することができ、複数回の実行の間で保持されます。この場合、送信された実行の回数およびクラスター上で設定された max_nodes に基づいてノードは自動的にスケールアップまたはスケールダウンされます。 min_nodes 設定では、使用可能な最小ノード数が制御されます。

コンピューティング クラスターの作成に適用されるリージョンあたりの専用コア数は、VM ファミリ クォータ別およびリージョン合計クォータ別に、Azure Machine Learning トレーニングのコンピューティング インスタンスのクォータと統合され、共有されます。

重要

ジョブが実行されていない場合の課金を回避するには、最小ノード数を 0 に設定します。 この設定により、使用されていないノードの割り当てを Azure Machine Learning で解除できます。 0 より大きい値を指定すると、ノードが使用されていない場合でも、指定した数のノードが実行され続けます。

コンピューティングは、使用されていないときは、0 ノードまで自動的にスケールダウンされます。 必要に応じて、ジョブ実行専用の VM が作成されます。

Python で永続的な Azure Machine Learning コンピューティング リソースを作成するには、vm_size および max_nodes プロパティを指定します。 その後、Azure Machine Learning では他のプロパティに対してスマート既定値が使用されます。

  • vm_size:Azure Machine Learning コンピューティングによって作成されるノードの VM ファミリ。
  • max_nodes:Azure Machine Learning コンピューティングでジョブを実行中に自動スケールアップする最大ノード数。

適用対象:Python SDK azureml v1

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

# Choose a name for your CPU cluster
cpu_cluster_name = "cpucluster"

# Verify that cluster does not exist already
try:
    cpu_cluster = ComputeTarget(workspace=ws, name=cpu_cluster_name)
    print('Found existing cluster, use it.')
except ComputeTargetException:
    # To use a different region for the compute, add a location='<region>' parameter
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                           max_nodes=4)
    cpu_cluster = ComputeTarget.create(ws, cpu_cluster_name, compute_config)

cpu_cluster.wait_for_completion(show_output=True)

Azure Machine Learning コンピューティングを作成するときに、いくつかの詳細プロパティも設定できます。 これらのプロパティを使用すると、永続的なクラスターを固定サイズで、またはサブスクリプションの既存の Azure 仮想ネットワーク内に作成できます。 詳しくは、「AmlCompute クラス」をご覧ください。

警告

ワークスペースやデータストアと異なるリージョンで location パラメーターを設定すると、ネットワークの待機時間とデータ転送コストが増大する可能性があります。 待機時間とコストは、クラスターの作成時や、クラスターでのジョブの実行時に発生する可能性があります。

コンピューティング クラスターのコストを削減する

優先順位の低い VM を使用して、一部または全部のワークロードを実行することもできます。 これらの VM では、可用性が保証されず、使用中に割り込まれる可能性があります。 割り込まれたジョブを再開する必要があります。

優先順位の低い VM を指定するには、次のいずれかの方法を使用します。

適用対象:Python SDK azureml v1

compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                            vm_priority='lowpriority',
                                                            max_nodes=4)

マネージド ID を設定する

また、Azure Machine Learning コンピューティング クラスターによって、マネージド ID がサポートされ、コードに資格情報を含めることなく、Azure リソースへのアクセスが認証されます。 マネージド ID には、次の 2 種類があります。

  • システム割り当てマネージド ID は、Azure Machine Learning コンピューティング クラスターで直接有効になります。 システム割り当て ID のライフ サイクルは、コンピューティング クラスターに直接関連付けられます。 コンピューティング クラスターが削除された場合、Azure は Azure AD の資格情報および ID を自動的にクリーンアップします。
  • ユーザー割り当てマネージド ID は、Azure マネージド ID サービスを介して提供されるスタンドアロンの Azure リソースです。 ユーザー割り当てマネージド ID を複数のリソースに割り当てることができ、任意の有効期間を設定できます。 このマネージド ID は、事前に作成してから、必要なパラメーターとして identity_id として渡す必要があります。

Note

マネージド ID はコンピューティング クラスターではサポートされていますが、コンピューティング インスタンスではサポートされていません。

適用対象:Python SDK azureml v1

  • プロビジョニング構成でマネージド ID を構成します。

    • ws という名前のワークスペースで作成された、システム割り当てマネージド ID

      # configure cluster with a system-assigned managed identity
      compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                              max_nodes=5,
                                                              identity_type="SystemAssigned",
                                                              )
      cpu_cluster_name = "cpu-cluster"
      cpu_cluster = ComputeTarget.create(ws, cpu_cluster_name, compute_config)
      
    • ws という名前のワークスペースで作成された、ユーザー割り当てマネージド ID

      # configure cluster with a user-assigned managed identity
      compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                              max_nodes=5,
                                                              identity_type="UserAssigned",
                                                              identity_id=['/subscriptions/<subcription_id>/resourcegroups/<resource_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user_assigned_identity>'])
      
      cpu_cluster_name = "cpu-cluster"
      cpu_cluster = ComputeTarget.create(ws, cpu_cluster_name, compute_config)
      
  • cpu_cluster という名前の既存のコンピューティング クラスターにマネージド ID を追加します

    • システム割り当てマネージド ID:

      # add a system-assigned managed identity
      cpu_cluster.add_identity(identity_type="SystemAssigned")
      
    • ユーザー割り当てマネージド ID:

      # add a user-assigned managed identity
      cpu_cluster.add_identity(identity_type="UserAssigned", 
                                  identity_id=['/subscriptions/<subcription_id>/resourcegroups/<resource_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user_assigned_identity>'])
      

Note

Azure Machine Learning コンピューティング クラスターは、システムによって割り当てられた 1 つの ID またはユーザーによって割り当てられた複数の ID のみをサポートします。両方同時にはサポートしません。

マネージド ID の使用

既定のマネージド ID は、システムによって割り当てられたマネージド ID、またはユーザーが割り当てた最初のマネージドID です。

実行中、ID は次の 2 つの方法で利用されます。

  1. ユーザーのストレージ マウント、コンテナー レジストリ、データストアを設定するために、システムによって ID が使用されます。

    • この場合、システムは既定のマネージド ID を使用します。
  2. 送信済み実行のコード内からリソースにアクセスするために、ユーザーによって ID が利用されます。

    • この場合、資格情報の取得に使用するマネージド ID に対応する client_id を指定します。
    • または、DEFAULT_IDENTITY_CLIENT_ID 環境変数を使用して、ユーザーが割り当てた ID のクライアント ID を取得します。

    たとえば、既定のマネージド ID を使用してデータストアのトークンを取得するには、次のようにします。

    client_id = os.environ.get('DEFAULT_IDENTITY_CLIENT_ID')
    credential = ManagedIdentityCredential(client_id=client_id)
    token = credential.get_token('https://storage.azure.com/')
    

トラブルシューティング

GA リリースの前に Azure portal から Azure Machine Learning ワークスペースを作成したユーザーが、そのワークスペースに AmlCompute を作成できないことがあります。 サービスにサポート リクエストを送るか、ポータルまたは SDK を使って新しいワークスペースを作成することで、すぐにブロックを解除することができます。

サイズ変更時の停止

ノードの状態に応じてサイズ変更 (0 -> 0) を実行しているときに Azure Machine Learning のコンピューティング クラスターが停止したように見える場合は、Azure リソースのロックが原因である可能性があります。

Azure では、リソースに "ロック" を設定して、削除できないようにしたり、読み取り専用にしたりすることができます。 リソースをロックすると、予期しない結果になる可能性があります。 リソースを変更する操作のように見えなくても、実際はロックによってブロックされているアクションを必要とする場合があります。

Azure Machine Learning では、ワークスペースのリソース グループに削除ロックを適用すると、Azure ML コンピューティング クラスターのスケーリング操作ができなくなります。 この問題を回避するには、リソース グループからロックを解除し、グループ内の個々の項目に適用することをお勧めします。

重要

次のリソースにロックを適用しないでください

リソース名 リソースの種類
<GUID>-azurebatch-cloudservicenetworksecurityggroup ネットワーク セキュリティ グループ
<GUID>-azurebatch-cloudservicepublicip パブリック IP アドレス
<GUID>-azurebatch-cloudserviceloadbalancer Load Balancer

これらのリソースは、コンピューティング クラスターと通信し、スケーリングなどの操作を実行するために使用されます。 これらのリソースからリソース ロックを解除すると、コンピューティング クラスターで自動スケールが許可されるようになります。

リソースのロックの詳細については、「リソースのロックによる予期せぬ変更の防止」を参照してください。

次のステップ

コンピューティング クラスターを使用して以下を行います。