Megosztás a következőn keresztül:


Optimalizált nagy nyelvi modell (LLM) szolgáltatás

Fontos

Ez a funkció a nyilvános előzetes verzióban érhető el.

Fontos

Az útmutatóban szereplő kód példák elavult API-kat használnak. A Databricks a kiosztott átviteli sebesség használatát javasolja az LLM-k optimalizált következtetéséhez. Lásd: A végpontokat kiszolgáló, optimalizált LLM migrálása a kiosztott átviteli sebességre.

Ez a cikk bemutatja, hogyan engedélyezheti a nagyméretű nyelvi modellek (LLM-ek) optimalizálását a Mozaik AI-modell-szolgáltatásban.

Az optimalizált LLM-szolgáltatás a hagyományos kiszolgálási módszerekhez képest 3-5-ször jobb átviteli sebességet és késést biztosít. Az alábbi táblázat összefoglalja a támogatott LLM-családokat és azok változatait.

A Databricks azt javasolja, hogy telepítsen alapmodelleket a Databricks Marketplace használatával. Megkeresheti a modellcsaládot, és a modelloldalon válassza a Hozzáférés kérése lehetőséget, és adja meg a bejelentkezési hitelesítő adatokat a modell Unity-katalógusba való telepítéséhez.

Modellcsalád Telepítés a Marketplace-ről
Láma 2 Láma 2 modellek
TCT
Misztrál Mistral modellek

Követelmények

  • Az optimalizált LLM-szolgáltatás a GPU-üzemelő példányok nyilvános előzetes verziójának részeként támogatott.

  • A modellt az MLflow 2.4-es vagy újabb verziójával vagy a Databricks Runtime 13.2 ML-es vagy újabb verziójával kell naplózni.

  • A modellek üzembe helyezésekor elengedhetetlen, hogy a modell paramétermérete és a megfelelő számítási méret egyezzen. Az 50 milliárd vagy több paraméterrel rendelkező modellek esetében forduljon az Azure Databricks-fiók csapatához a szükséges GPU-k eléréséhez.

    Modellparaméter mérete Javasolt számítási méret Számítási feladat típusa
    7 milliárd 1xA100 GPU_LARGE
    13 milliárd 1xA100 GPU_LARGE
    30-34 milliárd 1xA100 GPU_LARGE
    70 milliárd 2xA100 GPU_LARGE_2

Nagy nyelvi modell naplózása

Először naplózza a modellt az MLflow-ízzel transformers , és adja meg a feladatmezőt az MLflow metaadatai között a következővel metadata = {"task": "llm/v1/completions"}: . Ez a végpontot kiszolgáló modellhez használt API-aláírást adja meg.

Az optimalizált LLM-szolgáltatás kompatibilis az Azure Databricks AI Gateway által támogatott útvonaltípusokkal; jelenleg. llm/v1/completions Ha olyan modellcsaládot vagy feladattípust szeretne kiszolgálni, amely nem támogatott, forduljon az Azure Databricks-fiók csapatához.

