Compartir a través de


Consulta y comparación de experimentos y ejecuciones con MLflow

Puede usar MLflow para consultar experimentos y trabajos (o ejecuciones) en Azure Machine Learning. No es necesario instalar ningún SDK específico para administrar lo que sucede dentro de un trabajo de entrenamiento. Al quitar dependencias específicas de la nube, obtendrá una transición más fluida entre las ejecuciones locales y la nube. En este artículo, aprenderá a consultar y comparar experimentos y ejecuciones en el área de trabajo mediante Azure Machine Learning y el SDK de MLflow en Python.

Con MLflow, puede hacer lo siguiente:

  • Crear, consultar, eliminar y buscar experimentos en un área de trabajo.
  • Consultar, eliminar y buscar ejecuciones en un área de trabajo.
  • Realizar el seguimiento y recuperar métricas, parámetros, artefactos y modelos a partir de ejecuciones.

Para obtener una comparación detallada entre MLflow de código abierto y MLflow al conectarse a Azure Machine Learning, consulte Matriz de compatibilidad para consultar ejecuciones y experimentos en Azure Machine Learning.

Nota:

El SDK de Python de Azure Machine Learning v2 no proporciona funcionalidades nativas de registro ni seguimiento. Esta limitación se aplica no solo al registro, sino también a consultar las métricas registradas. En su lugar, use MLflow para administrar experimentos y ejecuciones. En este artículo se explica cómo usar MLflow para administrar experimentos y ejecuciones en Azure Machine Learning.

También es posible consultar y buscar experimentos y ejecuciones mediante la API de REST de MLflow. Para obtener un ejemplo sobre cómo consumirlo, consulte Uso de REST de MLflow con Azure Machine Learning.

Requisitos previos

  • Instale el paquete del SDK mlflow de MLflow y el complemento de Azure Machine Learning azureml-mlflow para MLflow:

    pip install mlflow azureml-mlflow
    

    Sugerencia

    Puede usar el paquete de mlflow-skinny, que es un paquete de MLflow ligero sin dependencias de almacenamiento de SQL, servidor, interfaz de usuario o ciencia de datos. Se recomienda este paquete para los usuarios que necesitan principalmente las funcionalidades de seguimiento y registro de MLflow, pero no para el conjunto completo de características, incluidas las implementaciones.

  • Cree un área de trabajo de Azure Machine Learning. Para crear un área de trabajo, consulte Crear recursos que necesita para empezar. Revise los permisos de acceso que necesita para realizar operaciones de MLflow en el área de trabajo.

  • Para realizar el seguimiento remoto o realizar el seguimiento de experimentos que se ejecutan fuera de Azure Machine Learning, configure MLflow para que apunte al URI de seguimiento del área de trabajo de Azure Machine Learning. Para más información sobre cómo conectar MLflow al área de trabajo, consulte Configuración de MLflow para Azure Machine Learning.

Consulta y búsqueda de experimentos

Use MLflow para buscar experimentos dentro del área de trabajo. Consulte los siguientes ejemplos:

  • Obtener todos los experimentos activos:

    mlflow.search_experiments()
    

    Nota:

    En las versiones heredadas de MLflow (<2.0), use el método mlflow.list_experiments() en su lugar.

  • Obtenga todos los experimentos, incluidos los experimentos archivados:

    from mlflow.entities import ViewType
    
    mlflow.search_experiments(view_type=ViewType.ALL)
    
  • Obtenga un experimento específico por nombre:

    mlflow.get_experiment_by_name(experiment_name)
    
  • Obtenga un experimento específico por Id.:

    mlflow.get_experiment('1234-5678-90AB-CDEFG')
    

Experimentos de búsqueda

El search_experiments() método, disponible desde Mlflow 2.0, permite buscar experimentos que coincidan con criterios mediante filter_string.

  • Recupere varios experimentos en función de sus Id.:

    mlflow.search_experiments(filter_string="experiment_id IN ("
        "'CDEFG-1234-5678-90AB', '1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')"
    )
    
  • Recupere todos los experimentos creados después de un tiempo determinado:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_experiments(filter_string=f"creation_time > {int(dt.timestamp())}")
    
  • Recupere todos los experimentos con una etiqueta determinada:

    mlflow.search_experiments(filter_string=f"tags.framework = 'torch'")
    

