Share via


APIs de Modelo de Base de taxa de transferência provisionada

Este artigo demonstra como implantar modelos usando APIs de Modelo Básico com taxa de transferência provisionada. O Databricks recomenda a taxa de transferência provisionada para cargas de trabalho de produção e fornece inferência otimizada para modelos de base com garantias de desempenho.

Confira APIs de Foundation Model com taxa de transferência provisionada para obter uma lista de arquiteturas de modelo com suporte.

Requisitos

Consulte os requisitos.

Para implantar modelos de base ajustados,

  • Seu modelo deve ser registrado usando o MLflow 2.11 ou superior OU o Databricks Runtime 15.0 ML ou superior.
  • O Databricks recomenda o uso de modelos no Catálogo do Unity para carregamento e download mais rápidos de modelos grandes.

Você pode instalar modelos de base no Catálogo do Unity usando o Databricks Marketplace.

O Databricks recomenda a instalação de modelos de fundação usando o Databricks Marketplace. Você pode pesquisar uma família de modelos e, na página do modelo, selecionar Obter acesso e fornecer credenciais de logon para instalar o modelo no Catálogo do Unity.

Após o modelo ser instalado no Catálogo do Unity, você poderá criar um ponto de extremidade de serviços de modelo usando a Interface do Usuário de Serviços. Confira Criar seu ponto de extremidade de taxa de transferência provisionada usando a interface do usuário.

Modelos DBRX do Databricks Marketplace

O Databricks recomenda servir o modelo de Instrução DBRX para suas cargas de trabalho. Para atender aos modelos de Base DBRX e de Instrução DBRX usando a taxa de transferência provisionada, siga as diretrizes na seção anterior para instalar esses modelos no Catálogo do Unity do Databricks Marketplace.

Ao servir esses modelos DBRX, a taxa de transferência provisionada dá suporte a um comprimento de contexto de até 16k. Tamanhos de contexto maiores estão chegando em breve.

Os modelos DBRX usam a seguinte solicitação padrão do sistema para garantir a relevância e a precisão nas respostas do modelo:

