Consulta y comparación de experimentos y ejecuciones con MLflow

Los experimentos y trabajos (o ejecuciones) en Azure Machine Learning se pueden consultar utilizando MLflow. No es necesario instalar ningún SDK específico para administrar lo que sucede dentro de un trabajo de entrenamiento, gracias a lo cual se genera una transición más fluida entre ejecuciones locales y la nube por la eliminación de las dependencias específicas de 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.

MLflow le permite:

  • 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 v2 de Python para Azure Machine Learning no proporciona funcionalidades nativas de registro o seguimiento. Esto no solo se aplica al registro, sino también para la consulta de 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. Consulte Uso de MLflow REST con Azure Machine Learning para ver un ejemplo sobre cómo consumirlo.

Requisitos previos

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

    pip install mlflow azureml-mlflow
    

    Sugerencia

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

  • Un área de trabajo de Azure Machine Learning. Puede crear uno siguiendo el tutorial Creación de recursos de aprendizaje automático.

  • Si va a realizar el seguimiento remoto (es decir, los experimentos de seguimiento 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 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 método search_experiments(), 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 en qué experimentos se desea buscar. También puede indicar 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)
    

Tenga en cuenta que experiment_ids permite proporcionar una matriz de experimentos, por lo que podrá buscar ejecuciones en varios experimentos si fuera necesario. Esto podría resultar útil en caso de que quiera comparar ejecuciones del mismo modelo cuando se registra en diferentes experimentos (por ejemplo: por personas diferentes o iteraciones de proyectos diferentes).

Importante

Si experiment_ids, experiment_names o search_all_experiments no se especificasen, MLflow buscará de forma predeterminada en el experimento activo actual. Establezca el experimento activo mediante mlflow.set_experiment().

De manera predeterminada, MLflow devuelve los datos en formato Pandas Dataframe, lo que resulta útil cuando se procesa más a fondo el análisis de las ejecuciones. Los datos devueltos incluyen columnas con:

  • Información básica sobre la ejecución.
  • Parámetros con el nombre de columna params.<parameter-name>.
  • Métricas (último valor registrado de cada una) con el nombre 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 quiere recuperar todos los valores de una métrica determinada, use el método mlflow.get_metric_history. Consulte Obtención de parámetros y métricas de una ejecución para ver un ejemplo.

Ejecuciones de pedidos

De manera predeterminada, los experimentos se ordenan de forma descendente por start_time, que es el momento en el que el experimento se encontraba en la cola en Azure Machine Learning. Sin embargo, puede cambiar este valor predeterminado mediante el parámetro order_by.

  • 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 el software de código abierto de MLflow, pero se proporciona en Azure Machine Learning para mayor comodidad.

  • El orden se ejecuta por los valores de la métrica:

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

    Advertencia

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

Filtrado de ejecuciones

También puede buscar una ejecución con una combinación específica en los hiperparámetros mediante el parámetro filter_string. Se utiliza params para acceder a los parámetros de la 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 la 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 el software de código abierto de MLflow, pero se proporciona en Azure Machine Learning 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 al estado posible diferente 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 attributes.status de MLFlow Significado
Sin iniciar Scheduled Azure Machine Learning recibió el trabajo o la ejecución.
Cola Scheduled El trabajo o la ejecución está programado para ejecutarse, pero aún no se ha iniciado.
Preparing (En preparación) Scheduled El trabajo o la ejecución aún no se han iniciado, pero se asignó un proceso para su ejecución y se está preparando el entorno y sus entradas.
En ejecución Running El trabajo o ejecución se encuentra actualmente en ejecución activa.
Completado Finished El trabajo o ejecución se completó sin errores.
Con error Failed El trabajo o ejecución se completó con errores.
Canceled Killed El usuario canceló el trabajo o la ejecución, o se finalizó por el sistema.

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",
)

Se puede acceder a los detalles desde el 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

Cuando se devuelven ejecuciones mediante output_format="list", puede acceder fácilmente a 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 quiere recuperar todos los valores de una métrica determinada, use el método mlflow.get_metric_history. 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 de ejecución y se debería usar el cliente de MLflow en su lugar:

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

Los modelos también se pueden registrar en la ejecución y, a continuación, recuperarse directamente desde esta. Para recuperar un modelo, es necesario conocer la ruta de acceso al artefacto donde se almacene. El método list_artifacts se puede usar para buscar artefactos que representen 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
)

Después, puede volver a cargar el modelo desde los artefactos descargados mediante la función típica load_model en el espacio de nombres específico del tipo. 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 de propiedad mlflow.parentRunId, que contiene el id. 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 o 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 sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Captura 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.