Ejecución de consultas y búsquedas

MLflow permite realizar búsquedas de ejecuciones dentro de cualquier experimento o, incluso, de varios al mismo tiempo. El método mlflow.search_runs() acepta los argumentos experiment_ids y experiment_name para indicar qué experimentos desea buscar. También puede establecer search_all_experiments=True si desea buscar en todos los experimentos del área de trabajo:

  • Por nombre del experimento:

    mlflow.search_runs(experiment_names=[ "my_experiment" ])
    
  • Por id. de experimento:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ])
    
  • Busque en todos los experimentos del área de trabajo:

    mlflow.search_runs(filter_string="params.num_boost_round='100'", search_all_experiments=True)
    

El experiment_ids argumento admite proporcionar un conjunto de experimentos, de modo que pueda buscar entre varios experimentos. Esta característica es útil si desea comparar ejecuciones del mismo modelo cuando se registra en diferentes experimentos (por ejemplo, por diferentes personas o iteraciones de proyectos diferentes).

Importante

Si no especifica experiment_ids, experiment_nameso search_all_experiments, MLflow busca de forma predeterminada en el experimento activo actual. Puede establecer el experimento activo mediante mlflow.set_experiment().

De forma predeterminada, MLflow devuelve los datos en formato Pandas Dataframe , lo que hace que sea útil al realizar más procesamiento o análisis de las ejecuciones. Los datos devueltos incluyen columnas con:

  • Información básica sobre la ejecución.
  • Parámetros con nombres de columna params.<parameter-name>.
  • Métricas (último valor registrado de cada métrica) con nombres de columna metrics.<metric-name>.

Todas las métricas y parámetros también se devuelven al realizar consultas. Sin embargo, para las métricas que contengan varios valores (por ejemplo, una curva de pérdida o una curva de PR), solo se devolverá el último valor de la métrica. Si desea recuperar todos los valores de una métrica determinada, use el mlflow.get_metric_history método . Consulte Obtención de parámetros y métricas de una ejecución para ver un ejemplo.

Ejecuciones de pedidos

De forma predeterminada, el portal muestra experimentos en orden descendente por start_time, que es la hora en la que ha puesto en cola el experimento en Azure Machine Learning. Sin embargo, puede cambiar este orden predeterminado mediante el order_by parámetro .

  • El orden se lleva a cabo por atributos, como start_time:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ],
                       order_by=["attributes.start_time DESC"])
    
  • Ordene ejecuciones y limite los resultados. En el ejemplo siguiente se devuelve la última ejecución única del experimento:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       max_results=1, order_by=["attributes.start_time DESC"])
    
  • La orden se ejecuta mediante el atributo duration:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       order_by=["attributes.duration DESC"])
    

    Sugerencia

    attributes.duration no está presente en MLflow OSS, pero Azure Machine Learning lo proporciona para mayor comodidad.

  • Ordenar las ejecuciones por valores de métrica

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ]).sort_values("metrics.accuracy", ascending=False)
    

    Advertencia

    El order_by parámetro no admite actualmente expresiones que contengan metrics.*, params.*o tags.*. En su lugar, use el método sort_values de Pandas, tal y como se muestra en el ejemplo.

Filtrado de ejecuciones

Puede usar el filter_string parámetro para buscar ejecuciones con una combinación específica de hiperparámetros. Use params para acceder a los parámetros de una ejecución, metrics para acceder a las métricas registradas en la ejecución y attributes para acceder a los detalles de la información de ejecución. MLflow admite expresiones unidas por la palabra clave AND (la sintaxis no admite OR):

  • La búsqueda se ejecuta según el valor de un parámetro:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="params.num_boost_round='100'")
    

    Advertencia

    Solo se admiten los operadores =, likey != para filtrar parameters.

  • Buscar ejecuciones en función del valor de una métrica:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="metrics.auc>0.8")
    
  • Buscar ejecuciones con una etiqueta determinada:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="tags.framework='torch'")
    
  • Buscar ejecuciones creadas por un usuario determinado:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.user_id = 'John Smith'")
    
  • Buscar ejecuciones con errores. Consulte Filtrado de ejecuciones por estado para ver los valores posibles:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.status = 'Failed'")
    
  • Buscar ejecuciones creadas después de un tiempo determinado:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.creation_time > '{int(dt.timestamp())}'")
    

    Sugerencia

    Para la clave attributes, los valores deben ser siempre cadenas y, por tanto, estar codificados entre comillas.

  • Ejecuciones de búsqueda que tardan más de una hora:

    duration = 360 * 1000 # duration is in milliseconds
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.duration > '{duration}'")
    

    Sugerencia

    attributes.duration no está presente en MLflow OSS, pero Azure Machine Learning lo proporciona para mayor comodidad.

  • Ejecuciones de búsqueda que tienen el identificador en un conjunto determinado:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.run_id IN ('1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')")
    

