Cómo implementar una canalización para realizar puntuaciones por lotes con preprocesamiento

SE APLICA A:Extensión ML de la CLI de Azure v2 (actual)SDK de Python azure-ai-ml v2 (actual)

En este artículo, aprenderá a implementar una canalización de inferencia (o puntuación) en un punto de conexión por lotes. La canalización realiza la puntuación sobre un modelo registrado mientras también reutiliza un componente de preprocesamiento desde el momento en que se entrenó el modelo. La reutilización del mismo componente de preprocesamiento garantizará que se aplique el mismo preprocesamiento durante la puntuación.

Aprenderá lo siguiente:

  • Creación de una canalización que reutilice los componentes existentes del área de trabajo
  • Implementación de la canalización en un punto de conexión
  • Consumo de predicciones generadas por la canalización

Acerca de este ejemplo

En este ejemplo, se muestra cómo reutilizar el código de preprocesamiento y los parámetros aprendidos durante el preprocesamiento antes de usar el modelo para la inferencia. Al reutilizar el código de preprocesamiento y los parámetros aprendidos, podremos asegurarnos de que las mismas transformaciones (como la normalización y la codificación de características) que se aplicaron a los datos de entrada durante el entrenamiento también se apliquen durante la inferencia. El modelo usado para la inferencia realizará predicciones sobre datos tabulares del conjunto de datos de enfermedades cardíacas de UCI.

Una visualización de la canalización es la siguiente:

Captura de pantalla de la canalización de inferencia que comprende un componente de puntuación junto con el componente de preparación y las salidas de una canalización de entrenamiento.

El ejemplo de este artículo se basa en ejemplos de código incluidos en el repositorio azureml-examples. Para ejecutar los comandos de forma local sin tener que copiar/pegar YAML y otros archivos, primero clona el repositorio y luego cambia los directorios a la carpeta:

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

Los archivos de este ejemplo están en:

cd endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing

Sigue estos pasos en los cuadernos de Jupyter Notebooks

Puedes seguir la versión SDK de Python de este ejemplo abriendo el cuaderno sdk-deploy-and-test.ipynb en el repositorio clonado.

Prerrequisitos

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

  • Suscripción a Azure. Si no tiene una suscripción de Azure, cree una cuenta gratuita antes de empezar. Pruebe la versión gratuita o de pago de Azure Machine Learning.

  • Un área de trabajo de Azure Machine Learning. Si no tiene una, siga los pasos descritos en el artículo Administración de áreas de trabajo de Azure Machine Learning para crear una.

  • Asegúrese de tener los permisos siguientes en el área de trabajo:

    • Crear o administrar puntos de conexión e implementaciones por lotes: use un rol propietario, colaborador o personalizado que permita Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • Creación de implementaciones de ARM en el grupo de recursos del área de trabajo: use un rol propietario, colaborador o personalizado que permita Microsoft.Resources/deployments/write en el grupo de recursos donde se implementa el área de trabajo.

  • Debe instalar el siguiente software para trabajar con Azure Machine Learning:

    La CLI de Azure y la mlextensión para Azure Machine Learning.

    az extension add -n ml
    

    Nota

    Las implementaciones de componentes de canalización para puntos de conexión de Batch se introdujeron en la versión 2.7 de la extensión ml para la CLI de Azure. Use az extension update --name ml para obtener la última versión.

Conexión con su área de trabajo

El área de trabajo es el recurso de nivel superior para Azure Machine Learning, que proporciona un lugar centralizado para trabajar con todos los artefactos que crea al usar Azure Machine Learning. En esta sección, nos conectaremos al área de trabajo en la que realizará las tareas de implementación.

Pasa los valores del id. de suscripción, el área de trabajo, la ubicación y el grupo de recursos en el código siguiente:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Crear la canalización de inferencia

En esta sección, crearemos todos los recursos necesarios para nuestra canalización de inferencia. Comenzaremos creando un entorno que incluya las bibliotecas necesarias para los componentes de la canalización. A continuación, crearemos un clúster de proceso en el que se ejecutará la implementación por lotes. Después, registraremos los componentes, los modelos y las transformaciones necesarios para crear nuestra canalización de inferencia. Por último, compilaremos y probaremos la canalización.

Creación del entorno

Los componentes de este ejemplo utilizarán un entorno con las bibliotecas XGBoost y scikit-learn. El archivo environment/conda.yml contiene la configuración de la implementación:

environment/conda.yml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - azureml-mlflow
  - datasets
  - jobtools
  - cloudpickle==1.6.0
  - dask==2023.2.0
  - scikit-learn==1.1.2
  - xgboost==1.3.3
name: mlflow-env

Crear el entorno de la siguiente manera:

  1. Definir el entorno:

    environment/xgboost-sklearn-py38.yml

    $schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
    name: xgboost-sklearn-py38
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
    conda_file: conda.yml
    description: An environment for models built with XGBoost and Scikit-learn.
    
  2. Crear el entorno:

    az ml environment create -f environment/xgboost-sklearn-py38.yml
    

