Migrar o log do SDK v1 para o SDK v2

O Azure Machine Learning utiliza o MLflow Tracking para registo de métricas e armazenamento de artefactos para as suas experiências, quer tenha criado as experiências através do SDK Python do Azure Machine Learning, da CLI do Azure Machine Learning ou do estúdio Azure Machine Learning. Recomendamos o uso do MLflow para rastrear experimentos.

Se você estiver migrando do SDK v1 para o SDK v2, use as informações desta seção para entender os equivalentes MLflow das APIs de log do SDK v1.

Porquê 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 rastreiem, compartilhem, empacotem e implantem qualquer modelo para inferência em lote ou em tempo real. O Azure Machine Learning integra-se com o MLflow, o que permite que o seu código de formação obtenha uma verdadeira portabilidade e uma integração perfeita com outras plataformas, uma vez que não contém quaisquer instruções específicas do Azure Machine Learning.

Prepare-se para migrar para o MLflow

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

pip install mlflow azureml-mlflow

Ligar à sua área de trabalho

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

Você já está conectado ao seu espaço de trabalho ao executar na computação do Azure Machine Learning.

Experiências 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 MLflow

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

Comparação da API de registro em log

Registrar uma métrica inteira ou flutuante

SDK v1

azureml_run.log("sample_int_metric", 1)

SDK v2 com MLflow

mlflow.log_metric("sample_int_metric", 1)

Registrar uma métrica booleana

SDK v1

azureml_run.log("sample_boolean_metric", True)

SDK v2 com 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 MLflow

mlflow.log_text("sample_string_text", "string.txt")
  • A cadeia de caracteres é registrada como um artefato, não como uma métrica. No estúdio do Azure Machine Learning, o valor é 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 MLflow

mlflow.log_artifact("Azure.png")

A imagem é registrada como um artefato e aparece na guia Imagens no Estúdio de Aprendizado de Máquina do Azure.

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 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 aparece na guia Imagens no Estúdio de Aprendizado de Máquina do Azure.

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

Registar uma tabela

SDK v1

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

SDK v2 com 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 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 mlflow.log_dict método é experimental.

Registar 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 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 de Aprendizado de Máquina do Azure.
  • Registrado como um artefato, não como uma métrica.
  • O mlflow.log_dict método é 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 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 de Aprendizado de Máquina do Azure.
  • Registrado como um artefato, não como uma métrica.
  • O mlflow.log_dict método é experimental.

Log de resíduos

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 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 de Aprendizado de Máquina do Azure.
  • Registrado como um artefato, não como uma métrica.
  • O mlflow.log_dict método é experimental.

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

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

Gorjeta

Experimentos e execuções de informações de rastreamento no Aprendizado de Máquina do Azure podem ser consultados usando o MLflow, que fornece uma API de pesquisa abrangente para consultar e pesquisar experimentos, e é executado facilmente e comparar resultados rapidamente. Para obter mais informações sobre todos os recursos do MLflow nessa dimensão, consulte Query & compare experimentos e execuções com MLflow

O exemplo a seguir 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 exemplo a seguir mostra como exibir o metrics, tagse params:

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

Nota

O metrics terá apenas o valor registrado mais recentemente para uma determinada métrica. Por exemplo, se você registrar em ordem um valor de 1, então 2, 3e finalmente 4 para uma métrica chamada sample_metric, somente 4 estará presente no metrics dicionário. Para obter todas as métricas registradas para 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, consulte a referência MlFlowClient .

O info campo 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óximos passos