Compartir a través de


Implementación segura de nuevas implementaciones para la inferencia en tiempo real

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, verá cómo implementar una nueva versión de un modelo de Machine Learning en producción sin provocar interrupciones. Se usa una estrategia de implementación azul-verde, que también se conoce como estrategia de implementación segura, para introducir una nueva versión de un servicio web en producción. Al usar esta estrategia, puede implementar la nueva versión del servicio web en un pequeño subconjunto de usuarios o solicitudes antes de implementarla por completo.

En este artículo se supone que usa puntos de conexión en línea o puntos de conexión que se usan para la inferencia en línea (en tiempo real). Hay dos tipos de puntos de conexión en línea: puntos de conexión en línea administrados y puntos de conexión en línea de Kubernetes. Para más información sobre los puntos de conexión y las diferencias entre los tipos de punto de conexión, consulte Puntos de conexión en línea administrados frente a puntos de conexión en línea de Kubernetes.

En este artículo se usan puntos de conexión en línea administrados para la implementación. Pero también incluye notas que explican cómo usar puntos de conexión de Kubernetes en lugar de puntos de conexión en línea administrados.

En este artículo, verá cómo:

  • Defina un punto de conexión en línea con una implementación denominada blue para atender la primera versión de un modelo.
  • Escale la blue implementación para que pueda gestionar más solicitudes.
  • Implemente la segunda versión del modelo, que se denomina implementación green, en el punto de conexión, pero envíe la implementación sin tráfico activo.
  • Pruebe la green implementación de forma aislada.
  • Refleje un porcentaje del tráfico activo en la implementación de green para validarlo.
  • Envíe un pequeño porcentaje de tráfico activo a la implementación de green.
  • Envíe todo el tráfico activo a la implementación green.
  • Elimine la implementación blue sin usar.

Requisitos previos

  • Una cuenta de usuario que tenga al menos uno de los siguientes roles de control de acceso basado en rol de Azure (RBAC de Azure):

    • Un rol de propietario para el área de trabajo de Azure Machine Learning
    • Un rol colaborador para el área de trabajo de Azure Machine Learning
    • Un rol personalizado con Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* permisos

    Para obtener más información, consulte Administración del acceso a un área de trabajo de Azure Machine Learning.

  • Opcionalmente, Docker Engine, instalado y ejecutándose localmente. Este requisito previo es muy recomendable. Necesita implementar un modelo localmente y resulta útil para la depuración.

Preparación del sistema

Establecimiento de variables de entorno

Puede configurar los valores predeterminados para usarlos con la CLI de Azure. Para evitar pasar valores para la suscripción, el área de trabajo y el grupo de recursos varias veces, ejecute el código siguiente:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<Azure-Machine-Learning-workspace-name> group=<resource-group-name>

Clone el repositorio de ejemplos

Para seguir este artículo, primero clone el repositorio de ejemplos (azureml-examples). A continuación, vaya al directorio del cli/ repositorio:

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

Sugerencia

Use --depth 1 para clonar solo la confirmación más reciente en el repositorio, lo que reduce el tiempo necesario para completar la operación.

Los comandos de este tutorial se encuentran en el archivo deploy-safe-rollout-online-endpoints.sh en el directorio cli y los archivos de configuración de YAML se encuentran en el subdirectorio endpoints/online/managed/sample/.

Nota

Los archivos de configuración de YAML para los puntos de conexión en línea de Kubernetes se encuentran en el subdirectorio endpoints/online/kubernetes/.

Definición del punto de conexión y la implementación

Los puntos de conexión en línea 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 enviar respuestas en tiempo real.

Definición de un punto de conexión

En la tabla siguiente se enumeran los atributos clave que se deben especificar al definir un punto de conexión.

