Implementación de modelos de MLflow en puntos de conexión en línea

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

En este artículo, obtendrá información sobre cómo implementar un modelo de MLflow en un punto de conexión en línea para realizar procesos de inferencia en tiempo real. Al implementar el modelo de MLflow en un punto de conexión en línea, no es necesario especificar un script de puntuación o un entorno. Esta funcionalidad se conoce como implementación sin código.

En la implementación sin código, Azure Machine Learning hace lo siguiente:

  • Instala dinámicamente los paquetes de Python proporcionados en el archivo conda.yaml. Por lo tanto, las dependencias se instalan durante el runtime del contenedor.
  • Proporciona una imagen base de MLflow o un entorno mantenido que contiene los elementos siguientes:

Sugerencia

Áreas de trabajo sin acceso a la red pública: para poder implementar modelos de MLflow en puntos de conexión en línea sin conectividad de salida, debe empaquetar los modelos (versión preliminar). Mediante el empaquetado de modelos, puede evitar la necesidad de una conexión a Internet, lo que Azure Machine Learning requeriría instalar dinámicamente los paquetes de Python necesarios para los modelos de MLflow.

Acerca del ejemplo

En el ejemplo se muestra cómo puede implementar un modelo de MLflow en un punto de conexión en línea para realizar predicciones. En el ejemplo se usa un modelo de MLflow basado en el conjunto de datos Diabetes. El conjunto de datos contiene diez variables de línea de base: la edad, el sexo, el índice de masa corporal, la presión arterial media y seis mediciones del suero sanguíneo obtenidas de 442 pacientes diabéticos. También contiene la respuesta de interés, una medida cuantitativa del progreso de la enfermedad un año después de la línea de base.

El modelo se ha entrenado mediante un regresor scikit-learn y todos los procesamientos previos necesarios se han empaquetado como una canalización, lo que convierte este modelo en una canalización de un extremo a otro que pasa de datos sin procesar a 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 YAML y otros archivos, clone el repositorio y luego cambie los directorios a cli, si usa la CLI de Azure. Si usa el SDK de Azure Machine Learning para Python, cambie los directorios a sdk/python/endpoints/online/mlflow.

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

Siga en los cuadernos de Jupyter Notebooks

Para seguir los pasos para usar el SDK de Azure Machine Learning para Python, abra el cuaderno Implementación del modelo de MLflow en puntos de conexión en línea en el repositorio clonado.

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 sobre los roles, consulte Administración del acceso a un área de trabajo de Azure Machine Learning.

  • Debe tener un modelo de MLflow registrado en el área de trabajo. En este artículo se registra un modelo entrenado para el conjunto de datos Diabetes en el área de trabajo.

  • Además, debe:


Conexión con su área de trabajo

Primero, conéctese al área de trabajo de Azure Machine Learning donde realizará su trabajo.

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Registro del modelo

Solo puede implementar modelos registrados en puntos de conexión en línea. En este ejemplo, ya tiene una copia local del modelo en el repositorio, por lo que solo necesita publicar el modelo en el registro del área de trabajo. Puede omitir este paso si el modelo que está intentando implementar ya está registrado.

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

¿Qué ocurre si el modelo se registró dentro de una ejecución?

Si el modelo se registró dentro de una ejecución, puede registrarlo directamente.

Para registrar el modelo, debe conocer la ubicación donde se almacena. Si usa la característica autolog de MLflow, la ruta de acceso al modelo depende del tipo de modelo y del marco de trabajo. Debe comprobar la salida de los trabajos para identificar el nombre de la carpeta del modelo. Esta carpeta contiene un archivo denominado MLModel.

Si usa el método log_model para registrar manualmente los modelos, pase la ruta de acceso al modelo como argumento al método. Como ejemplo, si registra el modelo mediante mlflow.sklearn.log_model(my_model, "classifier"), la ruta de acceso donde se almacena el modelo se denomina classifier.

Use la versión 2 de la CLI de Azure Machine Learning para crear un modelo a partir de la salida de un trabajo de entrenamiento. En el ejemplo siguiente, se registra un modelo denominado $MODEL_NAME mediante los artefactos de un trabajo con el id. $RUN_ID. La ruta de acceso donde se almacena el modelo es $MODEL_PATH.

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

