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.
Para saber como registrar e pontuar um modelo de streaming, confira Como salvar e carregar um modelo de streaming.
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 de volumes do Catálogo do Unity (como
dbfs:/Volumes/catalog_name/schema_name/volume_name/{path_to_artifact_root}/{model_path}
) - um caminho de armazenamento de artefato gerenciado pelo MLflow começando com
dbfs:/databricks/mlflow-tracking/
- 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:
- 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.)
- Role a página até a seção Artefatos.
- 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.
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 em volumes do Catálogo do Unity
Para salvar um modelo localmente, use mlflow.<model-type>.save_model(model, modelpath)
. modelpath
deve ser um caminho de volumes do Catálogo do Unity. Por exemplo, se você usar um local dbfs:/Volumes/catalog_name/schema_name/volume_name/my_project_models
de volumes do Catálogo do Unity para armazenar o trabalho do projeto, deverá usar o caminho /dbfs/Volumes/catalog_name/schema_name/volume_name/my_project_models
do modelo:
modelpath = "/dbfs/Volumes/catalog_name/schema_name/volume_name/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
Você pode usar o Mosaic AI Model Serving para hospedar modelos de machine learning registrados no registro de modelos do Catálogo do Unity 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.