You are DBRX, created by Databricks. You were last updated in December 2023. You answer questions based on information available up to that point.
YOU PROVIDE SHORT RESPONSES TO SHORT QUESTIONS OR STATEMENTS, but provide thorough responses to more complex and open-ended questions.
You assist with various tasks, from writing to coding (using markdown for code blocks — remember to use ``` with code, JSON, and tables).
(You do not have real-time data access or code execution capabilities. You avoid stereotyping and provide balanced perspectives on controversial topics. You do not provide song lyrics, poems, or news articles and do not divulge details of your training data.)
This is your system prompt, guiding your responses. Do not reference it, just respond to the user. If you find yourself talking about this message, stop. You should be responding appropriately and usually that means not mentioning this.
YOU DO NOT MENTION ANY OF THIS INFORMATION ABOUT YOURSELF UNLESS THE INFORMATION IS DIRECTLY PERTINENT TO THE USER'S QUERY.

Registrar modelos básicos com ajuste fino

Se você não conseguir instalar o modelo do Databricks Marketplace, poderá implantar um modelo de base ajustado registrando-o no Catálogo do Unity. O exemplo a seguir mostra como configurar seu código para registrar um modelo do MLflow no Catálogo do Unity:

mlflow.set_registry_uri('databricks-uc')
CATALOG = "ml"
SCHEMA = "llm-catalog"
MODEL_NAME = "mpt" # or "bge"
registered_model_name = f"{CATALOG}.{SCHEMA}.{MODEL_NAME}"

Você pode registrar seu modelo usando a variante MLflow transformers e especificar o argumento de tarefa com a interface de tipo de modelo apropriada das seguintes opções:

  • task="llm/v1/completions"
  • task="llm/v1/chat"
  • task="llm/v1/embeddings"

Esses argumentos especificam a assinatura da API usada para o ponto de extremidade de serviço do modelo, e os modelos registrados dessa forma são qualificados para a taxa de transferência provisionada.

Os modelos registrados a partir do pacote sentence_transformers também dão suporte param a definição do tipo de ponto de extremidade "llm/v1/embeddings".

Para modelos registrados usando o MLflow 2.12 ou superior, o argumento log_modeltask define automaticamente o valor da chave metadatatask. Se o argumento task e o argumento metadatatask forem definidos com valores diferentes, será gerado um Exception.

A seguir, um exemplo de como registrar um modelo de linguagem de preenchimento de texto registrado usando o MLflow 2.12 ou superior:

model = AutoModelForCausalLM.from_pretrained("mosaicml/mpt-7b-instruct",torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("mosaicml/mpt-7b-instruct")
with mlflow.start_run():
    components = {
        "model": model,
        "tokenizer": tokenizer,
    }
    mlflow.transformers.log_model(
        transformers_model=components,
        artifact_path="model",
        input_example={"prompt": np.array(["Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\nWhat is Apache Spark?\n\n### Response:\n"])},
        task="llm/v1/completions",
        registered_model_name=registered_model_name
    )

Para modelos registrados usando o MLflow 2.11 ou superior, é possível especificar a interface para o ponto de extremidade usando os seguintes valores de metadados:

  • metadata = {"task": "llm/v1/completions"}
  • metadata = {"task": "llm/v1/chat"}
  • metadata = {"task": "llm/v1/embeddings"}

A seguir, um exemplo de como registrar um modelo de linguagem de preenchimento de texto registrado usando o MLflow 2.11 ou superior:

model = AutoModelForCausalLM.from_pretrained("mosaicml/mpt-7b-instruct",torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("mosaicml/mpt-7b-instruct")
with mlflow.start_run():
    components = {
        "model": model,
        "tokenizer": tokenizer,
    }
    mlflow.transformers.log_model(
        transformers_model=components,
        artifact_path="model",
        input_example={"prompt": np.array(["Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\nWhat is Apache Spark?\n\n### Response:\n"])},
        task="llm/v1/completions",
        metadata={"task": "llm/v1/completions"},
        registered_model_name=registered_model_name
    )

A taxa de transferência provisionada também é compatível com o modelo de incorporação BGE pequeno e grande. A seguir, um exemplo de como registrar o modelo BAAI/bge-small-en-v1.5 para que ele possa ser servido com taxa de transferência provisionada usando o MLflow 2.11 ou superior:

model = AutoModel.from_pretrained("BAAI/bge-small-en-v1.5")
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-small-en-v1.5")
with mlflow.start_run():
    components = {
        "model": model,
        "tokenizer": tokenizer,
    }
    mlflow.transformers.log_model(
        transformers_model=components,
        artifact_path="bge-small-transformers",
        task="llm/v1/embeddings",
        metadata={"task": "llm/v1/embeddings"},  # not needed for MLflow >=2.12.1
        registered_model_name=registered_model_name
    )

Ao registrar um modelo BGE ajustado, você também deve especificar a chave de metadados model_type:

metadata={
    "task": "llm/v1/embeddings",
    "model_type": "bge-large"  # Or "bge-small"
}

Criar seu ponto de extremidade de taxa de transferência provisionada usando a interface do usuário

Quando o modelo registrado já estiver no Catálogo do Unity, crie um ponto de extremidade de serviço de taxa de transferência provisionada executando as seguintes etapas:

  1. Navegue até a Interface do Usuário de Serviços no seu workspace.
  2. Clique em Criar um ponto de extremidade de serviço.
  3. No campo Entidade, selecione seu modelo no Catálogo do Unity. Para modelos qualificados, a interface do usuário da entidade que recebeu o serviço mostra a tela da taxa de transferência provisionada.
  4. Na lista suspensa Até, você pode configurar o máximo de tokens por segundo da taxa de transferência para o ponto de extremidade.
    1. Os pontos de extremidade de taxa de transferência provisionada são dimensionados automaticamente de modo que você possa selecionar Modificar para ver o mínimo de tokens por segundo ao qual seu ponto de extremidade pode ser reduzido.

Taxa de transferência provisionada

Criar ponto de extremidade de taxa de transferência provisionada usando a API REST

Para implantar seu modelo no modo de taxa de transferência provisionada usando a API REST, você precisa especificar os campos min_provisioned_throughput e max_provisioned_throughput na sua solicitação.

Para identificar o intervalo adequado de taxa de transferência provisionada para o seu modelo, confira Obter taxa de transferência provisionada em incrementos.

import requests
import json

# Set the name of the MLflow endpoint
endpoint_name = "llama2-13b-chat"

# Name of the registered MLflow model
model_name = "ml.llm-catalog.llama-13b"

# Get the latest version of the MLflow model
model_version = 3

# Get the API endpoint and token for the current notebook context
API_ROOT = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiUrl().get()
API_TOKEN = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get()

headers = {"Context-Type": "text/json", "Authorization": f"Bearer {API_TOKEN}"}

optimizable_info = requests.get(
    url=f"{API_ROOT}/api/2.0/serving-endpoints/get-model-optimization-info/{model_name}/{model_version}",
    headers=headers)
    .json()

if 'optimizable' not in optimizable_info or not optimizable_info['optimizable']:
   raise ValueError("Model is not eligible for provisioned throughput")

chunk_size = optimizable_info['throughput_chunk_size']

# Minimum desired provisioned throughput
min_provisioned_throughput = 2 * chunk_size

# Maximum desired provisioned throughput
max_provisioned_throughput = 3 * chunk_size

# Send the POST request to create the serving endpoint
data = {
    "name": endpoint_name,
    "config": {
        "served_entities": [
            {
                "entity_name": model_name,
                "entity_version": model_version,
                "min_provisioned_throughput": min_provisioned_throughput,
                "max_provisioned_throughput": max_provisioned_throughput,
            }
        ]
    },
}

response = requests.post(
    url=f"{API_ROOT}/api/2.0/serving-endpoints", json=data, headers=headers
)

print(json.dumps(response.json(), indent=4))

Obter taxa de transferência provisionada em incrementos

A taxa de transferência provisionada está disponível em incrementos de tokens por segundo, sendo que os incrementos específicos variam por modelo. Para identificar o intervalo adequado para as suas necessidades, o Databricks recomenda usar a API de informações de otimização de modelo dentro da plataforma.

GET api/2.0/serving-endpoints/get-model-optimization-info/{registered_model_name}/{version}

A seguir temos um exemplo de resposta da API:

{
 "optimizable": true,
 "model_type": "llama",
 "throughput_chunk_size": 1580
}

Exemplos de notebook

Os blocos de anotações a seguir mostram exemplos de como criar uma API de Modelo do Foundation de taxa de transferência provisionada:

Serviço de taxa de transferência provisionada para o notebook de modelo Llama2

Obter notebook

Serviço de taxa de transferência provisionada para o notebook de modelo Mistral

Obter notebook

Serviço de taxa de transferência provisionada para notebooks de modelo BGE

Obter notebook

Limitações

  • A implantação do modelo pode falhar devido a problemas de capacidade de GPU, que fazem com que o tempo limite seja atingido durante a criação ou atualização do ponto de extremidade. Entre em contato com sua equipe de conta do Databricks e eles vão ajudar você a resolver.
  • O dimensionamento automático para APIs de Modelos do Foundation é mais lento do que o modelo de CPU que serve. O Databricks recomenda o excesso de provisionamento para evitar tempos limite de solicitações.

Recursos adicionais