Implementación segura de puntos de conexión en línea administrados mediante el SDK de Python v2 (versión preliminar)

SE APLICA A: SDK de Python azure-ai-ml v2 (versión preliminar)

Importante

El SDK v2 está actualmente en versión preliminar pública. Se ofrece la versión preliminar sin Acuerdo de Nivel de Servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En este artículo, aprenderá a implementar una nueva versión del modelo sin causar ninguna interrupción. La implementación azul-verde, o implementación segura, es un método en el que se introduce una nueva versión de un servicio web en producción mediante la implementación del cambio en un pequeño subconjunto de usuarios o solicitudes antes de implementarlo por completo. En este artículo se da por supuesto que usa puntos de conexión en línea; para obtener más información, consulte Puntos de conexión de Azure Machine Learning.

En este artículo aprenderá lo siguiente:

  • Implementar un nuevo punto de conexión en línea denominado "azul" que sirva la versión 1 del modelo.
  • Escalar esta implementación para que pueda controlar más solicitudes.
  • Implementar la versión 2 del modelo en un punto de conexión denominado "verde" que no acepta tráfico en directo.
  • Probar la implementación verde de forma aislada.
  • Enviar el 10 % del tráfico en directo a la implementación verde.
  • Migrar completamente 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

Clonación del repositorio de ejemplos

Para ejecutar los ejemplos de entrenamiento, primero clone el repositorio de ejemplos y cambie al directorio sdk:

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

Sugerencia

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

Conexión al área de trabajo de Azure Machine Learning

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 se crean al usar Azure Machine Learning. En esta sección, nos conectaremos al área de trabajo en la que realizará las tareas de implementación.

  1. Importe las bibliotecas necesarias:

    # import required libraries
    from azure.ai.ml import MLClient
    from azure.ai.ml.entities import (
        ManagedOnlineEndpoint,
        ManagedOnlineDeployment,
        Model,
        Environment,
        CodeConfiguration,
    )
    from azure.identity import DefaultAzureCredential
    
  2. Configure los detalles del área de trabajo y obtenga un manipulador para el área de trabajo:

    Para conectarse a un área de trabajo, se necesitan parámetros de identificador: una suscripción, un grupo de recursos y un nombre de área de trabajo. Usaremos estos detalles en el elemento MLClient de azure.ai.ml para obtener un manipulador para el área de trabajo de Azure Machine Learning necesaria. En este ejemplo, se usa la autenticación predeterminada de Azure.

    # enter details of your AzureML workspace
    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace = "<AZUREML_WORKSPACE_NAME>"
    
    # get a handle to the workspace
    ml_client = MLClient(
        DefaultAzureCredential(), subscription_id, resource_group, workspace
    )
    

Creación del 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.

Para crear un punto de conexión en línea, usaremos ManagedOnlineEndpoint. Esta clase permite al usuario configurar los siguientes aspectos clave:

  • name - Nombre del punto de conexión. Es preciso que sea único en el nivel de región de Azure.
  • auth_mode: método de autenticación del punto de conexión. Se admite la autenticación basada en claves y la autenticación basada en tokens de Azure Machine Learning. La autenticación basada en claves no expira, pero la autenticación basada en tokens de Azure Machine Learning. Los valores posibles son key o aml_token.
  • identity: configuración de identidad administrada a fin de acceder a recursos de Azure para el aprovisionamiento y la inferencia de puntos de conexión.
    • type: tipo de identidad administrada. Azure Machine Learning admite la identidad system_assigned o user_assigned.
    • user_assigned_identities: lista (matriz) de identificadores de recursos completos de las identidades asignadas por el usuario. Esta propiedad es necesaria si identity.type es user_assigned.
  • description: descripción del punto de conexión.
  1. Configuración del punto de conexión:

    # Creating a unique endpoint name with current datetime to avoid conflicts
    import datetime
    
    online_endpoint_name = "endpoint-" + datetime.datetime.now().strftime("%m%d%H%M%f")
    
    # create an online endpoint
    endpoint = ManagedOnlineEndpoint(
        name=online_endpoint_name,
        description="this is a sample online endpoint",
        auth_mode="key",
        tags={"foo": "bar"},
    )
    
  2. Creación del punto de conexión:

    Con el elemento MLClient creado anteriormente, ahora crearemos el punto de conexión en el área de trabajo. Este comando iniciará la creación del punto de conexión y devolverá una respuesta de confirmación mientras continúa la creación del punto de conexión.

    ml_client.begin_create_or_update(endpoint)
    

Creación de la implementación "azul"

Una implementación es un conjunto de recursos necesarios para hospedar el modelo que realiza la inferencia real. Crearemos una implementación para nuestro punto de conexión mediante la clase ManagedOnlineDeployment. Esta clase permite al usuario configurar los siguientes aspectos clave.

Aspectos clave de la implementación

  • name: nombre de la implementación.
  • endpoint_name: nombre del punto de conexión en el que se va a crear la implementación.
  • model: modelo que se va a 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.
  • environment: entorno que se va a usar para la implementación. 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.
  • code_configuration: configuración del código fuente y el script de puntuación.
    • path: ruta de acceso al directorio de código fuente para la puntuación del modelo.
    • scoring_script: ruta de acceso relativa al archivo de puntuación en el directorio de código fuente.
  • instance_type: 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.
  • instance_count: número de instancias que se usarán para la implementación.
  1. Configure la implementación azul:

    # create blue deployment
    model = Model(path="../model-1/model/sklearn_regression_model.pkl")
    env = Environment(
        conda_file="../model-1/environment/conda.yml",
        image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1",
    )
    
    blue_deployment = ManagedOnlineDeployment(
        name="blue",
        endpoint_name=online_endpoint_name,
        model=model,
        environment=env,
        code_configuration=CodeConfiguration(
            code="../model-1/onlinescoring", scoring_script="score.py"
        ),
        instance_type="Standard_F2s_v2",
        instance_count=1,
    )
    
  2. Cree la implementación:

    Con el elemento MLClient creado anteriormente, ahora crearemos la implementación en el área de trabajo. Este comando iniciará la creación de la implementación y devolverá una respuesta de confirmación mientras continúa la creación de la implementación.

    ml_client.begin_create_or_update(blue_deployment)
    
    # blue deployment takes 100 traffic
    endpoint.traffic = {"blue": 100}
    ml_client.begin_create_or_update(endpoint)
    

