Compartir por


Implementación progresiva de modelos de MLflow en puntos de conexión en línea

En este artículo, aprenderá a actualizar e implementar modelos de MLflow de forma progresiva en puntos de conexión en línea sin provocar interrupciones del servicio. Usará la implementación azul-verde, también conocida como estrategia de lanzamiento seguro, para introducir una nueva versión de un servicio web en producción. Esta estrategia le permitirá implementar la nueva versión del servicio web en un pequeño subconjunto de usuarios o solicitudes antes de implementarlo por completo.

Acerca de este ejemplo

Los puntos de conexión en línea tienen los conceptos de punto de conexión e implementación. Un punto de conexión representa la API que los clientes usan para consumir el modelo, mientras que la implementación indica la implementación específica de esa API. Esta distinción permite a los usuarios desacoplar la API de la implementación y cambiar la implementación subyacente sin que ello afecte al consumidor. En este ejemplo se usarán estos conceptos para actualizar el modelo implementado en puntos de conexión sin introducir interrupciones del servicio.

El modelo que implementaremos se basa en el conjunto de datos de enfermedades cardíacas de UCI. La base de datos contiene 76 atributos, pero se usa un subconjunto de 14 de ellos. El modelo intenta predecir la presencia de enfermedades cardíacas en un paciente. Es un entero cuyo valor es 0 (sin presencia) o 1 (presencia). Se ha entrenado mediante un clasificador de XGBBoost y todo el preprocesamiento necesarios se ha empaquetado en forma de canalización de scikit-learn, lo que convierte a este modelo en una canalización de un extremo a otro que pasa de los datos sin procesar a las predicciones.

La información de este artículo se basa en ejemplos de código que se encuentran en el repositorio azureml-examples. Para ejecutar los comandos localmente sin tener que copiar y pegar los archivos, clone el repositorio y cambie los directorios a sdk/using-mlflow/deploy.

Siga estos pasos en Jupyter Notebooks

Puede seguir este ejemplo en los cuadernos siguientes. En el repositorio clonado, abra el cuaderno: mlflow_sdk_online_endpoints_progresive.ipynb.

Requisitos previos

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.
  • Los controles de acceso basado en rol de Azure (RBAC de Azure) se usan para conceder acceso a las operaciones en Azure Machine Learning. Para realizar los pasos descritos en este artículo, la cuenta de usuario debe tener asignado el rol de propietario o colaborador para el área de trabajo de Azure Machine Learning, o un rol personalizado que permita Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Para obtener más información, consulte Administración del acceso a un área de trabajo de Azure Machine Learning.

Además, deberá:

Conexión con su área de trabajo

En primer lugar, vamos a conectarnos al área de trabajo de Azure Machine Learning en la que vamos a trabajar.

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

Registro del modelo en el registro

Asegúrese de que el modelo está registrado en el registro de Azure Machine Learning. No se admite la implementación de modelos no registrados en Azure Machine Learning. Puede registrar un nuevo modelo mediante el SDK de MLflow:

MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

Creación de un punto de conexión en línea

Los puntos de conexión en línea son puntos de conexión que se usan para las inferencias en línea (en tiempo real). Los puntos de conexión en línea contienen implementaciones que están listas para recibir datos de los clientes y que pueden enviar respuestas en tiempo real.

Vamos a aprovechar esta funcionalidad mediante la implementación de varias versiones del mismo modelo en el mismo punto de conexión. Sin embargo, la nueva implementación recibirá el 0 % del tráfico en el retraso. Una vez que estemos seguros de que el nuevo modelo funciona correctamente, vamos a mover progresivamente el tráfico de una implementación a la otra.

  1. Los puntos de conexión requieren un nombre, que debe ser único en la misma región. Vamos a asegurarnos de crear uno que no exista:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Configuración del punto de conexión

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Creación del punto de conexión:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Obtención del secreto de autenticación del punto de conexión.

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

Creación de una implementación azul

Hasta el momento, el punto de conexión está vacío. No hay implementaciones en él. Vamos a crear la primera. Para ello, implementaremos el mismo modelo en el que estábamos trabajando. Llamaremos a esta implementación "default", que representa nuestra "blue deployment".

  1. Configurar la implementación

    blue-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: default
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. Creación de la implementación

    az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Si el punto de conexión no tiene conectividad de salida, use el empaquetado del modelo (versión preliminar) mediante la marca --with-package:

    az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Sugerencia

    Establecemos la marca --all-traffic en el comando create, que asignará todo el tráfico a la nueva implementación.

  3. Asigne todo el tráfico a la implementación

    Hasta el momento, el punto de conexión tiene una implementación, pero no se le asigna ningún tráfico. Vamos a asignarlo.

    Este paso no es necesario en la CLI de Azure, ya que se usó --all-traffic durante la creación.

  4. Actualice la configuración del punto de conexión:

    Este paso no es necesario en la CLI de Azure, ya que se usó --all-traffic durante la creación.

  5. Cree una entrada de ejemplo para probar la implementación

    sample.yml

    {
        "input_data": {
            "columns": [
                "age",
                "sex",
                "cp",
                "trestbps",
                "chol",
                "fbs",
                "restecg",
                "thalach",
                "exang",
                "oldpeak",
                "slope",
                "ca",
                "thal"
            ],
            "data": [
                [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ]
            ]
        }
    }
    
  6. Prueba de la implementación

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

Cree una implementación verde debajo del punto de conexión

Imaginemos que hay una nueva versión del modelo creada por el equipo de desarrollo y está lista para estar en producción. Primero podemos intentar utilizar este modelo y, una vez que estemos seguros, podemos actualizar el punto de conexión para enrutar el tráfico a él.

  1. Registre una nueva versión del modelo

    MODEL_NAME='heart-classifier'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    

    Vamos a obtener el número de versión del nuevo modelo:

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. Configure una nueva implementación

    green-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: xgboost-model
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    

    Asignaremos el nombre a la implementación de la siguiente manera:

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. Cree la nueva implementación

    az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    

    Si el punto de conexión no tiene conectividad de salida, use el empaquetado del modelo (versión preliminar) mediante la marca --with-package:

    az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. Pruebe la implementación sin cambiar el tráfico

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    Sugerencia

    Observe que ahora se indica el nombre de la implementación que queremos invocar.

Actualización progresiva del tráfico

Una vez que estemos familiarizados con la nueva implementación, podemos actualizar el tráfico para enrutar parte una de ella a la nueva implementación. El tráfico se configura en el nivel de punto de conexión:

  1. Configure el tráfico:

    Este paso no es necesario en la CLI de Azure

  2. Actualización del punto de conexión

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Si decide cambiar todo el tráfico a la nueva implementación, actualice todo el tráfico:

    Este paso no es necesario en la CLI de Azure

  4. Actualización del punto de conexión

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Al no recibir tráfico, la implementación antigua se puede eliminar de forma segura:

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    Sugerencia

    Observe que, en este momento, se ha eliminado la "implementación azul" anterior y la nueva "implementación verde" ha ocupado el lugar de ella.

Limpieza de recursos

az ml online-endpoint delete --name $ENDPOINT_NAME --yes

Importante

Tenga en cuenta que al eliminar un punto de conexión se eliminan también todas las implementaciones que contiene.

Pasos siguientes