Creación de un clúster de proceso

Las implementaciones y puntos de conexión por lotes se ejecutan en clústeres de computación. Pueden ejecutarse en cualquier clúster de proceso de Azure Machine Learning que ya exista en el área de trabajo. Por lo tanto, varias implementaciones por lotes pueden compartir la misma infraestructura de proceso. En este ejemplo, trabajaremos en un clúster de proceso de Azure Machine Learning denominado batch-cluster. Verifiquemos que el cálculo exista en el área de trabajo o creémoslo de otra manera.

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Registro de componentes y modelos

Registraremos los componentes, modelos y transformaciones que necesitamos para crear nuestra canalización de inferencia. Podemos reutilizar algunos de estos recursos para las rutinas de entrenamiento.

Sugerencia

En este tutorial, volveremos a usar el modelo y el componente de preprocesamiento de una canalización de entrenamiento anterior. Para ver cómo se crearon, siga el ejemplo Cómo implementar una canalización de entrenamiento con puntos de conexión por lotes.

  1. Registre el modelo que se vaya a usar para la predicción:

    az ml model create --name heart-classifier --type mlflow_model --path model
    
  2. El modelo registrado no se entrenó directamente en los datos de entrada. En su lugar, el dato de entrada se preprocesó (o transformó) antes del entrenamiento mediante un componente de preparación. También tendremos que registrar este componente. Registre el componente de preparación:

    az ml component create -f components/prepare/prepare.yml
    

    Sugerencia

    Después de registrar el componente de preparación, ahora podrá hacer referencia a él desde el área de trabajo. Por ejemplo, azureml:uci_heart_prepare@latest obtendrá la última versión del componente de preparación.

  3. Como parte de las transformaciones de datos del componente de preparación, los datos de entrada se normalizaron para centrar los predictores y limitar sus valores en el intervalo de [-1, 1]. Los parámetros de transformación se capturaron en una transformación Scikit-learn, que también se puede registrar para aplicarse más adelante cuando tengamos nuevos datos. Registre la transformación de la siguiente manera:

    az ml model create --name heart-classifier-transforms --type custom_model --path transformations
    
  4. Realizaremos inferencias para el modelo registrado mediante otro componente denominado score que calcula las predicciones de un modelo determinado. Se hará referencia al componente directamente desde su definición.

    Sugerencia

    El procedimiento recomendado sería registrar el componente y hacer referencia a él desde la canalización. Sin embargo, en este ejemplo vamos a hacer referencia al componente directamente desde su definición para ayudarle a ver qué componentes se reutilizan de la canalización de entrenamiento y cuáles son nuevos.

Crear la canalización

Ahora es el momento de enlazar todos los elementos juntos. La canalización de inferencia que implementaremos tiene dos componentes (pasos):

  • preprocess_job: este paso lee los datos de entrada y devuelve los datos preparados y las transformaciones aplicadas. El paso recibe dos entradas:
    • data: una carpeta que contiene los datos de entrada que se van a puntuar
    • transformations: (opcional) ruta de acceso a las transformaciones que se aplicarán, si están disponibles. Cuando se proporciona, las transformaciones se leen del modelo que se indica en la ruta de acceso. Sin embargo, si no se proporcionase la ruta de acceso, las transformaciones se aprenderán de los datos de entrada. Sin embargo, para la inferencia no es posible aprender los parámetros de transformación (en este ejemplo, los coeficientes de normalización) de los datos de entrada porque necesita usar los mismos valores de parámetro que se aprendieron durante el entrenamiento. Dado que esta entrada es opcional, el componente preprocess_job se puede usar durante el entrenamiento y la puntuación.
  • score_job: este paso realizará la inferencia en los datos transformados mediante el modelo de entrada. Observe que el componente usa un modelo de MLflow para realizar la inferencia. Por último, las puntuaciones se escriben en el mismo formato que se leyeron.

La configuración de la canalización se define en el archivo pipeline.yml:

pipeline.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline

name: batch_scoring_uci_heart
display_name: Batch Scoring for UCI heart
description: This pipeline demonstrates how to make batch inference using a model from the Heart Disease Data Set problem, where pre and post processing is required as steps. The pre and post processing steps can be components reusable from the training pipeline.

inputs:
  input_data:
    type: uri_folder
  score_mode:
    type: string
    default: append

outputs: 
  scores:
    type: uri_folder
    mode: upload

jobs:
  preprocess_job:
    type: command
    component: azureml:uci_heart_prepare@latest
    inputs:
      data: ${{parent.inputs.input_data}}
      transformations: 
        path: azureml:heart-classifier-transforms@latest
        type: custom_model
    outputs:
      prepared_data:
  
  score_job:
    type: command
    component: components/score/score.yml
    inputs:
      data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
      model:
        path: azureml:heart-classifier@latest
        type: mlflow_model
      score_mode: ${{parent.inputs.score_mode}}
    outputs:
      scores: 
        mode: upload
        path: ${{parent.outputs.scores}}

