Compartir vía


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, y sobre las distintas herramientas que puede usar para administrar las implementaciones.

Implementación sin código

Al implementar modelos de MLflow en Azure Machine Learning, a diferencia de la implementación de modelos personalizados, no es necesario proporcionar un script de puntuación ni un entorno. 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.

Paquetes y dependencias

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 ejemplo de archivo conda.yaml muestra las dependencias de Conda especificadas en un modelo de MLflow.

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

Importante

MLflow detecta automáticamente los paquetes cuando registra un modelo y ancla las versiones del paquete en las dependencias de Conda del modelo. Es posible que esta detección automática de paquetes no refleje sus intenciones o requisitos. También puede registrar modelos con una firma, un entorno o ejemplos personalizados.

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 garantiza 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 produce un error en la invocación del modelo.

Puede inspeccionar una firma de modelo de MLflow abriendo el archivo MLmodel. Para obtener más información sobre cómo funcionan las firmas en MLflow, consulte Firmas en MLflow.

El siguiente archivo MLmodel de ejemplo destaca el archivo signature.

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

Se recomiendan firmas en modelos de MLflow porque proporcionan una manera cómoda de detectar problemas de compatibilidad de datos. 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.

Implementación en el servidor integrado de MLflow frente a la implementación en el servidor de inferencia de Azure Machine Learning

Los desarrolladores de modelos pueden usar herramientas de implementación integradas de MLflow para probar modelos localmente. Por ejemplo, puede ejecutar una instancia local de un modelo registrado en el registro del servidor de MLflow mediante mlflow models serve o la CLI de MLflow mlflow models predict. 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.

Azure Machine Learning también 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 de Azure Machine Learning, similares al servidor integrado de MLflow, proporcionan una manera escalable, sincrónica y ligera de ejecutar modelos para la inferencia.

  • Los puntos de conexión por lotes de Azure Machine Learning pueden ejecutar inferencia asincrónica a través de procesos de inferencia de ejecución prolongada que se pueden escalar a grandes cantidades de datos. El servidor de MLflow carece de esta funcionalidad, aunque 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.

Formatos de entrada

En la siguiente tabla se muestran los tipos de entrada admitidos por el servidor integrado de MLflow frente a los puntos de conexión en línea de Azure Machine Learning.

Tipo de entrada Servidor integrado de MLflow Punto 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 Use la inferencia por lotes. Para más información, consulte Implementación de modelos de MLflow en puntos de conexión por lotes.
Entrada de TensorFlow como listas serializadas en JSON (tensores) y diccionario de listas (tensores con nombre)
Entrada de TensorFlow mediante la API de servicio de TensorFlow

Las siguientes secciones se centran en los modelos de MLflow que se implementan en puntos de conexión en línea de Azure Machine Learning.

Estructura de entrada

Independientemente del tipo de entrada, Azure Machine Learning requiere que proporcione entradas en una carga JSON en la clave de diccionario input_data. Esta clave no es necesaria cuando se usa el comando mlflow models serve para atender modelos, por lo que 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

La estructura de carga ha cambiado en MLflow 2.0.

Los siguientes ejemplos de carga muestran diferencias entre un modelo implementado en el servidor integrado de MLflow frente al servidor de inferencia de Azure Machine Learning.

DataFrame de Pandas serializado por 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]
        ]
    }
}

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]
    ]
}

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]
        ]
    }
}

Personalización de inferencia para modelos de MLflow

Los scripts de puntuación personalizan cómo ejecutar la inferencia para modelos personalizados. Pero para la implementación de modelo de MLflow, el generador de modelos toma la decisión sobre cómo ejecutar la inferencia en lugar del ingeniero de implementación. Cada marco de modelo puede aplicar automáticamente rutinas de inferencia específicas.

Si necesita cambiar cómo se ejecuta la inferencia para un modelo de MLflow, puede realizar una de las siguientes 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 mediante mlflow.autolog o mlflow.<flavor>.log_model, el tipo usado para el modelo determina cómo ejecutar la inferencia y los resultados que se van a devolver. MLflow no impone ningún comportamiento específico en cuanto a cómo genera resultados la función predict().

En algunos casos, puede que desee realizar preprocesamiento o procesamiento posterior antes y después de que se ejecute el modelo. O bien, es posible que desee cambiar lo que se devuelve; por ejemplo, probabilidades en lugar de 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 por motivos de rendimiento. También puede personalizar cómo realiza la inferencia del modelo registrando modelos personalizados.

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 para personalizar la ejecución de inferencia para los modelos de MLflow si es necesario. Para obtener más información sobre cómo personalizar la inferencia, consulte Personalización de implementaciones de modelos de MLflow para puntos de conexión en línea o Personalización de la implementación de modelos con script de puntuación para 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 las siguientes herramientas para implementar modelos de MLflow en puntos de conexión en línea y por lotes:

Cada herramienta tiene diferentes funcionalidades, especialmente para qué tipo de proceso puede tener como destino. En la siguiente tabla se muestra la compatibilidad con diferentes escenarios de implementación de MLflow.

Escenario MLflow SDK CLI SDK o estudio de Azure Machine Learning
Implementación en puntos de conexión en línea administrados1 Admitido. Consulte Implementación progresiva de modelos de MLflow en puntos de conexión en línea Admitido. Consulte Implementación de modelos MLflow en puntos de conexión en línea
Implementación en puntos de conexión en línea administrados con un script de puntuación No se admite3 Admitido. Consulte Personalización de las implementaciones de modelos de MLflow
Implementación en puntos de conexión por lotes No se admite3 Admitido. Consulte Uso de modelos de MLflow en implementaciones por lotes
Implementación en puntos de conexión por lotes con un script de puntuación No se admite3 Admitido. Consulte Personalización de la implementación de modelos con script de puntuación
Implementación en servicios web como Azure Container Instances o Azure Kubernetes Service (AKS) Compatibilidad heredada2 No compatible2
Implementación en servicios web como Container Instances o AKS con un script de puntuación No se admite3 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 Cambie a puntos de conexión en línea administrados si es posible.

3 MLflow de código abierto no tiene el concepto de script de puntuación y no admite la ejecución por lotes.

Elección de una herramienta de implementación

Use el SDK de MLflow si:

  • Está familiarizado con MLflow y quiere seguir usando los mismos métodos y
  • Usa una plataforma como Azure Databricks que admite MLflow de forma nativa.

Use la CLI de Azure Machine Learning v2 o el SDK para Python si:

  • Está familiarizado con ellos, o bien
  • Quiere automatizar la implementación con canalizaciones o
  • Quiere mantener la configuración de implementación en un repositorio de Git.

Use la interfaz de usuario de Estudio de Azure Machine Learning si desea implementar y probar rápidamente modelos entrenados con MLflow.