Atributo Obligatorio u opcional Descripción
Nombre Obligatorio Nombre del punto de conexión. Debe ser único en la región de Azure en la que se encuentra. Para más información sobre las reglas de nomenclatura, consulte Puntos de conexión en línea y puntos de conexión por lotes de Azure Machine Learning.
Modo de autenticación Opcional Método de autenticación del punto de conexión. Puede elegir entre la autenticación basada en claves, keyy la autenticación basada en tokens de Azure Machine Learning, aml_token. Una clave no expira, pero un token sí. Para obtener más información sobre la autenticación, consulte Autenticación de clientes para puntos de conexión en línea.
Descripción Opcional Descripción del punto de conexión.
Etiquetas Opcional Diccionario de etiquetas para el punto de conexión.
Tráfico Opcional Reglas sobre cómo enrutar el tráfico entre implementaciones. Representa el tráfico como un diccionario de pares clave-valor, donde la clave representa el nombre de implementación y el valor representa el porcentaje de tráfico a esa implementación. Puede establecer el tráfico solo después de crear las implementaciones en un punto de conexión. También puede actualizar el tráfico de un punto de conexión en línea después de crear las implementaciones. Para obtener más información sobre cómo usar el tráfico reflejado, consulte Asignación de un pequeño porcentaje de tráfico activo a la nueva implementación.
Tráfico reflejado Opcional Porcentaje del tráfico activo que se va a reflejar en una implementación. Para obtener más información sobre cómo usar el tráfico reflejado, consulte Probar la implementación con tráfico reflejado.

Para ver una lista completa de atributos que puede especificar al crear un punto de conexión, consulte Esquema YAML de endpoint en línea de CLI (v2). Para la versión 2 del SDK de Azure Machine Learning para Python, consulte Clase ManagedOnlineEndpoint.

Definición de una implementación

Una implementación es un conjunto de recursos necesarios para hospedar el modelo que realiza la inferencia real. En la tabla siguiente se describen los atributos clave que se deben especificar al definir una implementación.

Atributo Obligatorio u opcional Descripción
Nombre Obligatorio Nombre del despliegue.
El nombre del punto de conexión Obligatorio El nombre del punto de conexión en el que se creará la implementación.
Modelo Opcional Modelo que se usará para la implementación. Este valor puede ser una referencia a un modelo con versiones existente en el área de trabajo o una especificación de modelo en línea. En los ejemplos de este artículo, un modelo realiza regresión scikit-learn.
Ruta de acceso al código Opcional Ruta de acceso a la carpeta del entorno de desarrollo local que contiene todo el código fuente de Python para puntuar el modelo. Puede usar directorios y paquetes anidados.
Script de puntuación Opcional Código de Python que ejecuta el modelo en una solicitud de entrada determinada. Este valor puede ser la ruta de acceso relativa al archivo de puntuación en la carpeta de código fuente.
El script de puntuación recibe los datos enviados a un servicio web implementado y los pasa al modelo. A continuación, el script ejecuta el modelo y devuelve su respuesta al cliente. El script de puntuación es específico para el modelo y debe entender los datos que el modelo espera como entrada y devuelve como salida.
En los ejemplos de este artículo se usa un archivo score.py. Este código de Python debe tener una función init y una función run. La función init se llama después de crear o actualizar el modelo. Puede usarlo para almacenar en caché el modelo en memoria, por ejemplo. Se llama a la función run en cada invocación del punto de conexión para realizar la puntuación o predicción reales.
Entorno Obligatorio Entorno para hospedar el modelo y el código. Este valor puede ser una referencia a un entorno con versiones existente en el área de trabajo o una especificación de entorno en línea. El entorno puede ser una imagen de Docker con dependencias de Conda, un Dockerfile o un entorno registrado.
Tipo de instancia Obligatorio Tamaño de máquina virtual que se va a usar para la implementación. Para obtener una lista de tamaños admitidos, consulte la lista de SKU de puntos de conexión en línea gestionados.
Recuento de instancias Obligatorio El número de instancias que se usarán para la implementación. Basas el valor en la carga de trabajo que esperas. Para lograr una alta disponibilidad, se recomienda usar al menos tres instancias. Azure Machine Learning reserva un 20 % adicional para realizar actualizaciones. Para más información, consulte Puntos de conexión en línea y puntos de conexión por lotes de Azure Machine Learning.