Filtrado de ejecuciones por estado

Al filtrar las ejecuciones por estado, MLflow usa una convención diferente para asignar un nombre a los distintos estados posibles de una ejecución en comparación con Azure Machine Learning. En la tabla siguiente, se muestran los valores posibles:

Estado del trabajo de Azure Machine Learning de MLflow attributes.status Significado
No iniciado Scheduled Azure Machine Learning recibe el trabajo o la ejecución.
Cola Scheduled La tarea o el proceso está programado para ejecutarse, pero aún no se inicia.
Preparando Scheduled El trabajo o la ejecución aún no se han iniciado, pero se asigna un recurso de cálculo para su ejecución, y se está preparando el entorno y los datos de entrada.
En ejecución Running El trabajo o proceso se está ejecutando activamente.
Completed Finished El trabajo o la ejecución se completa sin errores.
Con error Failed El trabajo o la ejecución se completa con errores.
Cancelado Killed El usuario cancela el trabajo o la ejecución, o el sistema lo finaliza.

Ejemplo:

mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                   filter_string="attributes.status = 'Failed'")

Obtención de métricas, parámetros, artefactos y modelos

El método search_runs devuelve un Pandas Dataframe que contiene una cantidad limitada de información de forma predeterminada. En caso necesario, es posible obtener objetos de Python que pudieran ser útiles para ver más detalles sobre estos. Use el output_format parámetro para controlar cómo se devuelve la salida:

runs = mlflow.search_runs(
    experiment_ids=[ "1234-5678-90AB-CDEFG" ],
    filter_string="params.num_boost_round='100'",
    output_format="list",
)

Puede acceder a los detalles del miembro info. En el siguiente ejemplo se muestra cómo obtener run_id:

last_run = runs[-1]
print("Last run ID:", last_run.info.run_id)

Obtención de parámetros y métricas de una ejecución

Al devolver ejecuciones mediante output_format="list", puede acceder fácilmente a los parámetros mediante la clave data:

last_run.data.params

De la misma manera, puede consultar las métricas:

last_run.data.metrics

Para las métricas que contienen varios valores (por ejemplo, una curva de pérdida o una curva PR), solo se devuelve el último valor registrado de la métrica. Si desea recuperar todos los valores de una métrica determinada, use el mlflow.get_metric_history método . Este método requiere que use MlflowClient:

client = mlflow.tracking.MlflowClient()
client.get_metric_history("1234-5678-90AB-CDEFG", "log_loss")

Obtención de artefactos de una ejecución

MLflow puede consultar cualquier artefacto registrado por una ejecución. No se puede acceder a los artefactos mediante el propio objeto run. En su lugar, use el cliente MLflow:

client = mlflow.tracking.MlflowClient()
client.list_artifacts("1234-5678-90AB-CDEFG")

El método anterior 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 = mlflow.artifacts.download_artifacts(
    run_id="1234-5678-90AB-CDEFG", artifact_path="feature_importance_weight.png"
)

Nota:

En las versiones heredadas de MLflow (<2.0), use el método MlflowClient.download_artifacts() en su lugar.

Obtención de modelos de una ejecución

Puede registrar modelos en la ejecución y, a continuación, recuperarlos directamente. Para recuperar un modelo, es necesario conocer la ruta de acceso al artefacto donde se almacene. Use el list_artifacts método para buscar artefactos que representan un modelo, ya que los modelos de MLflow siempre son carpetas. Descargue un modelo de manera que especifique la ruta de acceso donde se almacene el modelo mediante el método download_artifact:

