Share via


Registrar em log, carregar, registrar e implantar modelos de MLflow

Um modelo do MLflow é um formato padrão para empacotar modelos de machine learning que podem ser usados em uma variedade de ferramentas de downstream, por exemplo, inferência em lote no Apache Spark ou em tempo real por meio de uma API REST. O formato define uma convenção que permite salvar um modelo em diferentes variantes (função do Python, PyTorch, Scikit-learn etc.), que possa ser compreendido por diferentes plataformas de serviço de modelo e de inferência.

Registrar e carregar modelos

Quando você registra um modelo, o MLflow registra automaticamente arquivos requirements.txt e conda.yaml. Você pode usar esses arquivos para recriar o ambiente de desenvolvimento de modelo e reinstalar as dependências usando virtualenv (recomendado) ou conda.

Importante

O Anaconda Inc. atualizou os termos de serviço dos canais de anaconda.org. Com base nos novos termos de serviço, você poderá precisar de uma licença comercial se depender do empacotamento e da distribuição do Anaconda. Confira Perguntas frequentes sobre a Edição Comercial do Anaconda para obter mais informações. O uso de qualquer canal do Anaconda é regido pelos termos de serviço.

Os modelos de MLflow registrados antes da v1.18 (Databricks Runtime 8.3 ML ou anterior) eram registrados por padrão com o canal conda defaults (https://repo.anaconda.com/pkgs/) como uma dependência. Devido a essa alteração de licença, o Databricks interrompeu o uso do canal defaults para modelos registrados usando o MLflow v1.18 e superior. O canal padrão registrado agora é conda-forge, o que aponta para a comunidade gerenciada https://conda-forge.org/.

Se você registrou um modelo antes do MLflow v1.18 sem excluir o canal defaults do ambiente conda para o modelo, esse modelo poderá ter uma dependência no canal defaults que talvez você não tenha pretendido. Para confirmar manualmente se um modelo tem essa dependência, você pode examinar o valor channel no arquivo conda.yaml que está empacotado com o modelo registrado. Por exemplo, um conda.yaml de modelo com uma dependência de canal defaults pode ser assim:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

Como o Databricks não pode determinar se o uso do repositório do Anaconda para interagir com seus modelos é permitido em seu relacionamento com o Anaconda, o Databricks não está forçando seus clientes a fazer alterações. Se o uso do repositório do Anaconda.com por meio do Databricks for permitido nos termos do Anaconda, você não precisará tomar nenhuma medida.

Caso você queira alterar o canal usado no ambiente de um modelo, é possível registrar novamente o modelo no registro de modelo com um novo conda.yaml. Você pode fazer isso especificando o canal no parâmetro conda_env de log_model().

Para obter mais informações sobre a API log_model(), consulte a documentação do MLflow para o sabor do modelo com o qual você está trabalhando, por exemplo, log_model para scikit-learn.

Para obter mais informações sobre os arquivos conda.yaml, consulte a Documentação do MLflow.

Comandos da API

Para registrar um modelo em log no servidor de acompanhamento do MLflow, use mlflow.<model-type>.log_model(model, ...).

Para carregar um modelo já registrado em log para inferência ou desenvolvimento adicional, use mlflow.<model-type>.load_model(modelpath), em que modelpath é um dos seguintes:

  • um caminho relativo de execução (como runs:/{run_id}/{model-path})
  • um caminho do DBFS
  • um caminho de modelo registrado (como models:/{model_name}/{model_stage}).

Para obter uma lista completa de opções de carregamento de modelos do MLflow, confira Como referenciar artefatos na documentação do MLflow.

Para modelos do Python do MLflow, uma opção adicional é usar mlflow.pyfunc.load_model() para carregar o modelo como uma função genérica do Python. Use o snippet de código a seguir para carregar o modelo e pontuar os pontos de dados.

model = mlflow.pyfunc.load_model(model_path)
model.predict(model_input)

Como alternativa, você pode exportar o modelo como uma UDF do Apache Spark para usá-lo para pontuação em um cluster do Spark, seja como um trabalho em lotes ou como um trabalho de streaming do Spark em tempo real.

# load input data table as a Spark DataFrame
input_data = spark.table(input_table_name)
model_udf = mlflow.pyfunc.spark_udf(spark, model_path)
df = input_data.withColumn("prediction", model_udf())

Dependências do modelo de log

Para carregar um modelo com precisão, você deve verificar se as dependências do modelo são carregadas com as versões corretas no ambiente de notebook. No Databricks Runtime 10.5 ML e versões superiores, o MLflow avisa se uma incompatibilidade é detectada entre o ambiente atual e as dependências do modelo.

A funcionalidade adicional para simplificar a restauração de dependências de modelo está incluída no Databricks Runtime 11.0 ML e posterior. Com o Databricks Runtime 11.0 ML ou versões posteriores, para modelos do tipo pyfunc, você pode chamar mlflow.pyfunc.get_model_dependencies para recuperar e baixar as dependências do modelo. Essa função retorna um caminho para o arquivo de dependências que você pode instalar usando %pip install <file-path>. Quando você carrega um modelo como um UDF do PySpark, especifique env_manager="virtualenv" na chamada mlflow.pyfunc.spark_udf. Isso restaura as dependências do modelo no contexto do UDF do PySpark e não afeta o ambiente externo.

Você também pode usar essa funcionalidade no Databricks Runtime 10.5 ou anterior instalando manualmente o MLflow versão 1.25.0 ou posterior:

%pip install "mlflow>=1.25.0"

Para obter informações adicionais sobre como registrar dependência de modelo (Python e não Python) e artefatos, consulte Registrar dependências de modelo.

Saiba como registrar dependências de modelo e artefatos personalizados para serviço de modelo:

Snippets de código gerados automaticamente na interface do usuário do MLflow

Quando você registra um modelo em um notebook do Azure Databricks, o Azure Databricks gere automaticamente snippets de código que você pode copiar e usar para carregar e executar o modelo. Para ver esses snippets de código:

  1. Navegue até a tela Execuções da execução que gerou o modelo. (Confira Exibir o experimento do notebook para saber como ver a tela Execuções.)
  2. Role a página até a seção Artefatos.
  3. Clique no nome do modelo registrado em log. Um painel será aberto à direita mostrando o código que você pode usar para carregar o modelo registrado em log e fazer previsões em DataFrames do Spark ou do Pandas.

Snippets de código do painel do artefato

Exemplos

Para ver exemplos de modelos de log, confira os exemplos em Acompanhar exemplos de execuções de treinamento de machine learning. Para ver um exemplo de carregamento de um modelo registrado em log para inferência, confira o Exemplo de inferência do modelo.

Registrar modelos no Registro de Modelo

Você pode registrar modelos no Registro de Modelo do MLflow, um repositório de modelos centralizado que fornece uma interface do usuário e um conjunto de APIs para gerenciar o ciclo de vida completo dos modelos do MLflow. Para obter instruções sobre como usar o Registro de Modelo para gerenciar modelos no Catálogo do Databricks Unity, confira Gerenciar o ciclo de vida do modelo. Para usar o Workspace Model Registry, veja Gerenciar o ciclo de vida do modelo usando o Workspace Model Registry (legado).

Para registrar um modelo usando a API, use mlflow.register_model("runs:/{run_id}/{model-path}", "{registered-model-name}").

Salvar modelos no DBFS

Para salvar um modelo localmente, use mlflow.<model-type>.save_model(model, modelpath). modelpath precisa ser um caminho do DBFS. Por exemplo, se você usar um local dbfs:/my_project_models do DBFS para armazenar o trabalho do projeto, use o caminho /dbfs/my_project_models do modelo:

modelpath = "/dbfs/my_project_models/model-%f-%f" % (alpha, l1_ratio)
mlflow.sklearn.save_model(lr, modelpath)

Para modelos do MLlib, use os Pipelines de ML.

Baixar artefatos de modelo

Baixe os artefatos do modelo registrado em log (como arquivos de modelo, gráficos e métricas) para um modelo registrado com várias APIs.

Exemplo de API do Python:

from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository

model_uri = MlflowClient.get_model_version_download_uri(model_name, model_version)
ModelsArtifactRepository(model_uri).download_artifacts(artifact_path="")

Exemplo de API do Java:

MlflowClient mlflowClient = new MlflowClient();
// Get the model URI for a registered model version.
String modelURI = mlflowClient.getModelVersionDownloadUri(modelName, modelVersion);

// Or download the model artifacts directly.
File modelFile = mlflowClient.downloadModelVersion(modelName, modelVersion);

Exemplo de comando da CLI:

mlflow artifacts download --artifact-uri models:/<name>/<version|stage>

Implantar modelos para o serviço online

Use o Serviço de Modelo para hospedar modelo de machine learning do Registro de Modelo como pontos de extremidade REST. Esses pontos de extremidade são atualizados automaticamente com base na disponibilidade das versões e nas fases do modelo.

Implante também um modelo para estruturas de serviço de terceiros usando Ferramenta de implantação internas de MLflow. Veja os exemplos a seguir.