Para ver una lista completa de atributos que puede especificar al crear una implementación, consulte Esquema YAML de implementación en línea administrada de la CLI (v2). Para la versión 2 del SDK de Python, consulte Clase ManagedOnlineDeployment.

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

En primer lugar, establezca el nombre del punto de conexión y, a continuación, configúrelo. En este artículo, usará el archivo endpoints/online/managed/sample/endpoint.yml para configurar el punto de conexión. Ese archivo contiene las siguientes líneas:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

En la tabla siguiente se describen las claves que usa el formato YAML del punto de conexión. Para ver cómo especificar estos atributos, consulte Esquema YAML del punto de conexión en línea de la CLI (v2). Para obtener información sobre los límites relacionados con los puntos de conexión en línea administrados, consulte Puntos de conexión en línea y puntos de conexión por lotes de Azure Machine Learning.

Clave Descripción
$schema (Opcional) El esquema de YAML. Para ver todas las opciones disponibles en el archivo YAML, puede ver el esquema en el bloque de código anterior en un explorador.
name Nombre del punto de conexión.
auth_mode Modo de autenticación. Use key para la autenticación basada en claves. Use aml_token para la autenticación basada en tokens de Azure Machine Learning. Para obtener el token más reciente, use el comando az ml online-endpoint get-credentials.

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

  1. Establezca el nombre del punto de conexión ejecutando el siguiente comando de Unix. Reemplace YOUR_ENDPOINT_NAME por un nombre único.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Importante

    Los nombres del punto de conexión deben ser únicos dentro de una región de Azure. Por ejemplo, en la región westus2 de Azure solo puede haber un punto de conexión con el nombre my-endpoint.

  2. Cree el punto de conexión en la nube mediante la ejecución del código siguiente. Este código usa el archivo endpoint.yml para configurar el punto de conexión:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

Creación de la implementación azul

Puede usar el archivo endpoints/online/managed/sample/blue-deployment.yml para configurar los aspectos clave de una implementación denominada blue. Ese archivo contiene las siguientes líneas:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

Para usar el archivo blue-deployment.yml para crear la implementación de blue para su punto de conexión, ejecute el siguiente comando:

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

Importante

La marca --all-traffic del comando az ml online-deployment create asigna el 100 % del tráfico del punto de conexión a la implementación recién creada blue.

En el archivo blue-deployment.yaml, la path línea especifica dónde cargar archivos. La CLI de Azure Machine Learning usa esta información para cargar los archivos y registrar el modelo y el entorno. Como procedimiento recomendado para producción, debe registrar el modelo y el entorno y especificar el nombre y la versión registrados por separado en el código YAML. Use el formato model: azureml:<model-name>:<model-version> para el modelo, por ejemplo, model: azureml:my-model:1. Para el entorno, use el formato environment: azureml:<environment-name>:<environment-version>, por ejemplo, environment: azureml:my-env:1.

Para el registro, puede extraer las definiciones de YAML de model y environment en archivos YAML diferentes y usar los comandos az ml model create y az ml environment create. Para obtener más información sobre estos comandos, ejecute az ml model create -h y az ml environment create -h.

Para más información sobre cómo registrar el modelo como un recurso, consulte Registro de un modelo mediante la CLI de Azure o el SDK de Python. Para obtener más información sobre cómo crear un entorno, consulte Creación de un entorno personalizado.

Confirmación de la implementación existente

Una manera de confirmar la implementación existente es invocar su punto de conexión para que pueda puntuar su modelo para una solicitud de entrada determinada. Al invocar el punto de conexión a través de la CLI de Azure o el SDK de Python, puede especificar el nombre de la implementación para recibir el tráfico entrante.

