Registro de métricas, parámetros y archivos con MLflow

SE APLICA A: SDK de Python azure-ai-ml v2 (actual)

Azure Machine Learning admite el registro y el seguimiento de experimentos mediante MLflow Tracking. Puede registrar modelos, métricas, parámetros y artefactos con MLflow, ya sea localmente en el equipo o en un entorno de nube.

Importante

A diferencia del SDK v1 de Azure Machine Learning, no hay ninguna funcionalidad de registro en el SDK de Azure Machine Learning para Python (v2). Si ha usado el SDK de Azure Machine Learning v1 antes, se recomienda aprovechar MLflow para realizar el seguimiento de experimentos. Consulte Migración del registro de SDK v1 a MLflow para obtener instrucciones específicas.

Los registros pueden ayudarle a diagnosticar errores y advertencias, o a realizar un seguimiento de las métricas de rendimiento, como los parámetros y el rendimiento del modelo. En este artículo se explica cómo habilitar el registro en los siguientes escenarios:

  • Registro de métricas, parámetros y modelos al enviar trabajos.
  • Seguimiento de las ejecuciones cuando se entrena de forma interactiva.
  • Visualización de información de diagnóstico sobre el entrenamiento.

Sugerencia

En este artículo se muestra cómo supervisar el proceso de entrenamiento del modelo. Si está interesado en la supervisión del uso de los recursos y eventos desde Azure Machine Learning, como las cuotas o los trabajos de entrenamiento o implementaciones de modelos completados, puede consultar Supervisión de Azure Machine Learning.

Requisitos previos

  • Debe tener un área de trabajo de Azure Machine Learning. Si no tiene, consulte Creación de recursos de área de trabajo.

  • Debe tener instalados los paquetes mlflow y azureml-mlflow. Si no los tiene, use el siguiente comando para instalarlos en el entorno de desarrollo:

    pip install mlflow azureml-mlflow
    
  • Si va a realizar el seguimiento remoto (experimentos de seguimiento que se ejecutan fuera de Azure Machine Learning), configure MLflow para realizar un seguimiento de los experimentos. Para más información, consulte Configuración de MLflow para Azure Machine Learning.

  • Para registrar métricas, parámetros, artefactos y modelos en los experimentos de Azure Machine Learning mediante MLflow, simplemente importe MLflow en el script:

    import mlflow
    

Configuración de experimentos

MLflow organiza la información en experimentos y ejecuciones (en Azure Machine Learning, las ejecuciones se denominan trabajos). Hay algunas diferencias en cómo configurarlas en función de cómo ejecutar el código:

Al entrenar de forma interactiva, como en un Jupyter Notebook, use el siguiente patrón:

  1. Cree o establezca el experimento activo.
  2. Inicie el trabajo.
  3. Use métodos de registro para registrar métricas y otra información.
  4. Finalice el trabajo.

Por ejemplo, el siguiente fragmento de código configura el experimento y, a continuación, registra durante un trabajo:

import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")

# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run 
mlflow.end_run()

Sugerencia

Técnicamente no es necesario llamar a start_run() porque una nueva ejecución se crea si no existe y se llama a una API de registro. En ese caso, puede usar mlflow.active_run() para recuperar la ejecución que se está usando actualmente. Para obtener más información, consulte mlflow.active_run().

También puede usar el paradigma del administrador de contextos:

import mlflow
mlflow.set_experiment("mlflow-experiment")

# Start the run, log metrics, end the run
with mlflow.start_run() as run:
    # Run started when context manager is entered, and ended when context manager exits
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)
    pass

Al iniciar una nueva ejecución con mlflow.start_run, puede ser útil indicar el parámetro run_name que, a continuación, se traducirá al nombre de la ejecución en la interfaz de usuario de Azure Machine Learning y le ayuda a identificar la ejecución más rápido:

with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)

Para más información sobre las API de registro de MLflow, consulte la referencia de MLflow.

Parámetros de registro

MLflow admite los parámetros de registro usados por los experimentos. Los parámetros pueden ser de cualquier tipo y se pueden registrar con la sintaxis siguiente:

mlflow.log_param("num_epochs", 20)

MLflow también ofrece una manera cómoda de registrar varios parámetros indicando todos ellos mediante un diccionario. Varios marcos también pueden pasar parámetros a modelos mediante diccionarios y, por lo tanto, es una manera cómoda de registrarlos en el experimento.

params = {
    "num_epochs": 20,
    "dropout_rate": .6,
    "objective": "binary_crossentropy"
}

mlflow.log_params(params)

Métricas de registro

Las métricas, en oposición a los parámetros, siempre son numéricas. En la tabla siguiente se describe cómo registrar tipos numéricos específicos:

Valor registrado Ejemplo de código Notas
Registrar un valor numérico (int o float) mlflow.log_metric("my_metric", 1)
Registro de un valor numérico (int o float) en el tiempo mlflow.log_metric("my_metric", 1, step=1) Use el parámetro step para indicar el paso en el que se registra el valor de la métrica. Puede ser cualquier número entero. El valor predeterminado es cero.
Registrar un valor booleano mlflow.log_metric("my_metric", 0) 0 = True, 1 = False

