マネージド ID を使ってオンライン エンドポイントから Azure リソースにアクセスする
[アーティクル] 09/03/2024
18 人の共同作成者
フィードバック
この記事の内容
適用対象: Azure CLI ml extension v2 (現行) Python SDK azure-ai-ml v2 (現行)
オンライン エンドポイントと、システム割り当てマネージド ID またはユーザー割り当てマネージド ID のいずれかを使用して、スコアリング スクリプトから Azure リソースにアクセスする方法を説明します。
マネージド エンドポイントと Kubernetes エンドポイントの両方を使うと、Azure Machine Learning で、コンピューティング リソースのプロビジョニングと機械学習モデルのデプロイの負担を管理できます。 通常、モデルは、Azure Container Registry や推論用の BLOB ストレージなどの Azure リソースにアクセスする必要がありますが、マネージド ID を使用すると、コード内で資格情報を管理することなく、それらのリソースにアクセスできます。 マネージド ID の詳細を確認してください。
このガイドでは、マネージド ID、ストレージ アカウント、オンライン エンドポイントがないことを前提としています。 これらのコンポーネントが既にある場合は、「マネージド ID にアクセス許可を付与する 」セクションに進んでください。
前提条件
Azure Machine Learning を使用するには、Azure サブスクリプションが必要です。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。
Azure CLI と ML (v2) 拡張機能をインストールして構成します。 詳細については、2.0 CLI のインストール、設定、使用 に関するページを参照してください。
Azure リソース グループ。ユーザー (または使用するサービス プリンシパル) に "ユーザー アクセス管理者" と "共同作成者" のアクセスが必要です。 前の記事に従って ML 拡張機能を構成した場合は、そのようなリソース グループが存在します。
Azure Machine Learning ワークスペース。 前の記事に従って ML 拡張機能を構成した場合は、既にワークスペースが存在します。
スコアリングとデプロイの準備が整ったトレーニング済みの機械学習モデル。 サンプルに従っている場合は、モデルが提供されます。
まだ Azure CLI の既定値を設定していない場合は、既定の設定を保存する必要があります。 サブスクリプション、ワークスペース、およびリソース グループの値を複数回渡さないようにするには、次のコードを実行します。
az account set --subscription <subscription ID>
az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
サンプルに従って処理するには、サンプル リポジトリを複製し、ディレクトリを cli に変更します。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Azure Machine Learning を使用するには、Azure サブスクリプションが必要です。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。
Azure CLI と ML (v2) 拡張機能をインストールして構成します。 詳細については、2.0 CLI のインストール、設定、使用 に関するページを参照してください。
Azure リソース グループ。ユーザー (または使用するサービス プリンシパル) に "ユーザー アクセス管理者" と "共同作成者" のアクセスが必要です。 前の記事に従って ML 拡張機能を構成した場合は、そのようなリソース グループが存在します。
Azure Machine Learning ワークスペース。 前の記事に従って ML 拡張機能を構成した場合は、ワークスペースが存在します。
スコアリングとデプロイの準備が整ったトレーニング済みの機械学習モデル。 サンプルに従っている場合は、モデルが提供されます。
まだ Azure CLI の既定値を設定していない場合は、既定の設定を保存する必要があります。 サブスクリプション、ワークスペース、およびリソース グループの値を複数回渡さないようにするには、次のコードを実行します。
az account set --subscription <subscription ID>
az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
サンプルに従って処理するには、サンプル リポジトリを複製し、ディレクトリを cli に変更します。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Azure Machine Learning を使用するには、Azure サブスクリプションが必要です。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。
Azure Machine Learning Python SDK (v2) をインストールして構成します。 詳細については、SDK (v2) をインストールして設定する 方法に関するページを参照してください。
Azure リソース グループ。ユーザー (または使用するサービス プリンシパル) に "ユーザー アクセス管理者" と "共同作成者" のアクセスが必要です。 前の記事に従って ML 拡張機能を構成した場合は、そのようなリソース グループが存在します。
Azure Machine Learning ワークスペース。 前の記事に従って ML 拡張機能を構成した場合は、既にワークスペースが存在します。
スコアリングとデプロイの準備が整ったトレーニング済みの機械学習モデル。 サンプルに従っている場合は、モデルが提供されます。
サンプル リポジトリを複製し、ディレクトリを変更します。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/endpoints/online/managed/managed-identities
このノートブックに沿って作業を行うには、sdk/endpoints/online/managed/managed-identities ディレクトリにあるコンパニオン サンプル ノートブック にアクセスしてください。
この例では、その他の Python パッケージが必要です。
Microsoft Azure Storage 管理クライアント
Microsoft Azure Authorization 管理クライアント
次のコードを使用してインストールします。
%pip install --pre azure-mgmt-storage
%pip install --pre azure-mgmt-authorization
Azure Machine Learning を使用するには、Azure サブスクリプションが必要です。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。
サブスクリプションまたはユーザー割り当て ID によってアクセスされる Azure リソースのロール作成アクセス許可。
Azure Machine Learning Python SDK (v2) をインストールして構成します。 詳細については、SDK (v2) をインストールして設定する 方法に関するページを参照してください。
Azure リソース グループ。ユーザー (または使用するサービス プリンシパル) に "ユーザー アクセス管理者" と "共同作成者" のアクセスが必要です。 前の記事に従って ML 拡張機能を構成した場合は、そのようなリソース グループが存在します。
Azure Machine Learning ワークスペース。 前の記事に従って ML 拡張機能を構成した場合は、既にワークスペースが存在します。
スコアリングとデプロイの準備が整ったトレーニング済みの機械学習モデル。 サンプルに従っている場合は、モデルが提供されます。
サンプル リポジトリを複製します。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/endpoints/online/managed/managed-identities
このノートブックに沿って作業を行うには、sdk/endpoints/online/managed/managed-identities ディレクトリにあるコンパニオン サンプル ノートブック にアクセスしてください。
この例では、その他の Python パッケージが必要です。
Microsoft Azure MSI 管理クライアント
Microsoft Azure Storage クライアント
Microsoft Azure Authorization 管理クライアント
次のコードを使用してインストールします。
%pip install --pre azure-mgmt-msi
%pip install --pre azure-mgmt-storage
%pip install --pre azure-mgmt-authorization
制限事項
エンドポイントの ID は不変です。 エンドポイントの作成時に、システム割り当て ID (既定) またはユーザー割り当て ID に関連付けることができます。 エンドポイントが作成された後は、ID を変更できません。
ARC と BLOB ストレージがプライベートとして (仮想ネットワークの背後に) 構成されている場合、お使いのワークスペースがパブリックかプライベートかに関係なく、Kubernetes エンドポイントからのアクセスはプライベート リンク経由となる必要があります。 プライベート リンク設定の詳細については、ワークスペース vnet をセキュリティで保護する方法 に関する記事を参照してください。
デプロイメントで使用するために作成するエンドポイント、ワークスペース、ワークスペースの場所について、それぞれの変数名を構成します。
次のコードは、これらの値をエンドポイントの環境変数としてエクスポートするものです。
export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"
次に、BLOB ストレージ アカウント、BLOB コンテナー、ファイルに付けたい名前を指定します。 ここでこれらの変数名を定義しておいて、次のセクションの az storage account create
コマンドや az storage container create
コマンドから参照することになります。
次のコードは、それらの値を環境変数としてエクスポートするものです。
export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"
これらの変数をエクスポートした後、テキスト ファイルをローカルに作成します。 エンドポイントがデプロイされると、スコアリング スクリプトは、エンドポイントの作成時に生成されるシステム割り当てマネージド ID を使用して、このテキスト ファイルにアクセスします。
エンドポイント、ワークスペース、ワークスペースの場所の名前を決め、その値を環境変数としてエクスポートします。
export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"
次に、BLOB ストレージ アカウント、BLOB コンテナー、ファイルに付けたい名前を指定します。 ここでこれらの変数名を定義しておいて、次のセクションの az storage account create
コマンドや az storage container create
コマンドから参照することになります。
export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"
これらの変数をエクスポートした後、テキスト ファイルをローカルに作成します。 エンドポイントがデプロイされると、スコアリング スクリプトは、エンドポイントで使用されるユーザー割り当てマネージド ID を使用して、このテキスト ファイルにアクセスします。
ユーザー id 名の名前を決定し、その値を環境変数としてエクスポートします。
export UAI_NAME="<USER_ASSIGNED_IDENTITY_NAME>"
ワークスペースとデプロイに関連する変数の値を割り当てます。
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace_name = "<AML_WORKSPACE_NAME>"
endpoint_name = "<ENDPOINT_NAME>"
次に、BLOB ストレージ アカウント、BLOB コンテナー、ファイルに付けたい名前を指定します。 これらの変数名はここで定義され、ストレージ アカウントとコンテナー作成コードで StorageManagementClient
と ContainerClient
として参照されます。
storage_account_name = "<STORAGE_ACCOUNT_NAME>"
storage_container_name = "<CONTAINER_TO_ACCESS>"
file_name = "<FILE_TO_ACCESS>"
これらの変数を割り当てたら、テキスト ファイルをローカルに作成します。 エンドポイントがデプロイされると、スコアリング スクリプトは、エンドポイントの作成時に生成されるシステム割り当てマネージド ID を使用して、このテキスト ファイルにアクセスします。
次に、ワークスペースへのハンドルを取得し、その場所を取得します。
from azure.ai.ml import MLClient
from azure.identity import AzureCliCredential
from azure.ai.ml.entities import (
ManagedOnlineDeployment,
ManagedOnlineEndpoint,
Model,
CodeConfiguration,
Environment,
)
credential = AzureCliCredential()
ml_client = MLClient(credential, subscription_id, resource_group, workspace_name)
workspace_location = ml_client.workspaces.get(workspace_name).location
この値を使用してストレージ アカウントを作成します。
ワークスペースとデプロイに関連する変数の値を割り当てます。
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace_name = "<AML_WORKSPACE_NAME>"
endpoint_name = "<ENDPOINT_NAME>"
次に、BLOB ストレージ アカウント、BLOB コンテナー、ファイルに付けたい名前を指定します。 これらの変数名はここで定義され、ストレージ アカウントとコンテナー作成コードで StorageManagementClient
と ContainerClient
として参照されます。
storage_account_name = "<STORAGE_ACCOUNT_NAME>"
storage_container_name = "<CONTAINER_TO_ACCESS>"
file_name = "<FILE_TO_ACCESS>"
これらの変数を割り当てたら、テキスト ファイルをローカルに作成します。 エンドポイントがデプロイされると、スコアリング スクリプトは、エンドポイントの作成時に生成されるユーザー割り当てマネージド ID を使用して、このテキスト ファイルにアクセスします。
ユーザー ID 名の名前を決定します。
uai_name = "<USER_ASSIGNED_IDENTITY_NAME>"
次に、ワークスペースへのハンドルを取得し、その場所を取得します。
from azure.ai.ml import MLClient
from azure.identity import AzureCliCredential
from azure.ai.ml.entities import (
ManagedOnlineDeployment,
ManagedOnlineEndpoint,
Model,
CodeConfiguration,
Environment,
)
credential = AzureCliCredential()
ml_client = MLClient(credential, subscription_id, resource_group, workspace_name)
workspace_location = ml_client.workspaces.get(workspace_name).location
この値を使用してストレージ アカウントを作成します。
デプロイ構成を定義する
CLI を使用してオンライン エンドポイントをデプロイするには、YAML ファイルで構成を定義する必要があります。 YAML スキーマの詳細については、オンライン エンドポイント YAML リファレンス に関するドキュメントを参照してください。
次の例の YAML ファイルは、オンライン エンドポイントを作成するために使用されます。
次の YAML の例は、endpoints/online/managed/managed-identities/1-sai-create-endpoint にあります。 このファイルによって、以下が行われます。
エンドポイントを参照する際に使用する名前 (my-sai-endpoint
) を定義します。
エンドポイントへのアクセスに使用する承認の種類 (auth-mode: key
) を指定します。
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key
この YAML の例 (2-sai-deployment.yml ) によって、次のことが行われます。
作成するエンドポイントの種類が online
であることを指定します。
エンドポイントに、blue
というデプロイが関連付けられるように指定します
デプロイするモデル、使用する環境とスコアリング スクリプトなど、デプロイの詳細を構成します。
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
model:
path: ../../model-1/model/
code_configuration:
code: ../../model-1/onlinescoring/
scoring_script: score_managedidentity.py
environment:
conda_file: ../../model-1/environment/conda-managedidentity.yaml
image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1
environment_variables:
STORAGE_ACCOUNT_NAME: "storage_place_holder"
STORAGE_CONTAINER_NAME: "container_place_holder"
FILE_NAME: "file_place_holder"
CLI を使用してオンライン エンドポイントをデプロイするには、YAML ファイルで構成を定義する必要があります。 YAML スキーマの詳細については、オンライン エンドポイント YAML リファレンス に関するドキュメントを参照してください。
次の例の YAML ファイルは、オンライン エンドポイントを作成するために使用されます。
次の YAML の例は、endpoints/online/managed/managed-identities/1-uai-create-endpoint にあります。 このファイルによって、以下が行われます。
エンドポイントを参照する際に使用する名前 (my-uai-endpoint
) を定義します。
エンドポイントへのアクセスに使用する承認の種類 (auth-mode: key
) を指定します。
使用する id の種類 (type: user_assigned
) を示します。
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-uai-endpoint
auth_mode: key
identity:
type: user_assigned
user_assigned_identities:
- resource_id: user_identity_ARM_id_place_holder
この YAML の例 (2-sai-deployment.yml ) によって、次のことが行われます。
作成するエンドポイントの種類が online
であることを指定します。
エンドポイントに、blue
というデプロイが関連付けられるように指定します
デプロイするモデル、使用する環境とスコアリング スクリプトなど、デプロイの詳細を構成します。
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
model:
path: ../../model-1/model/
code_configuration:
code: ../../model-1/onlinescoring/
scoring_script: score_managedidentity.py
environment:
conda_file: ../../model-1/environment/conda-managedidentity.yaml
image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1
environment_variables:
STORAGE_ACCOUNT_NAME: "storage_place_holder"
STORAGE_CONTAINER_NAME: "container_place_holder"
FILE_NAME: "file_place_holder"
UAI_CLIENT_ID: "uai_client_id_place_holder"
Python SDK (v2) を使用してオンライン エンドポイントをデプロイする場合、オブジェクトを使用して次の構成を定義できます。 または、YAML ファイルを .load
メソッドで読み込むこともできます。
次の Python エンドポイント オブジェクトは:
エンドポイントを参照するための名前を変数 endpoint_name
に割り当てます。
エンドポイント (auth-mode="key"
) へのアクセスに使用する承認の種類を指定します。
endpoint = ManagedOnlineEndpoint(name=endpoint_name, auth_mode="key")
このデプロイ オブジェクトは:
作成するデプロイの種類が、クラスを介した ManagedOnlineDeployment
であることを指定します。
エンドポイントに、blue
というデプロイが関連付けられるように指定します
name
や instance_count
などのデプロイの詳細を構成します。
インラインで追加のオブジェクトを定義し、それらを Model
、CodeConfiguration
、Environment
のデプロイと関連付けます。
システム割り当てマネージド ID でストレージにアクセスするために必要な環境変数が含まれます。
deployment = ManagedOnlineDeployment(
name="blue",
endpoint_name=endpoint_name,
model=Model(path="../../model-1/model/"),
code_configuration=CodeConfiguration(
code="../../model-1/onlinescoring/", scoring_script="score_managedidentity.py"
),
environment=Environment(
conda_file="../../model-1/environment/conda-managedidentity.yml",
image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
),
instance_type="Standard_DS3_v2",
instance_count=1,
environment_variables={
"STORAGE_ACCOUNT_NAME": storage_account_name,
"STORAGE_CONTAINER_NAME": storage_container_name,
"FILE_NAME": file_name,
},
)
Python SDK (v2) を使用してオンライン エンドポイントをデプロイする場合、オブジェクトを使用して次の構成を定義できます。 または、YAML ファイルを .load
メソッドで読み込むこともできます。
ユーザー割り当て ID の場合、ユーザー割り当てマネージド ID が作成された後に、エンドポイント構成を定義します。
このデプロイ オブジェクトは:
作成するデプロイの種類が、クラスを介した ManagedOnlineDeployment
であることを指定します。
エンドポイントに、blue
というデプロイが関連付けられるように指定します
name
や instance_count
などのデプロイの詳細を構成します。
インラインで追加のオブジェクトを定義し、それらを Model
、CodeConfiguration
、Environment
のデプロイと関連付けます。
ユーザー割り当てマネージド ID でストレージにアクセスするために必要な環境変数が含まれます。
UAI_CLIENT_ID
のプレースホルダー環境変数を追加します。これは、作成後、実際にこの構成をデプロイする前に追加されます。
deployment = ManagedOnlineDeployment(
name="blue",
endpoint_name=endpoint_name,
model=Model(path="../../model-1/model/"),
code_configuration=CodeConfiguration(
code="../../model-1/onlinescoring/", scoring_script="score_managedidentity.py"
),
environment=Environment(
conda_file="../../model-1/environment/conda-managedidentity.yml",
image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
),
instance_type="Standard_DS3_v2",
instance_count=1,
environment_variables={
"STORAGE_ACCOUNT_NAME": storage_account_name,
"STORAGE_CONTAINER_NAME": storage_container_name,
"FILE_NAME": file_name,
# We will update this after creating an identity
"UAI_CLIENT_ID": "uai_client_id_place_holder",
},
)
マネージド ID を作成する
Azure リソースにアクセスするには、オンライン エンドポイントに対するシステム割り当てマネージド ID またはユーザー割り当てマネージド ID を作成します。
ユーザー割り当てマネージド ID を作成するには、次のコマンドを使用します。
az identity create --name $UAI_NAME
ユーザー割り当てマネージド ID を作成するには、最初に ManagedServiceIdentityClient
へのハンドルを取得します。
from azure.mgmt.msi import ManagedServiceIdentityClient
from azure.mgmt.msi.models import Identity
credential = AzureCliCredential()
msi_client = ManagedServiceIdentityClient(
subscription_id=subscription_id,
credential=credential,
)
次に、ID を作成します。
msi_client.user_assigned_identities.create_or_update(
resource_group_name=resource_group,
resource_name=uai_name,
parameters=Identity(location=workspace_location),
)
次に、ID オブジェクトを取得します。これにはユーザーが使用する詳細が含まれています。
uai_identity = msi_client.user_assigned_identities.get(
resource_group_name=resource_group,
resource_name=uai_name,
)
uai_identity.as_dict()
Storage アカウントとコンテナーを作成する
この例では、BLOB ストレージ アカウントと BLOB コンテナーを作成し、先ほど作成したテキスト ファイルを BLOB コンテナーにアップロードします。 このストレージ アカウントと BLOB コンテナーに、オンライン エンドポイントとマネージド ID にアクセスする権限を付与します。
まず、ストレージ アカウントを作成します。
az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION
次に、ストレージ アカウントに BLOB コンテナーを作成します。
az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME
その後、テキスト ファイルを BLOB コンテナーにアップロードします。
az storage blob upload --account-name $STORAGE_ACCOUNT_NAME --container-name $STORAGE_CONTAINER_NAME --name $FILE_NAME --file endpoints/online/managed/managed-identities/hello.txt
まず、ストレージ アカウントを作成します。
az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION
次のものを使用して、既存のストレージ アカウント ID を取得することもできます。
storage_id=`az storage account show --name $STORAGE_ACCOUNT_NAME --query "id" -o tsv`
次に、ストレージ アカウントに BLOB コンテナーを作成します。
az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME
次に、ファイルをコンテナーにアップロードします。
az storage blob upload --account-name $STORAGE_ACCOUNT_NAME --container-name $STORAGE_CONTAINER_NAME --name $FILE_NAME --file endpoints/online/managed/managed-identities/hello.txt
まず、StorageManagementclient
へのハンドルを取得します。
from azure.mgmt.storage import StorageManagementClient
from azure.storage.blob import ContainerClient
from azure.mgmt.storage.models import Sku, StorageAccountCreateParameters, BlobContainer
credential = AzureCliCredential()
storage_client = StorageManagementClient(
credential=credential, subscription_id=subscription_id
)
次に、ストレージ アカウントを作成します。
storage_account_parameters = StorageAccountCreateParameters(
sku=Sku(name="Standard_LRS"),
kind="Storage",
location=workspace_location,
tags={"NRMS.NSP-extension": "ServiceTag-storage"},
)
storage_account = storage_client.storage_accounts.begin_create(
resource_group_name=resource_group,
account_name=storage_account_name,
parameters=storage_account_parameters,
).result()
次に、ストレージ アカウントに BLOB コンテナーを作成します。
blob_container = storage_client.blob_containers.create(
resource_group_name=resource_group,
account_name=storage_account_name,
container_name=storage_container_name,
blob_container=BlobContainer(),
)
ストレージ アカウント キーを取得し、ContainerClient
を使用してコンテナーへのハンドルを作成します。
res = storage_client.storage_accounts.list_keys(
resource_group_name=resource_group,
account_name=storage_account_name,
)
key = res.keys[0].value
container_client = ContainerClient(
account_url=storage_account.primary_endpoints.blob,
container_name=storage_container_name,
credential=key,
)
次に、ContainerClient
を使用してコンテナーに BLOB をアップロードします。
with open(file_name, "rb") as f:
container_client.upload_blob(name=file_name, data=f.read())
まず、StorageManagementclient
へのハンドルを取得します。
from azure.mgmt.storage import StorageManagementClient
from azure.storage.blob import ContainerClient
from azure.mgmt.storage.models import Sku, StorageAccountCreateParameters, BlobContainer
credential = AzureCliCredential()
storage_client = StorageManagementClient(
credential=credential, subscription_id=subscription_id
)
次に、ストレージ アカウントを作成します。
storage_account_parameters = StorageAccountCreateParameters(
sku=Sku(name="Standard_LRS"),
kind="Storage",
location=workspace_location,
tags={"NRMS.NSP-extension": "ServiceTag-storage"},
)
storage_account = storage_client.storage_accounts.begin_create(
resource_group_name=resource_group,
account_name=storage_account_name,
parameters=storage_account_parameters,
).result()
次に、ストレージ アカウントに BLOB コンテナーを作成します。
blob_container = storage_client.blob_containers.create(
resource_group_name=resource_group,
account_name=storage_account_name,
container_name=storage_container_name,
blob_container=BlobContainer(),
)
ストレージ アカウント キーを取得し、ContainerClient
を使用してコンテナーへのハンドルを作成します。
res = storage_client.storage_accounts.list_keys(
resource_group_name=resource_group,
account_name=storage_account_name,
)
key = res.keys[0].value
container_client = ContainerClient(
account_url=storage_account.primary_endpoints.blob,
container_name=storage_container_name,
credential=key,
)
次に、ContainerClient
を使用してコンテナーに BLOB をアップロードします。
with open(file_name, "rb") as f:
container_client.upload_blob(name=file_name, data=f.read())
オンライン エンドポイントの作成
次のコードでは、デプロイを指定せずにオンライン エンドポイントを作成します。
警告
エンドポイントの ID は不変です。 エンドポイントの作成時に、システム割り当て ID (既定) またはユーザー割り当て ID に関連付けることができます。 エンドポイントが作成された後は、ID を変更できません。
オンライン エンドポイントを作成すると、既定ではそのエンドポイントに対してシステム割り当てマネージド ID が作成されます。
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-sai-create-endpoint.yml
エンドポイントの状態を次のようにして確認します。
az ml online-endpoint show --name $ENDPOINT_NAME
問題が発生した場合は、「オンライン エンドポイントのデプロイとスコアリングのトラブルシューティング 」を参照してください。
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-uai-create-endpoint.yml --set identity.user_assigned_identities[0].resource_id=$uai_id
エンドポイントの状態を次のようにして確認します。
az ml online-endpoint show --name $ENDPOINT_NAME
問題が発生した場合は、「オンライン エンドポイントのデプロイとスコアリングのトラブルシューティング 」を参照してください。
オンライン エンドポイントを作成すると、既定ではそのエンドポイントに対してシステム割り当てマネージド ID が作成されます。
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
以下のコードで、デプロイされたエンドポイント オブジェクトの詳細を使用して、エンドポイントの状態を確認します。
endpoint = ml_client.online_endpoints.get(endpoint_name)
print(endpoint.identity.type)
print(endpoint.identity.principal_id)
問題が発生した場合は、「オンライン エンドポイントのデプロイとスコアリングのトラブルシューティング 」を参照してください。
次の Python エンドポイント オブジェクトは:
エンドポイントを参照するための名前を変数 endpoint_name
に割り当てます。
エンドポイント (auth-mode="key"
) へのアクセスに使用する承認の種類を指定します。
その ID を ManagedServiceIdentity
として定義し、マネージド ID をユーザー割り当てとして指定します。
エンドポイントを定義してデプロイします。
from azure.ai.ml.entities import ManagedIdentityConfiguration, IdentityConfiguration
endpoint = ManagedOnlineEndpoint(
name=endpoint_name,
auth_mode="key",
identity=IdentityConfiguration(
type="user_assigned",
user_assigned_identities=[
ManagedIdentityConfiguration(resource_id=uai_identity.id)
],
),
)
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
以下のコードで、デプロイされたエンドポイント オブジェクトの詳細を使用して、エンドポイントの状態を確認します。
endpoint = ml_client.online_endpoints.get(endpoint_name)
print(endpoint.identity.type)
print(endpoint.identity.user_assigned_identities)
問題が発生した場合は、「オンライン エンドポイントのデプロイとスコアリングのトラブルシューティング 」を参照してください。
マネージド ID にアクセス許可を付与する
重要
オンライン エンドポイントでは、コンテナー レジストリーに対する Azure Container Registry のプルアクセス許可である AcrPull アクセス許可と、ワークスペースの既定データストアに対するストレージ BLOB データ閲覧者アクセス許可が必要です。
オンライン エンドポイント アクセス許可でシステム割り当てマネージド ID を使用してストレージにアクセスできるようにしたり、ユーザー割り当てマネージド ID に対するアクセス許可を付与して、前のセクションで作成されたストレージ アカウントにアクセスできるようにすることができます。
エンドポイントに対して作成されたシステム割り当てマネージド ID を取得します。
system_identity=`az ml online-endpoint show --name $ENDPOINT_NAME --query "identity.principal_id" -o tsv`
ここから、システム割り当てマネージド ID に、ご使用のストレージへのアクセス許可を与えることができます。
az role assignment create --assignee-object-id $system_identity --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id
ユーザー割り当てマネージド ID のクライアント ID を取得します。
uai_clientid=`az identity list --query "[?name=='$UAI_NAME'].clientId" -o tsv`
uai_principalid=`az identity list --query "[?name=='$UAI_NAME'].principalId" -o tsv`
ユーザー割り当てマネージド ID を取得します。
uai_id=`az identity list --query "[?name=='$UAI_NAME'].id" -o tsv`
ワークスペースに関連付けられているコンテナー レジストリを取得します。
container_registry=`az ml workspace show --name $WORKSPACE --query container_registry -o tsv`
ワークスペースの既定のストレージを取得します。
storage_account=`az ml workspace show --name $WORKSPACE --query storage_account -o tsv`
ユーザー割り当てマネージド ID に、ストレージ アカウントのアクセス許可を付与します。
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id
ユーザー割り当てマネージド ID に、コンテナー レジストリのアクセス許可を付与します。
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "AcrPull" --scope $container_registry
ユーザー割り当てマネージド ID に、既定のワークスペース ストレージのアクセス許可を付与します。
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_account
まず、AuthorizationManagementClient
を作成して、ロールの定義の一覧を表示します。
from azure.mgmt.authorization import AuthorizationManagementClient
from azure.mgmt.authorization.v2018_01_01_preview.models import RoleDefinition
import uuid
role_definition_client = AuthorizationManagementClient(
credential=credential,
subscription_id=subscription_id,
api_version="2018-01-01-preview",
)
そうしたら、1 つ初期化してロールの割り当てを行います。
from azure.mgmt.authorization.v2020_10_01_preview.models import (
RoleAssignment,
RoleAssignmentCreateParameters,
)
role_assignment_client = AuthorizationManagementClient(
credential=credential,
subscription_id=subscription_id,
api_version="2020-10-01-preview",
)
次に、システム割り当てマネージド ID のプリンシパル ID を取得します。
endpoint = ml_client.online_endpoints.get(endpoint_name)
system_principal_id = endpoint.identity.principal_id
次は、Storage Blob Data Reader ロールをエンドポイントに割り当てます。 ロールの定義は名前で取得され、エンドポイントのプリンシパル ID と共に渡されます。 このロールは、上記で作成したストレージ アカウントのスコープに適用され、エンドポイントにファイルの読み取りを許可します。
role_name = "Storage Blob Data Reader"
scope = storage_account.id
role_defs = role_definition_client.role_definitions.list(scope=scope)
role_def = next((r for r in role_defs if r.role_name == role_name))
role_assignment_client.role_assignments.create(
scope=scope,
role_assignment_name=str(uuid.uuid4()),
parameters=RoleAssignmentCreateParameters(
role_definition_id=role_def.id, principal_id=system_principal_id
),
)
まず、AuthorizationManagementClient
を作成して、ロールの定義の一覧を表示します。
from azure.mgmt.authorization import AuthorizationManagementClient
from azure.mgmt.authorization.v2018_01_01_preview.models import RoleDefinition
import uuid
role_definition_client = AuthorizationManagementClient(
credential=credential,
subscription_id=subscription_id,
api_version="2018-01-01-preview",
)
そうしたら、1 つ初期化してロールの割り当てを行います。
from azure.mgmt.authorization.v2020_10_01_preview.models import (
RoleAssignment,
RoleAssignmentCreateParameters,
)
role_assignment_client = AuthorizationManagementClient(
credential=credential,
subscription_id=subscription_id,
api_version="2020-10-01-preview",
)
次に、ユーザー割り当てマネージド ID のプリンシパル ID とクライアント ID を取得します。 ロールを割り当てるのに必要なのは、プリンシパル ID のみです。 ただし、デプロイを作成する前に、クライアント ID を使用して UAI_CLIENT_ID
プレースホルダー環境変数を入力します。
uai_identity = msi_client.user_assigned_identities.get(
resource_group_name=resource_group, resource_name=uai_name
)
uai_principal_id = uai_identity.principal_id
uai_client_id = uai_identity.client_id
次は、Storage Blob Data Reader ロールをエンドポイントに割り当てます。 ロールの定義は名前で取得され、エンドポイントのプリンシパル ID と共に渡されます。 このロールは、エンドポイントにファイルの読み取りを許可するため、上記で作成したストレージ アカウントのスコープに適用されます。
role_name = "Storage Blob Data Reader"
scope = storage_account.id
role_defs = role_definition_client.role_definitions.list(scope=scope)
role_def = next((r for r in role_defs if r.role_name == role_name))
role_assignment_client.role_assignments.create(
scope=scope,
role_assignment_name=str(uuid.uuid4()),
parameters=RoleAssignmentCreateParameters(
role_definition_id=role_def.id,
principal_id=uai_principal_id,
principal_type="ServicePrincipal",
),
)
次の 2 つのアクセス許可には、ワークスペース オブジェクトとコンテナー レジストリ オブジェクトが必要です。
workspace = ml_client.workspaces.get(workspace_name)
container_registry = workspace.container_registry
次に、ユーザー割り当て ID に AcrPull ロールを割り当てます。 このロールを使用すると、イメージを Azure Container Registry からプルできます。 スコープは、ワークスペースに関連付けられているコンテナー レジストリのレベルで適用されます。
role_name = "AcrPull"
scope = container_registry
role_defs = role_definition_client.role_definitions.list(scope=scope)
role_def = next((r for r in role_defs if r.role_name == role_name))
role_assignment_client.role_assignments.create(
scope=scope,
role_assignment_name=str(uuid.uuid4()),
parameters=RoleAssignmentCreateParameters(
role_definition_id=role_def.id,
principal_id=uai_principal_id,
principal_type="ServicePrincipal",
),
)
最後に、ワークスペース ストレージ アカウントのスコープでエンドポイントに Storage Blob Data Reader ロールを割り当てます。 このロールの割り当てにより、エンドポイントでワークスペース ストレージ アカウントと新しく作成されたストレージ アカウントの BLOB を読み取れるようになります。
このロールの名前と機能は、上記で割り当てた最初のロールと同じですが、異なるスコープで適用され、ID が異なります。
role_name = "Storage Blob Data Reader"
scope = workspace.storage_account
role_defs = role_definition_client.role_definitions.list(scope=scope)
role_def = next((r for r in role_defs if r.role_name == role_name))
role_assignment_client.role_assignments.create(
scope=scope,
role_assignment_name=str(uuid.uuid4()),
parameters=RoleAssignmentCreateParameters(
role_definition_id=role_def.id,
principal_id=uai_principal_id,
principal_type="ServicePrincipal",
),
)
Azure リソースにアクセスするためのスコアリング スクリプト
ID トークンを使用して Azure リソースにアクセスする方法を理解するには、次のスクリプトを参照してください。このシナリオでは、前のセクションで作成したストレージ アカウントです。
import os
import logging
import json
import numpy
import joblib
import requests
from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobClient
def access_blob_storage_sdk():
credential = ManagedIdentityCredential(client_id=os.getenv("UAI_CLIENT_ID"))
storage_account = os.getenv("STORAGE_ACCOUNT_NAME")
storage_container = os.getenv("STORAGE_CONTAINER_NAME")
file_name = os.getenv("FILE_NAME")
blob_client = BlobClient(
account_url=f"https://{storage_account}.blob.core.windows.net/",
container_name=storage_container,
blob_name=file_name,
credential=credential,
)
blob_contents = blob_client.download_blob().content_as_text()
logging.info(f"Blob contains: {blob_contents}")
def get_token_rest():
"""
Retrieve an access token via REST.
"""
access_token = None
msi_endpoint = os.environ.get("MSI_ENDPOINT", None)
msi_secret = os.environ.get("MSI_SECRET", None)
# If UAI_CLIENT_ID is provided then assume that endpoint was created with user assigned identity,
# # otherwise system assigned identity deployment.
client_id = os.environ.get("UAI_CLIENT_ID", None)
if client_id is not None:
token_url = (
msi_endpoint + f"?clientid={client_id}&resource=https://storage.azure.com/"
)
else:
token_url = msi_endpoint + f"?resource=https://storage.azure.com/"
logging.info("Trying to get identity token...")
headers = {"secret": msi_secret, "Metadata": "true"}
resp = requests.get(token_url, headers=headers)
resp.raise_for_status()
access_token = resp.json()["access_token"]
logging.info("Retrieved token successfully.")
return access_token
def access_blob_storage_rest():
"""
Access a blob via REST.
"""
logging.info("Trying to access blob storage...")
storage_account = os.environ.get("STORAGE_ACCOUNT_NAME")
storage_container = os.environ.get("STORAGE_CONTAINER_NAME")
file_name = os.environ.get("FILE_NAME")
logging.info(
f"storage_account: {storage_account}, container: {storage_container}, filename: {file_name}"
)
token = get_token_rest()
blob_url = f"https://{storage_account}.blob.core.windows.net/{storage_container}/{file_name}?api-version=2019-04-01"
auth_headers = {
"Authorization": f"Bearer {token}",
"x-ms-blob-type": "BlockBlob",
"x-ms-version": "2019-02-02",
}
resp = requests.get(blob_url, headers=auth_headers)
resp.raise_for_status()
logging.info(f"Blob contains: {resp.text}")
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment.
# It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION)
# For multiple models, it points to the folder containing all deployed models (./azureml-models)
# Please provide your model's folder name if there is one
model_path = os.path.join(
os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl"
)
# deserialize the model file back into a sklearn model
model = joblib.load(model_path)
logging.info("Model loaded")
# Access Azure resource (Blob storage) using system assigned identity token
access_blob_storage_rest()
access_blob_storage_sdk()
logging.info("Init complete")
# note you can pass in multiple rows for scoring
def run(raw_data):
logging.info("Request received")
data = json.loads(raw_data)["data"]
data = numpy.array(data)
result = model.predict(data)
logging.info("Request processed")
return result.tolist()
自分の構成を使用してデプロイを作成する
オンライン エンドポイントに関連付けられているデプロイを作成します。 オンライン エンドポイントへのデプロイの詳細について学習します 。
警告
基になる環境とイメージが初めて構築されるものであるかどうかに応じて、このデプロイには 8 分から 14 分程度かかる場合があります。 その後、同じ環境を使用したデプロイは、それよりも短時間で完了します。
az ml online-deployment create --endpoint-name $ENDPOINT_NAME --all-traffic --name blue --file endpoints/online/managed/managed-identities/2-sai-deployment.yml --set environment_variables.STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME environment_variables.STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME environment_variables.FILE_NAME=$FILE_NAME
Note
--name
引数の値によって、YAML ファイル内の name
キーがオーバーライドされる可能性があります。
デプロイの状態を確認します。
az ml online-deployment show --endpoint-name $ENDPOINT_NAME --name blue
特定のデータのみが返されるように上記のクエリを調整する方法については、Azure CLI コマンドの出力の照会 に関するページを参照してください。
Note
スコアリング スクリプトの init メソッドは、システム割り当てマネージド ID トークンを使用して、ストレージ アカウントからファイルを読み取ります。
init メソッドの出力をチェックするには、次のコードでデプロイ ログを確認します。
# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-uai-create-endpoint.yml --set identity.user_assigned_identities[0].resource_id=$uai_id
Note
--name
引数の値によって、YAML ファイル内の name
キーがオーバーライドされる可能性があります。
コマンドが実行されると、デプロイの状態を確認できます。
az ml online-endpoint show --name $ENDPOINT_NAME
特定のデータのみが返されるように上記のクエリを調整する方法については、Azure CLI コマンドの出力の照会 に関するページを参照してください。
# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue
Note
スコアリング スクリプトの init メソッドは、ユーザー割り当てマネージド ID トークンを使用して、ストレージ アカウントからファイルを読み取ります。
init メソッドの出力をチェックするには、次のコードでデプロイ ログを確認します。
# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue
まず、デプロイを作成します。
ml_client.online_deployments.begin_create_or_update(deployment).result()
デプロイが完了したら、状態を確認してから、その ID の詳細を確認します。
deployment = ml_client.online_deployments.get(
endpoint_name=endpoint_name, name=deployment.name
)
print(deployment)
Note
スコアリング スクリプトの init メソッドは、システム割り当てマネージド ID トークンを使用して、ストレージ アカウントからファイルを読み取ります。
init メソッドの出力をチェックするには、次のコードでデプロイ ログを確認します。
ml_client.online_deployments.get_logs(deployment.name, deployment.endpoint_name, 1000)
デプロイを確認したら、トラフィックを 100% に設定します。
endpoint.traffic = {str(deployment.name): 100}
ml_client.begin_create_or_update(endpoint).result()
デプロイする前に、UAI_CLIENT_ID
環境変数プレースホルダーを更新します。
deployment.environment_variables["UAI_CLIENT_ID"] = uai_client_id
次に、デプロイを作成します。
ml_client.online_deployments.begin_create_or_update(deployment).result()
デプロイが完了したら、状態を確認してから、その ID の詳細を確認します。
deployment = ml_client.online_deployments.get(
endpoint_name=endpoint_name, name=deployment.name
)
print(deployment)
Note
スコアリング スクリプトの init メソッドは、ユーザー割り当てマネージド ID トークンを使用して、ストレージ アカウントからファイルを読み取ります。
init メソッドの出力をチェックするには、次のコードでデプロイ ログを確認します。
ml_client.online_deployments.get_logs(deployment.name, deployment.endpoint_name, 1000)
デプロイを確認したら、トラフィックを 100% に設定します。
endpoint.traffic = {str(deployment.name): 100}
ml_client.begin_create_or_update(endpoint).result()
デプロイが完了すると、モデル、環境、エンドポイントが Azure Machine Learning ワークスペースに登録されます。
エンドポイントをテストする
オンライン エンドポイントがデプロイされたら、要求でその操作をテストして確認します。 推論の詳細は、モデルによって異なります。 このガイドでは、JSON クエリ パラメーターは次のようになります。
{"data": [
[1,2,3,4,5,6,7,8,9,10],
[10,9,8,7,6,5,4,3,2,1]
]}
エンドポイントを呼び出すには、次を実行します。
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
sample_data = "../../model-1/sample-request.json"
ml_client.online_endpoints.invoke(endpoint_name=endpoint_name, request_file=sample_data)
sample_data = "../../model-1/sample-request.json"
ml_client.online_endpoints.invoke(endpoint_name=endpoint_name, request_file=sample_data)
エンドポイントとストレージ アカウントを削除する
デプロイしたオンライン エンドポイントとストレージを今後使用する予定がない場合は、コストを節約するためにそれらを削除してください。 エンドポイントを削除すると、そこに関連付けられているデプロイもすべて削除されます。
az ml online-endpoint delete --name $ENDPOINT_NAME --yes
az storage account delete --name $STORAGE_ACCOUNT_NAME --yes
az ml online-endpoint delete --name $ENDPOINT_NAME --yes
az storage account delete --name $STORAGE_ACCOUNT_NAME --yes
az identity delete --name $UAI_NAME
エンドポイントを削除します:
ml_client.online_endpoints.begin_delete(endpoint_name)
ストレージ アカウントを削除します:
storage_client.storage_accounts.delete(
resource_group_name=resource_group, account_name=storage_account_name
)
エンドポイントを削除します:
ml_client.online_endpoints.begin_delete(endpoint_name)
ストレージ アカウントを削除します:
storage_client.storage_accounts.delete(
resource_group_name=resource_group, account_name=storage_account_name
)
ユーザー割り当てマネージド ID を削除します:
msi_client.user_assigned_identities.delete(
resource_group_name=resource_group, resource_name=uai_name
)
関連するコンテンツ