model = AutoModelForCausalLM.from_pretrained("mosaicml/mpt-7b-instruct",torch_dtype=torch.bfloat16, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("mosaicml/mpt-7b-instruct")
with mlflow.start_run():
    components = {
        "model": model,
        "tokenizer": tokenizer,
    }
    mlflow.transformers.log_model(
        artifact_path="model",
        transformers_model=components,
        input_example=["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"],
        metadata={"task": "llm/v1/completions"},
        registered_model_name='mpt'
    )

A modell naplózása után regisztrálhatja a modelleket a Unity Katalógusban a következőkkel, ahol lecserélheti CATALOG.SCHEMA.MODEL_NAME a modell háromszintű nevét.


mlflow.set_registry_uri("databricks-uc")

registered_model_name=CATALOG.SCHEMA.MODEL_NAME

A végpontot kiszolgáló modell létrehozása

Ezután hozza létre a végpontot kiszolgáló modellt. Ha a modellt optimalizált LLM-szolgáltatás támogatja, az Azure Databricks automatikusan létrehoz egy optimalizált modell-kiszolgáló végpontot, amikor megpróbálja kiszolgálni.

import requests
import json

# Set the name of the MLflow endpoint
endpoint_name = "llama2-3b-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

# Specify the type of compute (CPU, GPU_SMALL, GPU_LARGE, etc.)
workload_type = "GPU_LARGE"

# Specify the scale-out size of compute (Small, Medium, Large, etc.)
workload_size = "Small"

# Specify Scale to Zero (only supported for CPU endpoints)
scale_to_zero = False

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

# send the POST request to create the serving endpoint

data = {
    "name": endpoint_name,
    "config": {
        "served_models": [
            {
                "model_name": model_name,
                "model_version": model_version,
                "workload_size": workload_size,
                "scale_to_zero_enabled": scale_to_zero,
                "workload_type": workload_type,
            }
        ]
    },
}

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

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

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

Bemeneti és kimeneti séma formátuma

Az optimalizált LLM-kiszolgáló végpont olyan bemeneti és kimeneti sémákkal rendelkezik, amelyeket az Azure Databricks vezérel. Négy különböző formátum támogatott.

  • dataframe_split JSON-szerializált Pandas Dataframe a split tájolásban.

    
    {
      "dataframe_split":{
        "columns":["prompt"],
        "index":[0],
        "data":[["Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n"]]
      },
      "params": {
        "temperature": 0.5,
        "max_tokens": 100,
        "stop": ["word1","word2"],
        "candidate_count": 1
      }
    }
    
  • dataframe_records JSON-szerializált Pandas Dataframe a records tájolásban.

    {
      "dataframe_records": [{"prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n"}],
      "params": {
        "temperature": 0.5,
        "max_tokens": 100,
        "stop": ["word1","word2"],
        "candidate_count": 1
      }
    }
    
  • példányok

    {
      "instances": [
       {
         "prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n"
       }
      ],
      "params": {
      "temperature": 0.5,
      "max_tokens": 100,
      "stop": ["word1","word2"],
      "candidate_count": 1
      }
    }
    
  • Bemenetek

    
    {
      "inputs": {
        "prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n"
      },
      "params": {
        "temperature": 0.5,
        "max_tokens": 100,
        "stop": ["word1","word2"],
        "candidate_count": 1
      }
    }
    

A végpont lekérdezése

Miután a végpont elkészült, lekérdezheti egy API-kéréssel. A modell méretétől és összetettségétől függően a végpont előkészítése akár 30 percet is igénybe vehet.


data = {
    "inputs": {
        "prompt": [
            "Hello, I'm a language model,"
        ]
    },
    "params": {
        "max_tokens": 100,
        "temperature": 0.0
    }
}

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

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

print(json.dumps(response.json()))

Korlátozások

  • A GPU-n kiszolgált modellekre vonatkozó megnövekedett telepítési követelmények miatt a GPU-kiszolgáló tárolólemezképének létrehozása hosszabb időt vesz igénybe, mint a cpu-kiszolgáló rendszerképének létrehozása.
    • A modell mérete a képlétrehozásra is hatással van. A 30 milliárd paramétert vagy annál több paramétert tartalmazó modellek létrehozása például legalább egy órát igénybe vehet.
    • A Databricks ugyanazt a tárolót használja újra a modell ugyanazon verziójának következő üzembe helyezésekor, így a későbbi üzembe helyezés kevesebb időt vesz igénybe.
  • A GPU-kiszolgáló automatikus skálázása hosszabb időt vesz igénybe, mint a CPU-kiszolgálás esetében, mivel a GPU-számításra szolgáló modellek beállítási ideje megnő. A Databricks a kérések időtúllépésének elkerülése érdekében túlkiépítést javasol.