Uso compartido de modelos, componentes y entornos entre áreas de trabajo con registros

El registro de Azure Machine Learning le permite colaborar entre áreas de trabajo dentro de su organización. Con los registros, puede compartir modelos, componentes y entornos.

Hay dos escenarios en los que querría usar el mismo conjunto de modelos, componentes y entornos en varias áreas de trabajo:

  • MLOps entre áreas de trabajo: está entrenando un modelo en un área de trabajo dev y tiene que implementarla en las áreas de trabajo test y prod. En este caso, quiere tener linaje de un extremo a otro entre los puntos de conexión en los que se implementa el modelo en las áreas de trabajo test o prod y el trabajo de entrenamiento, las métricas, el código, los datos y el entorno que se usó para entrenar el modelo en el área de trabajo dev.
  • Compartir y reutilizar modelos y canalizaciones entre distintos equipos: El uso compartido y la reutilización mejoran la colaboración y la productividad. En este escenario, es posible que quiera publicar un modelo entrenado y los componentes y entornos asociados que se usan para entrenarlo en un catálogo central. A partir de allí, los colegas de otros equipos pueden buscar y reutilizar los recursos compartidos en sus propios experimentos.

En este artículo, aprenderá a:

  • Crear un entorno y un componente en el registro.
  • Usar el componente del registro para enviar un trabajo de entrenamiento de modelos en un área de trabajo.
  • Registrar el modelo entrenado en el registro.
  • Implementar el modelo desde el registro en un punto de conexión en línea en el área de trabajo y, a continuación, enviar una solicitud de inferencia.

Prerrequisitos

Antes de seguir los pasos de este artículo, asegúrese de que tiene los siguientes requisitos previos:

  • Un registro de Azure Machine Learning para compartir modelos, componentes y entornos. Para crear un registro, consulte Información sobre cómo crear un registro.

  • Un área de trabajo de Azure Machine Learning. Si no tiene uno, siga los pasos descritos en el artículo Inicio rápido: Creación de recursos del área de trabajo para crear uno.

    Importante

    La región de Azure (ubicación) donde cree el área de trabajo debe estar en la lista de regiones admitidas para el registro de Azure Machine Learning.

  • La CLI de Azure y la extensión mlo el SDK v2 de Python para Azure Machine Learning:

    Para instalar la CLI de Azure y la extensión, consulte Instalación, configuración y uso de la CLI (v2).

    Importante

    • En los ejemplos de la CLI de este artículo se supone que usa el shell de Bash (o compatible). Por ejemplo, de un sistema Linux o Subsistema de Windows para Linux.

    • En los ejemplos también se supone que ha configurado los valores predeterminados de la CLI de Azure para que no tenga que especificar los parámetros de la suscripción, el área de trabajo, el grupo de recursos ni la ubicación. Para establecer la configuración predeterminada, use los siguientes comandos. Reemplace los parámetros siguientes por los valores de su configuración:

      • Reemplace <subscription> con la identificación de su suscripción de Azure.
      • Reemplace <workspace> por el nombre del área de trabajo de Azure Machine Learning.
      • Reemplace <resource-group> por el grupo de recursos de Azure que contiene el área de trabajo.
      • Reemplace <location> por la región de Azure que contiene el área de trabajo.
      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
      

      Puede ver cuáles son los valores predeterminados actuales mediante el comando az configure -l.

Clonación del repositorio de ejemplos

Los ejemplos de código de este artículo se basan en el la muestra nyc_taxi_data_regression del repositorio de ejemplos. Para usar estos archivos en el entorno de desarrollo, use los siguientes comandos para clonar el repositorio y cambiar los directorios en el ejemplo:

git clone https://github.com/Azure/azureml-examples
cd azureml-examples

En el ejemplo de la CLI, cambie los directorios a cli/jobs/pipelines-with-components/nyc_taxi_data_regression en el clon local del repositorio de ejemplos.

cd cli/jobs/pipelines-with-components/nyc_taxi_data_regression

Creación de una conexión de SDK

