Migración del registro del SDK v1 a SDK v2

Azure Machine Learning solo usa el seguimiento de MLflow para el registro de métricas y el almacenamiento de artefactos para los experimentos, tanto si los ha creado a través del SDK de Python de Azure Machine Learning, la CLI de Azure Machine Learning o Azure Machine Learning studio. Se recomienda usar MLflow para realizar el seguimiento de experimentos.

Si va a migrar del SDK v1 al SDK v2, use la información de esta sección para comprender los valore equivalentes de MLflow de las API de registro del SDK v1.

¿Por qué MLflow?

MLflow, con más de 13 millones de descargas mensuales, se ha convertido en la plataforma estándar para MLOps de un extremo a otro, lo que permite a los equipos de todos los tamaños realizar un seguimiento, compartir, empaquetar e implementar cualquier modelo para la inferencia por lotes o en tiempo real. Azure Machine Learning se integra con MLflow, lo que permite que tu código de capacitación logre una verdadera portabilidad y una integración perfecta con otras plataformas, ya que no contiene instrucciones específicas de Azure Machine Learning.

Preparación para la migración a MLflow

Para usar el seguimiento de MLflow, debes instalar el paquete SDK de Mlflow mlflow y el complemento Azure Machine Learning para MLflow azureml-mlflow. Todos los entornos de Azure Machine Learning ya tienen estos paquetes disponibles, pero tendrás que incluirlos si crea su propio entorno.

pip install mlflow azureml-mlflow

Conexión con su área de trabajo

Azure Machine Learning permite a los usuarios realizar el seguimiento en trabajos de entrenamiento que se ejecutan en el área de trabajo o ejecutarse de forma remota (seguimiento de experimentos que se ejecutan fuera de Azure Machine Learning). Si realizas el seguimiento remoto, deberás indicar el área de trabajo a la que desea conectar MLflow.

Ya está conectado al área de trabajo cuando se ejecuta en el proceso de Azure Machine Learning.

Experimentos y ejecuciones

SDK v1

from azureml.core import Experiment

# create an Azure Machine Learning experiment and start a run
experiment = Experiment(ws, "create-experiment-sdk-v1")
azureml_run = experiment.start_logging()

SDK v2 con MLflow

# Set the MLflow experiment and start a run
mlflow.set_experiment("logging-with-mlflow")
mlflow_run = mlflow.start_run()

Comparación de API de registro

Registro de una métrica de tipo entero o float

SDK v1

azureml_run.log("sample_int_metric", 1)

SDK v2 con MLflow

mlflow.log_metric("sample_int_metric", 1)

Registro de un valor booleano

SDK v1

azureml_run.log("sample_boolean_metric", True)

SDK v2 con MLflow

mlflow.log_metric("sample_boolean_metric", 1)

Registro de una métrica de cadena

SDK v1

azureml_run.log("sample_string_metric", "a_metric")

SDK v2 con MLflow

mlflow.log_text("sample_string_text", "string.txt")
  • La cadena se registra como un artefacto, no como una métrica. En Estudio de Azure Machine Learning, el valor se muestra en la pestaña Salidas y registros.

Registro de una imagen en un archivo PNG o JPEG

SDK v1

azureml_run.log_image("sample_image", path="Azure.png")

SDK v2 con MLflow

mlflow.log_artifact("Azure.png")

La imagen se registra como un artefacto y aparece en la pestaña Imágenes de Estudio de Azure Machine Learning.

Registro de un elemento matplotlib.pyplot

SDK v1

import matplotlib.pyplot as plt

plt.plot([1, 2, 3])
azureml_run.log_image("sample_pyplot", plot=plt)

SDK v2 con MLflow

import matplotlib.pyplot as plt

plt.plot([1, 2, 3])
fig, ax = plt.subplots()
ax.plot([0, 1], [2, 3])
mlflow.log_figure(fig, "sample_pyplot.png")
  • La imagen se registra como un artefacto y aparece en la pestaña Imágenes de Estudio de Azure Machine Learning.

Registro de una lista de métricas

SDK v1

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
azureml_run.log_list('sample_list', list_to_log)

SDK v2 con MLflow

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