Importante

Consideraciones sobre el rendimiento: Si necesita registrar varias métricas (o varios valores para la misma métrica), evite realizar llamadas a mlflow.log_metric en bucles. Se puede lograr un mejor rendimiento registrando un lote de métricas. Utilice el método mlflow.log_metrics que acepta un diccionario con todas las métricas que desea registrar de una vez o utilice MLflowClient.log_batch que acepta múltiples tipos de elementos para el registro. Consulte Curvas de registro o lista de valores para obtener un ejemplo.

Curvas de registro o lista de valores

Las curvas (o una lista de valores numéricos) se pueden registrar con MLflow registrando la misma métrica varias veces. En el siguiente ejemplo se muestra cómo hacerlo:

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id, 
                 metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])

Imágenes de registro

MLflow admite dos formas de registrar imágenes. Ambas formas conservan la imagen dada como un artefacto dentro de la ejecución.

Valor registrado Ejemplo de código Notas
Registrar métricas de numpy u objetos de imagen de PIL mlflow.log_image(img, "figure.png") img debe ser una instancia de numpy.ndarray o PIL.Image.Image. figure.png es el nombre del artefacto generado dentro de la ejecución. No tiene que ser un archivo existente.
Registrar trazado de matlotlib o archivo de imagen mlflow.log_figure(fig, "figure.png") figure.png es el nombre del artefacto generado dentro de la ejecución. No tiene que ser un archivo existente.

Archivos de registro

En general, los archivos de MLflow se denominan artefactos. Puede registrar artefactos de varias maneras en Mlflow:

Valor registrado Ejemplo de código Notas
Registro de texto en un archivo de texto mlflow.log_text("text string", "notes.txt") El texto se conserva dentro de la ejecución en un archivo de texto con el nombre notes.txt.
Diccionarios de registro como archivos JSON y YAML mlflow.log_dict(dictionary, "file.yaml" dictionary es un objeto de diccionario que contiene toda la estructura que desea conservar como un archivo JSON o YAML.
Registro de un archivo trivial ya existente mlflow.log_artifact("path/to/file.pkl") Los archivos siempre se registran en la raíz de la ejecución. Si se proporciona artifact_path, el archivo se registra en una carpeta como se indica en ese parámetro.
Registro de todos los artefactos de una carpeta existente mlflow.log_artifacts("path/to/folder") La estructura de carpetas se copia en la ejecución, pero no se incluye la carpeta raíz indicada.

Sugerencia

Al registrar archivos grandes con log_artifact o log_model, es posible que encuentre errores de tiempo de espera antes de que se complete la carga del archivo. Considere la posibilidad de aumentar el valor de tiempo de espera ajustando la variable de entorno AZUREML_ARTIFACTS_DEFAULT_TIMEOUT. El valor predeterminado es 300 (segundos).

Modelos de registro

MLflow presenta el concepto de modelos como una manera de empaquetar todos los artefactos necesarios para que un modelo determinado funcione. Los modelos de MLflow siempre son una carpeta con un número arbitrario de archivos, en función del marco utilizado para generar el modelo. Los modelos de registro tienen la ventaja de realizar el seguimiento de todos los elementos del modelo como una sola entidad que se puede registrar y luego implementar. Además, los modelos de MLflow disfrutan de la ventaja de la implementación sin código y se pueden usar con el panel de IA responsable en Studio. Para obtener más información, consulte De artefactos a modelos en MLflow.

Para guardar el modelo de una ejecución de entrenamiento, use la log_model() API para el marco con el que trabaja. Por ejemplo, mlflow.sklearn.log_model(). Para obtener más información, consulte Registro de modelos de MLflow. Para migrar modelos existentes a MLflow, consulte Conversión de modelos personalizados a MLflow.

Sugerencia

Al registrar modelos grandes, es posible que encuentre el error Failed to flush the queue within 300 seconds. Por lo general, significa que la operación se interrumpe antes de que finalice la carga de los artefactos del modelo. Considere la posibilidad de aumentar el valor de tiempo de espera ajustando la variable de entorno AZUREML_ARTIFACTS_DEFAULT_TIMEOUT.

Registro automático

Con Azure Machine Learning y MLflow, los usuarios pueden registrar métricas, parámetros de modelo y artefactos de modelo automáticamente al entrenar un modelo. Cada marco decide automáticamente de qué debe realizarse el seguimiento. Se admiten diversas bibliotecas de aprendizaje automático populares. Obtenga más información sobre el registro automático con MLflow.

Para habilitar el registro automático, inserte el siguiente código antes del código de entrenamiento:

mlflow.autolog()

Sugerencia

Puede controlar lo que se registra automáticamente con el registro automático. Por ejemplo, si indica mlflow.autolog(log_models=False), MLflow registra todo menos los modelos. Este control resulta útil en los casos en los que se quiere registrar los modelos manualmente pero se disfruta del registro automático de métricas y parámetros. Tenga en cuenta también que algunos marcos pueden deshabilitar el registro automático de modelos si el modelo entrenado va más allá de límites específicos. Este comportamiento depende del tipo usado y le recomendamos que vea la documentación si este es su caso.

Visualización de la información de los trabajos o las ejecuciones con MLflow

Puede ver la información registrada mediante MLflow mediante el objeto MLflow.entities.Run:

import mlflow

run = mlflow.get_run(run_id="<RUN_ID>")

Puede ver las métricas, los parámetros y las etiquetas de la ejecución en el campo de datos del objeto de ejecución.

metrics = run.data.metrics
params = run.data.params
tags = run.data.tags

Nota

El diccionario de métricas que devuelve mlflow.get_run o mlflow.search_runs solo devuelve el valor registrado más recientemente para un nombre de métrica determinado. Por ejemplo, si registra una métrica denominada iteration varias veces con valores, 1, luego 2, luego 3, luego 4, solo se devuelve 4 al llamar a run.data.metrics['iteration'].

Para obtener todas las métricas registradas para un nombre de métrica concreto, puede usar MlFlowClient.get_metric_history() como se explica en el ejemplo Obtención de los parámetros y métricas de una ejecución.

Sugerencia

MLflow puede recuperar métricas y parámetros de varias ejecuciones al mismo tiempo, lo que permite realizar comparaciones rápidas entre varias pruebas. Para obtener más información, consulte Consulta y comparación de experimentos y ejecuciones con MLflow.

MLflow puede consultar cualquier artefacto registrado por una ejecución. No se puede acceder a los artefactos mediante el propio objeto de ejecución y se debería usar el cliente de MLflow en su lugar:

client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")

Este método enumera todos los artefactos registrados en la ejecución, pero permanecen almacenados en el almacén de artefactos (almacenamiento de Azure Machine Learning). Para descargar cualquiera de ellos, use el método download_artifact:

file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")

Para obtener más información, consulte Obtención de métricas, parámetros, artefactos y modelos.

Visualización de la información de trabajos o ejecuciones en Studio

Puede examinar los registros de ejecución completados, incluidas las métricas registradas, en Estudio de Azure Machine Learning.

Vaya a la pestaña Trabajos. Para ver todos los trabajos del área de trabajo entre experimentos, seleccione la pestaña Todos los trabajos. Puede explorar en profundidad los trabajos de experimentos específicos si aplica el filtro Experimento en la barra de menús superior. Seleccione el trabajo de interés para escribir la vista de detalles y, a continuación, seleccione la pestaña Métricas.

Seleccione las métricas registradas para representar gráficos en el lado derecho. Puede personalizar los gráficos aplicando suavizado, cambiando el color o trazando varias métricas en un solo gráfico. También puede cambiar el tamaño y reorganizar el diseño como quiera. Después de crear la vista deseada, puede guardarla para su uso futuro y compartirla con sus compañeros de equipo mediante un vínculo directo.

Captura de pantalla de la vista de métricas.

Visualización y descarga de registros de diagnóstico

Los archivos de registro son un recurso esencial para depurar las cargas de trabajo de Azure Machine Learning. Después de enviar un trabajo de entrenamiento, explore en profundidad hasta una ejecución específica para ver sus registros y salidas:

  1. Vaya a la pestaña Trabajos.
  2. Seleccione el identificador de la ejecución para ver una ejecución específica.
  3. Seleccione Resultados y registros en la parte superior de la página.
  4. Seleccione Descargar todo para descargar todos los registros en una carpeta comprimida.
  5. También puede descargar archivos de registro individuales eligiendo el archivo de registro y seleccionando Descargar.

Captura de pantalla de la sección de resultados y registros de una ejecución.

Carpeta user_logs

Esta carpeta contiene información sobre los registros generados por el usuario. Esta carpeta está abierta de forma predeterminada y el registro std_log.txt está seleccionado. El archivo std_log.txt es donde se muestran los registros del código (por ejemplo, instrucciones print). Este archivo contiene el registro stdout y los registros stderr del script de control y el script de entrenamiento, uno por proceso. En la mayoría de los casos, supervisa los registros aquí.

Carpeta system_logs

Esta carpeta contiene los registros que se generan en Azure Machine Learning y está cerrada de manera predeterminada. Los registros generados por el sistema se agrupan en diferentes carpetas, según el estado del trabajo del runtime.

Otras carpetas

Para el entrenamiento de trabajos en clústeres con varios procesos, los registros están presentes para cada nodo IP. La estructura de cada nodo es igual que la de los trabajos de un solo nodo. Hay una carpeta de registros adicional para los registros de ejecución general, stderr y stdout.

Azure Machine Learning registra información de varios orígenes durante el entrenamiento, como AutoML o el contenedor de Docker que ejecuta el trabajo de entrenamiento. Muchos de estos registros no están documentados. Si encuentra problemas y se pone en contacto con el Soporte técnico de Microsoft, es posible que puedan usar estos registros durante la resolución de problemas.

Pasos siguientes