Sugerencia

Este paso solo es necesario cuando se usa el SDK de Python.

Cree una conexión de cliente tanto al área de trabajo de Azure Machine Learning como al registro:

ml_client_workspace = MLClient( credential=credential,
    subscription_id = "<workspace-subscription>",
    resource_group_name = "<workspace-resource-group",
    workspace_name = "<workspace-name>")
print(ml_client_workspace)

ml_client_registry = MLClient(credential=credential,
                        registry_name="<REGISTRY_NAME>",
                        registry_location="<REGISTRY_REGION>")
print(ml_client_registry)

Creación de un entorno en el registro

Los entornos definen el contenedor de Docker y las dependencias de Python necesarios para ejecutar trabajos de entrenamiento o implementar modelos. Para obtener más información sobre los entornos, consulte los artículos siguientes:

Sugerencia

El mismo comando az ml environment create de la CLI se puede usar para crear entornos en un área de trabajo o registro. Al ejecutar el comando con --workspace-name se crea el entorno en un área de trabajo, mientras que al ejecutar el comando con --registry-name se crea el entorno en el registro.

Crearemos un entorno que use la imagen de Docker python:3.8 e instale los paquetes de Python necesarios para ejecutar un trabajo de entrenamiento mediante el marco Scikit Learn. Si ha clonado el repositorio de ejemplos y está en la carpeta cli/jobs/pipelines-with-components/nyc_taxi_data_regression, debería poder ver el archivo de definición de entorno env_train.yml que hace referencia al archivo de Docker env_train/Dockerfile. A continuación se muestra env_train.yml para su referencia:

$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
name: SKLearnEnv
version: 1
build:
  path: ./env_train

Cree el entorno con az ml environment create como se indica a continuación.

az ml environment create --file env_train.yml --registry-name <registry-name>

Si recibe un error de que ya existe un entorno con este nombre y versión en el registro, puede editar el campo version en env_train.yml o especificar otra versión en la CLI que invalide el valor de versión en env_train.yml.

# use shell epoch time as the version
version=$(date +%s)
az ml environment create --file env_train.yml --registry-name <registry-name> --set version=$version

Sugerencia

version=$(date +%s) solo funciona en Linux. Reemplace $version por un número aleatorio si no funciona.

Anote name y version del entorno de la salida del comando az ml environment create y úselos con los comandos az ml environment show como se indica a continuación. Necesitará name y version en la sección siguiente al crear un componente en el registro.

az ml environment show --name SKLearnEnv --version 1 --registry-name <registry-name>

Sugerencia

Si ha usado otro nombre o versión de entorno, reemplace los parámetros --name y --version en consecuencia.

También puede usar az ml environment list --registry-name <registry-name> para enumerar todos los entornos del registro.

Puede examinar todos los entornos de Estudio de Azure Machine Learning. Asegúrese de navegar a la interfaz de usuario global y busque la entrada Registros.

Captura de pantalla de entornos en el registro.

Creación de un componente en el registro

Los componentes son bloques de creación reutilizables de canalizaciones de Machine Learning en Azure Machine Learning. Puede empaquetar en un componente el código, el comando, el entorno, la interfaz de entrada y la interfaz de salida de un paso de canalización individual. Después, puede volver a usar el componente en varias canalizaciones sin tener que preocuparse de portar las dependencias y el código cada vez que escriba una canalización diferente.

La creación de un componente en un área de trabajo le permite usar el componente en cualquier trabajo de canalización dentro de esa área de trabajo. La creación de un componente en un registro le permite usar el componente en cualquier canalización de cualquier área de trabajo dentro de su organización. La creación de componentes en un registro es una excelente manera de crear utilidades modulares reutilizables o tareas de entrenamiento compartidas que pueden usarse para la experimentación de diferentes equipos dentro de su organización.

Para obtener más información sobre los componentes, consulte los siguientes artículos:

