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.
- Registrar métricas de forma asincrónica.
- 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
yazureml-mlflow
. Si no los tiene, use el siguiente comando para instalarlos en el entorno de desarrollo:pip install mlflow azureml-mlflow
Nota:
Para el registro asincrónico de métricas, debe tener
MLflow
versión 2.8.0+ yazureml-mlflow
versión 1.55+.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:
- Cree o establezca el experimento activo.
- Inicie el trabajo.
- Use métodos de registro para registrar métricas y otra información.
- 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 lugar de los parámetros, siempre son numéricas y se pueden registrar de forma sincrónica o asincrónica. Cuando se registran las métricas, están disponibles inmediatamente para su consumo tras la devolución de llamada. 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 mediante registro asincrónico con mlflow.log_metric("metric1", 9.42, synchronous=False)
o mediante el registro de un lote de métricas.
Métricas de registro de forma asincrónica
MLflow también permite el registro de métricas de forma asincrónica. El registro de métricas asincrónico es especialmente útil en los casos en los que los trabajos de entrenamiento de gran tamaño con decenas de nodos de proceso podrían estar ejecutándose e intentando registrar métricas simultáneamente. También es útil cuando un pequeño número de nodos intenta registrar un gran número de métricas.
El registro asincrónico de métricas permite registrar métricas inmediatamente evitando esperar a que se materialicen en el servicio back-end. Este enfoque se escala a grandes rutinas de entrenamiento que registran cientos de miles de valores de métricas y es el enfoque recomendado.
Sin embargo, las métricas de registros de MLflow se registran de forma sincrónica de forma predeterminada; sin embargo, puede cambiar este comportamiento en cualquiera hora:
import mlflow
mlflow.config.enable_async_logging()
Se puede establecer la misma propiedad mediante una variable de entorno:
export MLFLOW_ENABLE_ASYNC_LOGGING=True
Para registrar métricas específicas de forma asincrónica, use la API de registro de MLflow como lo haría normalmente, pero agregue el parámetro adicional synchronous=False
.
import mlflow
with mlflow.start_run():
# (...)
mlflow.log_metric("metric1", 9.42, synchronous=False)
# (...)
Cuando se usa log_metric(synchronous=False)
, el control se devuelve automáticamente al autor de la llamada una vez aceptada la operación; sin embargo, el valor no está disponible para leer de forma inmediata. El registro asincrónico de métricas garantiza el orden y se conservan con la marca de tiempo de cuando se registraron.
Importante
Incluso con synchronous=False
, Azure Machine Learning garantiza el orden de las métricas.
Si necesita esperar a que se conserve un valor determinado en el backend, puede usar la operación de métrica devuelta para esperar en él, como se muestra en el ejemplo siguiente:
import mlflow
with mlflow.start_run():
# (...)
run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
# (...)
run_operation.wait()
# (...)
Puede registrar de forma asincrónica una métrica a la vez o registrar un lote de métricas, como se muestra en el ejemplo siguiente:
import mlflow
import time
from mlflow.entities import Metric
with mlflow.start_run() as current_run:
mlflow_client = mlflow.tracking.MlflowClient()
metrics = {"metric-0": 3.14, "metric-1": 6.28}
timestamp = int(time.time() * 1000)
metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]
run_operation = mlflow_client.log_batch(
run_id=current_run.info.run_id,
metrics=metrics_arr,
synchronous=False,
)
La operación de wait()
también está disponible al registrar un lote de métricas:
run_operation.wait()
No tiene que llamar a wait()
en las rutinas si no necesita acceso inmediato a los valores de métrica. Azure Machine Learning espera automáticamente cuando el trabajo está a punto de finalizar para ver si hay alguna métrica pendiente que se va a conservar. En el momento en que se completa un trabajo en Azure Machine Learning, se garantiza que todas las métricas se persisten.
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. |
Trazado de matplotlib de registro 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
. Su 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. Además, tenga en cuenta que algunos marcos podrían 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 información sobre trabajos o 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 información sobre 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.
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:
- Vaya a la pestaña Trabajos.
- Seleccione el identificador de la ejecución para ver una ejecución específica.
- Seleccione Resultados y registros en la parte superior de la página.
- Seleccione Descargar todo para descargar todos los registros en una carpeta comprimida.
- También puede descargar archivos de registro individuales eligiendo el archivo de registro y seleccionando Descargar.
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 la misma que 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.