Compartilhar via


Visão geral de modelos personalizados

Este artigo descreve o suporte para modelos personalizados usando o Mosaic AI Model Serving. Ele fornece detalhes sobre opções de registro de logs de modelos com suporte e tipos de computação, como empacotar as dependências dos modelos para disponibilização, e expectativas para criação e escalonamento de endpoints.

O que são modelos personalizados?

O Serviço de Modelo pode implantar qualquer modelo do Python ou código personalizado como uma API de nível de produção usando recursos de computação de CPU ou GPU. O Databricks refere-se a esses 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,

  1. Registre o modelo ou o código no formato MLflow usando os sabores nativos integrados do MLflow ou pyfunc.
  2. Depois que o modelo for registrado, registre-o no Catálogo do Unity (recomendado) ou no registro do workspace.
  3. A partir daqui, você pode criar um ponto de extremidade de serviço de modelo para implantar e consultar seu modelo.
    1. Consulte Criar pontos de extremidade de serviço de modelo personalizados
    2. Confira Pontos de extremidade de serviço de consulta para modelos personalizados.

Para obter um tutorial completo sobre como servir modelos personalizados no Databricks, consulte o tutorial de serviço de modelo.

O Databricks também dá suporte ao fornecimento de modelos de base para aplicativos de IA geradores, consulte APIs do Foundation Model e modelos externos para modelos com suporte e ofertas de computação.

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)
    
  • Registre usando as funcionalidades 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 Bloco de Anotações.

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, você deve verificar se o código está 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 80 GB
GPU_LARGE_2 2xA100 160 GB
GPU_LARGE_4 4xA100 320 GB

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. A imagem base pode incluir algumas dependências no nível do sistema, mas as dependências no nível do aplicativo devem ser especificadas explicitamente em seu modelo de MLflow.

Se nem todas as dependências necessárias forem incluídas no modelo, você poderá encontrar erros de dependência durante a implantação. 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. Consulte Usar bibliotecas personalizadas do Python com o Model Serving.

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. Para obter informações detalhadas sobre requisitos de registro em log e práticas recomendadas, consulte a documentação de Modelos do MLflow e a referência da API do Python do MLflow.

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"],)

Para obter informações sobre como validar e atualizar dependências antes da implantação, consulte a validação de pré-implantação para Model Serving.

Expectativas e limitações

Observação

As informações desta seção não se aplicam a pontos de extremidade que fornecem modelos de base ou modelos externos.

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

  • Tempo de implantação: 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, mas pode levar mais tempo dependendo da complexidade, do tamanho e das dependências do modelo.
  • Atualizações de tempo de inatividade zero: 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 atualizada até que a nova fique pronta. Isso reduz o risco de interrupção para pontos de extremidade que estão em uso. Durante esse processo de atualização, você será cobrado por ambas as configurações de endpoint antigas e novas até que a transição seja concluída.
  • Tempo limite da solicitação: se a computação de modelo levar mais de 297 segundos, as solicitações terão tempo limite.

Importante

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. Se um modelo falhar ao recarregar, a atualização do ponto de extremidade será marcada como falha e a configuração do ponto de extremidade existente continuará a atender às solicitações. Verifique se os modelos personalizados são robustos e podem recarregar a qualquer momento.

Expectativas de escalabilidade de endpoint

Os pontos de extremidade de serviço são dimensionados automaticamente com base no tráfego e na capacidade das unidades de simultaneidade provisionadas.

  • 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). Para validar sua configuração de simultaneidade, consulte Teste de carga para pontos de extremidade de serviço.
  • 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.
  • Dimensionar para zero: Dimensionar para zero é um recurso opcional para endpoints que permite que eles abaixem para zero após 30 minutos de inatividade. A primeira solicitação após o dimensionamento para zero experimenta um "início frio", levando a uma latência maior. O aumento a partir do zero geralmente leva de 10 a 20 segundos, mas às vezes pode levar minutos. Não há nenhum SLA em escala de latência zero.
  • Otimização de rota: Para casos de uso de alta QPS e baixa latência, a otimização de rota é a opção ideal e recomendada para melhorar o desempenho.
  • Implantações otimizadas sem servidor: Para obter uma velocidade de implantação de endpoints mais rápida, use implantações otimizadas sem servidor.

Aviso

A escala para zero não deve ser usada para cargas de trabalho de produção que exigem tempo de atividade consistente ou tempos de resposta garantidos. Para aplicativos sensíveis à latência ou pontos de extremidade que exigem disponibilidade contínua, desabilite a escala para zero.

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 poderá atingir o tempo limite se a construção do contêiner e a implantação do modelo excederem uma duração de 60 minutos, ou a construção do contêiner poderá falhar com o erro "Sem espaço disponível no dispositivo" devido a limitações de armazenamento. Para modelos de linguagem grandes, use em vez disso APIs do Modelo Fundamental.
  • 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.

Aviso de licenciamento da Anaconda para modelos herdados

Observação

Esta seção se aplica somente a modelos registrados com mlflow v1.17 ou anterior (Databricks Runtime 8.3 ML ou anterior). Se você estiver usando uma versão mais recente, poderá ignorar esta seção.

O aviso a seguir é para clientes que dependem do Anaconda com modelos herdados.

Importante

A Anaconda Inc. atualizou seus termos de serviço para canais de anaconda.org. Com base nos novos termos de serviço, você poderá exigir uma licença comercial se depender do empacotamento e distribuição da Anaconda. Confira as perguntas frequentes sobre o Anaconda Commercial Edition 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 modelo conda.yaml com dependência de canal defaults pode ter esta aparência:

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 Anaconda.com por meio do uso do Databricks for permitido nos termos da Anaconda, você não precisará executar nenhuma ação.

Se você quiser alterar o canal usado no ambiente de um modelo, poderá 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 log_model() API, consulte a documentação do MLflow para o tipo de modelo com o qual você está trabalhando, por exemplo, log_model para scikit-learn.

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

Recursos adicionais