Asegúrese de que se encuentra en la carpeta cli/jobs/pipelines-with-components/nyc_taxi_data_regression. Encontrará el archivo de definición de componentes train.yml que empaqueta un script de entrenamiento de Scikit Learn train_src/train.py y el entorno mantenidoAzureML-sklearn-0.24-ubuntu18.04-py37-cpu. Usaremos el entorno de Scikit Learn creado en un paso anterior, en lugar del entorno mantenido. Puede editar el campo environment en train.yml para que haga referencia al entorno de Scikit Learn. El archivo de definición de componente train.yml resultante será similar al ejemplo siguiente:

# <component>
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_linear_regression_model
display_name: TrainLinearRegressionModel
version: 1
type: command
inputs:
  training_data: 
    type: uri_folder
  test_split_ratio:
    type: number
    min: 0
    max: 1
    default: 0.2
outputs:
  model_output:
    type: mlflow_model
  test_data:
    type: uri_folder
code: ./train_src
environment: azureml://registries/<registry-name>/environments/SKLearnEnv/versions/1`
command: >-
  python train.py 
  --training_data ${{inputs.training_data}} 
  --test_data ${{outputs.test_data}} 
  --model_output ${{outputs.model_output}}
  --test_split_ratio ${{inputs.test_split_ratio}}

Si ha usado un nombre o versión diferentes, la representación más genérica tiene este aspecto: environment: azureml://registries/<registry-name>/environments/<sklearn-environment-name>/versions/<sklearn-environment-version>, así que asegúrese de reemplazar <registry-name>, <sklearn-environment-name> y <sklearn-environment-version> en consecuencia. A continuación, ejecute el comando az ml component create para crear el componente como se indica a continuación.

az ml component create --file train.yml --registry-name <registry-name>

Sugerencia

El mismo comando az ml component create de la CLI se puede usar para crear componentes en un área de trabajo o registro. Al ejecutar el comando con --workspace-name se crea el componente en un área de trabajo, mientras que al ejecutar el comando con --registry-name se crea el componente en el registro.

Si prefiere no editar train.yml, puede invalidar el nombre del entorno en la CLI de la siguiente manera:

az ml component create --file train.yml --registry-name <registry-name>` --set environment=azureml://registries/<registry-name>/environments/SKLearnEnv/versions/1
# or if you used a different name or version, replace `<sklearn-environment-name>` and `<sklearn-environment-version>` accordingly
az ml component create --file train.yml --registry-name <registry-name>` --set environment=azureml://registries/<registry-name>/environments/<sklearn-environment-name>/versions/<sklearn-environment-version>

Sugerencia

Si recibe un error que indica que el nombre del componente ya existe en el registro, puede editar la versión en train.yml o invalidar la versión en la CLI con una versión aleatoria.

Anote name y version del componente de la salida del comando az ml component create y úselos con los comandos az ml component show como se indica a continuación. Necesitará name y version en la sección siguiente al crear un trabajo de entrenamiento en el área de trabajo.

az ml component show --name <component_name> --version <component_version> --registry-name <registry-name>

También puede usar az ml component list --registry-name <registry-name> para enumerar todos los componentes del registro.

Puede examinar todos los componentes de Estudio de Azure Machine Learning. Asegúrese de navegar a la interfaz de usuario global y busque la entrada Registros.

Captura de pantalla de los componentes en el registro.

Ejecución de un trabajo de canalización en un área de trabajo mediante el componente del registro

Al ejecutar un trabajo de canalización que usa un componente de un registro, los recursos de proceso y los datos de entrenamiento son locales para el área de trabajo. Para obtener más información sobre la ejecución de trabajos, consulte los siguientes artículos:

Ejecutaremos un trabajo de canalización con el componente de entrenamiento de Scikit Learn creado en la sección anterior para entrenar un modelo. Compruebe que se encuentra en la carpeta cli/jobs/pipelines-with-components/nyc_taxi_data_regression. El conjunto de datos de entrenamiento se encuentra en la carpeta data_transformed. Edite la sección component en la sección train_job del archivo single-job-pipeline.yml para que haga referencia al componente de entrenamiento creado en la sección anterior. A continuación se muestra el archivo single-job-pipeline.yml resultante.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: nyc_taxi_data_regression_single_job
description: Single job pipeline to train regression model based on nyc taxi dataset

