SE APLICA A:
Extensión ML de la CLI de Azure v2 (actual)
SDK de Python azure-ai-ml v2 (actual)
Aprenda a acceder de forma segura a los recursos de Azure desde el script de puntuación con un punto de conexión en línea y una identidad administrada asignada por el sistema o una identidad administrada asignada por el usuario.
Los puntos de conexión administrados y los puntos de conexión de Kubernetes permiten que Azure Machine Learning pueda administrar la carga que conlleva aprovisionar el recurso de proceso e implementar el modelo de Machine Learning. Normalmente, el modelo necesita acceder a recursos de Azure, como Azure Container Registry o el almacenamiento de blobs para la inferencia. Con una identidad administrada puede acceder a estos recursos sin necesidad de administrar las credenciales en el código. Más información sobre las identidades administradas.
En esta guía se da por supuesto que no tiene una identidad administrada, una cuenta de almacenamiento o un punto de conexión en línea. Si ya tiene estos componentes, vaya a la sección Concesión de permiso de acceso a la identidad administrada.
Requisitos previos
Para usar Azure Machine Learning, es preciso tener una suscripción a Azure. Si no tiene una suscripción de Azure, cree una cuenta gratuita antes de empezar. Pruebe hoy mismo la versión gratuita o de pago de Azure Machine Learning.
Instale y configure la CLI de Azure y la extensión ML (v2). Para más información, consulte Instalación, configuración y uso de la CLI 2.0.
Un grupo de recursos de Azure, donde usted (o la entidad de servicio que utiliza) deben tener el acceso Administrador de acceso de usuario y el de Colaborador. Tiene un grupo de recursos de este tipo si configuró la extensión de ML según el artículo anterior.
Un área de trabajo de Azure Machine Learning. Ya tiene un área de trabajo si configuró la extensión de ML según el artículo anterior.
Un modelo de Machine Learning listo para la puntuación y la implementación. Si sigue el ejemplo, se proporciona un modelo.
Si aún no ha establecido los valores predeterminados de la CLI de Azure, guarde la configuración predeterminada. Para evitar pasar los valores de la suscripción, el área de trabajo y el grupo de recursos varias veces, ejecute este código:
az account set --subscription <subscription ID>
az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
Para seguir el ejemplo, clone el repositorio de ejemplos y luego cambie el directorio a CLI.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Para usar Azure Machine Learning, es preciso tener una suscripción a Azure. Si no tiene una suscripción de Azure, cree una cuenta gratuita antes de empezar. Pruebe hoy mismo la versión gratuita o de pago de Azure Machine Learning.
Instale y configure la CLI de Azure y la extensión ML (v2). Para más información, consulte Instalación, configuración y uso de la CLI 2.0.
Un grupo de recursos de Azure, donde usted (o la entidad de servicio que utiliza) deben tener el acceso Administrador de acceso de usuarios y el de Colaborador. Tiene un grupo de recursos de este tipo si configuró la extensión de ML según el artículo anterior.
Un área de trabajo de Azure Machine Learning. Tiene un área de trabajo si configuró la extensión de ML según el artículo anterior.
Un modelo de Machine Learning listo para la puntuación y la implementación. Si sigue el ejemplo, se proporciona un modelo.
Si aún no ha establecido los valores predeterminados de la CLI de Azure, guarde la configuración predeterminada. Para evitar pasar los valores de la suscripción, el área de trabajo y el grupo de recursos varias veces, ejecute este código:
az account set --subscription <subscription ID>
az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
Para seguir el ejemplo, clone el repositorio de ejemplos y luego cambie el directorio a CLI.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Para usar Azure Machine Learning, es preciso tener una suscripción a Azure. Si no tiene una suscripción de Azure, cree una cuenta gratuita antes de empezar. Pruebe hoy mismo la versión gratuita o de pago de Azure Machine Learning.
Instale y configure el SDK de Python de Azure Machine Learning (v2). Para obtener más información, consulte Instalación y configuración del SDK (v2).
Un grupo de recursos de Azure, donde usted (o la entidad de servicio que utiliza) deben tener el acceso Administrador de acceso de usuarios y el de Colaborador. Tiene un grupo de recursos de este tipo si configuró la extensión de ML según el artículo anterior.
Un área de trabajo de Azure Machine Learning. Ya tiene un área de trabajo si configuró la extensión de ML según el artículo anterior.
Un modelo de Machine Learning listo para la puntuación y la implementación. Si sigue el ejemplo, se proporciona un modelo.
Clone el repositorio de ejemplos y cambie el directorio.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/endpoints/online/managed/managed-identities
Para seguir este cuaderno, acceda al cuaderno de ejemplo complementario que se encuentra en el directorio sdk/endpoints/online/managed/managed-identities.
Se requieren otros paquetes de Python para este ejemplo:
- Cliente de administración de Microsoft Azure Storage
- Cliente de administración de autorización de Microsoft Azure
Instálelos con el código siguiente:
%pip install --pre azure-mgmt-storage
%pip install --pre azure-mgmt-authorization
Para usar Azure Machine Learning, es preciso tener una suscripción a Azure. Si no tiene una suscripción de Azure, cree una cuenta gratuita antes de empezar. Pruebe hoy mismo la versión gratuita o de pago de Azure Machine Learning.
Permisos de creación de roles para la suscripción o los recursos de Azure a los que accede la identidad asignada por el usuario.
Instale y configure el SDK de Python de Azure Machine Learning (v2). Para obtener más información, consulte Instalación y configuración del SDK (v2).
Un grupo de recursos de Azure, donde usted (o la entidad de servicio que utiliza) deben tener el acceso Administrador de acceso de usuarios y el de Colaborador. Tiene un grupo de recursos de este tipo si configuró la extensión de ML según el artículo anterior.
Un área de trabajo de Azure Machine Learning. Ya tiene un área de trabajo si configuró la extensión de ML según el artículo anterior.
Un modelo de Machine Learning listo para la puntuación y la implementación. Si sigue el ejemplo, se proporciona un modelo.
Clone el repositorio de ejemplos.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/endpoints/online/managed/managed-identities
Para seguir este cuaderno, acceda al cuaderno de ejemplo complementario que se encuentra en el directorio sdk/endpoints/online/managed/managed-identities.
Se requieren otros paquetes de Python para este ejemplo:
- Cliente de administración de MSI de Microsoft Azure
- Cliente de Microsoft Azure Storage
- Cliente de administración de autorización de Microsoft Azure
Instálelos con el código siguiente:
%pip install --pre azure-mgmt-msi
%pip install --pre azure-mgmt-storage
%pip install --pre azure-mgmt-authorization
Limitaciones
- La identidad de un punto de conexión es inmutable. Durante la creación del punto de conexión, puede asociarlo a una identidad asignada por el sistema (valor predeterminado) o a una identidad asignada por el usuario. No se puede cambiar la identidad después de crear el punto de conexión.
- Si el almacenamiento de blobs y ARC están configurados como privados, es decir, detrás de una red virtual, el acceso desde el punto de conexión de Kubernetes debe estar a través del vínculo privado, independientemente de si el área de trabajo es pública o privada. Para más información sobre la configuración del vínculo privado, consulte Cómo proteger la red virtual del área de trabajo.
Configure los nombres de las variables para el área de trabajo, la ubicación del área de trabajo y el punto de conexión que desea crear para usar con la implementación.
El código siguiente exporta estos valores como variables de entorno en el punto de conexión:
export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"
A continuación, especifique el nombre que desea para la cuenta de almacenamiento de blobs, el contenedor de blobs y el archivo. Estos nombres de variable se definen aquí y se hace referencia a ellos en los comandos az storage account create
y az storage container create
de la sección siguiente.
El código siguiente exporta esos valores como variables de entorno:
export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"
Una vez exportadas estas variables, cree un archivo de texto localmente. Cuando se implementa el punto de conexión, el script de puntuación accede a este archivo de texto mediante la identidad administrada asignada por el sistema que se genera al crear el punto de conexión.
Determine el nombre del punto de conexión, el área de trabajo y la ubicación del área de trabajo y, a continuación, exporte ese valor como una variable de entorno:
export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"
A continuación, especifique el nombre que desea para la cuenta de almacenamiento de blobs, el contenedor de blobs y el archivo. Estos nombres de variable se definen aquí y se hace referencia a ellos en los comandos az storage account create
y az storage container create
de la sección siguiente.
export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"
Una vez exportadas estas variables, cree un archivo de texto localmente. Cuando se implementa el punto de conexión, el script de puntuación accede a este archivo de texto mediante la identidad administrada asignada por el usuario que se utiliza en el punto de conexión.
Decida el nombre de su identidad de usuario y exporte ese valor como una variable de entorno:
export UAI_NAME="<USER_ASSIGNED_IDENTITY_NAME>"
Asigne valores para el área de trabajo y las variables relacionadas con la implementación:
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace_name = "<AML_WORKSPACE_NAME>"
endpoint_name = "<ENDPOINT_NAME>"
A continuación, especifique el nombre que desea para la cuenta de almacenamiento de blobs, el contenedor de blobs y el archivo. Estos nombres de variable se definen aquí y se hace referencia a ellos en la cuenta de almacenamiento y el código de creación de contenedores por StorageManagementClient
y ContainerClient
.
storage_account_name = "<STORAGE_ACCOUNT_NAME>"
storage_container_name = "<CONTAINER_TO_ACCESS>"
file_name = "<FILE_TO_ACCESS>"
Una vez asignadas estas variables, cree un archivo de texto localmente. Cuando se implementa el punto de conexión, el script de puntuación accede a este archivo de texto mediante la identidad administrada asignada por el sistema que se genera al crear el punto de conexión.
A continuación, obtenga un manipulador para el área de trabajo y recupere su ubicación:
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
Utilice este valor para crear una cuenta de almacenamiento.
Asigne valores para el área de trabajo y las variables relacionadas con la implementación:
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace_name = "<AML_WORKSPACE_NAME>"
endpoint_name = "<ENDPOINT_NAME>"
A continuación, especifique el nombre que desea para la cuenta de almacenamiento de blobs, el contenedor de blobs y el archivo. Estos nombres de variable se definen aquí y se hace referencia a ellos en la cuenta de almacenamiento y el código de creación de contenedores por StorageManagementClient
y ContainerClient
.
storage_account_name = "<STORAGE_ACCOUNT_NAME>"
storage_container_name = "<CONTAINER_TO_ACCESS>"
file_name = "<FILE_TO_ACCESS>"
Una vez asignadas estas variables, cree un archivo de texto localmente. Cuando se implementa el punto de conexión, el script de puntuación accede a este archivo de texto mediante la identidad administrada asignada por el usuario que se genera al crear el punto de conexión.
Decida el nombre de su nombre de identidad de usuario:
uai_name = "<USER_ASSIGNED_IDENTITY_NAME>"
A continuación, obtenga un manipulador para el área de trabajo y recupere su ubicación:
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
Utilice este valor para crear una cuenta de almacenamiento.
Definición de la configuración de la implementación
Para implementar un punto de conexión en línea con la CLI, debe definir la configuración en un archivo YAML. Para más información sobre el esquema de YAML, consulte el documento de referencia de YAML del punto de conexión en línea.
Los archivos YAML de los ejemplos siguientes se usan para crear puntos de conexión en línea.
El siguiente ejemplo de YAML se encuentra en endpoints/online/managed/managed-identities/1-sai-create-endpoint. El archivo
- Define el nombre por el que se desea hacer referencia al punto de conexión,
my-sai-endpoint
.
- Especifica el tipo de autorización que se usará para acceder al punto de conexión,
auth-mode: key
.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key
Este ejemplo de YAML, 2-sai-deployment.yml,
- Especifica que el tipo de punto de conexión que desea crear es un punto de conexión
online
.
- Indica que el punto de conexión tiene una implementación asociada llamada
blue
.
- Configura los detalles de la implementación como, por ejemplo, qué modelo se va a implementar y qué entorno y script de puntuación se usarán.
$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"
Para implementar un punto de conexión en línea con la CLI, debe definir la configuración en un archivo YAML. Para más información sobre el esquema de YAML, consulte el documento de referencia de YAML del punto de conexión en línea.
Los archivos YAML de los ejemplos siguientes se usan para crear puntos de conexión en línea.
El siguiente ejemplo de YAML se encuentra en endpoints/online/managed/managed-identities/1-uai-create-endpoint. El archivo
- Define el nombre por el que se desea hacer referencia al punto de conexión,
my-uai-endpoint
.
- Especifica el tipo de autorización que se usará para acceder al punto de conexión,
auth-mode: key
.
- Indica el tipo de identidad que se usará,
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
Este ejemplo de YAML, 2-sai-deployment.yml,
- Especifica que el tipo de punto de conexión que desea crear es un punto de conexión
online
.
- Indica que el punto de conexión tiene una implementación asociada llamada
blue
.
- Configura los detalles de la implementación como, por ejemplo, qué modelo se va a implementar y qué entorno y script de puntuación se usarán.
$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"
Para implementar un punto de conexión en línea con el SDK de Python (v2), se pueden usar objetos para definir la siguiente configuración. Como alternativa, los archivos YAML se pueden cargar mediante el método .load
.
El siguiente objeto de punto de conexión de Python:
- Asigna el nombre según el cual quiere hacer referencia al punto de conexión en la variable
endpoint_name
.
- Especifica el tipo de autorización que se usará para acceder al punto de conexión,
auth-mode="key"
.
endpoint = ManagedOnlineEndpoint(name=endpoint_name, auth_mode="key")
Este objeto de implementación:
- Especifica que el tipo de implementación que desea crear través de la clase es
ManagedOnlineDeployment
.
- Indica que el punto de conexión tiene una implementación asociada llamada
blue
.
- Configura los detalles de la implementación, como
name
y instance_count
.
- Define objetos adicionales insertados y los asocia con la implementación para
Model
,CodeConfiguration
y Environment
.
- Incluye las variables de entorno necesarias para que la identidad administrada asignada por el sistema obtenga acceso al almacenamiento.
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,
},
)
Para implementar un punto de conexión en línea con el SDK de Python (v2), se pueden usar objetos para definir la siguiente configuración. Como alternativa, los archivos YAML se pueden cargar mediante el método .load
.
Para una identidad asignada por el usuario, defina la configuración del punto de conexión después de crear la identidad administrada asignada por el usuario.
Este objeto de implementación:
- Especifica que el tipo de implementación que desea crear través de la clase es
ManagedOnlineDeployment
.
- Indica que el punto de conexión tiene una implementación asociada llamada
blue
.
- Configura los detalles de la implementación, como
name
y instance_count
.
- Define más objetos insertados y los asocia con la implementación para
Model
,CodeConfiguration
y Environment
.
- Incluye las variables de entorno necesarias para que la identidad administrada asignada por el usuario obtenga acceso al almacenamiento.
- Agrega una variable de entorno de marcador de posición para
UAI_CLIENT_ID
, que se agrega después de crear una y antes de implementar realmente esta configuración.
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",
},
)
Creación de la identidad administrada
Para acceder a los recursos de Azure, cree una identidad administrada asignada por el sistema o asignada por el usuario para el punto de conexión en línea.
Cuando se crea un punto de conexión en línea, se genera automáticamente una identidad administrada asignada por el sistema, por lo que no es necesario crear una independiente.
Para crear una identidad administrada asignada por el usuario, use el siguiente comando:
az identity create --name $UAI_NAME
Cuando se crea un punto de conexión en línea, se genera automáticamente una identidad administrada asignada por el sistema, por lo que no es necesario crear una independiente.
Para crear una identidad administrada asignada por el usuario, primero debe obtener un identificador para 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,
)
A continuación, cree la identidad:
msi_client.user_assigned_identities.create_or_update(
resource_group_name=resource_group,
resource_name=uai_name,
parameters=Identity(location=workspace_location),
)
Ahora, recupere el objeto de identidad, que contiene los detalles que usa:
uai_identity = msi_client.user_assigned_identities.get(
resource_group_name=resource_group,
resource_name=uai_name,
)
uai_identity.as_dict()
Creación de una cuenta de almacenamiento y un contenedor
En este ejemplo, creará una cuenta de almacenamiento de blobs y un contenedor de blobs y, a continuación, cargará el archivo de texto creado anteriormente en el contenedor de blobs. El punto de conexión en línea y la identidad administrada tienen acceso a esta cuenta de almacenamiento y al contenedor de blob.
Primero, cree una cuenta de almacenamiento.
az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION
A continuación, cree el contenedor de blobs en la cuenta de almacenamiento.
az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME
Después, cargue el archivo de texto en el contenedor de blobs.
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
Primero, cree una cuenta de almacenamiento.
az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION
También puede recuperar un identificador de cuenta de almacenamiento existente con lo siguiente.
storage_id=`az storage account show --name $STORAGE_ACCOUNT_NAME --query "id" -o tsv`
A continuación, cree el contenedor de blobs en la cuenta de almacenamiento.
az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME
A continuación, cargue el archivo en el contenedor.
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
Obtenga un manipulador para 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
)
A continuación, cree una cuenta de almacenamiento:
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()
Después, cree el contenedor de blobs en la cuenta de almacenamiento:
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(),
)
Recupere la clave de la cuenta de almacenamiento y cree un manipulador para el contenedor 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,
)
A continuación, cargue un blob en el contenedor con ContainerClient
:
with open(file_name, "rb") as f:
container_client.upload_blob(name=file_name, data=f.read())
Obtenga un manipulador para 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
)
A continuación, cree una cuenta de almacenamiento:
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()
Después, cree el contenedor de blobs en la cuenta de almacenamiento:
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(),
)
Recupere la clave de la cuenta de almacenamiento y cree un manipulador para el contenedor 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,
)
A continuación, cargue un blob en el contenedor con ContainerClient
:
with open(file_name, "rb") as f:
container_client.upload_blob(name=file_name, data=f.read())
Creación de un punto de conexión en línea
El código siguiente crea un punto de conexión en línea sin especificar una implementación.
Advertencia
La identidad de un punto de conexión es inmutable. Durante la creación del punto de conexión, puede asociarlo a una identidad asignada por el sistema (valor predeterminado) o a una identidad asignada por el usuario. No puede cambiar la identidad una vez creado el punto de conexión.
Al crear un punto de conexión administrado, se crea de forma predeterminada una identidad administrada asignada por el sistema para el punto de conexión en línea.
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-sai-create-endpoint.yml
Compruebe el estado del punto de conexión con lo siguiente.
az ml online-endpoint show --name $ENDPOINT_NAME
Si experimenta algún problema, consulte Solución de problemas de implementación y puntuación de puntos de conexión en línea.
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
Compruebe el estado del punto de conexión con lo siguiente.
az ml online-endpoint show --name $ENDPOINT_NAME
Si experimenta algún problema, consulte Solución de problemas de implementación y puntuación de puntos de conexión en línea.
Al crear un punto de conexión administrado, se crea de forma predeterminada una identidad administrada asignada por el sistema para el punto de conexión en línea.
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
Compruebe el estado del punto de conexión mediante los detalles del objeto de punto de conexión implementado con el código siguiente:
endpoint = ml_client.online_endpoints.get(endpoint_name)
print(endpoint.identity.type)
print(endpoint.identity.principal_id)
Si experimenta algún problema, consulte Solución de problemas de implementación y puntuación de puntos de conexión en línea.
El siguiente objeto de punto de conexión de Python:
- Asigna el nombre según el cual quiere hacer referencia al punto de conexión en la variable
endpoint_name
.
- Especifica el tipo de autorización que se usará para acceder al punto de conexión,
auth-mode="key"
.
- Define su identidad como
ManagedServiceIdentity
y especifica la identidad administrada como asignada por el usuario.
Defina e implemente el punto de conexión:
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()
Compruebe el estado del punto de conexión mediante los detalles del objeto de punto de conexión implementado con el código siguiente:
endpoint = ml_client.online_endpoints.get(endpoint_name)
print(endpoint.identity.type)
print(endpoint.identity.user_assigned_identities)
Si experimenta algún problema, consulte Solución de problemas de implementación y puntuación de puntos de conexión en línea.
Concesión de permiso a la identidad administrada
Importante
Los puntos de conexión en línea requieren permiso de extracción de Azure Container Registry y permiso de AcrPull en el registro de contenedor, y permiso de lector de datos de Storage Blob en el almacén de datos predeterminado del área de trabajo.
Puede hacer que el permiso de punto de conexión en línea acceda al almacenamiento a través de su identidad administrada asignada por el sistema o conceder permiso a la identidad administrada asignada por el usuario para acceder a la cuenta de almacenamiento creada en la sección anterior.
Recupere la identidad administrada asignada por el sistema que se creó para el punto de conexión.
system_identity=`az ml online-endpoint show --name $ENDPOINT_NAME --query "identity.principal_id" -o tsv`
Desde aquí, puede conceder a la identidad administrada asignada por el sistema permiso para acceder al almacenamiento.
az role assignment create --assignee-object-id $system_identity --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id
Recupere el identificador de cliente de la identidad administrada asignada por el usuario.
uai_clientid=`az identity list --query "[?name=='$UAI_NAME'].clientId" -o tsv`
uai_principalid=`az identity list --query "[?name=='$UAI_NAME'].principalId" -o tsv`
Recupere el identificador de la identidad administrada asignada por el usuario.
uai_id=`az identity list --query "[?name=='$UAI_NAME'].id" -o tsv`
Obtenga el registro de contenedor asociado al área de trabajo.
container_registry=`az ml workspace show --name $WORKSPACE --query container_registry -o tsv`
Recupere el almacenamiento predeterminado del área de trabajo.
storage_account=`az ml workspace show --name $WORKSPACE --query storage_account -o tsv`
Conceda permiso de cuenta de almacenamiento a la identidad administrada asignada por el usuario.
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id
Conceda permiso de registro de contenedor a la identidad administrada asignada por el usuario.
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "AcrPull" --scope $container_registry
Conceda permiso de almacenamiento de área de trabajo predeterminado a la identidad administrada asignada por el usuario.
az role assignment create --assignee-object-id $uai_principalid --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_account
En primer lugar, cree un elemento AuthorizationManagementClient
para enumerar las definiciones de rol:
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",
)
Ahora, inicialice uno para realizar las asignaciones de rol:
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",
)
A continuación, obtenga el id. de entidad de seguridad de la identidad administrada asignada por el sistema:
endpoint = ml_client.online_endpoints.get(endpoint_name)
system_principal_id = endpoint.identity.principal_id
A continuación, asigne el rol Lector de datos de blobs de almacenamiento al punto de conexión. La definición de roles se recupera según el nombre y se pasa junto con el id. de entidad de seguridad del punto de conexión. El rol se aplica en el ámbito de la cuenta de almacenamiento creada anteriormente y permite que el punto de conexión lea el archivo.
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
),
)
En primer lugar, cree un elemento AuthorizationManagementClient
para enumerar las definiciones de rol:
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",
)
Ahora, inicialice uno para realizar las asignaciones de rol:
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",
)
A continuación, obtenga el id. de entidad de seguridad y el Id. de cliente de la identidad administrada asignada por el usuario. Para asignar roles, solo necesita el id. de entidad de seguridad. Sin embargo, se usa el Id. de cliente para rellenar la variable de entorno de marcador de posición UAI_CLIENT_ID
antes de crear la implementación.
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
A continuación, asigne el rol Lector de datos de blobs de almacenamiento al punto de conexión. La definición de roles se recupera según el nombre y se pasa junto con el id. de entidad de seguridad del punto de conexión. El rol se aplica en el ámbito de la cuenta de almacenamiento creada anteriormente y permite que el punto de conexión lea el archivo.
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",
),
)
Para los dos permisos siguientes, necesita el área de trabajo y los objetos del registro de contenedor:
workspace = ml_client.workspaces.get(workspace_name)
container_registry = workspace.container_registry
A continuación, asigne el rol AcrPull a la identidad asignada por el usuario. Este rol permite extraer imágenes de una instancia de Azure Container Registry. El ámbito se aplica en el nivel del registro de contenedor asociado al área de trabajo.
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",
),
)
Por último, asigne el rol Lector de datos de blobs de almacenamiento al punto de conexión en el ámbito de la cuenta de almacenamiento del área de trabajo. Esta asignación de roles permite al punto de conexión leer blobs en la cuenta de almacenamiento del área de trabajo, así como en la cuenta de almacenamiento recién creada.
El rol tiene el mismo nombre y funcionalidades que el primer rol asignado anteriormente, pero se aplica en un ámbito diferente y tiene un identificador diferente.
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 de puntuación para acceder al recurso de Azure
Consulte el siguiente script para saber cómo usar el token de identidad para acceder a los recursos de Azure, en este escenario, la cuenta de almacenamiento creada en las secciones anteriores.
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()
Creación de una implementación con la configuración
Cree una implementación asociada al punto de conexión en línea. Obtenga más información sobre la implementación en puntos de conexión en línea.
Advertencia
Esta implementación puede tardar aproximadamente entre 8 y 14 minutos, dependiendo de si el entorno o la imagen subyacentes se están creando por primera vez. Las implementaciones subsiguientes que usen el mismo entorno serán más rápidas.
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
El valor del argumento --name
puede invalidar la clave name
dentro del archivo YAML.
Compruebe el estado de la implementación.
az ml online-deployment show --endpoint-name $ENDPOINT_NAME --name blue
Para refinar la consulta anterior para que solo devuelva datos específicos, consulte Resultados de los comandos de consulta de la CLI de Azure.
Nota
El método init del script de puntuación lee el archivo de la cuenta de almacenamiento mediante el token de identidad administrada asignado por el sistema.
Para comprobar la salida del método init, consulte el registro de implementación con el código siguiente.
# 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
El valor del argumento --name
puede invalidar la clave name
dentro del archivo YAML.
Una vez que se ejecuta el comando, puede comprobar el estado de la implementación.
az ml online-endpoint show --name $ENDPOINT_NAME
Para refinar la consulta anterior para que solo devuelva datos específicos, consulte Resultados de los comandos de consulta de la CLI de 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
El método init del script de puntuación lee el archivo de la cuenta de almacenamiento mediante el token de identidad administrada asignado por el usuario.
Para comprobar la salida del método init, consulte el registro de implementación con el código siguiente.
# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue
Primero, cree la implementación:
ml_client.online_deployments.begin_create_or_update(deployment).result()
Una vez completada la implementación, compruebe su estado y confirme sus detalles de identidad:
deployment = ml_client.online_deployments.get(
endpoint_name=endpoint_name, name=deployment.name
)
print(deployment)
Nota
El método init del script de puntuación lee el archivo de la cuenta de almacenamiento mediante el token de identidad administrada asignado por el sistema.
Para comprobar la salida del método init, consulte el registro de implementación con el código siguiente.
ml_client.online_deployments.get_logs(deployment.name, deployment.endpoint_name, 1000)
Una vez confirmada la implementación, establezca el tráfico en 100 %:
endpoint.traffic = {str(deployment.name): 100}
ml_client.begin_create_or_update(endpoint).result()
Antes de realizar la implementación, actualice el marcador de posición de la variable de entorno UAI_CLIENT_ID
.
deployment.environment_variables["UAI_CLIENT_ID"] = uai_client_id
Después, cree la implementación:
ml_client.online_deployments.begin_create_or_update(deployment).result()
Una vez completada la implementación, compruebe su estado y confirme sus detalles de identidad:
deployment = ml_client.online_deployments.get(
endpoint_name=endpoint_name, name=deployment.name
)
print(deployment)
Nota
El método init del script de puntuación lee el archivo de la cuenta de almacenamiento mediante el token de identidad administrada asignado por el usuario.
Para comprobar la salida del método init, consulte el registro de implementación con el código siguiente.
ml_client.online_deployments.get_logs(deployment.name, deployment.endpoint_name, 1000)
Una vez confirmada la implementación, establezca el tráfico en 100 %:
endpoint.traffic = {str(deployment.name): 100}
ml_client.begin_create_or_update(endpoint).result()
Una vez completada la implementación, el modelo, el entorno y el punto de conexión se registran en el área de trabajo de Azure Machine Learning.
Prueba del punto de conexión
Una vez implementado el punto de conexión en línea, pruebe y confirme su operación con una solicitud. Los detalles de la inferencia varían de un modelo a otro. En esta guía, los parámetros de la consulta JSON son parecidos a los siguientes:
{"data": [
[1,2,3,4,5,6,7,8,9,10],
[10,9,8,7,6,5,4,3,2,1]
]}
Para llamar al punto de conexión, ejecute:
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)
Eliminación del punto de conexión y la cuenta de almacenamiento
Si no tiene previsto seguir usando el punto de conexión en línea y el almacenamiento implementados, elimínelos para reducir los costos. Al eliminar el punto de conexión, también se eliminan todas sus implementaciones asociadas.
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
Eliminación del punto de conexión:
ml_client.online_endpoints.begin_delete(endpoint_name)
Eliminación de la cuenta de almacenamiento:
storage_client.storage_accounts.delete(
resource_group_name=resource_group, account_name=storage_account_name
)
Eliminación del punto de conexión:
ml_client.online_endpoints.begin_delete(endpoint_name)
Eliminación de la cuenta de almacenamiento:
storage_client.storage_accounts.delete(
resource_group_name=resource_group, account_name=storage_account_name
)
Eliminación de la identidad administrada asignada por el usuario:
msi_client.user_assigned_identities.delete(
resource_group_name=resource_group, resource_name=uai_name
)
Contenido relacionado