Nota

A diferencia de la CLI de Azure o el SDK de Python, Azure Machine Learning Studio requiere que especifique una implementación al invocar un punto de conexión.

Invocación de un punto de conexión con un nombre de implementación

Al invocar un punto de conexión, puede especificar el nombre de una implementación que desea recibir tráfico. En este caso, Azure Machine Learning enruta el tráfico del punto de conexión directamente a la implementación especificada y devuelve su salida. Puede usar la --deployment-name opción de la CLI de Azure Machine Learning v2 o la deployment_name opción del SDK de Python v2 para especificar la implementación.

Invocación del punto de conexión sin especificar una implementación

Si invoca el punto de conexión sin especificar la implementación que desea recibir tráfico, Azure Machine Learning enruta el tráfico entrante del punto de conexión a las implementaciones del punto de conexión en función de la configuración del control de tráfico.

La configuración del control de tráfico asigna porcentajes especificados del tráfico entrante a cada implementación del punto de conexión. Por ejemplo, si las reglas de tráfico especifican que una implementación determinada en el punto de conexión debe recibir tráfico entrante el 40 % del tiempo, Azure Machine Learning enruta el 40 % del tráfico del punto de conexión a esa implementación.

Para ver el estado del punto de conexión y la implementación existentes, ejecute los siguientes comandos:

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

La salida muestra información sobre el $ENDPOINT_NAME punto de conexión y la blue implementación.

Prueba del punto de conexión mediante datos de ejemplo

Puede invocar el punto de conexión mediante el invoke comando . El siguiente comando usa el archivo JSONsample-request.json para enviar una solicitud de ejemplo:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

Escalado de la implementación existente para controlar más tráfico

En la implementación descrita en Implementación y puntuación de un modelo de aprendizaje automático a través de un punto de conexión en línea , el valor instance_count se establece 1 en el archivo YAML de implementación. Puede escalar horizontalmente mediante el comando update:

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

Nota

En el comando anterior, la --set opción invalida la configuración de implementación. Como alternativa, puede actualizar el archivo YAML y pasarlo como entrada al update comando mediante la --file opción .

Implementar un nuevo modelo pero sin enviar tráfico

Cree una nueva implementación denominada green:

az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml

Dado que no asigna explícitamente ningún tráfico a la implementación green, tiene cero tráfico asignado a ella. Puede comprobar ese hecho mediante el comando siguiente:

az ml online-endpoint show -n $ENDPOINT_NAME --query traffic

Prueba de la nueva implementación

Aunque la green implementación tiene el 0 % del tráfico asignado a ella, puede invocarla directamente mediante la --deployment opción :

az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json

Si desea usar un cliente REST para invocar la implementación directamente sin pasar por reglas de tráfico, establezca el siguiente encabezado HTTP: azureml-model-deployment: <deployment-name>. El código siguiente usa client for URL (cURL) para invocar la implementación directamente. Puede ejecutar el código en un entorno unix o subsistema de Windows para Linux (WSL). Para obtener instrucciones para recuperar el $ENDPOINT_KEY valor, consulte Obtención de la clave o token para las operaciones del plano de datos.

# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json

Prueba de la implementación con tráfico reflejado

Después de probar la implementación green, puede reflejar un porcentaje del tráfico activo al punto de conexión copiando ese porcentaje de tráfico y enviándolo a la implementación green. La creación de reflejo del tráfico, que también se denomina sombreado, no cambia los resultados devueltos a los clientes; el 100 % de las solicitudes siguen fluyendo a la implementación blue. El porcentaje reflejado del tráfico se copia y también se envía a la implementación green para que pueda recopilar métricas y registros sin afectar a los clientes.