jobs:
  train_job:
    type: command
    component: azureml://registries/<registry-name>/component/train_linear_regression_model/versions/1
    compute: azureml:cpu-cluster
    inputs:
      training_data: 
        type: uri_folder
        path: ./data_transformed
    outputs:
      model_output: 
        type: mlflow_model
      test_data: 

El aspecto clave es que esta canalización se va a ejecutar en un área de trabajo mediante un componente que no está en el área de trabajo específica. El componente está en un registro que se puede usar con cualquier área de trabajo de la organización. Puede ejecutar este trabajo de entrenamiento en cualquier área de trabajo a la que tenga acceso sin tener que preocuparse de que el código de entrenamiento y el entorno estén disponibles en esa área de trabajo.

Advertencia

  • Antes de ejecutar el trabajo de canalización, confirme que el área de trabajo en la que ejecutará el trabajo se encuentra en una región de Azure admitida por el registro en el que creó el componente.
  • Confirme que el área de trabajo tiene un clúster de proceso con el nombre cpu-cluster o edite el campo compute en jobs.train_job.compute con el nombre del proceso.

Ejecute el trabajo de canalización con el comando az ml job create.

az ml job create --file single-job-pipeline.yml 

Sugerencia

Si no ha configurado el área de trabajo y el grupo de recursos predeterminados, como se explica en la sección de requisitos previos, tendrá que especificar los parámetros --workspace-name y --resource-group para que az ml job create funcione.

Como alternativa, puede omitir la edición de single-job-pipeline.yml e invalidar el nombre del componente usado por train_job en la CLI.

az ml job create --file single-job-pipeline.yml --set jobs.train_job.component=azureml://registries/<registry-name>/component/train_linear_regression_model/versions/1

Dado que el componente usado en el trabajo de entrenamiento se comparte a través de un registro, puede enviar el trabajo a cualquier área de trabajo a la que tenga acceso en su organización, incluso en distintas suscripciones. Por ejemplo, si tiene dev-workspace, test-workspace y prod-workspace, ejecutar el trabajo de entrenamiento en estas tres áreas de trabajo es tan fácil como ejecutar tres comandos az ml job create.

az ml job create --file single-job-pipeline.yml --workspace-name dev-workspace --resource-group <resource-group-of-dev-workspace>
az ml job create --file single-job-pipeline.yml --workspace-name test-workspace --resource-group <resource-group-of-test-workspace>
az ml job create --file single-job-pipeline.yml --workspace-name prod-workspace --resource-group <resource-group-of-prod-workspace>

En Estudio de Azure Machine Learning, seleccione el vínculo del punto de conexión en la salida del trabajo para ver el trabajo. Aquí puede analizar las métricas de entrenamiento, comprobar que el trabajo usa el componente y el entorno del registro y revisar el modelo entrenado. Anote name del trabajo de la salida o busque la misma información en la información general del trabajo en Estudio de Azure Machine Learning. Necesitará esta información para descargar el modelo entrenado en la sección siguiente sobre la creación de modelos en el registro.

Captura de pantalla de la canalización en Estudio de Azure Machine Learning.

Creación de un modelo en el registro

En esta sección, aprenderá a crear modelos en un registro. Consulte Administración de modelos para obtener más información sobre la administración de modelos en Azure Machine Learning. Veremos dos maneras diferentes de crear un modelo en un registro. La primera es a partir de archivos locales. La segunda es copiar en un registro un modelo registrado en el área de trabajo.

En ambas opciones, creará el modelo con el formato de MLflow, que le ayudará a implementar este modelo para la inferencia sin escribir ningún código de inferencia.

Creación de un modelo en el registro a partir de archivos locales

Descargue el modelo, que está disponible como salida de train_job ; para ello, reemplace <job-name> por el nombre del trabajo de la sección anterior. El modelo, junto con los archivos de metadatos de MLflow, debe estar disponible en ./artifacts/model/.

