Implementación y puntuación de un modelo de Machine Learning con un punto de conexión en línea administrado 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á cómo implementar el modelo de Machine Learning en un punto de conexión en línea administrado y cómo obtener predicciones. Comenzará por implementar un modelo en la máquina local para depurar los errores y, después, lo implementará y probará en Azure.

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 y la implementación

Nota:

Para realizar la implementación localmente, debe tener instalado el motor de Docker. El motor de Docker debe estar en ejecución. Este motor normalmente se inicia cuando se inicia el equipo. Si no lo hace, puede solucionar el problema aquí.

  1. Creación del punto de conexión local:

    El objetivo de la implementación de un punto de conexión local es validar y depurar el código y la configuración antes de implementarlo en Azure. La implementación local tiene las siguientes limitaciones:

    • Los puntos de conexión locales no admiten reglas de tráfico, autenticación ni configuración de sondeo.
    • Los puntos de conexión locales solo admiten una implementación por punto de conexión.
    # Creating a local endpoint
    import datetime
    
    local_endpoint_name = "local-" + datetime.datetime.now().strftime("%m%d%H%M%f")
    
    # create an online endpoint
    endpoint = ManagedOnlineEndpoint(
        name=local_endpoint_name, description="this is a sample local endpoint"
    )
    
    ml_client.online_endpoints.begin_create_or_update(endpoint, local=True)
    
  2. Creación de la implementación local:

    El ejemplo contiene todos los archivos necesarios para implementar un modelo en un punto de conexión en línea. Para implementar un modelo debe tener:

    • Archivos de modelo (o el nombre y la versión de un modelo ya registrado en el área de trabajo). En el ejemplo, tenemos un modelo scikit-learn que realiza la regresión.
    • Código necesario para puntuar el modelo. En este caso, tenemos un archivo score-py.
    • Entorno en el que se ejecuta el modelo. Como verá, el entorno podría ser una imagen de Docker con dependencias de Conda o podría ser un Dockerfile.
    • Configuración para especificar el tipo de instancia y la capacidad de escalado.

    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 va a 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
    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=local_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,
    )
    
    ml_client.online_deployments.begin_create_or_update(
        deployment=blue_deployment, local=True
    )
    

Comprobación de que la implementación local se ha realizado correctamente

  1. Compruebe el estado para ver si el modelo se ha implementado sin errores:

    ml_client.online_endpoints.get(name=local_endpoint_name, local=True)
    
  2. Obtención de registros:

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=local_endpoint_name, local=True, lines=50
    )
    

Invocación del punto de conexión local

Invoque el punto de conexión para puntuar el modelo con el práctico comando invoke y pase los parámetros de consulta almacenados en un archivo JSON.

ml_client.online_endpoints.invoke(
    endpoint_name=local_endpoint_name,
    request_file="../model-1/sample-request.json",
    local=True,
)

Implementación del punto de conexión en línea en Azure

A continuación, implemente el punto de conexión en línea en Azure.

  1. Configuración del punto de conexión en línea:

    Sugerencia

    • endpoint_name: 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, consulte los límites del punto de conexión en línea administrado.
    • 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. key no expira, pero aml_token sí lo hace. Para más información sobre la autenticación, consulte Autenticación en un punto de conexión en línea.
    • Opcionalmente, puede agregar una descripción y etiquetas al 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)
    
  3. Configuración de la implementación en línea:

    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.

    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,
    )
    
  4. Creación de 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",
)

Administración de puntos de conexión e implementaciones

  1. 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)
    
  2. Obtención de los registros de la nueva implementación:

    Obtenga los registros de la implementación verde y realice las comprobaciones necesarias.

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=online_endpoint_name, lines=50
    )
    

Eliminación del punto de conexión

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Pasos siguientes

Pruebe estos pasos para saber cómo usar el SDK (v2) de Azure Machine Learning para Python: