Directrices para implementar modelos de MLflow

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

En este artículo hay más información sobre la implementación de modelos de MLflow en Azure Machine Learning para la inferencia en tiempo real y por lotes. También veremos las distintas herramientas que se pueden usar para administrar la implementación.

Implementación de modelos de MLflow frente a modelos personalizados

Al contrario que con la implementación de modelo en Azure Machine Learning, al implementar modelos de MLflow en Azure Machine Learning, no es necesario proporcionar un script de puntuación ni un entorno para la implementación, ya que se generan automáticamente. En vez de eso, Azure Machine Learning genera automáticamente el script de puntuación y el entorno. Esta funcionalidad se llama implementación in código.

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

  • Garantiza que se cumplen todas las dependencias de paquete indicadas en el modelo de MLflow.
  • Proporciona una imagen base de MLflow o un entorno mantenido que contiene los elementos siguientes:
    • Paquetes necesarios para que Azure Machine Learning realice la inferencia, incluido mlflow-skinny.
    • Un script de puntuación para realizar la inferencia.

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.

Dependencias y paquetes de Python

Azure Machine Learning genera automáticamente entornos para ejecutar la inferencia de modelos en MLflow. Para compilar los entornos, Azure Machine Learning lee las dependencias de conda que se especifican en el modelo de MLflow y agrega los paquetes necesarios para ejecutar el servidor de inferencia. Estos paquetes adicionales varían en función del tipo de implementación.

El siguiente archivo conda.yaml muestra un ejemplo de dependencias de conda especificadas en un modelo de MLflow.

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

Advertencia

MLflow detecta automáticamente los paquetes al registrar un modelo y ancla las versiones del paquete en las dependencias de conda del modelo. Sin embargo, es posible que esta detección automática de paquetes no siempre refleje sus intenciones o requisitos. En esos casos, considere la posibilidad de registrar modelos con una definición personalizada de dependencias de Conda.

Implicaciones del uso de modelos con firmas

Los modelos de MLflow pueden incluir una firma que indique las entradas esperadas y sus tipos. Cuando estos modelos se implementan en puntos de conexión en línea o por lotes, Azure Machine Learning exige que el número y los tipos de las entradas de datos cumplan la firma. Si los datos de entrada no se pueden analizar según lo previsto, se producirá un error en la invocación del modelo.

Para inspeccionar la firma de un modelo de MLflow, abra el archivo MLmodel asociado a su modelo. Para obtener más información sobre cómo funcionan las firmas en MLflow, consulte Firmas en MLflow.

El siguiente archivo muestra el archivo MLmodel asociado a un modelo de MLflow.

MLmodel

artifact_path: model
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

Sugerencia

Las firmas en los modelos de MLflow son opcionales, pero se recomiendan encarecidamente, ya que proporcionan una manera cómoda de detectar problemas de compatibilidad de datos pronto. Para obtener más información sobre cómo registrar modelos con firmas, consulte Registro de modelos con una firma personalizada, un entorno o ejemplos.

Los modelos implementados en Azure Machine Learning frente a los modelos implementados en el servidor integrado de MLflow

MLflow incluye herramientas de implementación integradas que los desarrolladores de modelos pueden usar para probar modelos localmente. Por ejemplo, se puede ejecutar una instancia local de un modelo que se registra en el registro de servidor de MLflow con mlflow models serve -m my_model, o mediante el mlflow models predict de la CLI de MLflow.

Inferencia con puntos de conexión por lotes frente a puntos de conexión en línea

Azure Machine Learning admite la implementación de modelos en puntos de conexión tanto en línea como por lotes. Estos puntos de conexión ejecutan diferentes tecnologías de inferencia que pueden tener características diferentes.

Los puntos de conexión en línea son similares al servidor integrado de MLflow en cuanto a que proporcionan una manera escalable, sincrónica y ligera de ejecutar modelos para la inferencia.

Por su parte, los puntos de conexión por lotes pueden ejecutar la inferencia asincrónica a través de procesos de inferencia de larga duración que pueden escalar a grandes cantidades de datos. Por el momento en el servidor de MLflow no tiene esta funcionalidad, aunque se puede lograr una funcionalidad similar mediante trabajos de Spark. Para más información sobre los puntos de conexión por lotes y los modelos de MLflow, consulte Uso de modelos de MLflow en implementaciones por lotes.

Las secciones siguientes se centran más en los modelos de MLflow implementados en puntos de conexión en línea de Azure Machine Learning.

Formatos de entrada

Tipo de entrada Servidor integrado de MLflow Puntos de conexión en línea de Azure Machine Learning
Dataframes de Pandas serializados con JSON en la orientación dividida
Dataframes de Pandas serializados con JSON en la orientación de registros Obsoleto
Dataframes de Pandas serializados como CSV Uso por lotes1
Formato de entrada de Tensor como listas serializadas con JSON (tensores) y diccionario de listas (tensores con nombre)
Entrada de Tensor con el formato como en la API de TF Serving

1 Considere la posibilidad de usar la inferencia por lotes para procesar archivos. Para más información, consulte Implementación de modelos de MLflow en puntos de conexión por lotes.

Estructura de entrada

Independientemente del tipo de entrada utilizado, Azure Machine Learning requiere que se proporcionen entradas en una carga JSON, dentro de una clave de diccionario input_data. Dado que esta clave no es necesaria al usar el comando mlflow models serve para modelos de servicio, las cargas no se pueden usar indistintamente para los puntos de conexión en línea de Azure Machine Learning y el servidor integrado de MLflow.

Importante

Nota sobre MLflow 2.0: la estructura de las cargas cambió en MLflow 2.0.

En esta sección se muestran varios ejemplos de carga y las diferencias de un modelo implementado en el servidor integrado de MLflow y el servidor de inferencia de Azure Machine Learning.

Ejemplo de carga para dataframe de Pandas serializados con JSON en la orientación dividida

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

Ejemplo de carga para una entrada de tensor

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

Ejemplo de carga para una entrada de tensor con nombre

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

Para obtener más información sobre las herramientas de implementación integradas de MLflow, vea herramientas de implementación integradas en la documentación de MLflow.

Personalizar la inferencia al implementar modelos de MLflow

Puede usarse para crear scripts de puntuación para personalizar cómo se ejecuta la inferencia para los modelos personalizados. Pero, al implementar modelos de MLflow en Azure Machine Learning, la decisión sobre cómo se debe ejecutar la inferencia la toma el generador de modelos (esto es, la persona que creó el modelo), y no el ingeniero de DevOps (esto es, la persona que trata de implementarlo). Cada marco de modelo podría aplicar automáticamente rutinas de inferencia específicas.

En cualquier momento, si necesita cambiar cómo se ejecuta la inferencia de un modelo de MLflow, puede realizar una de estas dos acciones:

  • Cambie cómo se registra el modelo en la rutina de entrenamiento.
  • Personalización de la inferencia con un script de puntuación en el momento de la implementación.

Cambio del modo en se registra el modelo durante el entrenamiento

Al registrar un modelo con mlflow.autolog o mlflow.<flavor>.log_model, el tipo usado para el modelo decide cómo debe ejecutarse la inferencia y qué resultado devuelve el modelo. MLflow no impone ningún comportamiento específico en cuanto a cómo genera resultados la función predict().

Sin embargo, hay escenarios en los que es probable que quiera realizar algún procesamiento previo o posterior antes y después de ejecutar el modelo. En otras ocasiones, es posible que quiera cambiar lo que se devuelve (por ejemplo, probabilidades frente a clases). Una solución es implementar canalizaciones de aprendizaje automático que se mueven de las entradas a las salidas directamente. Por ejemplo, sklearn.pipeline.Pipeline o pyspark.ml.Pipeline son formas populares de implementar canalizaciones y, a veces, se recomiendan para tener en cuenta el rendimiento. Otra alternativa es personalizar la forma en que el modelo realiza la inferencia mediante un tipo de modelo personalizado.

Personalización de la inferencia con un script de puntuación

Aunque los modelos de MLflow no requieren un script de puntuación, puede proporcionar uno si es necesario. Puede usar el script de puntuación para personalizar cómo se ejecuta la inferencia con los modelos de MLflow. Para obtener información sobre cómo personalizar inferencias, vea Personalización de implementaciones de modelos de MLflow (puntos de conexión en línea) y Personalización de implementaciones de modelos de MLflow (puntos de conexión por lotes).

Importante

Si elige suministrar un script de puntuación de una implementación de modelo de MLflow, también debe especificar un entorno para la implementación.

Herramientas de implementación

Azure Machine Learning ofrece muchas maneras de implementar modelos de MLflow en puntos de conexión en línea y por lotes. Se pueden implementar modelos con las siguientes herramientas:

  • MLflow SDK
  • CLI de Azure Machine Learning
  • SDK de Azure Machine Learning para Python
  • Azure Machine Learning Studio

Cada flujo de trabajo tiene distintas funcionalidades, especialmente en torno al tipo de proceso al que pueden dirigirse. En la tabla siguiente se muestran los distintas funcionalidades.

Escenario MLflow SDK CLI o SDK de Azure Machine Learning Azure Machine Learning Studio
Implementación en puntos de conexión en línea administrados Ver ejemplo1 Ver ejemplo1 Ver ejemplo1
Implementación en puntos de conexión en línea administrados (con un script de puntuación) No se admite3 Ver ejemplo Ver ejemplo
Implementación en puntos de conexión por lotes No se admite3 Ver ejemplo Ver ejemplo
Implementación en puntos de conexión por lotes (con un script de puntuación) No se admite3 Ver ejemplo Ver ejemplo
Implementación en servicios web (ACI/AKS) Compatibilidad heredada2 No compatible2 No compatible2
Implementación en servicios web (ACI/AKS, con un script de puntuación) No se admite3 Compatibilidad heredada2 Compatibilidad heredada2

1 La implementación en puntos de conexión en línea que están en áreas de trabajo con el vínculo privado habilitado requiere que empaquete los modelos antes de la implementación (versión preliminar).

2 En su lugar, se recomienda cambiar a los puntos de conexión en línea administrados.

3 MLflow (OSS) no tiene el concepto de script de puntuación y no admite actualmente la ejecución por lotes.

¿Qué herramienta de implementación se va a usar?

  • Use el SDK de MLflow si se aplican ambas de estas condiciones:

    • Está familiarizado con MLflow o usa una plataforma que admite MLflow de forma nativa (como Azure Databricks).
    • Desea seguir usando el mismo conjunto de métodos de MLflow.
  • Use la CLI de Azure Machine Learning v2 si se aplican cualquiera de estas condiciones:

    • Está más familiarizado con la CLI de Azure Machine Learning v2
    • Quiere automatizar las implementaciones mediante canalizaciones de automatización.
    • Quiere mantener la configuración de implementación en un repositorio git.
  • Use la implementación de UI de Estudio de Azure Machine Learning si quiere implementar y probar rápidamente modelos entrenados con MLflow.