# fetch the name of the train_job by listing all child jobs of the pipeline job
train_job_name=$(az ml job list --parent-job-name <job-name> --query [0].name | sed 's/\"//g')
# download the default outputs of the train_job
az ml job download --name $train_job_name 
# review the model files
ls -l ./artifacts/model/

Sugerencia

Si no ha configurado el área de trabajo y el grupo de recursos predeterminados, como se explica en la sección de requisitos previos, tendrá que especificar los parámetros --workspace-name y --resource-group para que az ml model create funcione.

Advertencia

La salida de az ml job list se pasa a sed. Esto solo funciona en shells de Linux. Si está en Windows, ejecute az ml job list --parent-job-name <job-name> --query [0].name y quite las comillas que vea en el nombre del trabajo de entrenamiento.

Si no puede descargar el modelo, puede encontrar el modelo de MLflow de ejemplo entrenado por el trabajo de entrenamiento en la sección anterior en la carpeta cli/jobs/pipelines-with-components/nyc_taxi_data_regression/artifacts/model/.

Cree el modelo en el registro:

# create model in registry
az ml model create --name nyc-taxi-model --version 1 --type mlflow_model --path ./artifacts/model/ --registry-name <registry-name>

Sugerencia

  • Use un número aleatorio para el parámetro version si recibe un error que indica que el nombre y la versión del modelo ya existen.
  • El mismo comando az ml model create de la CLI se puede usar para crear modelos en un área de trabajo o registro. Al ejecutar el comando con --workspace-name se crea el modelo en un área de trabajo, mientras que al ejecutar el comando con --registry-name se crea el modelo en el registro.

Compartir un modelo del área de trabajo al registro

En este flujo de trabajo, primero creará el modelo en el área de trabajo y, a continuación, lo compartirá con el registro. Este flujo de trabajo es útil cuando desea probar el modelo en el área de trabajo antes de compartirlo. Por ejemplo, impleméntelo en puntos de conexión, pruebe la inferencia con algunos datos de prueba y, luego, copie el modelo en un registro si todo parece estar correcto. Este flujo de trabajo también puede ser útil cuando desarrolla una serie de modelos mediante diferentes técnicas, marcos o parámetros, y desea promover solo uno de ellos al registro como candidato de producción.

Asegúrese de que tiene el nombre del trabajo de canalización de la sección anterior y reemplácelo en el comando para capturar el nombre del trabajo de entrenamiento a continuación. Luego registrará el modelo de la salida del trabajo de entrenamiento en el área de trabajo. Observe cómo el parámetro --path hace referencia a la salida train_job con la sintaxis azureml://jobs/$train_job_name/outputs/artifacts/paths/model.

# fetch the name of the train_job by listing all child jobs of the pipeline job
train_job_name=$(az ml job list --parent-job-name <job-name> --workspace-name <workspace-name> --resource-group <workspace-resource-group> --query [0].name | sed 's/\"//g')
# create model in workspace
az ml model create --name nyc-taxi-model --version 1 --type mlflow_model --path azureml://jobs/$train_job_name/outputs/artifacts/paths/model 

Sugerencia

  • Use un número aleatorio para el parámetro version si recibe un error que indica que el nombre y la versión del modelo ya existen.
  • Si no ha configurado el área de trabajo y el grupo de recursos predeterminados, como se explica en la sección de requisitos previos, tendrá que especificar los parámetros --workspace-name y --resource-group para que az ml model create funcione.

Anote el nombre y la versión del modelo. Para validar si el modelo está registrado en el área de trabajo, puede examinarlo en la interfaz de usuario de Studio o mediante el comando az ml model show --name nyc-taxi-model --version $model_version.

Ahora compartirá el modelo del área de trabajo con el registro.

# share model registered in workspace to registry
az ml model share --name nyc-taxi-model --version 1 --registry-name <registry-name> --share-with-name <new-name> --share-with-version <new-version>