La creación de reflejo es útil cuando desea validar una nueva implementación sin que los clientes resulten afectados. Por ejemplo, puede usar la creación de reflejo para comprobar si la latencia está dentro de límites aceptables o para comprobar que no hay errores HTTP. El uso de la creación de reflejo del tráfico o la sombreado para probar una nueva implementación también se conoce como pruebas de sombras. La implementación que recibe el tráfico reflejado, en este caso, la implementación green también se puede denominar implementación sombreada.

La creación de reflejo tiene las siguientes limitaciones:

  • La creación de reflejo es compatible con las versiones 2.4.0 y posteriores de la CLI de Azure Machine Learning y las versiones 1.0.0 y posteriores del SDK de Python. Si usa una versión anterior de la CLI de Azure Machine Learning o el SDK de Python para actualizar un punto de conexión, perderá la configuración del tráfico reflejado.
  • La creación de reflejo no se admite actualmente en los puntos de conexión en línea de Kubernetes.
  • Puede reflejar el tráfico en una sola implementación en un punto de conexión.
  • El porcentaje máximo de tráfico que puede reflejar es del 50 %. Este límite limita el efecto en la cuota de ancho de banda del punto de conexión, que tiene un valor predeterminado de 5 MBps. El ancho de banda del punto de conexión se limita si supera la cuota asignada. Para obtener información sobre la supervisión de la limitación de ancho de banda, consulte Limitación de ancho de banda.

Tenga en cuenta también el comportamiento siguiente:

  • Puede configurar una implementación para recibir solo tráfico activo o tráfico reflejado, no ambos.
  • Al invocar un punto de conexión, puede especificar el nombre de cualquiera de sus implementaciones, incluso una implementación. instantánea para devolver la predicción.
  • Al invocar un punto de conexión y especificar el nombre de una implementación para recibir tráfico entrante, Azure Machine Learning no refleja el tráfico en la implementación en sombra. Azure Machine Learning refleja el tráfico en la implementación de sombra desde el tráfico enviado al punto de conexión cuando no se especifica una implementación.

Si establece que la implementación green reciba el 10 % del tráfico reflejado, los clientes seguirán recibiendo predicciones solo de la implementación blue.

Diagrama que muestra el flujo de tráfico a través de un punto de conexión. Todo el tráfico va a la implementación azul y el 10 % se refleja en la implementación verde.

Use el siguiente comando para reflejar el 10 % del tráfico y enviarlo a la green implementación:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

Puede probar el tráfico reflejado invocando el punto de conexión varias veces sin especificar una implementación para recibir el tráfico entrante:

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

Puede confirmar que el porcentaje especificado del tráfico se envía a la green implementación comprobando los registros de la implementación:

az ml online-deployment get-logs --name green --endpoint $ENDPOINT_NAME

Después de las pruebas, puede establecer el tráfico reflejado en cero para deshabilitar la creación de reflejo:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

Asignación de un pequeño porcentaje de tráfico en directo a la nueva implementación

Después de probar la green implementación, asigne un pequeño porcentaje de tráfico a ella:

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

Sugerencia

El porcentaje total de tráfico debe ser del 0 por ciento, para deshabilitar el tráfico o el 100 por ciento, para habilitar el tráfico.

La implementación green recibe ahora el 10 % del tráfico activo. Los clientes reciben predicciones de las implementaciones blue y green.

Diagrama que muestra el flujo de tráfico a través de un punto de conexión. La implementación azul recibe el 90 % del tráfico y la implementación verde, el 10 %.

Enviar todo el tráfico a la nueva implementación

Cuando esté satisfecho con la implementación green, cambie todo el tráfico a ella.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

Eliminación de la implementación anterior

Siga estos pasos para eliminar una implementación individual de un punto de conexión en línea administrado. La eliminación de una implementación individual no afecta a las demás implementaciones en el punto de conexión en línea administrado:

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

Eliminación del punto de conexión y la implementación

Si no va a usar el punto de conexión ni la implementación, debe eliminarlos. Al eliminar un punto de conexión, también se eliminan todas sus implementaciones subyacentes.

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