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á:
- Instale la CLI de Azure y la extensión de ml en la CLI de Azure. Para más información, consulte Instalación, configuración y uso de la CLI v2.
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.
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"
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
Creación del punto de conexión:
az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
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".
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
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.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.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.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" ] ] } }
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.
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")
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"
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
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:
Configure el tráfico:
Este paso no es necesario en la CLI de Azure
Actualización del punto de conexión
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
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
Actualización del punto de conexión
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
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.