metrics = [Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log]
MlflowClient().log_batch(mlflow_run.info.run_id, metrics=metrics)
  • Las métricas aparecen en la pestaña Métricas de Estudio de Azure Machine Learning.
  • No se admiten los valores de texto.

Registro de una fila de métricas

SDK v1

azureml_run.log_row("sample_table", col1=5, col2=10)

SDK v2 con MLflow

metrics = {"sample_table.col1": 5, "sample_table.col2": 10}
mlflow.log_metrics(metrics)
  • Las métricas no se representan como una tabla en Estudio de Azure Machine Learning.
  • No se admiten los valores de texto.
  • Se registra como un artefacto, no como una métrica.

Registro de una tabla

SDK v1

table = {
"col1" : [1, 2, 3],
"col2" : [4, 5, 6]
}
azureml_run.log_table("table", table)

SDK v2 con MLflow

# Add a metric for each column prefixed by metric name. Similar to log_row
row1 = {"table.col1": 5, "table.col2": 10}
# To be done for each row in the table
mlflow.log_metrics(row1)

# Using mlflow.log_artifact
import json

with open("table.json", 'w') as f:
json.dump(table, f)
mlflow.log_artifact("table.json")
  • Registra las métricas de cada columna.
  • Las métricas no se representan como una tabla en Estudio de Azure Machine Learning.
  • No se admiten los valores de texto.
  • Se registra como un artefacto, no como una métrica.

Registro de una tabla de precisión

SDK v1

ACCURACY_TABLE = '{"schema_type": "accuracy_table", "schema_version": "v1", "data": {"probability_tables": ' +\
        '[[[114311, 385689, 0, 0], [0, 0, 385689, 114311]], [[67998, 432002, 0, 0], [0, 0, ' + \
        '432002, 67998]]], "percentile_tables": [[[114311, 385689, 0, 0], [1, 0, 385689, ' + \
        '114310]], [[67998, 432002, 0, 0], [1, 0, 432002, 67997]]], "class_labels": ["0", "1"], ' + \
        '"probability_thresholds": [0.52], "percentile_thresholds": [0.09]}}'

azureml_run.log_accuracy_table('v1_accuracy_table', ACCURACY_TABLE)

SDK v2 con MLflow

ACCURACY_TABLE = '{"schema_type": "accuracy_table", "schema_version": "v1", "data": {"probability_tables": ' +\
        '[[[114311, 385689, 0, 0], [0, 0, 385689, 114311]], [[67998, 432002, 0, 0], [0, 0, ' + \
        '432002, 67998]]], "percentile_tables": [[[114311, 385689, 0, 0], [1, 0, 385689, ' + \
        '114310]], [[67998, 432002, 0, 0], [1, 0, 432002, 67997]]], "class_labels": ["0", "1"], ' + \
        '"probability_thresholds": [0.52], "percentile_thresholds": [0.09]}}'

mlflow.log_dict(ACCURACY_TABLE, 'mlflow_accuracy_table.json')
  • Las métricas no se representan como una tabla de precisión en Estudio de Azure Machine Learning.
  • Se registra como un artefacto, no como una métrica.
  • El método mlflow.log_dict es experimental.

Registro de una matriz de confusión

SDK v1

CONF_MATRIX = '{"schema_type": "confusion_matrix", "schema_version": "v1", "data": {"class_labels": ' + \
    '["0", "1", "2", "3"], "matrix": [[3, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]}}'

azureml_run.log_confusion_matrix('v1_confusion_matrix', json.loads(CONF_MATRIX))

SDK v2 con MLflow

CONF_MATRIX = '{"schema_type": "confusion_matrix", "schema_version": "v1", "data": {"class_labels": ' + \
    '["0", "1", "2", "3"], "matrix": [[3, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]}}'

mlflow.log_dict(CONF_MATRIX, 'mlflow_confusion_matrix.json')
  • Las métricas no se representan como una matriz de confusión en Estudio de Azure Machine Learning.
  • Se registra como un artefacto, no como una métrica.
  • El método mlflow.log_dict es experimental.

Registro de predicciones

SDK v1

PREDICTIONS = '{"schema_type": "predictions", "schema_version": "v1", "data": {"bin_averages": [0.25,' + \
    ' 0.75], "bin_errors": [0.013, 0.042], "bin_counts": [56, 34], "bin_edges": [0.0, 0.5, 1.0]}}'

