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 actualizar de SDK v1 a SDK v2, use la información de esta sección para comprender los equivalentes de MLflow de las API de registro de 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")