Gerenciar registros de modelos em Azure Machine Learning com o MLflow
O Azure Machine Learning dá suporte ao MLflow para gerenciamento de modelos quando conectado a um workspace. Tal abordagem representa uma forma conveniente de dar suporte a todo o ciclo de vida do modelo para usuários familiarizados com o cliente do MLFlow. O artigo a seguir descreve os diferentes recursos e como ele se compara com outras opções.
Pré-requisitos
Instale o pacote
mlflow
do SDK do MLflow e o plug-in do Azure Machine Learning para MLflowazureml-mlflow
.pip install mlflow azureml-mlflow
Dica
Você pode usar o pacote
mlflow-skinny
, que é um pacote MLflow leve sem dependências de armazenamento, servidor, interface do usuário ou ciência de dados do SQL.mlflow-skinny
é recomendado para usuários que precisam principalmente dos recursos de rastreamento 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 machine learning.
Se você estiver executando 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 workspace 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.
Observe que os registros organizacionais não são compatíveis com o gerenciamento de modelos com MLflow.
Algumas operações podem ser executadas diretamente usando a API fluente do MLflow (
mlflow.<method>
). No entanto, outras pessoas podem precisar criar um cliente do MLflow, que permite a comunicação com o Azure Machine Learning no protocolo do MLflow. Você pode criar um objetoMlflowClient
da seguinte maneira. Este tutorial usa o objetoclient
para se referir a esse cliente MLflow.import mlflow client = mlflow.tracking.MlflowClient()
Registrar novos modelos no registro
O registro de modelos oferece uma forma conveniente e centralizada de gerenciar modelos em um workspace. Cada workspace tem seu próprio registro de modelos independentes. A seção a seguir explica várias maneiras de registrar modelos no registro usando o SDK do MLflow.
Criar modelos de uma execução existente
Se você tiver um modelo MLflow registrado em uma execução e quiser colocá-lo em um registro, use a ID de execução e o caminho em que o modelo foi registrado. Consulte Gerenciar experimentos e execuções com o MLflow para saber como consultar essas informações se você não tiver.
mlflow.register_model(f"runs:/{run_id}/{artifact_path}", model_name)
Observação
Os modelos só podem ser registrados no registro no mesmo workspace em que a execução foi rastreada. Não há suporte para operações entre workspaces no momento no Azure Machine Learning.
Dica
Recomendamos que você registre os modelos de execuções ou use o método mlflow.<flavor>.log_model
dentro da execução, pois ele mantém a linhagem do trabalho que gerou o ativo.
Criar modelos de ativos
Se você tiver uma pasta com um modelo MLFlow do MLModel, poderá registrá-la diretamente. Não é necessário que o modelo esteja sempre no contexto de uma execução. Para fazer isso, você pode usar o esquema file://path/to/model
de URI para registrar modelos de MLflow armazenados no sistema de arquivos local. Vamos criar um modelo simples usando Scikit-Learn
e salvá-lo no formato MLflow no armazenamento local:
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
mlflow.sklearn.save_model(reg, "./regressor")
Dica
O método save_model()
funciona da mesma forma que log_model()
. Enquanto log_model()
salva o modelo dentro de uma execução ativa, save_model()
usa o sistema de arquivos local para salvar o modelo.
Agora você pode registrar o modelo no caminho local:
import os
model_local_path = os.path.abspath("./regressor")
mlflow.register_model(f"file://{model_local_path}", "local-model-test")
Consulta de registros de modelo
Você pode usar o SDK do MLflow para consultar e pesquisar modelos registrados no registro. A seção a seguir explica várias maneiras de conseguir isso.
Consultando todos os modelos no registro
Você pode consultar todos os modelos registrados no registro usando o cliente do MLflow. O exemplo a seguir imprime todos os nomes do modelo:
for model in client.search_registered_models():
print(f"{model.name}")
Use order_by
para ordenar por uma propriedade específica como name
, version
, creation_timestamp
e last_updated_timestamp
:
client.search_registered_models(order_by=["name ASC"])
Observação
Consultoria do MLflow 2.0: nas versões antigas do MLflow (<2.0), use o método MlflowClient.list_registered_models()
.
Obtendo versões específicas do modelo
O comando search_registered_models()
recupera o objeto de modelo que contém todas as versões de modelo. No entanto, se você quiser obter a última versão do modelo registrado de um determinado modelo, poderá usar get_registered_model
:
client.get_registered_model(model_name)
Se você precisar de uma versão específica do modelo, poderá indicar:
client.get_model_version(model_name, version=2)
Carregamento de modelos do registro
É possível carregar modelos diretamente do registro para restaurar os objetos de modelos que foram registrados. Use as funções mlflow.<flavor>.load_model()
ou mlflow.pyfunc.load_model()
indicando o URI do modelo que você deseja carregar usando a seguinte sintaxe:
models:/<model-name>/latest
, para carregar a última versão do modelo.models:/<model-name>/<version-number>
, para carregar uma versão específica do modelo.models:/<model-name>/<stage-name>
, para carregar uma versão específica de um modelo em um determinado estágio. Veja Estágios do modelo para obter detalhes.
Dica
Para saber mais sobre a diferença entre mlflow.<flavor>.load_model()
e mlflow.pyfunc.load_model()
, confira Fluxos de trabalho para carregar modelos do MLflow.
Fases do modelo
O MLflow dá suporte as fases do modelo para gerenciar o ciclo de vida do modelo. A versão do modelo pode fazer a transição de uma fase para outra. Fases são atribuídas à versão de um modelo (em vez de modelos), o que significa que um determinado modelo pode ter várias versões em diferentes fases.
Importante
Fases só podem ser acessadas usando o SDK do MLflow. Eles não aparecem no portal do Azure ML Studio e não podem ser recuperados usando nem o SDK do Azure ML, a CLI do Azure ML ou a API REST do Azure ML. Não há suporte para a criação da implantação da fase de um determinado modelo no momento.
Fases do modelo de consulta
Você pode usar o cliente MLflow para verificar todas as fases possíveis que um modelo pode ser:
client.get_model_version_stages(model_name, version="latest")
Você pode ver qual é a versão do modelo em cada fase obtendo o modelo do registro. O exemplo a seguir obtém a versão do modelo atualmente na fase Staging
.
client.get_latest_versions(model_name, stages=["Staging"])
Observação
Várias versões podem estar no mesma fase ao mesmo tempo no Mlflow, no entanto, esse método retorna a versão mais recente (versão maior) entre todas elas.
Aviso
Os nomes das fase diferenciam maiúsculas de minúsculas.
Modelos de transição
A transição da versão de um modelo para uma fase específica pode ser feita usando o cliente MLflow.
client.transition_model_version_stage(model_name, version=3, stage="Staging")
Por padrão, se houver uma versão de modelo existente nessa fase específica, ela permanecerá lá. Portanto, ele não é substituído, já que várias versões de modelo podem estar na mesma fase ao mesmo tempo. Como alternativa, você pode indicar para informar archive_existing_versions=True
ao MLflow para mover a versão do modelo existente para a fase Archived
.
client.transition_model_version_stage(
model_name, version=3, stage="Staging", archive_existing_versions=True
)
Carregando modelos de fases
Ou pode carregar um modelo em uma fase específica diretamente do Python usando a função load_model
e o seguinte formato de URI. Observe que, para que esse método tenha êxito, você precisa ter todas as bibliotecas e dependências já instaladas no ambiente em que você está trabalhando.
model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")
Editar e excluir modelos
Há suporte para a edição de modelos registrados no Mlflow e no Azure ML. No entanto, há algumas diferenças importantes a serem observadas:
Aviso
Não há suporte para a renomeação de modelos em Azure Machine Learning, pois os objetos de modelo são imutáveis.
Editar modelos
Você pode editar a descrição e as marcas do modelo de um modelo usando o Mlflow:
client.update_model_version(model_name, version=1, description="My classifier description")
Para editar marcas, você precisa usar o método set_model_version_tag
e remove_model_version_tag
:
client.set_model_version_tag(model_name, version="1", key="type", value="classification")
Remover uma marcação:
client.delete_model_version_tag(model_name, version="1", key="type")
Excluir a versão de um modelo
Você pode excluir qualquer versão de modelo no registro usando o cliente MLflow, conforme demonstrado no exemplo a seguir:
client.delete_model_version(model_name, version="2")
Observação
O Azure Machine Learning não dá suporte à exclusão de todo o contêiner de modelo. Para obter a mesma coisa, você precisará excluir todas as versões do modelo de um determinado modelo.
Matriz de suporte para gerenciar modelos com o MLflow
O cliente MLflow expõe vários métodos para recuperar e gerenciar modelos. A tabela a seguir mostra quais desses métodos têm suporte no MLflow quando conectados ao Azure ML. Ele também o compara com outros recursos de gerenciamento de modelos no Azure ML.
Recurso | MLflow | Azure ML com o MLflow | CLIv2 do Azure ML | Azure ML Studio |
---|---|---|---|---|
Registrando modelos no formato MLflow | ✓ | ✓ | ✓ | ✓ |
Registrando modelos que não estão no formato MLflow | ✓ | ✓ | ||
Registrando modelos de saídas/artefatos de execuções | ✓ | ✓1 | ✓2 | ✓ |
Registrar modelos de saídas/artefatos de execução em um servidor/workspace de rastreamento diferente | ✓ | ✓5 | ✓5 | |
Pesquisar/listar modelos registrados | ✓ | ✓ | ✓ | ✓ |
Recuperar detalhes das versões do modelo registrado | ✓ | ✓ | ✓ | ✓ |
Editar a descrição de versões do modelo registrado | ✓ | ✓ | ✓ | ✓ |
Editar as marcações de versões do modelo registrado | ✓ | ✓ | ✓ | ✓ |
Renomear modelos registrados | ✓ | 3 | 3 | 3 |
Excluir um modelo registrado (contêiner) | ✓ | 3 | 3 | 3 |
Excluir a versão de um modelo registrado | ✓ | ✓ | ✓ | ✓ |
Gerenciar fases do modelo do MLflow | ✓ | ✓ | ||
Pesquisar modelos registrados por nome | ✓ | ✓ | ✓ | ✓4 |
Pesquisar modelos registrados usando comparadores de cadeia de caracteres LIKE e ILIKE |
✓ | ✓4 | ||
Pesquisar modelos registrados por marca | ✓4 | |||
Suporte registros organizacionais | ✓ | ✓ |
Observação
- 1 Usar URIs com formato
runs:/<ruin-id>/<path>
. - 2 Usar URIs com formato
azureml://jobs/<job-id>/outputs/artifacts/<path>
. - 3 Modelos registrados são objetos imutáveis no Azure ML.
- 4 Use a caixa de pesquisa no Azure ML Studio. Correspondência parcial com suporte.
- 5 Use registros para movimentar modelos entre workspaces diferentes e, ao mesmo tempo, manter a linhagem.