Sugerencia

  • Asegúrese de usar el nombre y la versión correctos del modelo si lo cambió en el comando az ml model create.
  • El comando anterior tiene dos parámetros opcionales "--share-with-name" y "--share-with-version". Si no se proporcionan, el nuevo modelo tendrá el mismo nombre y versión que el modelo que se comparte. Anote name y version del modelo de la salida del comando az ml model create y úselos con los comandos az ml model show como se indica a continuación. Necesitará name y version en la sección siguiente al implementar el modelo en un punto de conexión en línea para la inferencia.
az ml model show --name <model_name> --version <model_version> --registry-name <registry-name>

También puede usar az ml model list --registry-name <registry-name> para enumerar todos los modelos del registro o examinar todos los componentes de la interfaz de usuario de Estudio de Azure Machine Learning. Asegúrese de navegar a la interfaz de usuario global y busque el centro Registros.

En la captura de pantalla siguiente se muestra un modelo en un registro en Estudio de Azure Machine Learning. Si creó un modelo a partir de la salida del trabajo y después copió el modelo del área de trabajo al registro, verá que el modelo tiene un vínculo al trabajo que entrenó el modelo. Puede usar ese vínculo para navegar al trabajo de entrenamiento para revisar el código, el entorno y los datos usados para entrenar el modelo.

Captura de pantalla de los modelos en el registro.

Implementación del modelo del registro al punto de conexión en línea en el área de trabajo

En la última sección, implementará un modelo del registro en un punto de conexión en línea en un área de trabajo. Puede optar por implementar cualquier área de trabajo a la que tenga acceso en su organización, siempre que la ubicación del área de trabajo sea una de las ubicaciones admitidas por el registro. Esta funcionalidad es útil si ha entrenado un modelo en un área de trabajo dev y ahora tiene que implementar el modelo en el área de trabajo test o prod, a la vez que conserva la información de linaje en relación con el código, el entorno y los datos usados para entrenar el modelo.

Los puntos de conexión en línea permiten implementar modelos y enviar solicitudes de inferencia a través de las API de REST. Para más información, consulte Implementación y puntuación de un modelo de Machine Learning mediante un punto de conexión en línea.

Cree un punto de conexión en línea.

az ml online-endpoint create --name reg-ep-1234

Actualice la línea model: de deploy.yml disponible en la carpeta cli/jobs/pipelines-with-components/nyc_taxi_data_regression para que haga referencia al nombre y la versión del modelo desde el paso anterior. Cree una implementación en línea en el punto de conexión en línea. A continuación se muestra el archivo deploy.yml para referencia.

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: demo
endpoint_name: reg-ep-1234
model: azureml://registries/<registry-name>/models/nyc-taxi-model/versions/1
instance_type: Standard_DS2_v2
instance_count: 1

Cree la implementación en línea. La implementación tarda varios minutos en completarse.

az ml online-deployment create --file deploy.yml --all-traffic

Capture el URI de puntuación y envíe una solicitud de puntuación de ejemplo. Los datos de ejemplo de la solicitud de puntuación están disponibles en scoring-data.json en la carpeta cli/jobs/pipelines-with-components/nyc_taxi_data_regression.

ENDPOINT_KEY=$(az ml online-endpoint get-credentials -n reg-ep-1234 -o tsv --query primaryKey)
SCORING_URI=$(az ml online-endpoint show -n reg-ep-1234 -o tsv --query scoring_uri)
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data @./scoring-data.json

Sugerencia

  • El comando curl solo funciona en Linux.
  • Si no ha configurado el área de trabajo y el grupo de recursos predeterminados, como se explica en la sección de requisitos previos, tendrá que especificar los parámetros --workspace-name y --resource-group para que los comandos az ml online-endpointy az ml online-deployment funcionen.

Limpieza de recursos

Si no va a usar la implementación, debe eliminarla para reducir costos. En el ejemplo siguiente se elimina el punto de conexión y todas las implementaciones subyacentes:

az ml online-endpoint delete --name reg-ep-1234 --yes --no-wait

Pasos siguientes