azureml_run.log_predictions('test_predictions', json.loads(PREDICTIONS))

SDK v2 con MLflow

PREDICTIONS = '{"schema_type": "predictions", "schema_version": "v1", "data": {"bin_averages": [0.25,' + \
    ' 0.75], "bin_errors": [0.013, 0.042], "bin_counts": [56, 34], "bin_edges": [0.0, 0.5, 1.0]}}'

mlflow.log_dict(PREDICTIONS, 'mlflow_predictions.json')
  • Las métricas no se representan como una matriz de confusión en Estudio de Azure Machine Learning.
  • Se registra como un artefacto, no como una métrica.
  • El método mlflow.log_dict es experimental.

Registro de valores residuales

SDK v1

RESIDUALS = '{"schema_type": "residuals", "schema_version": "v1", "data": {"bin_edges": [100, 200, 300], ' + \
'"bin_counts": [0.88, 20, 30, 50.99]}}'

azureml_run.log_residuals('test_residuals', json.loads(RESIDUALS))

SDK v2 con MLflow

RESIDUALS = '{"schema_type": "residuals", "schema_version": "v1", "data": {"bin_edges": [100, 200, 300], ' + \
'"bin_counts": [0.88, 20, 30, 50.99]}}'

mlflow.log_dict(RESIDUALS, 'mlflow_residuals.json')
  • Las métricas no se representan como una matriz de confusión en Estudio de Azure Machine Learning.
  • Se registra como un artefacto, no como una métrica.
  • El método mlflow.log_dict es experimental.

Visualización de la información y los datos de ejecución

Puede acceder a la información de ejecución mediante las propiedades data y info del objeto de ejecución de MLflow (mlflow.entities.Run).

Sugerencia

La información de seguimiento de experimentos y ejecuciones en Azure Machine Learning se puede consultar mediante MLflow, que proporciona una API de búsqueda integral para consultar y buscar experimentos y ejecuciones fácilmente, y comparar resultados rápidamente. Para obtener más información sobre todas las funcionalidades de MLflow en esta dimensión, consulte Query & compare experiments and runs with MLflow (Consulta y comparación de experimentos y ejecuciones con MLflow).

En el ejemplo siguiente se muestra cómo recuperar una ejecución finalizada:

from mlflow.tracking import MlflowClient

# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
finished_mlflow_run = MlflowClient().get_run("<RUN_ID>")

En el ejemplo siguiente se muestra cómo ver los elementos metrics, tags y params:

metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params

Nota:

metrics solo tendrá el valor que se haya registrado más recientemente en una métrica determinada. Por ejemplo, si inicia sesión según el orden de los valores 1, 2, 3 y, por último, 4 en una métrica denominada sample_metric, solo 4 estará presente en el diccionario metrics. Para obtener todas las métricas registradas en una métrica con nombre específica, use MlFlowClient.get_metric_history:

with mlflow.start_run() as multiple_metrics_run:
    mlflow.log_metric("sample_metric", 1)
    mlflow.log_metric("sample_metric", 2)
    mlflow.log_metric("sample_metric", 3)
    mlflow.log_metric("sample_metric", 4)

print(client.get_run(multiple_metrics_run.info.run_id).data.metrics)
print(client.get_metric_history(multiple_metrics_run.info.run_id, "sample_metric"))

Para obtener más información, consulte la referencia MlFlowClient.

El campo info proporciona información general sobre la ejecución, como la hora de inicio, el id. de ejecución, el id.de experimento, etc.:

run_start_time = finished_mlflow_run.info.start_time
run_experiment_id = finished_mlflow_run.info.experiment_id
run_id = finished_mlflow_run.info.run_id

Visualización de artefactos de ejecución

Para ver los artefactos de una ejecución, puede usar MlFlowClient.list_artifacts:

client.list_artifacts(finished_mlflow_run.info.run_id)

Para descargar un artefacto, usa MlFlowClient.download_artifacts:

mlflow.artifacts.download_artifacts(run_id=finished_mlflow_run.info.run_id, artifact_path="Azure.png")

Pasos siguientes