Migrar o registro em log do SDK v1 para o SDK v2

O Azure Machine Learning usa o Acompanhamento do MLflow para registro em log de métricas e armazenamento de artefatos dos seus experimentos, independentemente de você ter criado os experimentos por meio do SDK do Python do Azure Machine Learning, da CLI do Azure Machine Learning ou do Estúdio do Azure Machine Learning. É recomendável usar o MLflow para o acompanhamento de experimentos.

Se você estiver migrando do SDK v1 para o SDK v2, use as informações nesta seção para entender os equivalentes no MLflow às APIs de registro em log do SDK v1.

Por que o MLflow?

O MLflow, com mais de 13 milhões de downloads mensais, tornou-se a plataforma padrão para MLOps de ponta a ponta, permitindo que equipes de todos os tamanhos acompanhem, compartilhem, empacotam e implantem qualquer modelo para inferência em lote ou em tempo real. O Azure Machine Learning integra-se ao MLflow, que permite que o código de treinamento alcance a verdadeira portabilidade e a integração perfeita com outras plataformas, pois ele não contém instruções específicas do Azure Machine Learning.

Preparar-se para migrar para o MLflow

Para usar o acompanhamento do MLflow, é necessário instalar o pacote mlflow do SDK do Mlflow e o plug-in do Azure Machine Learning para o MLflow azureml-mlflow. Todos os ambientes do Azure Machine Learning já têm esses pacotes disponíveis para você, mas é necessário incluí-los se for criar seu próprio ambiente.

pip install mlflow azureml-mlflow

Conectar-se ao workspace

O Azure Machine Learning permite que os usuários executem o acompanhamento de trabalhos de treinamento em execução no workspace ou remotamente (acompanhar experimentos em execução fora do Azure Machine Learning). Se estiver executando o acompanhamento remoto, você precisará indicar o espaço de trabalho ao qual deseja conectar o MLflow.

Você já está conectado ao workspace durante a execução na computação do Azure Machine Learning.

Experimentos e execuções

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 com o MLflow

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

Comparação de API de registro em log

Registrar um inteiro ou uma métrica de float

SDK v1

azureml_run.log("sample_int_metric", 1)

SDK v2 com o MLflow

mlflow.log_metric("sample_int_metric", 1)

Registrar uma métrica booliana

SDK v1

azureml_run.log("sample_boolean_metric", True)

SDK v2 com o MLflow

mlflow.log_metric("sample_boolean_metric", 1)

Registrar uma métrica de cadeia de caracteres

SDK v1

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

SDK v2 com o MLflow

mlflow.log_text("sample_string_text", "string.txt")
  • A cadeia de caracteres será registrada como um artefato, não como uma métrica. No Estúdio do Azure Machine Learning, o valor será exibido na guia Saídas + logs.

Registrar uma imagem em um arquivo PNG ou JPEG

SDK v1

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

SDK v2 com o MLflow

mlflow.log_artifact("Azure.png")

A imagem é registrada como um artefato e aparecerá na guia Imagens no Estúdio do Azure Machine Learning.

Registrar um matplotlib.pyplot

SDK v1

import matplotlib.pyplot as plt

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

SDK v2 com o 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")
  • A imagem é registrada como um artefato e aparecerá na guia Imagens no Estúdio do Azure Machine Learning.

Registar uma 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 com o 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)
  • As métricas aparecem na guia métricas no Estúdio do Azure Machine Learning.
  • Não há suporte para valores de texto.

Registrar uma linha de métricas

SDK v1

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

SDK v2 com o MLflow

metrics = {"sample_table.col1": 5, "sample_table.col2": 10}
mlflow.log_metrics(metrics)
  • As métricas não são renderizadas como uma tabela no Estúdio do Azure Machine Learning.
  • Não há suporte para valores de texto.
  • Registrado como um artefato, não como uma métrica.

Registrar uma tabela

SDK v1

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

SDK v2 com o 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 métricas para cada coluna.
  • As métricas não são renderizadas como uma tabela no Estúdio do Azure Machine Learning.
  • Não há suporte para valores de texto.
  • Registrado como um artefato, não como uma métrica.

Registrar uma tabela de precisão

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 com o 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')
  • As métricas não são renderizadas como uma tabela de precisão no Estúdio do Azure Machine Learning.
  • Registrado como um artefato, não como uma métrica.
  • O método mlflow.log_dict é experimental.

Registrar uma matriz de confusão

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 com o 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')
  • As métricas não são renderizadas como uma matriz de confusão no Estúdio do Azure Machine Learning.
  • Registrado como um artefato, não como uma métrica.
  • O método mlflow.log_dict é experimental.

Previsões de log

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 com o 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')
  • As métricas não são renderizadas como uma matriz de confusão no Estúdio do Azure Machine Learning.
  • Registrado como um artefato, não como uma métrica.
  • O método mlflow.log_dict é experimental.

Resíduos de log

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 com o 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')
  • As métricas não são renderizadas como uma matriz de confusão no Estúdio do Azure Machine Learning.
  • Registrado como um artefato, não como uma métrica.
  • O método mlflow.log_dict é experimental.

Exibir informações de execução e dados

Você pode acessar as informações de execução usando as propriedades data e info do objeto de execução (mlflow.entities.Run).

Dica

Experimentos e execuções que acompanham informações no Azure Machine Learning podem ser consultados usando o MLflow, o que fornece uma API de pesquisa abrangente para consultar e pesquisar experimentos e execuções com facilidade e comparar rapidamente os resultados. Para obter mais informações sobre todos os recursos do MLflow nessa dimensão, consulte Query & comparar experimentos e execuções com MLflow

O seguinte exemplo mostra como recuperar uma execução concluída:

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

O seguinte exemplo mostra como exibir metrics, tags e params:

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

Observação

O metrics terá apenas o valor mais recente registrado em uma determinada métrica. Por exemplo, se você registrar em ordem um valor de 1, depois 2, 3 e finalmente 4 para uma métrica chamada sample_metric, só 4 estará presente no dicionário metrics. Para registrar todas as métricas de uma métrica nomeada 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 obter mais informações, confira a referência de MlFlowClient.

O campo info fornece informações gerais sobre a execução, como hora de início, ID de execução, ID do 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

Exibir artefatos de execução

Para exibir os artefatos de uma execução, use MlFlowClient.list_artifacts:

client.list_artifacts(finished_mlflow_run.info.run_id)

Para baixar um artefato, use mlflow.artifacts.download_artifacts:

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

Próximas etapas