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, aprenderá a implementar una nueva versión de un modelo de Machine Learning sin causar ninguna interrupción. Usará una estrategia de 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.

En este artículo se supone que usa puntos de conexión en línea, es decir, 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 puntos de conexión en línea administrados y los puntos de conexión en línea de Kubernetes, consulte ¿Qué son los puntos de conexión de Azure Machine Learning?

En el ejemplo principal de este artículo se usan puntos de conexión en línea administrados para la implementación. Para usar puntos de conexión Kubernetes en su lugar, consulte las notas de este documento insertadas en la explicación de los puntos de conexión en línea administrados.

En este artículo aprenderá lo siguiente:

  • Definir un punto de conexión en línea con una implementación denominada "blue" para atender la versión 1 de un modelo
  • Escalar esta implementación azul para que pueda controlar más solicitudes
  • Implemente la versión 2 del modelo (denominada implementación "verde") en el punto de conexión, pero envíe la implementación sin tráfico activo
  • Probar la implementación verde de forma aislada.
  • Reflejo de un porcentaje del tráfico activo en la implementación verde para validarlo
  • Envíe un pequeño porcentaje de tráfico en directo a la implementación verde
  • Enviar todo el tráfico en directo a la implementación verde
  • Eliminar la implementación azul de la versión 1 que ya no se usa.

Requisitos previos

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

  • 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.

  • (Opcional) Para implementar localmente, debe instalar el motor de Docker en el equipo local. Se recomienda esta opción, para que sea más sencillo depurar los problemas.

Preparación del sistema

Establecimiento de variables de entorno

Si aún no ha establecido los valores predeterminados de la CLI de Azure, guarde la configuración predeterminada. Para evitar pasar los valores de la suscripción, el área de trabajo y el grupo de recursos varias veces, ejecute este código:

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

Clone el repositorio de ejemplos

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

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

Sugerencia

Use --depth 1 para clonar únicamente la última confirmación al repositorio. Esto reduce el tiempo para completar la operación.

Los comandos de este tutorial están en el archivo deploy-safe-rollout-online-endpoints.sh en el directorio cli y los archivos de configuración 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 están en el endpoints/online/kubernetes/ subdirectorio.

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 Description
Nombre Necesario. Nombre del punto de conexión. El valor debe ser único dentro de la región de Azure. Para más información sobre las reglas de nomenclatura, vea los límites del punto de conexión.
Modo de autenticación Método de autenticación del punto de conexión. Elija entre la autenticación basada en claves key y la autenticación basada en tokens de Azure Machine Learning aml_token. Una clave no expira, pero un token sí. Para más información sobre la autenticación, consulte Autenticación en un punto de conexión en línea.
Descripción Descripción del punto de conexión.
Etiquetas Diccionario de etiquetas del punto de conexión.
Tráfico Reglas sobre cómo enrutar el tráfico entre implementaciones. Represente el tráfico como un diccionario de pares clave-valor, donde las claves representan el nombre de la implementación y los valores representan el porcentaje de tráfico a esa implementación. Solo puede establecer el tráfico cuando se hayan creado las implementaciones en un punto de conexión. También puede actualizar el tráfico de un punto de conexión en línea una vez creadas 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 en directo a la nueva implementación.
Tráfico reflejado Porcentaje de 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, vea Prueba de la implementación con tráfico reflejado.

