Dependências do modelo de log
Neste artigo, você aprenderá como registrar um modelo e suas dependências como artefatos de modelo, para que eles estejam disponíveis em seu ambiente para tarefas de produção, como o serviço de modelo.
Registrar dependências do modelo de pacote Python
O MLflow tem suporte nativo para algumas bibliotecas Python ML, onde o MLflow pode registrar de forma confiável dependências para modelos que usam essas bibliotecas. Veja os sabores de modelo incorporados.
Por exemplo, o MLflow suporta scikit-learn no módulo mlflow.sklearn, e o comando mlflow.sklearn.log_model registra a versão do sklearn. O mesmo se aplica ao registro automático com essas bibliotecas de ML. Consulte o repositório github MLflow para obter exemplos adicionais.
Nota
Para habilitar o log de rastreamento para cargas de trabalho de IA generativas, o MLflow suporta o registro automático do OpenAI.
Para bibliotecas de ML que podem ser instaladas com pip install PACKAGE_NAME==VERSION
o , mas não têm sabores de modelo MLflow integrados, você pode registrar esses pacotes usando o método mlflow.pyfunc.log_model . Certifique-se de registrar os requisitos com a versão exata da biblioteca, por exemplo, f"nltk=={nltk.__version__}"
em vez de apenas nltk
.
mlflow.pyfunc.log_model
Suporta registo para:
- Bibliotecas públicas e personalizadas empacotadas como Python egg ou Python wheel files.
- Pacotes públicos no PyPI e pacotes hospedados de forma privada em seu próprio servidor PyPI.
Com o mlflow.pyfunc.log_model, o MLflow tenta inferir as dependências automaticamente. MLflow infere as dependências usando mlflow.models.infer_pip_requirements e as registra em um requirements.txt
arquivo como um artefato de modelo.
Em versões mais antigas, o MLflow às vezes não identifica todos os requisitos do Python automaticamente, especialmente se a biblioteca não for um modelo integrado. Nesses casos, você pode especificar dependências adicionais com o extra_pip_requirements
parâmetro no log_model
comando. Veja um exemplo de uso do parâmetro extra_pip_requirements.
Importante
Você também pode substituir todo o conjunto de requisitos pelos parâmetros conda_env
e pip_requirements
, mas isso geralmente é desencorajado porque substitui as dependências que o MLflow seleciona automaticamente. Veja um exemplo de como usar o pip_requirements
parâmetro para substituir requisitos.
Registro de modelo personalizado
Para cenários em que é necessário um registo de modelos mais personalizado, pode optar por uma das seguintes opções:
- Escreva um modelo Python personalizado. Isso permite que você subclassifique
mlflow.pyfunc.PythonModel
para personalizar a inicialização e a previsão. Essa abordagem funciona bem para personalização de modelos somente Python.- Para obter um exemplo simples, consulte o exemplo de modelo add N.
- Para obter um exemplo mais complexo, consulte o exemplo de modelo XGBoost personalizado.
- Escreva um sabor personalizado. Nesse cenário, você pode personalizar o log mais do que o sabor genérico
pyfunc
, mas fazer isso requer mais trabalho para implementar.
Código Python personalizado
Você pode ter dependências de código Python que não podem ser instaladas usando o %pip install
comando, como um ou mais .py
arquivos.
Ao registrar um modelo, você pode dizer ao MLflow que o modelo pode encontrar essas dependências em um caminho especificado usando o code_path
parâmetro em mlflow.pyfunc.log_model. O MLflow armazena todos os arquivos ou diretórios passados usando code_path
como artefatos junto com o modelo em um diretório de código. Ao carregar o modelo, o MLflow adiciona esses arquivos ou diretórios ao caminho do Python. Esta rota também funciona com arquivos de roda Python personalizados, que podem ser incluídos no modelo usando code_path
, assim como .py
arquivos.
mlflow.pyfunc.log_model( artifact_path=artifact_path,
code_path=[filename.py],
data_path=data_path,
conda_env=conda_env,
)
Registrar dependências de modelo de pacote não-Python
O MLflow não capta automaticamente dependências não-Python, como pacotes Java, pacotes R e pacotes nativos (como pacotes Linux). Para esses pacotes, você precisa registrar dados adicionais.
- Lista de dependências: o Databricks recomenda registrar um artefato com o modelo especificando essas dependências não Python. Isso pode ser um simples
.txt
ou.json
arquivo. mlflow.pyfunc.log_model permite especificar esse artefato adicional usando oartifacts
argumento. - Pacotes personalizados: Assim como para as dependências personalizadas do Python acima, você precisa garantir que os pacotes estejam disponíveis em seu ambiente de implantação. Para pacotes em um local central, como o Maven Central ou seu próprio repositório, certifique-se de que o local esteja disponível na pontuação ou no tempo de serviço. Para pacotes privados não hospedados em outro lugar, você pode registrar pacotes junto com o modelo como artefatos.
Implantar modelos com dependências
Ao implantar um modelo a partir do MLflow Tracking Server ou do Model Registry, você precisa garantir que o ambiente de implantação tenha as dependências corretas instaladas. O caminho mais simples pode depender do seu modo de implantação: lote/streaming ou serviço online e dos tipos de dependências.
Para todos os modos de implantação, o Databricks recomenda executar a inferência na mesma versão de tempo de execução que você usou durante o treinamento, já que o Databricks Runtime no qual você criou seu modelo tem várias bibliotecas já instaladas. MLflow no Databricks salva automaticamente essa versão de tempo de execução no MLmodel
arquivo de metadados em um databricks_runtime
campo, como databricks_runtime: 10.2.x-cpu-ml-scala2.12
.
Servir online: Mosaic AI Model Serving
O Databricks oferece Model Serving, onde seus modelos de aprendizado de máquina MLflow são expostos como pontos de extremidade de API REST escaláveis.
Para dependências Python no requirements.txt
arquivo, Databricks e MLflow lidam com tudo para dependências públicas do PyPI. Da mesma forma, se você especificou .py
arquivos ou arquivos de roda Python ao registrar o modelo usando o argumento, o code_path
MLflow carregará essas dependências para você automaticamente.
Para esses cenários de serviço de modelo, consulte o seguinte:
- Use bibliotecas Python personalizadas com o Model Serving
- Empacotar artefatos e arquivos personalizados para o Model Serving
Para dependências Python no requirements.txt
arquivo, Databricks e MLflow lidam com tudo para dependências públicas do PyPI. Da mesma forma, se você especificou .py
arquivos ou arquivos de roda Python ao registrar o modelo usando o argumento, o code_path
MLflow carregará essas dependências para você automaticamente.
Atendimento online: sistemas de terceiros ou contêineres Docker
Se o seu cenário exigir servir para soluções de serviço de terceiros ou sua própria solução baseada no Docker, você poderá exportar seu modelo como um contêiner do Docker.
O Databricks recomenda o seguinte para serviços de terceiros que lidam automaticamente com dependências do Python. No entanto, para dependências não-Python, o contêiner precisa ser modificado para incluí-las.
Integração do Docker do MLflow para solução de serviço baseada em Docker: modelos MLflow build-docker
Integração MLflow do Azure Machine Learning:
Trabalhos em lote e streaming
A pontuação em lote e streaming deve ser executada como Databricks Jobs. Um trabalho de bloco de anotações geralmente é suficiente, e a maneira mais simples de preparar o código é usar o Databricks Model Registry para gerar um bloco de anotações de pontuação.
A seguir descrevemos o processo e as etapas a seguir para garantir que as dependências sejam instaladas e aplicadas de acordo:
Inicie seu cluster de pontuação com a mesma versão do Databricks Runtime usada durante o treinamento. Leia o
databricks_runtime
campo doMLmodel
arquivo de metadados e inicie um cluster com essa versão de tempo de execução.- Isso pode ser feito manualmente na configuração do cluster ou automatizado com lógica personalizada. Para automação, o formato de versão de tempo de execução que você lê do arquivo de metadados na API de Trabalhos e na API de Clusters.
Em seguida, instale todas as dependências que não sejam do Python. Para garantir que suas dependências não-Python sejam acessíveis ao seu ambiente de implementação, você pode:
- Instale manualmente as dependências não-Python do seu modelo no cluster Databricks como parte da configuração do cluster antes de executar a inferência.
- Como alternativa, você pode escrever lógica personalizada em sua implantação de trabalho de pontuação para automatizar a instalação das dependências em seu cluster. Supondo que você salvou suas dependências não-Python como artefatos, conforme descrito em Log não-Python package model dependencies, essa automação pode instalar bibliotecas usando a API de bibliotecas. Ou, você pode escrever código específico para gerar um script de inicialização com escopo de cluster para instalar as dependências.
Seu trabalho de pontuação instala as dependências do Python no ambiente de execução do trabalho. No Databricks, o Registro Modelo permite que você gere um bloco de anotações para inferência que faz isso por você.
- Quando você usa o Databricks Model Registry para gerar um bloco de anotações de pontuação, o bloco de anotações contém código para instalar as dependências Python no arquivo
requirements.txt
do modelo. Para seu trabalho de bloco de anotações para pontuação em lote ou streaming, esse código inicializa seu ambiente de bloco de anotações, para que as dependências do modelo estejam instaladas e prontas para seu modelo.
- Quando você usa o Databricks Model Registry para gerar um bloco de anotações de pontuação, o bloco de anotações contém código para instalar as dependências Python no arquivo
MLflow lida com qualquer código Python personalizado incluído no
code_path
parâmetro emlog_model
. Esse código é adicionado ao caminho Python quando o método dopredict()
modelo é chamado. Você também pode fazer isso manualmente:- Chamando mlflow.pyfunc.spark_udf com o
env_manager=['virtualenv'/'conda']
argumento. - Extraindo os requisitos usando mlflow.pyfunc.get_model_dependencies e instalando-os usando %pip install.
Nota
Se você especificou
.py
arquivos ou arquivos de roda Python ao registrar o modelo usando o argumento, ocode_path
MLflow carregará essas dependências para você automaticamente.- Chamando mlflow.pyfunc.spark_udf com o