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.
- Paquetes necesarios para que Azure Machine Learning realice la inferencia, incluido
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.