Share via


Ingerichte Doorvoer Foundation Model-API's

In dit artikel wordt gedemonstreerd hoe u modellen implementeert met behulp van Foundation Model-API's met ingerichte doorvoer. Databricks raadt ingerichte doorvoer aan voor productieworkloads en biedt geoptimaliseerde deductie voor basismodellen met prestatiegaranties.

Zie Ingerichte doorvoer Foundation Model-API's voor een lijst met ondersteunde modelarchitecturen.

Vereisten

Zie vereisten.

Voor het implementeren van nauwkeurig afgestemde basismodellen,

  • Uw model moet worden geregistreerd met MLflow 2.11 of hoger, OF Databricks Runtime 15.0 ML of hoger.
  • Databricks raadt het gebruik van modellen in Unity Catalog aan voor een snellere upload en download van grote modellen.

U kunt basisbasismodellen installeren in Unity Catalog met behulp van Databricks Marketplace.

Databricks raadt aan basismodellen te installeren met Behulp van Databricks Marketplace. U kunt zoeken naar een modelfamilie en op de modelpagina kunt u Toegang krijgen selecteren en aanmeldingsreferenties opgeven om het model te installeren in Unity Catalog.

Nadat het model is geïnstalleerd in Unity Catalog, kunt u een eindpunt voor het leveren van een model maken met behulp van de gebruikersinterface van De server. Zie Uw ingerichte doorvoereindpunt maken met behulp van de gebruikersinterface.

DBRX-modellen van Databricks Marketplace

Databricks raadt aan het DBRX-instruct-model voor uw workloads te leveren. Als u de DBRX Base- en DBRX Instruct-modellen wilt gebruiken met behulp van ingerichte doorvoer, moet u de richtlijnen in de vorige sectie volgen om deze modellen te installeren in Unity Catalog vanuit databricks Marketplace.

Bij het leveren van deze DBRX-modellen ondersteunt de ingerichte doorvoer een contextlengte van maximaal 16.000. Er zijn binnenkort grotere contextgrootten beschikbaar.

DBRX-modellen gebruiken de volgende standaardsysteemprompt om relevantie en nauwkeurigheid in modelreacties te garanderen:

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.

Aangepaste basismodellen in logboeken

Als u het model niet kunt installeren vanuit De Databricks Marketplace, kunt u een nauwkeurig afgestemd basismodel implementeren door het model vast te leggen in Unity Catalog. Hieronder ziet u hoe u uw code instelt om een MLflow-model te registreren bij Unity Catalog:

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

U kunt uw model registreren met behulp van de MLflow-smaak transformers en het taakargument opgeven met de juiste modeltypeinterface uit de volgende opties:

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

Deze argumenten geven de API-handtekening op die wordt gebruikt voor het eindpunt van het model dat wordt geleverd en modellen die op deze manier worden geregistreerd, komen in aanmerking voor ingerichte doorvoer.

Modellen die vanuit het sentence_transformers pakket zijn vastgelegd, ondersteunen ook het definiëren van het "llm/v1/embeddings" eindpunttype.

Voor modellen die zijn geregistreerd met MLflow 2.12 of hoger, wordt met het log_model argument task de waarde van de metadatatask sleutel automatisch ingesteld. Als het task argument en het metadatatask argument zijn ingesteld op verschillende waarden, wordt er een Exception verhoogd.

Hier volgt een voorbeeld van het registreren van een taalmodel voor tekstvoltooiing dat is vastgelegd met MLflow 2.12 of hoger:

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
    )

Voor modellen die zijn geregistreerd met MLflow 2.11 of hoger, kunt u de interface voor het eindpunt opgeven met behulp van de volgende metagegevenswaarden:

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

Hier volgt een voorbeeld van het vastleggen van een taalmodel voor tekstvoltooiing dat is geregistreerd met MLflow 2.11 of hoger:

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
    )

Ingerichte doorvoer ondersteunt ook zowel het kleine als het grote BGE-insluitingsmodel. Hier volgt een voorbeeld van het vastleggen van het model, BAAI/bge-small-en-v1.5 zodat het kan worden geleverd met ingerichte doorvoer met behulp van MLflow 2.11 of hoger:

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
    )

Bij het vastleggen van een nauwkeurig afgestemd BGE-model moet u ook metagegevenssleutel opgeven model_type :

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

Uw ingerichte doorvoereindpunt maken met behulp van de gebruikersinterface

Nadat het vastgelegde model zich in Unity Catalog bevindt, maakt u een ingerichte doorvoer voor eindpunt met de volgende stappen:

  1. Navigeer naar de gebruikersinterface van de server in uw werkruimte.
  2. Selecteer Het eindpunt voor het leveren van een service maken.
  3. Selecteer in het veld Entiteit uw model in Unity Catalog. Voor in aanmerking komende modellen wordt in de gebruikersinterface voor de entiteit Serveerbaar het scherm Ingerichte doorvoer weergegeven.
  4. In de vervolgkeuzelijst Up to kunt u de maximumtokens per seconde doorvoer voor uw eindpunt configureren.
    1. Ingerichte doorvoereindpunten worden automatisch geschaald, zodat u Wijzigen kunt selecteren om de minimale tokens per seconde weer te geven waarnaar uw eindpunt kan worden geschaald.

Ingerichte doorvoer

Uw ingerichte doorvoereindpunt maken met behulp van de REST API

Als u uw model wilt implementeren in de ingerichte doorvoermodus met behulp van de REST API, moet u velden in uw aanvraag opgeven en max_provisioned_throughput opgevenmin_provisioned_throughput.

Zie Ingerichte doorvoer in stappen ophalen om het geschikte bereik van ingerichte doorvoer voor uw model te identificeren.

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))

Ingerichte doorvoer in stappen ophalen

Ingerichte doorvoer is beschikbaar in stappen van tokens per seconde met specifieke stappen die per model variëren. Om het geschikte bereik voor uw behoeften te identificeren, raadt Databricks aan om de API voor modeloptimalisatie-informatie binnen het platform te gebruiken.

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

Hier volgt een voorbeeldantwoord van de API:

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

Notebook-voorbeelden

In de volgende notebooks ziet u voorbeelden van het maken van een ingerichte Doorvoer Foundation Model-API:

Ingerichte doorvoer voor Llama2-modelnotebook

Notebook downloaden

Ingerichte doorvoer voor Mistral model notebook

Notebook downloaden

Ingerichte doorvoer voor BGE-modelnotebook

Notebook downloaden

Beperkingen

  • Modelimplementatie kan mislukken vanwege problemen met GPU-capaciteit, wat resulteert in een time-out tijdens het maken of bijwerken van het eindpunt. Neem contact op met uw Databricks-accountteam om het probleem op te lossen.
  • Automatisch schalen voor Foundation Models-API's is langzamer dan het CPU-model dat wordt geleverd. Databricks raadt overinrichting aan om time-outs van aanvragen te voorkomen.

Aanvullende bronnen