SI APPLICA A:
Estensione per Machine Learning dell'interfaccia della riga di comando di Azure v2 (corrente)
Python SDK azure-ai-ml v2 (corrente)
Informazioni su come accedere alle risorse di Azure dallo script di assegnazione dei punteggi con un endpoint online e un'identità gestita assegnata dal sistema o un'identità gestita assegnata dall'utente.
Sia gli endpoint gestiti sia gli endpoint Kubernetes consentono ad Azure Machine Learning di gestire il carico di provisioning della risorsa di calcolo e della distribuzione del modello di Machine Learning. In genere, il modello deve accedere alle risorse di Azure, ad esempio Registro Azure Container o l'Archiviazione BLOB, per l'inferenza. Con un'identità gestita è possibile accedere a queste risorse senza dover gestire le credenziali nel codice. Altre informazioni sulle identità gestite.
Questa guida presuppone che non si disponga di un'identità gestita, un account di archiviazione o un endpoint online. Se si dispone già di questi componenti, passare alla sezione Concedere l'autorizzazione di accesso all'identità gestita.
Prerequisiti
Per usare Azure Machine Learning, è necessario avere una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.
Installare e configurare l'estensione dell'interfaccia della riga di comando di Azure e Machine Learning (v2). Per altre informazioni, vedere Installare, configurare e usare l'interfaccia della riga di comando 2.0.
Un gruppo di risorse di Azure in cui l'utente (o l'entità servizio in uso) necessita di accesso Amministratore accesso utenti e Contributore. Questo gruppo di risorse sarà disponibile se l'estensione di Machine Learning è stata configurata in base all'articolo precedente.
Un'area di lavoro di Azure Machine Learning. Se l'estensione ML è stata configurata come illustrato nell'articolo precedente, si dispone già di un'area di lavoro.
Modello di Machine Learning con training pronto per l'assegnazione di punteggi e la distribuzione. Se si sta seguendo il campione, viene fornito un modello.
Se le impostazioni predefinite per l'interfaccia della riga di comando di Azure non sono già state impostate, salvare le proprie impostazioni predefinite. Per evitare di passare più volte i valori per la sottoscrizione, l'area di lavoro e il gruppo di risorse, eseguire questo codice:
az account set --subscription <subscription ID>
az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
Per seguire il campione, clonare il repository dei campioni e quindi modificare la directory all’interfaccia della riga di comando.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Per usare Azure Machine Learning, è necessario avere una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.
Installare e configurare l'estensione dell'interfaccia della riga di comando di Azure e Machine Learning (v2). Per altre informazioni, vedere Installare, configurare e usare l'interfaccia della riga di comando 2.0.
Un gruppo di risorse di Azure in cui l'utente (o l'entità servizio in uso) necessita di accesso Amministratore accesso utenti e Contributore. Questo gruppo di risorse sarà disponibile se l'estensione di Machine Learning è stata configurata in base all'articolo precedente.
Un'area di lavoro di Azure Machine Learning. Un'area di lavoro sarà disponibile se l'estensione di Machine Learning è stata configurata come illustrato nell'articolo precedente.
Modello di Machine Learning con training pronto per l'assegnazione di punteggi e la distribuzione. Se si sta seguendo il campione, viene fornito un modello.
Se le impostazioni predefinite per l'interfaccia della riga di comando di Azure non sono già state impostate, salvare le proprie impostazioni predefinite. Per evitare di passare più volte i valori per la sottoscrizione, l'area di lavoro e il gruppo di risorse, eseguire questo codice:
az account set --subscription <subscription ID>
az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
Per seguire il campione, clonare il repository dei campioni e quindi modificare la directory all’interfaccia della riga di comando.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Per usare Azure Machine Learning, è necessario avere una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.
Installare e configurare Azure Machine Learning Python SDK (v2). Per altre informazioni, vedere Installare e configurare SDK (v2).
Un gruppo di risorse di Azure in cui l'utente (o l'entità servizio in uso) necessita di accesso Amministratore accesso utenti e Contributore. Questo gruppo di risorse sarà disponibile se l'estensione di Machine Learning è stata configurata in base all'articolo precedente.
Un'area di lavoro di Azure Machine Learning. Se l'estensione ML è stata configurata come illustrato nell'articolo precedente, si dispone già di un'area di lavoro.
Modello di Machine Learning con training pronto per l'assegnazione di punteggi e la distribuzione. Se si sta seguendo il campione, viene fornito un modello.
Clonare il repository dei campioni, quindi modificare la directory.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/endpoints/online/managed/managed-identities
Per seguire questo notebook, accedere al notebook di esempio complementare all'interno della directory sdk/endpoints/online/managed/managed-identities.
Per questo esempio sono necessari pacchetti Python aggiuntivi:
- Microsoft Azure Storage Management Client
- Microsoft Azure Authorization Management Client
Installarli con il codice seguente:
%pip install --pre azure-mgmt-storage
%pip install --pre azure-mgmt-authorization
Per usare Azure Machine Learning, è necessario avere una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.
Autorizzazioni di creazione dei ruoli per la sottoscrizione o le risorse di Azure a cui accede l'identità assegnata dall'utente.
Installare e configurare Azure Machine Learning Python SDK (v2). Per altre informazioni, vedere Installare e configurare SDK (v2).
Un gruppo di risorse di Azure in cui l'utente (o l'entità servizio in uso) necessita di accesso Amministratore accesso utenti e Contributore. Questo gruppo di risorse sarà disponibile se l'estensione di Machine Learning è stata configurata in base all'articolo precedente.
Un'area di lavoro di Azure Machine Learning. Se l'estensione ML è stata configurata come illustrato nell'articolo precedente, si dispone già di un'area di lavoro.
Modello di Machine Learning con training pronto per l'assegnazione di punteggi e la distribuzione. Se si sta seguendo il campione, viene fornito un modello.
Clonare il repository di esempi.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/endpoints/online/managed/managed-identities
Per seguire questo notebook, accedere al notebook di esempio complementare all'interno della directory sdk/endpoints/online/managed/managed-identities.
Per questo esempio sono necessari pacchetti Python aggiuntivi:
- Microsoft Azure Msi Management Client
- Microsoft Azure Storage Client
- Microsoft Azure Authorization Management Client
Installarli con il codice seguente:
%pip install --pre azure-mgmt-msi
%pip install --pre azure-mgmt-storage
%pip install --pre azure-mgmt-authorization
Limiti
- L'identità per un endpoint non è modificabile. Durante la creazione dell'endpoint, è possibile associarlo a un'identità assegnata dal sistema (impostazione predefinita) o a un'identità assegnata dall'utente. Non è possibile modificare l'identità dopo la creazione dell'endpoint.
- Se ARC e l'Archiviazione BLOB sono configurati come privati (ovvero si trovano dietro una rete virtuale), l'accesso dall'endpoint Kubernetes deve essere eseguito tramite il collegamento privato, indipendentemente dal fatto che l'area di lavoro sia pubblica o privata. Per altre informazioni sull'impostazione del collegamento privato, vedere Come proteggere la rete virtuale dell'area di lavoro.
Configurare i nomi delle variabili per l'area di lavoro, la posizione dell'area di lavoro e l'endpoint da creare per l'uso con la distribuzione.
Il codice seguente esporta questi valori come variabili di ambiente nell'endpoint:
export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"
Specificare quindi il nome dell'account di Archiviazione BLOB, del contenitore BLOB e del file. Questi nomi di variabile sono definiti qui e vi si fa riferimento nei comandi az storage account create
e az storage container create
nella sezione successiva.
Il codice seguente esporta tali valori come variabili di ambiente:
export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"
Dopo l'esportazione di queste variabili, creare un file di testo in locale. Quando l'endpoint viene distribuito, lo script di assegnazione dei punteggi accederà a questo file di testo usando l'identità gestita assegnata dal sistema generata al momento della creazione dell'endpoint.
Decidere il nome dell'endpoint, dell'area di lavoro e della posizione dell'area di lavoro, quindi esportare tale valore come variabile di ambiente:
export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"
Specificare quindi il nome dell'account di Archiviazione BLOB, del contenitore BLOB e del file. Questi nomi di variabile sono definiti qui e vi si fa riferimento nei comandi az storage account create
e az storage container create
nella sezione successiva.
export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"
Dopo l'esportazione di queste variabili, creare un file di testo in locale. Quando l'endpoint viene distribuito, lo script di assegnazione dei punteggi accederà a questo file di testo usando l'identità gestita assegnata dall'utente usata nell'endpoint.
Decidere il nome dell'identità utente ed esportare tale valore come variabile di ambiente:
export UAI_NAME="<USER_ASSIGNED_IDENTITY_NAME>"
Assegnare valori per le variabili correlate all'area di lavoro e alla distribuzione:
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace_name = "<AML_WORKSPACE_NAME>"
endpoint_name = "<ENDPOINT_NAME>"
Specificare quindi il nome dell'account di Archiviazione BLOB, del contenitore BLOB e del file. Questi nomi di variabile sono definiti qui e vi si fa riferimento nel codice di creazione dell'account di archiviazione e del contenitore con StorageManagementClient
e ContainerClient
.
storage_account_name = "<STORAGE_ACCOUNT_NAME>"
storage_container_name = "<CONTAINER_TO_ACCESS>"
file_name = "<FILE_TO_ACCESS>"
Dopo aver assegnato queste variabili, creare un file di testo in locale. Quando l'endpoint viene distribuito, lo script di assegnazione dei punteggi accederà a questo file di testo usando l'identità gestita assegnata dal sistema generata al momento della creazione dell'endpoint.
A questo punto, ottenere un handle per l'area di lavoro e recuperarne la posizione:
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
Usare questo valore per creare un account di archiviazione.
Assegnare valori per le variabili correlate all'area di lavoro e alla distribuzione:
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace_name = "<AML_WORKSPACE_NAME>"
endpoint_name = "<ENDPOINT_NAME>"
Specificare quindi il nome dell'account di Archiviazione BLOB, del contenitore BLOB e del file. Questi nomi di variabile sono definiti qui e vi si fa riferimento nel codice di creazione dell'account di archiviazione e del contenitore con StorageManagementClient
e ContainerClient
.
storage_account_name = "<STORAGE_ACCOUNT_NAME>"
storage_container_name = "<CONTAINER_TO_ACCESS>"
file_name = "<FILE_TO_ACCESS>"
Dopo aver assegnato queste variabili, creare un file di testo in locale. Quando l'endpoint viene distribuito, lo script di assegnazione dei punteggi accederà a questo file di testo usando l'identità gestita assegnata dall'utente generata al momento della creazione dell'endpoint.
Scegliere il nome dell'identità utente:
uai_name = "<USER_ASSIGNED_IDENTITY_NAME>"
A questo punto, ottenere un handle per l'area di lavoro e recuperarne la posizione:
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
Usare questo valore per creare un account di archiviazione.
Definire la configurazione della distribuzione
Per distribuire un endpoint online con l'interfaccia della riga di comando, è necessario definire la configurazione in un file YAML. Per altre informazioni sullo schema YAML, vedere il documento di riferimento sull'endpoint YAML online.
I file YAML negli esempi seguenti vengono usati per creare endpoint online.
L'esempio YAML seguente si trova in endpoints/online/managed/managed-identities/1-sai-create-endpoint. Il file
- Definisce il nome in base al quale si vuole fare riferimento all'endpoint,
my-sai-endpoint
.
- Specifica il tipo di autorizzazione da usare per accedere all'endpoint,
auth-mode: key
.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key
Questo esempio YAML, 2-sai-deployment.yml,
- Specifica che il tipo di endpoint che si vuole creare è un endpoint
online
.
- Indica che l'endpoint ha una distribuzione associata denominata
blue
.
- Configura i dettagli della distribuzione, ad esempio il modello da distribuire e quale ambiente e script di assegnazione dei punteggi usare.
$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"
Per distribuire un endpoint online con l'interfaccia della riga di comando, è necessario definire la configurazione in un file YAML. Per altre informazioni sullo schema YAML, vedere il documento di riferimento sull'endpoint YAML online.
I file YAML negli esempi seguenti vengono usati per creare endpoint online.
L'esempio YAML seguente si trova in endpoints/online/managed/managed-identities/1-uai-create-endpoint. Il file
- Definisce il nome in base al quale si vuole fare riferimento all'endpoint,
my-uai-endpoint
.
- Specifica il tipo di autorizzazione da usare per accedere all'endpoint,
auth-mode: key
.
- Indica il tipo di identità da usare,
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
Questo esempio YAML, 2-sai-deployment.yml,
- Specifica che il tipo di endpoint che si vuole creare è un endpoint
online
.
- Indica che l'endpoint ha una distribuzione associata denominata
blue
.
- Configura i dettagli della distribuzione, ad esempio il modello da distribuire e quale ambiente e script di assegnazione dei punteggi usare.
$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"
Per distribuire un endpoint online con Python SDK (v2), è possibile usare gli oggetti per definire la seguente configurazione. In alternativa, è possibile caricare file YAML usando il metodo .load
.
L'oggetto endpoint Python seguente:
- Assegna alla variabile
endpoint_name
il nome in base al quale si vuole fare riferimento all'endpoint.
- Specifica il tipo di autorizzazione da usare per accedere all'endpoint
auth-mode="key"
.
endpoint = ManagedOnlineEndpoint(name=endpoint_name, auth_mode="key")
Questo oggetto di distribuzione:
- Specifica tramite la classe che il tipo di distribuzione che si vuole creare è
ManagedOnlineDeployment
.
- Indica che l'endpoint ha una distribuzione associata denominata
blue
.
- Configura i dettagli della distribuzione, ad esempio
name
e instance_count
- Definisce oggetti aggiuntivi inline e li associa alla distribuzione per
Model
,CodeConfiguration
e Environment
.
- Include le variabili di ambiente necessarie per l'identità gestita assegnata dal sistema per accedere all'archiviazione.
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,
},
)
Per distribuire un endpoint online con Python SDK (v2), è possibile usare gli oggetti per definire la seguente configurazione. In alternativa, è possibile caricare file YAML usando il metodo .load
.
Per un'identità assegnata dall'utente, definire la configurazione dell'endpoint dopo aver creato l’identità gestita assegnata dall'utente.
Questo oggetto di distribuzione:
- Specifica tramite la classe che il tipo di distribuzione che si vuole creare è
ManagedOnlineDeployment
.
- Indica che l'endpoint ha una distribuzione associata denominata
blue
.
- Configura i dettagli della distribuzione, ad esempio
name
e instance_count
- Definisce ulteriori oggetti inline e li associa alla distribuzione per
Model
,CodeConfiguration
e Environment
.
- Include le variabili di ambiente necessarie per l'identità gestita assegnata dall'utente per accedere all'archiviazione.
- Aggiunge una variabile di ambiente segnaposto per
UAI_CLIENT_ID
, che verrà aggiunta dopo che ne è stata creata una e prima di distribuire effettivamente questa configurazione.
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",
},
)
Creare l'identità gestita
Per accedere alle risorse di Azure, creare un'identità gestita assegnata dal sistema o assegnata dall'utente per l'endpoint online.
Quando si crea un endpoint online, viene generata automaticamente un'identità gestita assegnata dal sistema, quindi non è necessario crearne una separata.
Per creare un'identità gestita assegnata dall'utente, usare il comando seguente:
az identity create --name $UAI_NAME
Quando si crea un endpoint online, viene generata automaticamente un'identità gestita assegnata dal sistema, quindi non è necessario crearne una separata.
Per creare un'identità gestita assegnata dall'utente, ottenere prima di tutto un handle per 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,
)
Creare quindi l'identità:
msi_client.user_assigned_identities.create_or_update(
resource_group_name=resource_group,
resource_name=uai_name,
parameters=Identity(location=workspace_location),
)
Ora, recuperare l'oggetto Identity, che contiene i dettagli usati:
uai_identity = msi_client.user_assigned_identities.get(
resource_group_name=resource_group,
resource_name=uai_name,
)
uai_identity.as_dict()
Creare un account di archiviazione e un contenitore
Per questo esempio, creare un account di archiviazione BLOB e un contenitore BLOB e quindi caricare il file di testo creato in precedenza nel contenitore BLOB. Si concede all'endpoint online e all'identità gestita l'accesso a questo account di archiviazione e al contenitore BLOB.
Creare prima di tutto un account di archiviazione.
az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION
Creare quindi il contenitore BLOB nell'account di archiviazione.
az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME
Caricare quindi il file di testo nel contenitore 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
Creare prima di tutto un account di archiviazione.
az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION
È anche possibile recuperare un ID dell'account di archiviazione esistente con quanto segue.
storage_id=`az storage account show --name $STORAGE_ACCOUNT_NAME --query "id" -o tsv`
Creare quindi il contenitore BLOB nell'account di archiviazione.
az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME
Caricare quindi il file nel contenitore.
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
Ottenere prima di tutto un handle per 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
)
Creare quindi un account di archiviazione:
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()
Creare quindi il contenitore BLOB nell'account di archiviazione:
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(),
)
Recuperare la chiave dell'account di archiviazione e creare un handle per il contenitore con 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,
)
Caricare quindi un BLOB nel contenitore con ContainerClient
:
with open(file_name, "rb") as f:
container_client.upload_blob(name=file_name, data=f.read())
Ottenere prima di tutto un handle per 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
)
Creare quindi un account di archiviazione:
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()
Creare quindi il contenitore BLOB nell'account di archiviazione:
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(),
)
Recuperare la chiave dell'account di archiviazione e creare un handle per il contenitore con 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,
)
Caricare quindi un BLOB nel contenitore con ContainerClient
:
with open(file_name, "rb") as f:
container_client.upload_blob(name=file_name, data=f.read())
Creare un endpoint online
Il codice seguente crea un endpoint online senza specificare una distribuzione.
Avviso
L'identità per un endpoint non è modificabile. Durante la creazione dell'endpoint, è possibile associarlo a un'identità assegnata dal sistema (impostazione predefinita) o a un'identità assegnata dall'utente. Non è possibile modificare l'identità dopo la creazione dell'endpoint.
Quando si crea un endpoint online, per impostazione predefinita viene creata un'identità gestita assegnata dal sistema per l'endpoint.
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-sai-create-endpoint.yml
Controllare lo stato dell'endpoint con quanto segue.
az ml online-endpoint show --name $ENDPOINT_NAME
Se si verificano problemi, vedere Risoluzione dei problemi di distribuzione e assegnazione dei punteggi per gli endpoint online.
Quando si crea un endpoint online, per impostazione predefinita viene creata un'identità gestita assegnata dal sistema per l'endpoint.
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
Controllare lo stato dell'endpoint tramite i dettagli dell'oggetto endpoint distribuito con il codice seguente:
endpoint = ml_client.online_endpoints.get(endpoint_name)
print(endpoint.identity.type)
print(endpoint.identity.principal_id)
Se si verificano problemi, vedere Risoluzione dei problemi di distribuzione e assegnazione dei punteggi per gli endpoint online.
L'oggetto endpoint Python seguente:
- Assegna alla variabile
endpoint_name
il nome in base al quale si vuole fare riferimento all'endpoint.
- Specifica il tipo di autorizzazione da usare per accedere all'endpoint
auth-mode="key"
.
- Definisce l'identità come
ManagedServiceIdentity
e specifica l'Identità gestita come assegnata dall'utente.
Definire e distribuire l'endpoint:
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()
Controllare lo stato dell'endpoint tramite i dettagli dell'oggetto endpoint distribuito con il codice seguente:
endpoint = ml_client.online_endpoints.get(endpoint_name)
print(endpoint.identity.type)
print(endpoint.identity.user_assigned_identities)
Se si verificano problemi, vedere Risoluzione dei problemi di distribuzione e assegnazione dei punteggi per gli endpoint online.
Concedere l'autorizzazione di accesso all'identità gestita
Importante
Gli endpoint online richiedono l'autorizzazione pull di Registro Azure Container, l'autorizzazione AcrPull, per il registro contenitori e l'autorizzazione Lettore dei dati dei BLOB di archiviazione per l'archivio dati predefinito dell'area di lavoro.
È possibile consentire all'endpoint online di accedere all'archiviazione tramite la rispettiva identità gestita assegnata dal sistema o concedere l'autorizzazione all'identità gestita assegnata dall'utente per accedere all'account di archiviazione creato nella sezione precedente.
Recuperare l'identità gestita assegnata dal sistema creata per l'endpoint.
system_identity=`az ml online-endpoint show --name $ENDPOINT_NAME --query "identity.principal_id" -o tsv`
Da qui è possibile concedere all'identità gestita assegnata dal sistema l'autorizzazione per accedere all'archiviazione.
az role assignment create --assignee-object-id $system_identity --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id
Recuperare l'ID client dell'identità gestita assegnata dall'utente.
uai_clientid=`az identity list --query "[?name=='$UAI_NAME'].clientId" -o tsv`
uai_principalid=`az identity list --query "[?name=='$UAI_NAME'].principalId" -o tsv`
Recuperare l'ID dell'identità gestita assegnata dall'utente.
uai_id=`az identity list --query "[?name=='$UAI_NAME'].id" -o tsv`
Ottenere il registro contenitori associato all'area di lavoro.
container_registry=`az ml workspace show --name $WORKSPACE --query container_registry -o tsv`
Recuperare la risorsa di archiviazione predefinita dell'area di lavoro.
storage_account=`az ml workspace show --name $WORKSPACE --query storage_account -o tsv`
Concedere l'autorizzazione dell'account di archiviazione all'identità gestita assegnata dall'utente.
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id
Concedere l'autorizzazione del registro contenitori all'identità gestita assegnata dall'utente.
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "AcrPull" --scope $container_registry
Concedere l'autorizzazione della risorsa di archiviazione dell'area di lavoro predefinita all'identità gestita assegnata dall'utente.
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_account
Creare prima di tutto un AuthorizationManagementClient
per elencare le definizioni dei ruoli:
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",
)
A questo punto, inizializzarne uno per creare assegnazioni di ruolo:
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",
)
Quindi, ottenere l'ID entità dell'identità gestita assegnata dal sistema:
endpoint = ml_client.online_endpoints.get(endpoint_name)
system_principal_id = endpoint.identity.principal_id
Assegnare quindi il ruolo Lettore dati BLOB di archiviazione all'endpoint. La definizione del ruolo viene recuperata in base al nome e passata insieme all'ID entità dell'endpoint. Il ruolo viene applicato all'ambito dell'account di archiviazione creato in precedenza e consente all'endpoint di leggere il file.
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
),
)
Creare prima di tutto un AuthorizationManagementClient
per elencare le definizioni dei ruoli:
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",
)
A questo punto, inizializzarne uno per creare assegnazioni di ruolo:
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",
)
Ottenere quindi l'ID entità e l'ID client dell'identità gestita assegnata dall'utente. Per assegnare ruoli, è necessario solo l'ID entità. Si userà tuttavia l'ID client per riempire la variabile di ambiente segnaposto UAI_CLIENT_ID
prima di creare la distribuzione.
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
Assegnare quindi il ruolo Lettore dati BLOB di archiviazione all'endpoint. La definizione del ruolo viene recuperata in base al nome e passata insieme all'ID entità dell'endpoint. Il ruolo viene applicato all'ambito dell'account di archiviazione creato in precedenza per consentire all'endpoint di leggere il file.
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",
),
)
Per le due autorizzazioni successive, sono necessari gli oggetti area di lavoro e registro contenitori:
workspace = ml_client.workspaces.get(workspace_name)
container_registry = workspace.container_registry
Assegnare quindi il ruolo AcrPull all'identità assegnata dall'utente. Questo ruolo consente il pull delle immagini da un Registro Azure Container. L'ambito viene applicato al livello del registro contenitori associato all'area di lavoro.
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",
),
)
Infine, assegnare il ruolo Lettore dati BLOB di archiviazione all'endpoint nell'ambito dell'account di archiviazione dell'area di lavoro. Questa assegnazione di ruolo consentirà all'endpoint di leggere BLOB nell'account di archiviazione dell'area di lavoro, oltre che nell'account di archiviazione appena creato.
Il ruolo ha lo stesso nome e le stesse funzionalità del primo ruolo assegnato in precedenza, ma viene applicato a un ambito diverso e ha un ID diverso.
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",
),
)
Script di assegnazione dei punteggi per accedere alla risorsa di Azure
Fare riferimento allo script seguente per comprendere come usare il token di identità per accedere alle risorse di Azure, ovvero, in questo scenario, l'account di archiviazione creato nelle sezioni precedenti.
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()
Creare una distribuzione con la configurazione
Creare una distribuzione associata all'endpoint online. Altre informazioni sulla distribuzione in endpoint online.
Avviso
Questa distribuzione può richiedere circa 8-14 minuti a seconda che l'ambiente o l'immagine sottostante venga compilata per la prima volta. Le distribuzioni successive che usano lo stesso ambiente saranno più rapide.
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
Nota
Il valore dell'argomento --name
può eseguire l'override della chiave name
all'interno del file YAML.
Controllare lo stato della distribuzione.
az ml online-deployment show --endpoint-name $ENDPOINT_NAME --name blue
Per perfezionare la query precedente in modo da restituire solo dati specifici, vedere Query sull'output del comando dell'interfaccia della riga di comando di Azure.
Nota
Il metodo init nello script di assegnazione dei punteggi legge il file dall'account di archiviazione usando il token dell'identità gestita assegnata dal sistema.
Per controllare l'output del metodo init, vedere il log di distribuzione con il codice seguente.
# 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
Nota
Il valore dell'argomento --name
può eseguire l'override della chiave name
all'interno del file YAML.
Dopo l'esecuzione del comando, è possibile controllare lo stato della distribuzione.
az ml online-endpoint show --name $ENDPOINT_NAME
Per perfezionare la query precedente in modo da restituire solo dati specifici, vedere Query sull'output del comando dell'interfaccia della riga di comando di Azure.
# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue
Nota
Il metodo init nello script di assegnazione dei punteggi legge il file dall'account di archiviazione usando il token dell'identità gestita assegnata dall'utente.
Per controllare l'output del metodo init, vedere il log di distribuzione con il codice seguente.
# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue
Creare prima di tutto la distribuzione:
ml_client.online_deployments.begin_create_or_update(deployment).result()
Al termine della distribuzione, controllarne lo stato e confermarne i dettagli di identità:
deployment = ml_client.online_deployments.get(
endpoint_name=endpoint_name, name=deployment.name
)
print(deployment)
Nota
Il metodo init nello script di assegnazione dei punteggi legge il file dall'account di archiviazione usando il token dell'identità gestita assegnata dal sistema.
Per controllare l'output del metodo init, vedere il log di distribuzione con il codice seguente.
ml_client.online_deployments.get_logs(deployment.name, deployment.endpoint_name, 1000)
Ora che la distribuzione è stata confermata, impostare il traffico su 100%:
endpoint.traffic = {str(deployment.name): 100}
ml_client.begin_create_or_update(endpoint).result()
Prima di eseguire la distribuzione, aggiornare il segnaposto della variabile di ambiente UAI_CLIENT_ID
.
deployment.environment_variables["UAI_CLIENT_ID"] = uai_client_id
Creare ora la distribuzione:
ml_client.online_deployments.begin_create_or_update(deployment).result()
Al termine della distribuzione, controllarne lo stato e confermarne i dettagli di identità:
deployment = ml_client.online_deployments.get(
endpoint_name=endpoint_name, name=deployment.name
)
print(deployment)
Nota
Il metodo init nello script di assegnazione dei punteggi legge il file dall'account di archiviazione usando il token dell'identità gestita assegnata dall'utente.
Per controllare l'output del metodo init, vedere il log di distribuzione con il codice seguente.
ml_client.online_deployments.get_logs(deployment.name, deployment.endpoint_name, 1000)
Ora che la distribuzione è stata confermata, impostare il traffico su 100%:
endpoint.traffic = {str(deployment.name): 100}
ml_client.begin_create_or_update(endpoint).result()
Al termine della distribuzione, il modello, l'ambiente e l'endpoint vengono registrati nell'area di lavoro di Azure Machine Learning.
Testare l'endpoint
Dopo aver distribuito l'endpoint online, testare e confermare l'operazione con una richiesta. I dettagli dell'inferenza variano da modello a modello. Per questa guida, i parametri di query JSON sono simili ai seguenti:
{"data": [
[1,2,3,4,5,6,7,8,9,10],
[10,9,8,7,6,5,4,3,2,1]
]}
Per chiamare l'endpoint, eseguire:
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)
Eliminare l'endpoint e l'account di archiviazione
Se non si prevede di continuare a usare l'endpoint online e la risorsa di archiviazione distribuiti, eliminarli per ridurre i costi. Quando si elimina l'endpoint, vengono eliminate anche tutte le distribuzioni associate.
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
Eliminare l'endpoint:
ml_client.online_endpoints.begin_delete(endpoint_name)
Eliminare l'account di archiviazione:
storage_client.storage_accounts.delete(
resource_group_name=resource_group, account_name=storage_account_name
)
Eliminare l'endpoint:
ml_client.online_endpoints.begin_delete(endpoint_name)
Eliminare l'account di archiviazione:
storage_client.storage_accounts.delete(
resource_group_name=resource_group, account_name=storage_account_name
)
Eliminare l'identità gestita assegnata dall'utente:
msi_client.user_assigned_identities.delete(
resource_group_name=resource_group, resource_name=uai_name
)
Contenuto correlato