artifact_path="classifier"
model_local_path = mlflow.artifacts.download_artifacts(
  run_id="1234-5678-90AB-CDEFG", artifact_path=artifact_path
)

A continuación, puede volver a cargar el modelo desde los artefactos descargados mediante la función load_model típica en el espacio de nombres específico del sabor. En el ejemplo siguiente se usa xgboost:

model = mlflow.xgboost.load_model(model_local_path)

MLflow también permite realizar ambas operaciones a la vez y descargar y cargar el modelo en una sola instrucción. MLflow descarga el modelo en una carpeta temporal y lo carga desde allí. El método load_model usa un formato URI para indicar desde dónde se debe recuperar el modelo. En el caso de cargar un modelo desde una ejecución, la estructura de URI es la siguiente:

model = mlflow.xgboost.load_model(f"runs:/{last_run.info.run_id}/{artifact_path}")

Sugerencia

Para consultar y cargar modelos registrados en el registro de modelos, consulte Administración de registros de modelos en Azure Machine Learning con MLflow.

Obtención de ejecuciones secundarias (anidadas)

MLflow admite el concepto de ejecuciones secundarias (anidadas). Estas ejecuciones resultan útiles cuando es necesario poner en marcha rutinas de entrenamiento que se deben seguir de forma independientemente del proceso de entrenamiento principal. Los procesos de optimización del ajuste de hiperparámetros o las canalizaciones de Azure Machine Learning son ejemplos típicos de trabajos que generan varias ejecuciones secundarias. Puede consultar todas las ejecuciones secundarias de una ejecución específica mediante la etiqueta mlflow.parentRunIdde propiedad , que contiene el identificador de ejecución de la ejecución primaria.

hyperopt_run = mlflow.last_active_run()
child_runs = mlflow.search_runs(
    filter_string=f"tags.mlflow.parentRunId='{hyperopt_run.info.run_id}'"
)

Comparación de trabajos y modelos en Estudio de Azure Machine Learning (versión preliminar)

Para comparar y evaluar la calidad de los trabajos y modelos en Estudio de Azure Machine Learning, use el panel de vista previa para habilitar la característica. Una vez habilitado, puede comparar los parámetros, las métricas y las etiquetas entre los trabajos y los modelos seleccionados.

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Se ofrece la versión preliminar sin Acuerdo de Nivel de Servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no se admitan o que tengan funcionalidades restringidas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Recorte de pantalla del panel de vista previa que muestra cómo comparar trabajos y modelos en Estudio de Azure Machine Learning.

En MLflow con cuadernos de Azure Machine Learning se demuestran y se analizan con mayor profundidad los conceptos presentados en este artículo.

Matriz de compatibilidad para consultas de ejecuciones y experimentos

El SDK de MLflow expone varios métodos para recuperar ejecuciones, incluidas opciones para controlar lo que se devuelve y de qué manera. Consulte la tabla siguiente para obtener información sobre cuáles de esos métodos se admiten actualmente en MLflow cuando se conecta a Azure Machine Learning:

Característica Compatible con MLflow Compatible con Azure Machine Learning
Ordenación de ejecuciones por atributos
Ordenación de ejecuciones por métricas 1
Ordenación de ejecuciones por parámetros 1
Ordenación de ejecuciones por etiquetas 1
Filtrado de ejecuciones por atributos
Filtrado de ejecuciones por métricas
Filtrado de ejecuciones por métricas con caracteres especiales (con escape)
Filtrado de ejecuciones por parámetros
Filtrado de ejecuciones por etiquetas
Filtrado de ejecuciones con comparadores numéricos (métricas), como =, !=, >, >=, < y <=
Filtrado de ejecuciones con comparadores de cadenas (parámetros, etiquetas y atributos): = y != 2
Filtrado de ejecuciones con comparadores de cadenas (parámetros, etiquetas y atributos): LIKE/ILIKE
Filtrado de ejecuciones con comparadores AND
Filtrado de ejecuciones con comparadores OR
Cambio de nombre de experimentos

Nota:

  • 1 Consulte la sección Ordenar ejecuciones para ver instrucciones y ejemplos sobre cómo lograr la misma funcionalidad en Azure Machine Learning.
  • 2!= para etiquetas no admitidas.