Una visualización de la canalización es la siguiente:

Captura de pantalla de la canalización de inferencia mostrando la puntuación por lotes con preprocesamiento.

Prueba de la canalización

Probemos la canalización con algunos datos de ejemplo. Para ello, se creará un trabajo mediante la canalización y el clúster de proceso batch-cluster creados anteriormente.

El siguiente archivo pipeline-job.yml contiene la configuración del trabajo de canalización:

pipeline-job.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: uci-classifier-score-job
description: |-
  This pipeline demonstrate how to make batch inference using a model from the Heart \
  Disease Data Set problem, where pre and post processing is required as steps. The \
  pre and post processing steps can be components reused from the training pipeline.

compute: batch-cluster
component: pipeline.yml
inputs:
  input_data:
    type: uri_folder
  score_mode: append
outputs: 
  scores:
    mode: upload

Crear el trabajo de prueba:

az ml job create -f pipeline-job.yml --set inputs.input_data.path=data/unlabeled

Creación de un punto de conexión por lotes

  1. Proporcione un nombre para el punto de conexión. El nombre de un punto de conexión por lotes debe ser único en cada región, ya que el nombre se usa para construir el URI de invocación. Para garantizar la unicidad, anexa los caracteres finales al nombre especificado en el código siguiente.

    ENDPOINT_NAME="uci-classifier-score"
    
  2. Configuración del punto de conexión:

    El archivo endpoint.yml contiene la configuración del punto de conexión.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-score
    description: Batch scoring endpoint of the Heart Disease Data Set prediction task.
    auth_mode: aad_token
    
  3. Creación del punto de conexión:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. Consulta del URI del punto de conexión:

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

Implementar el componente de canalización

Para implementar el componente de canalización, tendremos que crear una implementación por lotes. Una implementación es un conjunto de recursos necesarios para hospedar el recurso que realiza el trabajo real.

  1. Configurar la implementación

    El archivo deployment.yml contiene la configuración de la implementación. Puede comprobar el esquema YAML del punto de conexión por lotes completo para obtener más propiedades.

    deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-prepros-xgb
    endpoint_name: uci-classifier-batch
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  2. Creación de la implementación

    Ejecute el código siguiente para crear una implementación por lotes en el punto de conexión por lotes y establézcala como la implementación predeterminada.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment.yml --set-default
    

    Sugerencia

    Observa el uso de la marca --set-default para indicar que esta nueva implementación es ahora el valor predeterminado.

  3. La implementación está lista para su uso.

Prueba de la implementación

Una vez creada la implementación, está lista para recibir trabajos. Siga estos pasos para probar lo siguiente:

  1. Nuestra implementación requiere que indiquemos una entrada de datos y una entrada literal.

    El archivo inputs.yml contiene la definición del recurso de datos de entrada:

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: data/unlabeled
      score_mode:
        type: string
        default: append
    outputs:
      scores:
        type: uri_folder
        mode: upload
    

    Sugerencia

    Para más información sobre cómo indicar entradas, consulta Crear trabajos y datos de entrada para puntos de conexión por lotes.

  2. Puedes invocar la implementación determinada de la siguiente manera:

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. Puedes supervisar el progreso de la presentación y transmitir los registros mediante:

    az ml job stream -n $JOB_NAME
    

Acceso a la salida del trabajo

Una vez que se complete el trabajo, podemos acceder a su salida. Este trabajo contiene solo una salida denominada scores:

Puede descargar los resultados asociados mediante az ml job download.

az ml job download --name $JOB_NAME --output-name scores

Lea los datos puntuados:

import pandas as pd
import glob

output_files = glob.glob("named-outputs/scores/*.csv")
score = pd.concat((pd.read_csv(f) for f in output_files))
score

La salida tiene el siguiente aspecto:

age sex thal prediction
0,9338 1 2 0
1,3782 1 3 1
1,3782 1 4 0
-1,954 1 3 0

La salida contiene las predicciones más los datos que se proporcionaron al componente de puntuación que se preprocesó. Por ejemplo, la columna age se normalizó y la columna thal contiene valores de codificación originales. En la práctica, probablemente desee generar la predicción solo y, a continuación, concatenarla con los valores originales. Este trabajo se ha dejado al lector.

Limpieza de recursos

Una vez que hayas terminado, elimina los recursos asociados del área de trabajo:

Ejecuta el código siguiente para eliminar el punto de conexión por lotes y la implementación subyacente. --yes se usa para confirmar la eliminación.

az ml batch-endpoint delete -n $ENDPOINT_NAME --yes

(Opcional) elimina el proceso, a menos que planees reutilizar el clúster de proceso con implementaciones posteriores.

az ml compute delete -n batch-cluster

Pasos siguientes