Nota

La ruta de acceso $MODEL_PATH es la ubicación donde se ha almacenado el modelo en la ejecución.

Implementación de un modelo de MLflow en un punto de conexión en línea

  1. Configure el punto de conexión donde se implementará el modelo. En el ejemplo siguiente se configuran el nombre y el modo de autenticación del punto de conexión:

    Establezca un nombre de punto de conexión ejecutando el comando siguiente (reemplace YOUR_ENDPOINT_NAME por un nombre único):

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Configuración del punto de conexión:

    create-endpoint.yaml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Creación del punto de conexión:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configure la implementación. Una implementación es un conjunto de recursos necesarios para hospedar el modelo que realiza la inferencia real.

    sklearn-deployment.yaml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-deployment
    endpoint_name: my-endpoint
    model:
      name: mir-sample-sklearn-ncd-model
      version: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Nota:

    La generación automática de scoring_script y environment solo se admite para el tipo de modelo pyfunc. Para usar otro tipo de modelo, consulte Personalización de implementaciones de modelos de MLflow.

  4. Creación de la implementación:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --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 --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. 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.

    Este paso no es necesario en la CLI de Azure, ya que usó la marca --all-traffic durante la creación. Si necesita cambiar el tráfico, puede usar el comando az ml online-endpoint update --traffic. Para obtener más información sobre cómo actualizar el tráfico, consulte Actualización progresiva del tráfico.

  6. Actualice la configuración del punto de conexión:

    Este paso no es necesario en la CLI de Azure, ya que usó la marca --all-traffic durante la creación. Si necesita cambiar el tráfico, puede usar el comando az ml online-endpoint update --traffic. Para obtener más información sobre cómo actualizar el tráfico, consulte Actualización progresiva del tráfico.

Invocación del punto de conexión

Una vez que la implementación esté lista, puede usarla para atender la solicitud. Una forma de probar la implementación es mediante la capacidad de invocación integrada en el cliente de implementación que está usando. El siguiente JSON es una solicitud de ejemplo para la implementación.

sample-request-sklearn.json

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Nota:

input_data se usa en este ejemplo, en lugar de inputs que se usa en el servicio de MLflow. Esto se debe a que Azure Machine Learning requiere un formato de entrada diferente para poder generar automáticamente los contratos de Swagger para los puntos de conexión. Consulte Diferencias entre los modelos implementados en Azure Machine Learning y el servidor integrado de MLflow para obtener más información sobre los formatos de entrada esperados.

Envíe una solicitud al punto de conexión de la siguiente manera:

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

La respuesta será similar al texto siguiente:

[ 
  11633.100167144921,
  8522.117402884991
]

Importante

En el caso de la implementación sin código de MLflow, actualmente no se admiten las pruebas a través de puntos de conexión locales .

Personalización de las implementaciones de modelos de MLflow

No es necesario especificar un script de puntuación en la definición de implementación de un modelo de MLflow en un punto de conexión en línea. Sin embargo, puede optar por hacerlo y personalizar cómo se ejecuta la inferencia.

Normalmente, querrá personalizar la implementación de modelo de MLflow cuando:

  • El modelo no tiene un tipo PyFunc.
  • Debe personalizar la forma en que se ejecuta el modelo, por ejemplo, usar un tipo específico para cargarlo con mlflow.<flavor>.load_model().
  • Es necesario realizar un procesamiento previo y posterior en la rutina de puntuación cuando no lo realiza el propio modelo.
  • La salida del modelo no se puede representar correctamente en datos tabulares. Por ejemplo, es un tensor que representa una imagen.

Importante

Si decide especificar un script de puntuación para una implementación de modelo de MLflow, también tendrá que especificar el entorno en el que se ejecutará la implementación.

Pasos

