Consultar e comparar experimentos e execuções com o MLflow
Experimentos e trabalhos (ou execuções) no Azure Machine Learning podem ser consultados usando o MLflow. Você não precisa instalar nenhum SDK específico para gerenciar o que acontece dentro de um trabalho de treinamento, criando uma transição mais perfeita entre as execuções locais e a nuvem removendo dependências específicas da nuvem. Neste artigo, você aprenderá como consultar e comparar experimentos e execuções em seu espaço de trabalho usando o Azure Machine Learning e o SDK do MLflow no Python.
O MLflow permite:
- Criar, consultar, excluir e pesquisar por experimentos em um espaço de trabalho.
- Consultar, excluir e pesquisar execuções em um espaço de trabalho.
- Acompanhar e recuperar métricas, parâmetros, artefatos e modelos de execuções.
Para obter uma comparação detalhada entre o MLflow de código aberto e o MLflow quando conectado ao Azure Machine Learning, consulte Matriz de suporte para consulta de execuções e experimentos no Azure Machine Learning.
Observação
O SDK do Azure Machine Learning para Python v2 não fornece funcionalidades de registro em log ou acompanhamento nativos. Isso se aplica não apenas ao registro em log, mas também à consulta das métricas registradas. Em vez disso, use o MLflow para gerenciar experimentos e execuções. Este artigo explica como usar o MLflow para gerenciar experimentos e execuções no Azure Machine Learning.
Também é possível consultar e pesquisar experimentos e execuções usando a API REST do MLflow. Confira Usar o REST do MLflow com o Azure Machine Learning para obter um exemplo de como consumi-lo.
Pré-requisitos
Instale o pacote do SDK do MLflow
mlflow
e o pluginazureml-mlflow
do Azure Machine Learning para MLflow:pip install mlflow azureml-mlflow
Dica
Você pode usar o pacote
mlflow-skinny
, que é um pacote MLflow leve sem dependências de servidor, interface do usuário, ciência de dados ou armazenamento do SQL. Omlflow-skinny
é recomendado para usuários que precisam, principalmente, dos recursos de acompanhamento e registro em log do MLflow sem importar o conjunto completo de recursos, incluindo implantações.Um workspace do Azure Machine Learning. Para criar um espaço de trabalho, confira o tutorial Criar recursos de machine learning. Analise quais permissões de acesso você precisa para executar suas operações do MLflow no seu espaço de trabalho.
Se estiver efetuando o acompanhamento remoto (ou seja, acompanhando experimentos que estão sendo executados fora do Azure Machine Learning), configure o MLflow para apontar para o URI de acompanhamento do seu espaço de trabalho do Azure Machine Learning. Para obter mais informações sobre como conectar o MLflow ao seu workspace, consulte Configurar o MLflow para o Azure Machine Learning.
Experimentos de consulta e pesquisa
Use o MLflow para pesquisar experimentos dentro do seu espaço de trabalho. Veja os exemplos a seguir:
Obtenha todos os experimentos ativos:
mlflow.search_experiments()
Observação
Em versões herdadas do MLflow (<2.0), use o método
mlflow.list_experiments()
em vez disso.Obtenha todos os experimentos, inclusive os arquivados:
from mlflow.entities import ViewType mlflow.search_experiments(view_type=ViewType.ALL)
Obtenha um experimento específico por nome:
mlflow.get_experiment_by_name(experiment_name)
Obtenha um experimento específico por ID:
mlflow.get_experiment('1234-5678-90AB-CDEFG')
Pesquisar por experimentos
O método search_experiments()
, disponível desde o Mlflow 2.0, permite pesquisar experimentos que correspondam aos critérios usando filter_string
.
Recupere vários experimentos com base em suas IDs:
mlflow.search_experiments(filter_string="experiment_id IN (" "'CDEFG-1234-5678-90AB', '1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')" )
Recupere todos os experimentos criados após um determinado tempo:
import datetime dt = datetime.datetime(2022, 6, 20, 5, 32, 48) mlflow.search_experiments(filter_string=f"creation_time > {int(dt.timestamp())}")
Recupere todos os experimentos com uma determinada marca:
mlflow.search_experiments(filter_string=f"tags.framework = 'torch'")
Execuções de consulta e pesquisa
O MLflow permite pesquisar execuções dentro de qualquer experimento, inclusive vários experimentos ao mesmo tempo. O método mlflow.search_runs()
aceita o argumento experiment_ids
e experiment_name
, para indicar em quais experimentos a pesquisar. Você também pode indicar search_all_experiments=True
se quiser pesquisar em todos os experimentos do workspace:
Por nome do experimento:
mlflow.search_runs(experiment_names=[ "my_experiment" ])
Pela ID do experimento:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ])
Pesquise em todos os experimentos no workspace:
mlflow.search_runs(filter_string="params.num_boost_round='100'", search_all_experiments=True)
Observe que experiment_ids
dá suporte ao fornecimento de uma matriz de experimentos, para que você possa pesquisar execuções em vários experimentos, se necessário. Isso pode ser útil caso você queira comparar execuções do mesmo modelo quando ele estiver sendo registrado em experimentos diferentes (por exemplo, por pessoas diferentes ou iterações de projeto diferentes).
Importante
Se experiment_ids
, experiment_names
ou search_all_experiments
não forem especificados, o MLflow pesquisará por padrão no experimento ativo atual. Defina o experimento ativo usando mlflow.set_experiment()
.
Por padrão, o MLflow retorna os dados no formato Pandas Dataframe
, o que torna útil ao processar ainda mais nossa análise das execuções. Os dados retornados incluem colunas com:
- Informações básicas sobre a execução.
- Parâmetros com o nome
params.<parameter-name>
da coluna. - Métricas (último valor registrado de cada um) com o nome
metrics.<metric-name>
da coluna.
Todas as métricas e parâmetros também são retornados ao consultar as execuções. No entanto, para métricas que contêm vários valores (por exemplo, uma curva de perda ou uma curva de PR), somente o último valor da métrica é retornado. Se você quiser recuperar todos os valores de uma determinada métrica, usará o método mlflow.get_metric_history
. Confira Obter parâmetros e métricas de uma execução para ver um exemplo.
Execuções de pedidos
Por padrão, os experimentos estão ordem decrescente por start_time
, que é a hora em que o experimento foi enfileirado no Azure Machine Learning. No entanto, você pode alterar esse padrão usando o parâmetro order_by
.
Ordenar execuções por atributos, como
start_time
:mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], order_by=["attributes.start_time DESC"])
Ordenar execuções e limitar resultados. O exemplo a seguir retorna a última execução única no experimento:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], max_results=1, order_by=["attributes.start_time DESC"])
A ordem é executada pelo atributo
duration
:mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], order_by=["attributes.duration DESC"])
Dica
attributes.duration
não está presente no OSS do MLflow, mas fornecido no Azure Machine Learning para conveniência.Ordene as execuções por valores de métrica:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ]).sort_values("metrics.accuracy", ascending=False)
Aviso
No momento, não há suporte para o uso
order_by
com expressões que contêmmetrics.*
,params.*
outags.*
no parâmetroorder_by
. Em vez disso, use o métodoorder_values
do Pandas, conforme mostrado no exemplo.
Filtrar execuções
Você também pode procurar uma execução com uma combinação específica nos hiperparâmetros usando o parâmetro filter_string
. Use params
para acessar os parâmetros de execução, metrics
para acessar as métricas registradas na execução e attributes
para acessar os detalhes das informações de execução. O MLflow dá suporte a expressões unidas pela palavra-chave AND (a sintaxe não dá suporte a OR):
A pesquisa é executada com base no valor de um parâmetro:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="params.num_boost_round='100'")
Aviso
Somente os operadores
=
,like
e!=
têm suporte para filtrarparameters
.A pesquisa é executada com base no valor de uma métrica:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="metrics.auc>0.8")
Pesquise execuções com uma determinada marca:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="tags.framework='torch'")
Pesquise execuções criadas por um determinado usuário:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="attributes.user_id = 'John Smith'")
Execuções de pesquisa que falharam. Confira Filtrar execuções por status para obter os valores possíveis:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="attributes.status = 'Failed'")
Execuções de pesquisa criadas após um determinado tempo:
import datetime dt = datetime.datetime(2022, 6, 20, 5, 32, 48) mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string=f"attributes.creation_time > '{int(dt.timestamp())}'")
Dica
Para a chave
attributes
, os valores devem ser sempre cadeias de caracteres e, portanto, codificados entre aspas.Execuções de pesquisa que levam mais de uma hora:
duration = 360 * 1000 # duration is in milliseconds mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string=f"attributes.duration > '{duration}'")
Dica
attributes.duration
não está presente no OSS do MLflow, mas fornecido no Azure Machine Learning para conveniência.Execuções de pesquisa que têm a ID em um determinado conjunto:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="attributes.run_id IN ('1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')")
O filtro é executado por status
Ao filtrar as execuções por status, o MLflow usa uma convenção diferente para nomear os diferentes status possíveis de uma execução em comparação com o Azure Machine Learning. A tabela a seguir mostra os valores possíveis:
Status do trabalho do Azure Machine Learning | attributes.status do MLFlow |
Significado |
---|---|---|
Não iniciado | Scheduled |
O trabalho/execução foi recebido pelo Azure Machine Learning. |
Fila | Scheduled |
O trabalho/execução está agendado para execução, mas ainda não foi iniciado. |
Preparando | Scheduled |
O trabalho/execução ainda não foi iniciado, mas uma computação foi alocada para sua execução e está preparando o ambiente e suas entradas. |
Executando | Running |
O trabalho/execução está atualmente em execução ativa. |
Concluído | Finished |
O trabalho/execução foi concluído sem erros. |
Com falha | Failed |
O trabalho/execução foi concluído com erros. |
Canceled | Killed |
O trabalho/execução foi cancelado pelo usuário ou encerrado pelo sistema. |
Exemplo:
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ],
filter_string="attributes.status = 'Failed'")
Obter métricas, parâmetros, artefatos e modelos
O método search_runs
retorna um Pandas Dataframe
que contém uma quantidade limitada de informações por padrão. É possível obter objetos Python, se necessário, o que pode ser útil para obter detalhes sobre eles. Use o parâmetro output_format
para controlar como a saída é retornada:
runs = mlflow.search_runs(
experiment_ids=[ "1234-5678-90AB-CDEFG" ],
filter_string="params.num_boost_round='100'",
output_format="list",
)
Em seguida, os detalhes podem ser acessados do membro info
. O exemplo a seguir mostra como obter a run_id
:
last_run = runs[-1]
print("Last run ID:", last_run.info.run_id)
Obter parâmetros e métricas de uma execução
Quando as execuções são retornadas usando output_format="list"
, você pode acessar facilmente parâmetros usando a chave data
:
last_run.data.params
Da mesma forma, você pode consultar métricas:
last_run.data.metrics
Para métricas que contêm vários valores (por exemplo, uma curva de perda ou uma curva de PR), somente o último valor registrado da métrica é retornado. Se você quiser recuperar todos os valores de uma determinada métrica, usará o método mlflow.get_metric_history
. Esse método exige que você use o MlflowClient
:
client = mlflow.tracking.MlflowClient()
client.get_metric_history("1234-5678-90AB-CDEFG", "log_loss")
Obter artefatos de uma execução
O MLflow pode consultar qualquer artefato registrado por uma execução. Os artefatos não podem ser acessado usando o objeto de execução em si e o cliente MLflow deve ser usado no lugar:
client = mlflow.tracking.MlflowClient()
client.list_artifacts("1234-5678-90AB-CDEFG")
O método anterior lista todos os artefatos registrados na execução, mas eles permanecem armazenados no repositório de artefatos (armazenamento do Azure Machine Learning). Para baixar qualquer um deles, use o método download_artifact
:
file_path = mlflow.artifacts.download_artifacts(
run_id="1234-5678-90AB-CDEFG", artifact_path="feature_importance_weight.png"
)
Observação
Em versões herdadas do MLFlow (< 2.0), use o método MlflowClient.download_artifacts()
em vez disso.
Obter modelos de uma execução
Os modelos também podem ser conectados na execução e, em seguida, recuperados diretamente dele. Para recuperar um modelo, você precisará saber o caminho para o artefato em que ele está armazenado. O método list_artifacts
pode ser usado para localizar artefatos que representam um modelo, pois os modelos MLflow são sempre pastas. Faça download de um modelo especificando o caminho onde o modelo é armazenado usando o método download_artifact
:
artifact_path="classifier"
model_local_path = mlflow.artifacts.download_artifacts(
run_id="1234-5678-90AB-CDEFG", artifact_path=artifact_path
)
Você pode então carregar o modelo de volta a partir dos artefatos baixados usando a função típica load_model
na variante específica do namespace. O exemplo a seguir usa xgboost
:
model = mlflow.xgboost.load_model(model_local_path)
O MLflow também permite executar as duas operações de uma só vez e baixar e carregar o modelo em uma única instrução. O MLflow baixa o modelo para uma pasta temporária e o carrega de lá. O método load_model
usa um formato de URI para indicar de onde o modelo precisa ser recuperado. No caso de carregar um modelo de uma execução, a estrutura do URI é a seguinte:
model = mlflow.xgboost.load_model(f"runs:/{last_run.info.run_id}/{artifact_path}")
Dica
Para consultar e carregar modelos registrados no Registro de modelo, consulte Gerenciar registros de modelos no Azure Machine Learning com o MLflow.
Obter execuções filho (aninhadas)
O MLflow dá suporte ao conceito de execuções filho (aninhado). Essas corridas são úteis ao precisar desligar as rotinas de treinamento que devem ser acompanhadas independentemente do processo de treinamento principal. Processos de otimização de ajuste de hiperparâmetro ou pipelines do Azure Machine Learning são exemplos típicos de trabalhos que geram várias execuções filho. Você pode consultar todas as execuções filho de uma execução específica usando a marca mlflow.parentRunId
de propriedade, que contém a ID de execução da execução pai.
hyperopt_run = mlflow.last_active_run()
child_runs = mlflow.search_runs(
filter_string=f"tags.mlflow.parentRunId='{hyperopt_run.info.run_id}'"
)
Comparar trabalhos e modelos no Estúdio do Azure Machine Learning (versão prévia)
Para comparar e avaliar a qualidade dos trabalhos e modelos no Estúdio do Azure Machine Learning, use o painel de versão prévia para ativar o recurso. Depois de habilitado, você pode comparar os parâmetros, as métricas e as marcas entre os trabalhos e/ou os modelos selecionados.
Importante
Os itens marcados (versão prévia) neste artigo estão atualmente em versão prévia pública. A versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.
O MLflow com notebooks do Azure Machine Learning demonstra e expande os conceitos apresentados neste artigo.
- Treinar e acompanhar de um classificador com o MLflow: demonstra como acompanhar experimentos usando MLflow, modelos de log e combinar vários tipos em pipelines.
- Gerenciar experimentos e execuções com o MLflow: demonstra como consultar experimentos, execuções, métricas, parâmetros e artefatos do Azure Machine Learning usando o MLflow.
Matriz de suporte para execuções e experimentos de consulta
O SDK do MLflow expõe vários métodos para recuperar execuções, incluindo opções para controlar o que é retornado e como. Use a tabela a seguir para saber quais desses métodos têm suporte atualmente no MLflow quando conectados ao Azure Machine Learning:
Recurso | Com suporte do MLflow | Com suporte do Azure Machine Learning |
---|---|---|
Ordenar execuções por atributos | ✓ | ✓ |
Ordenar execuções por métricas | ✓ | 1 |
Ordenar execuções por parâmetros | ✓ | 1 |
Ordenar execuções por marcas | ✓ | 1 |
Filtrar execuções por atributos | ✓ | ✓ |
Filtrar execuções por métricas | ✓ | ✓ |
Filtrar execuções por métricas com caracteres especiais (escapou) | ✓ | |
Filtrar execuções por parâmetros | ✓ | ✓ |
Filtrar execuções por marcas | ✓ | ✓ |
Filtrar execuções com comparadores numéricos (métricas), incluindo = , != , > , >= , < e <= |
✓ | ✓ |
Filtrar execuções com comparadores de cadeia de caracteres (params, marcas e atributos): = e != |
✓ | ✓2 |
Filtrar execuções com comparadores de cadeia de caracteres (params, marcas e atributos): LIKE /ILIKE |
✓ | ✓ |
Filtrar execuções com comparadores AND |
✓ | ✓ |
Filtrar execuções com comparadores OR |
||
Alterar o nome dos experimentos | ✓ |
Observação
- 1 Verifique a seção Execuções de ordens para obter instruções e exemplos sobre como obter a mesma funcionalidade no Azure Machine Learning.
- 2
!=
para tags sem suporte.