Prueba del punto de conexión con datos de ejemplo

Con el elemento MLClient creado anteriormente, vamos a obtener un manipulador para el punto de conexión. El punto de conexión se puede invocar mediante el comando invoke con los parámetros siguientes:

  • endpoint_name: nombre del punto de conexión.
  • request_file: archivo con los datos de la solicitud.
  • deployment_name: nombre de la implementación específica que se va a probar en un punto de conexión

Vamos a enviar una solicitud de ejemplo mediante un archivo JSON.

# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    deployment_name="blue",
    request_file="../model-1/sample-request.json",
)

Escalado de la implementación

Con el elemento MLClient creado anteriormente, vamos a obtener un manipulador para la implementación. Para escalar la implementación, se aumenta o se reduce el valor de instance_count.

# scale the deployment
blue_deployment = ml_client.online_deployments.get(
    name="blue", endpoint_name=online_endpoint_name
)
blue_deployment.instance_count = 2
ml_client.online_deployments.begin_create_or_update(blue_deployment)

Obtención de los detalles del punto de conexión

# Get the details for online endpoint
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

# existing traffic details
print(endpoint.traffic)

# Get the scoring URI
print(endpoint.scoring_uri)

Implementación de un nuevo modelo sin que aún reciba tráfico

Cree una implementación denominada "green":

# create green deployment
model2 = Model(path="../model-2/model/sklearn_regression_model.pkl")
env2 = Environment(
    conda_file="../model-2/environment/conda.yml",
    image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1",
)

green_deployment = ManagedOnlineDeployment(
    name="green",
    endpoint_name=online_endpoint_name,
    model=model2,
    environment=env2,
    code_configuration=CodeConfiguration(
        code="../model-2/onlinescoring", scoring_script="score.py"
    ),
    instance_type="Standard_F2s_v2",
    instance_count=1,
)
# use MLClient to create green deployment
ml_client.begin_create_or_update(green_deployment)

Prueba de la nueva implementación

Aunque la implementación verde tiene asignado el 0 % del tráfico, todavía puede invocar el punto de conexión y la implementación con un archivo JSON.

ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    deployment_name="green",
    request_file="../model-2/sample-request.json",
)

Prueba de la implementación con tráfico reflejado (versión preliminar)

Importante

Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se ofrece sin Acuerdo de Nivel de Servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Una vez que haya probado la implementación green, puede copiar (o "reflejar") un porcentaje del tráfico activo en ella. La creación de reflejo del tráfico no cambia los resultados devueltos a los clientes. Las solicitudes siguen fluyendo un 100 % a la implementación azul. 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, para comprobar si la latencia está dentro de límites aceptables y que no hay errores HTTP.

Advertencia

La creación de reflejo de tráfico usa la cuota de ancho de banda del punto de conexión (5 MBPS de forma predeterminada). El ancho de banda del punto de conexión se limitará 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.

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

endpoint.mirror_traffic = {"green": 10}
ml_client.begin_create_or_update(endpoint)

Importante

La creación de reflejo tiene las siguientes limitaciones:

  • Solo puede reflejar el tráfico en una implementación.
  • El tráfico reflejado no se admite actualmente con K8s.
  • El tráfico reflejado máximo que puede configurar es del 50 %. Este límite sirve para reducir el impacto en la cuota de ancho de banda del punto de conexión.

También, tenga en cuenta el siguiente comportamiento:

  • Una implementación solo puede configurarse para tráfico activo o reflejado, no para ambos.
  • Puede enviar tráfico directamente a la implementación reflejada especificando el conjunto de implementación para el tráfico reflejado.
  • Puede enviar tráfico directamente a una implementación activa especificando el conjunto de implementación para el tráfico activo, pero en este caso el tráfico no se reflejará en la implementación reflejada. El tráfico reflejado se enruta desde el tráfico enviado al punto de conexión sin especificar la implementación.

Diagrama que muestra el 10 % del tráfico reflejado en una implementación.

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

endpoint.mirror_traffic = {"green": 0}
ml_client.begin_create_or_update(endpoint)

Pruebe la nueva implementación con un pequeño porcentaje de tráfico en directo:

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

endpoint.traffic = {"blue": 90, "green": 10}
ml_client.begin_create_or_update(endpoint)

Ahora, la implementación verde recibirá el 10 % de las solicitudes.

Diagrama que muestra la división del tráfico entre implementaciones.

Envíe todo el tráfico a la nueva implementación:

Cuando la implementación verde le resulte totalmente satisfactoria, cambie todo el tráfico a ella.

endpoint.traffic = {"blue": 0, "green": 100}
ml_client.begin_create_or_update(endpoint)

Elimine la implementación anterior:

ml_client.online_deployments.delete(name="blue", endpoint_name=online_endpoint_name)

Eliminación de un punto de conexión

Si no va a usar la implementación, debe eliminarla con:

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Pasos siguientes