Implantar modelos personalizados
Este artigo descreve o suporte da implantação de um modelo personalizado usando o Serviço de Modelo do Mosaic AI. Ele também fornece detalhes sobre opções de registro em log de modelo com suporte e tipos de computação, como empacotar dependências de modelo para serviço e criação e dimensionamento de ponto de extremidade.
O que são modelos personalizados?
O Serviço de Modelo pode implantar qualquer modelo do Python como uma API de nível de produção. O Databricks refere-se a modelos como modelos personalizados. Esses modelos de ML podem ser treinados usando bibliotecas ML padrão, como scikit-learn, XGBoost, PyTorch e transformadores do HuggingFace e podem incluir qualquer código Python.
Para implantar um modelo personalizado,
- Registre o modelo ou o código no formato MLflow usando os tipos internos MLflow nativos ou pyfunc.
- Depois que o modelo for registrado, registre-o no Catálogo do Unity (recomendado) ou no registro do workspace.
- A partir daqui, você pode criar um ponto de extremidade de serviço de modelo para implantar e consultar seu modelo.
Para obter um tutorial completo sobre como servir modelos personalizados no Databricks, consulte Tutorial de fornecimento de modelo.
O Databricks também dá suporte ao fornecimento de modelos de IA generativa para aplicações de IA generativa, consulte APIs do Modelo do Foundation e Modelos externos para modelos e ofertas de computação com suporte.
Importante
Se você depender do Anaconda, examine os termos de aviso de serviço para obter informações adicionais.
Registrar em log modelos de ML
Existem diferentes métodos de registrar em log o seu modelo de ML para serviço de modelo. A lista a seguir resume os métodos e exemplos com suporte.
Registro automático Esse método é habilitado automaticamente ao usar o Databricks Runtime para ML.
import mlflow from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import load_iris iris = load_iris() model = RandomForestRegressor() model.fit(iris.data, iris.target)
Registrar em log utilizando as variantes internas do MLflow. Você pode usar esse método se quiser registrar manualmente o modelo em log para um controle mais detalhado.
import mlflow from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris() model = RandomForestClassifier() model.fit(iris.data, iris.target) with mlflow.start_run(): mlflow.sklearn.log_model(model, "random_forest_classifier")
Registro em log personalizado com
pyfunc
. Você pode usar esse método para implantar modelos arbitrários de código python ou implantar código adicional com seu modelo.import mlflow import mlflow.pyfunc class Model(mlflow.pyfunc.PythonModel): def predict(self, context, model_input): return model_input * 2 with mlflow.start_run(): mlflow.pyfunc.log_model("custom_model", python_model=Model())
Baixe do HuggingFace. Você poderá baixar um modelo diretamente do Hugging Face e registrar esse modelo para servir. Para obter exemplos, consulte exemplos de Notebook.
Exemplos de assinatura e entrada
É recomendável adicionar uma assinatura e um exemplo de entrada ao MLflow. As assinaturas são necessárias para registrar modelos em log no Catálogo do Unity.
Veja a seguir um exemplo de assinatura:
from mlflow.models.signature import infer_signature
signature = infer_signature(training_data, model.predict(training_data))
mlflow.sklearn.log_model(model, "model", signature=signature)
Veja a seguir um exemplo de entrada:
input_example = {"feature1": 0.5, "feature2": 3}
mlflow.sklearn.log_model(model, "model", input_example=input_example)
Tipo de computação
O Serviço de Modelo do Mosaic AI oferece uma variedade de opções de CPU e GPU para implementar seu modelo. Ao implantar com uma GPU, é essencial garantir que seu código esteja configurado para que as previsões sejam executadas na GPU, usando os métodos fornecidos por sua estrutura. O MLflow faz isso automaticamente para modelos registrados com as variantes PyTorch ou Transformadores.
Tipo de carga de trabalho | Instância de GPU | memória |
---|---|---|
CPU |
4 GB por simultaneidade | |
GPU_SMALL |
1xT4 | 16 GB |
GPU_LARGE |
1xA100 | 80GB |
GPU_LARGE_2 |
2xA100 | 160GB |
Contêiner e dependências de implantação
Durante a implantação, um contêiner de nível de produção é criado e implantado como o ponto de extremidade. Esse contêiner inclui bibliotecas capturadas ou especificadas automaticamente no modelo do MLflow.
O contêiner de serviço de modelo não contém dependências pré-instaladas, o que pode levar a erros de dependência se nem todas as dependências necessárias forem incluídas no modelo. Ao executar problemas de implantação de modelo, o Databricks recomenda que você teste o modelo localmente.
Dependências de pacote e código
Bibliotecas personalizadas ou privadas podem ser adicionadas à sua implantação. Confira Usar bibliotecas do Python personalizadas com Serviço de Modelo.
Para modelos de sabor nativo do MLflow, as dependências de pacote necessárias são capturadas automaticamente.
Para modelos pyfunc
personalizados, as dependências podem ser adicionadas explicitamente.
Você pode adicionar dependências de pacote usando:
O parâmetro
pip_requirements
:mlflow.sklearn.log_model(model, "sklearn-model", pip_requirements = ["scikit-learn", "numpy"])
O parâmetro
conda_env
:conda_env = { 'channels': ['defaults'], 'dependencies': [ 'python=3.7.0', 'scikit-learn=0.21.3' ], 'name': 'mlflow-env' } mlflow.sklearn.log_model(model, "sklearn-model", conda_env = conda_env)
Para incluir requisitos adicionais além do que é capturado automaticamente, use
extra_pip_requirements
.mlflow.sklearn.log_model(model, "sklearn-model", extra_pip_requirements = ["sklearn_req"])
Se você tiver dependências de código, elas poderão ser especificadas usando code_path
.
mlflow.sklearn.log_model(model, "sklearn-model", code_path=["path/to/helper_functions.py"],)
Validação de dependência
Antes de implantar um modelo personalizado do MLflow, é bom verificar se o modelo pode ser servido. O MLflow fornece uma API que permite a validação do artefato do modelo que simula o ambiente de implantação e permite o teste de dependências modificadas.
Há duas APIs de validação de pré-implantação no API do Python do MLflow e a CLI do MLflow.
Você pode especificar o seguinte usando qualquer uma dessas APIs.
- O
model_uri
do modelo que é implantado para o serviço do modelo. - Um dos seguintes:
- O
input_data
no formato esperado para a chamadamlflow.pyfunc.PyFuncModel.predict()
do modelo. - O
input_path
que define um arquivo que contém dados de entrada que serão carregados e usados para a chamada parapredict
.
- O
- O
content_type
no formatocsv
oujson
. - Um
output_path
opcional para gravar as previsões em um arquivo. Se você omitir esse parâmetro, as previsões serão impressas emstdout
. - Um gerenciador de ambiente,
env_manager
, que é usado para compilar o ambiente para serviço:- O padrão é
virtualenv
. Recomendado para servir a validação. local
está disponível, mas potencialmente propenso a erros para a validação de serviço. Geralmente usado apenas para depuração rápida.
- O padrão é
- Se deseja instalar a versão atual do MLflow que está em seu ambiente com o ambiente virtual usando
install_mlflow
. Essa configuração usaFalse
como padrão. - Se deve atualizar e testar diferentes versões de dependências de pacotes para solução de problemas ou depuração. Você pode especificar isso como uma lista de substituições ou adições de dependência de cadeia de caracteres usando o argumento de substituição,
pip_requirements_override
.
Por exemplo:
import mlflow
run_id = "..."
model_uri = f"runs:/{run_id}/model"
mlflow.models.predict(
model_uri=model_uri,
input_data={"col1": 34.2, "col2": 11.2, "col3": "green"},
content_type="json",
env_manager="virtualenv",
install_mlflow=False,
pip_requirements_override=["pillow==10.3.0", "scipy==1.13.0"],
)
Atualizações de dependência
Se houver problemas com as dependências especificadas com um modelo registrado, você poderá atualizar os requisitos usando a CLI do MLflow ou mlflow.models.model.update_model_requirements()
na API do Python do MLflow sem precisar registrar outro modelo em log.
O exemplo a seguir mostra como atualizar o pip_requirements.txt
de um modelo registrado no local.
Você pode atualizar definições existentes com versões de pacote especificadas ou adicionar requisitos inexistentes ao arquivo pip_requirements.txt
. Esse arquivo está dentro do artefato do modelo MLflow no local de model_uri
especificado.
from mlflow.models.model import update_model_requirements
update_model_requirements(
model_uri=model_uri,
operation="add",
requirement_list=["pillow==10.2.0", "scipy==1.12.0"],
)
Expectativas e limitações
As seções a seguir descrevem expectativas e limitações conhecidas para servir modelos personalizados usando o Serviço de Modelo.
Expectativas de criação e atualização de ponto de extremidade
Observação
As informações desta seção não se aplicam a pontos de extremidade que fornecem modelos de base ou modelos externos.
Implantar uma versão de modelo recém-registrada envolve empacotar o modelo e seu ambiente de modelo e provisionar o ponto de extremidade do modelo em si. Esse processo pode levar aproximadamente 10 minutos.
O Azure Databricks executa uma atualização de tempo de inatividade zero dos pontos de extremidade mantendo a configuração do ponto de extremidade existente até que a nova fique pronta. Isso reduz o risco de interrupção para pontos de extremidade que estão em uso.
Se a computação de modelo levar mais de 120 segundos, as solicitações terão tempo limite. Se você acredita que a computação do modelo levará mais de 120 segundos, entre em contato com sua equipe de conta do Azure Databricks.
O Databricks executa atualizações ocasionais do sistema de tempo de inatividade zero e manutenção em pontos de extremidade existentes do Serviço de Modelo. Durante a manutenção, o Databricks recarrega modelos e marca um ponto de extremidade como Falha se um modelo não for recarregado. Verifique se os modelos personalizados são robustos e podem recarregar a qualquer momento.
Expectativas de dimensionamento de ponto de extremidade
Observação
As informações desta seção não se aplicam a pontos de extremidade que fornecem modelos de base ou modelos externos.
Os pontos de extremidade de serviço são dimensionados automaticamente com base no tráfego e na capacidade das unidades de simultaneidade provisionadas.
- A simultaneidade provisionada é o número máximo de solicitações paralelas que o sistema pode manipular. Estime a simultaneidade necessária usando a fórmula: simultaneidade provisionada = consultas por segundo (QPS) * tempo de execução do modelo (s).
- Comportamento de dimensionamento: pontos de extremidade aumentam quase imediatamente com o aumento do tráfego e reduzem verticalmente a cada cinco minutos para corresponder ao tráfego reduzido.
- Escala para zero: pontos de extremidade podem reduzir para zero após 30 minutos de inatividade. A primeira solicitação após o dimensionamento para zero experimenta uma “inicialização a frio” levando a uma latência maior. Para aplicativos sensíveis à latência, considere estratégias para gerenciar esse recurso com eficiência.
Limitações da carga de trabalho da GPU
Veja a seguir as limitações para atender pontos de extremidade com cargas de trabalho de GPU:
- A criação de imagem de contêiner para o serviço de GPU leva mais tempo do que a criação de imagem para o serviço de CPU devido ao tamanho do modelo e ao aumento dos requisitos de instalação para modelos servidos da GPU.
- Ao implantar modelos muito grandes, o processo de implantação pode ultrapassar o tempo limite se a implantação do modelo e do build do contêiner exceder uma duração de 60 minutos. Caso isso ocorra, iniciar uma nova tentativa do processo deve implantar o modelo com êxito.
- O dimensionamento automático para o serviço de GPU leva mais tempo do que para o serviço de CPU.
- A capacidade da GPU não é garantida ao escalar para zero. Os pontos de extremidade da GPU podem esperar uma latência extra alta para a primeira solicitação após a escala para zero.
- Essa funcionalidade não está disponível no
northcentralus
.
Atualização de licenciamento do Anaconda
O aviso a seguir destina-se aos clientes que dependem do Anaconda.
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.
Recursos adicionais
- Criar pontos de extremidade de serviço de modelo personalizados
- Consultar pontos de extremidade de serviço para modelos personalizados
- Usar bibliotecas do Python personalizadas com Serviço de Modelo
- Empacotar artefatos personalizados para Serviço de Modelo
- Implantar código Python com o Serviço de Modelo
- Configurar a otimização de rota em pontos de extremidade de serviço
- Configurar o acesso aos recursos dos pontos de extremidade do serviço de modelo