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 nesta dimensão, consulte Consultar e comparar experimentos e execuções com o 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")