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 mlflow do SDK do MLflow e o plug-in do Azure Machine Learning para MLflow azureml-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. mlflow-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. Você pode criar um seguindo o tutorial Criar recursos de aprendizado de máquina.

  • Se você estiver realizando 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 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_namesou 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êm metrics.*, params.* ou tags.* no parâmetro order_by. Em vez disso, use o método order_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 filtrar parameters.

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

Captura de tela do painel de visualização mostrando como comparar trabalhos e modelos no Estúdio do Azure Machine Learning.

O MLflow com notebooks do Azure Machine Learning demonstra e expande os conceitos apresentados neste artigo.

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 marcas sem suporte.