Para ver una lista completa de los atributos que puede especificar al crear un punto de conexión, consulte Esquema de YAML de punto de conexión en línea de la CLI (v2) o Clase ManagedOnlineEndpoint del SDK (v2).

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 Description
Nombre Necesario. Nombre de la implementación.
El nombre del punto de conexión Necesario. Nombre del punto de conexión en el que se creará la implementación.
Modelo 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 el ejemplo, tenemos un modelo scikit-learn que realiza la regresión.
Ruta de acceso al código Ruta de acceso al directorio en el 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 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 el directorio 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 este ejemplo, tenemos un archivo score-py. Este código de Python debe tener una función init() y una función run(). Se llamará a la función init() después de crear o actualizar el modelo (puede usarla para copiar en caché el modelo en la 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 Necesario. 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 Necesario. Tamaño de máquina virtual que se usará para la implementación. Para la lista de tamaños admitidos, consulte Lista de SKU de puntos de conexión en línea administrados.
Recuento de instancias Necesario. El número de instancias que se usarán para la implementación. Base el valor en la carga de trabajo esperada. Para lograr alta disponibilidad, se recomienda establecer el valor en al menos 3. Reservamos un 20 % adicional para realizar actualizaciones. Para más información, vea Límites de puntos de conexión en línea.

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

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

En primer lugar, establezca el nombre del punto de conexión y configúrelo. En este artículo, usará el archivo endpoints/online/managed/sample/endpoint.yml para configurar el punto de conexión. El siguiente fragmento de código muestra el contenido del archivo:

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

La referencia para el formato YAML del punto de conexión se describe en la tabla siguiente. Para aprender a especificar estos atributos, consulte la referencia de YAML de puntos de conexión en línea. Para obtener información sobre los límites relacionados con los puntos de conexión en línea administrados, vea Límites para los puntos de conexión en línea.

Clave Descripción
$schema (Opcional) El esquema de YAML. Para ver todas las opciones disponibles en el archivo YAML, puede ver el esquema del fragmento de código anterior en un explorador.
name Nombre del punto de conexión.
auth_mode 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:

    Para Unix, ejecute este comando (reemplace por YOUR_ENDPOINT_NAME 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:

    Ejecute el código siguiente a fin de usar 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"

En este artículo, usará el archivo endpoints/online/managed/sample/blue-deployment.yml para configurar los aspectos clave de la implementación. El siguiente fragmento de código muestra el contenido del archivo:

$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-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

A fin de crear una implementación denominada blue para el punto de conexión, ejecute el siguiente comando para usar el archivo blue-deployment.yml para la configuración:

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 elemento az ml online-deployment create asigna el 100 % del tráfico del punto de conexión a la implementación azul creada recientemente.

En el archivo blue-deployment.yaml, se especifica el valor de path (desde donde cargar archivos) insertado. La CLI carga automáticamente los archivos y registra el modelo y el entorno. Como procedimiento recomendado en producción, debe registrar el modelo y el entorno y especificar el nombre y la versión registrados por separado en el archivo YAML. Utilice el formulario model: azureml:my-model:1 o 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 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 del modelo como recurso en Machine Learning mediante la CLI. Para más información sobre cómo crear un entorno, consulte Administración de entornos de Azure Machine Learning con la CLI y el SDK (v2).

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 desde la CLI o el SDK de Python, puede optar por especificar el nombre de la implementación que recibirá el tráfico entrante.

Nota:

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

Invocar un punto de conexión con el nombre de la implementación

Si invoca el punto de conexión con el nombre de la implementación que recibirá tráfico, Azure Machine Learning enrutará el tráfico del punto de conexión directamente a la implementación especificada y devolverá su salida. Puede usar la opción --deployment-name para la CLI v2 o la opción deployment_name para el SDK v2 con el fin de especificar la implementación.

Invocar un punto de conexión sin especificar la implementación

Si invoca el punto de conexión sin especificar la implementación que recibirá tráfico, Azure Machine Learning enrutará el tráfico entrante del punto de conexión a las implementaciones en el 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 concreta de su punto de conexión recibirá tráfico entrante el 40 % del tiempo, Azure Machine Learning dirigirá 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:

az ml online-endpoint show --name $ENDPOINT_NAME 

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

Debería ver el punto de conexión identificado por $ENDPOINT_NAME y una implementación denominada blue.

Prueba del punto de conexión con datos de ejemplo

El punto de conexión se puede invocar mediante el comando invoke. Vamos a enviar una solicitud de ejemplo mediante un archivo JSON.

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 Machine Learning con un punto de conexión en línea, se establece instance_count en el valor 1 en el archivo YAML de la 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

Observe que en el comando anterior se usa --set para invalidar la configuración de la implementación. Como alternativa, puede actualizar el archivo YAML y pasarlo como entrada en el comando update mediante la entrada --file.

Implementación de un nuevo modelo sin que aún reciba 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

Puesto que no hemos asignado explícitamente ningún tráfico a green, tiene cero tráfico asignado. Para comprobarlo, use el comando siguiente:

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

Prueba de la nueva implementación

Aunque green tiene asignado 0 % de tráfico, puede invocarla directamente si especifica el nombre --deployment:

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 fragmento de código siguiente usa curl para invocar la implementación directamente. El fragmento de código debe funcionar en entornos Unix o WSL:

# 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

Una vez que haya probado la implementación green, puede reflejar (o copiar) un porcentaje del tráfico en directo en ella. La creación de reflejo del tráfico (también denominada creación de sombras) 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 se envía a la implementación green para que pueda recopilar métricas y registros sin que los clientes resulten afectados. 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 los límites aceptables o para comprobar que no haya errores HTTP. La prueba de la nueva implementación con creación de reflejo o "shadowing" de tráfico también se conoce como pruebas de "shado". La implementación que recibe el tráfico reflejado (en este caso, la implementación green) también se puede denominar implementación de sombra.

La creación de reflejo tiene las siguientes limitaciones:

  • La creación de reflejo del tráfico se admite en la CLI (v2) (versión 2.4.0 o posterior) y en el SDK de Python (v2) (versión 1.0.0 o posterior). Si usa una versión anterior de la CLI o el SDK 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 el 50 %. Este límite se establece para reducir el efecto en la cuota de ancho de banda del punto de conexión (valor predeterminado de 5 MBPS); el ancho de banda del punto de conexión se limita si supera la cuota asignada. Para más información sobre la supervisión del límite de ancho de banda, consulte Supervisión de puntos de conexión en línea administrados.

Tenga en cuenta también los siguientes comportamientos:

  • Una implementación se puede configurar para recibir solo el tráfico en directo o el 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 con el nombre de la implementación que recibirá tráfico entrante, Azure Machine Learning no reflejará el tráfico en la implementación de 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.

Ahora vamos a establecer la implementación verde para recibir el 10 % del tráfico reflejado. Los clientes seguirán recibiendo predicciones solo de la implementación azul.

Diagram showing 10% traffic mirrored to one deployment.

El siguiente comando refleja el 10 % del tráfico en la implementación green:

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 específico del tráfico se envió a la implementación green viendo los registros de la implementación:

az ml online-deployment get-logs --name blue --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

Una vez que haya probado la implementación green, asígnele un pequeño porcentaje de tráfico:

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

Sugerencia

El porcentaje de tráfico total debe ser 0 % (para deshabilitar el tráfico) o 100 % (para habilitar el tráfico).

Ahora, la implementación green recibe el 10 % de todo el tráfico en directo. Los clientes recibirán predicciones de las implementaciones blue y green.

Diagram showing traffic split between deployments.

Envío de todo el tráfico a la nueva implementación

Cuando esté plenamente 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. Al eliminar una implementación individual, las demás implementaciones del punto de conexión en línea administrado se ven afectadas:

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 el punto de conexión, también se eliminarán todas sus implementaciones subyacentes.

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