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:
azureml-inference-server-http
mlflow-skinny
- Un script de puntuación para 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.
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:
- Instalar la CLI de Azure y la extensión
ml
en la CLI de Azure. Para obtener más información sobre cómo instalar la CLI, consulte Instalación y configuración de la CLI (v2).
- Instalar la CLI de Azure y la extensión
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
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
Creación del punto de conexión:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
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: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Nota:
La generación automática de
scoring_script
yenvironment
solo se admite para el tipo de modelopyfunc
. Para usar otro tipo de modelo, consulte Personalización de implementaciones de modelos de MLflow.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
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 comandoaz 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.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 comandoaz 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:
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.
Cree un script de puntuación. Observe cómo el nombre de carpeta
model
que identificó anteriormente se incluye en la funcióninit()
.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.
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.
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
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