Para implementar un modelo de MLflow con un script de puntuación personalizado:

  1. Identifique la carpeta donde se localiza el modelo de MLflow.

    a. Vaya a Azure Machine Learning Studio.

    b. Vaya a la sección Modelos.

    c. Seleccione el modelo que intenta implementar y vaya a su pestaña Artefactos.

    d. Tome nota de la carpeta que se muestra. Esta carpeta se especificó cuando se registró el modelo.

    Captura de pantalla en la que se muestra la carpeta donde se colocan los artefactos del modelo.

  2. Cree un script de puntuación. Observe cómo el nombre de carpeta model que identificó anteriormente se incluye en la función init().

    Sugerencia

    El script de puntuación siguiente se proporciona como ejemplo sobre cómo realizar la inferencia con un modelo de MLflow. Puede adaptar este script a sus necesidades o cambiar cualquiera de sus partes para reflejar su escenario.

    score.py

    import logging
    import os
    import json
    import mlflow
    from io import StringIO
    from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json
    
    
    def init():
        global model
        global input_schema
        # "model" is the path of the mlflow artifacts when the model was registered. For automl
        # models, this is generally "mlflow-model".
        model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
        model = mlflow.pyfunc.load_model(model_path)
        input_schema = model.metadata.get_input_schema()
    
    
    def run(raw_data):
        json_data = json.loads(raw_data)
        if "input_data" not in json_data.keys():
            raise Exception("Request must contain a top level key named 'input_data'")
    
        serving_input = json.dumps(json_data["input_data"])
        data = infer_and_parse_json_input(serving_input, input_schema)
        predictions = model.predict(data)
    
        result = StringIO()
        predictions_to_json(predictions, result)
        return result.getvalue()
    

    Advertencia

    Advertencia de MLflow 2.0: el script de puntuación proporcionado funcionará con MLflow 1.X y MLflow 2.X. Sin embargo, tenga en cuenta que los formatos de entrada y salida esperados en esas versiones pueden variar. Compruebe la definición de entorno usada para asegurarse de que usa la versión de MLflow esperada. Tenga en cuenta que MLflow 2.0 solo se admite en Python 3.8 y versiones posteriores.

  3. Cree un entorno donde se pueda ejecutar el script de puntuación. Dado que el modelo es un modelo de MLflow, los requisitos de Conda también se especifican en el paquete del modelo. Para obtener más información sobre los archivos incluidos en un modelo de MLflow, consulte El formato MLflow. A continuación, compile el entorno con las dependencias de Conda del archivo. Sin embargo, también debe incluir el paquete azureml-inference-server-http, que es necesario para las implementaciones en línea en Azure Machine Learning.

    El archivo de definición de Conda tiene el aspecto siguiente:

    conda.yml

    channels:
    - conda-forge
    dependencies:
    - python=3.9
    - pip
    - pip:
      - mlflow
      - scikit-learn==1.2.2
      - cloudpickle==2.2.1
      - psutil==5.9.4
      - pandas==2.0.0
      - azureml-inference-server-http
    name: mlflow-env
    

    Nota:

    El paquete azureml-inference-server-http se ha agregado al archivo de dependencias de Conda original.

    Usará este archivo de dependencias de Conda para crear el entorno:

    El entorno se creará insertado en la configuración de implementación.

  4. Creación de la implementación:

    Cree un archivo de configuración de implementación deployment.yml:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-diabetes-custom
    endpoint_name: my-endpoint
    model: azureml:sklearn-diabetes@latest
    environment: 
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
      conda_file: sklearn-diabetes/environment/conda.yml
    code_configuration:
      code: sklearn-diabetes/src
      scoring_script: score.py
    instance_type: Standard_F2s_v2
    instance_count: 1
    

    Creación de la implementación:

    az ml online-deployment create -f deployment.yml
    
  5. Una vez completada la implementación, está lista para atender solicitudes. Una manera de probar la implementación es usar un archivo de solicitud de ejemplo junto con el método invoke.

    sample-request-sklearn.json

    {"input_data": {
        "columns": [
          "age",
          "sex",
          "bmi",
          "bp",
          "s1",
          "s2",
          "s3",
          "s4",
          "s5",
          "s6"
        ],
        "data": [
          [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
          [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
        ],
        "index": [0,1]
      }}
    

    Envíe una solicitud al punto de conexión de la siguiente manera:

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

    La respuesta será similar al texto siguiente:

    {
      "predictions": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    Advertencia

    Advertencia de MLflow 2.0: en MLflow 1.X, faltará la clave predictions.

Limpieza de recursos

Una vez que haya terminado de usar el punto de conexión, elimine sus recursos asociados:

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