Sdílet prostřednictvím


Obsluha optimalizovaného rozsáhlého jazykového modelu (LLM)

Důležité

Tato funkce je ve verzi Public Preview.

Důležité

Příklady kódu v této příručce používají zastaralá rozhraní API. Databricks doporučuje používat zřízené prostředí propustnosti pro optimalizované odvozování LLM. Viz Migrovaná optimalizovaná LLM obsluhující koncové body na zřízenou propustnost.

Tento článek ukazuje, jak povolit optimalizace pro velké jazykové modely (LLMs) ve službě Služby modelu AI v systému Mosaic AI.

Optimalizovaná obsluha LLM poskytuje vylepšení propustnosti a latence v rozsahu 3–5krát lépe v porovnání s tradičními přístupy pro obsluhu. Následující table shrnuje podporované modely LLM a varianty těchto modelů.

Databricks doporučuje nainstalovat základní modely pomocí Databricks Marketplace. Můžete vyhledat řadu modelů a na stránce modelu, selectGet získat přístup k a zadat přihlašovací credentials pro instalaci modelu do Unity Catalog.

Řada modelů Instalace z Marketplace
Llama 2 Modely Llama 2
MPT
Mistral Mistral modely

Požadavky

  • Optimalizované poskytování LLM se podporuje jako součást nasazení GPU ve verzi Public Preview.

  • Váš model musí být protokolovaný pomocí MLflow 2.4 a vyšší nebo Databricks Runtime 13.2 ML a vyšší.

  • Při nasazování modelů je nezbytné shodovat velikost parametru modelu s odpovídající velikostí výpočetních prostředků. V případě modelů s 50 miliardami nebo více parametersse obraťte na tým účtu Azure Databricks a požádejte o přístup k potřebným grafickým procesorům.

    Velikost parametru modelu Doporučená velikost výpočetních prostředků Typ úlohy
    7 miliard 1xA100 GPU_LARGE
    13 miliard 1xA100 GPU_LARGE
    30–34 miliard 1xA100 GPU_LARGE
    70 miliard 2xA100 GPU_LARGE_2

Protokolování velkého jazykového modelu

Nejprve zapište svůj model s příchutí MLflow transformers a zadejte pole úkolu v metadatech MLflow pomocí metadata = {"task": "llm/v1/completions"}. Určuje podpis rozhraní API používaný pro koncový bod obsluhy modelu.

Optimalizovaná obsluha LLM je kompatibilní s typy tras podporovanými službou Azure Databricks AI Gateway; v současné době . llm/v1/completions Pokud existuje řada modelů nebo typ úkolu, který chcete obsluhovat, který není podporovaný, obraťte se na svůj tým účtů Azure Databricks.

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

Po uložení modelu můžete své modely zaregistrovat v Unity Catalog, použijete následující where a nahradíte výraz CATALOG.SCHEMA.MODEL_NAME tříúrovňovým názvem modelu.


mlflow.set_registry_uri("databricks-uc")

registered_model_name=CATALOG.SCHEMA.MODEL_NAME

Vytvoření koncového bodu obsluhy modelu

Dále vytvořte koncový bod obsluhující model. Pokud váš model podporuje obsluha optimalizovaného LLM, Azure Databricks automaticky vytvoří optimalizovaný koncový bod obsluhy modelu při pokusu o jeho obsluhu.

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

Formát pro vstup a výstup schema

Optimalizovaný koncový bod obsluhy LLM má vstupní a výstupní schémata, která řídí Azure Databricks. Podporují se čtyři různé formáty.

  • dataframe_split je datový rámec Pandas serializovaný ve formátu JSON v orientaci split .

    
    {
      "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 je datový rámec Pandas serializovaný ve formátu JSON v orientaci records .

    {
      "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
      }
    }
    
  • instance

    {
      "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
      }
    }
    
  • vstupy

    
    {
      "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
      }
    }
    

Dotazování koncového bodu

Jakmile je koncový bod připravený, můžete se na něj dotazovat tak, že vytvoříte požadavek rozhraní API. V závislosti na velikosti a složitosti modelu může trvat 30 minut nebo déle, než bude koncový bod get připraven.


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

Omezení

  • Vzhledem k zvýšeným požadavkům na instalaci modelů obsluhujících GPU trvá vytvoření image kontejneru pro obsluhu GPU déle než vytvoření image pro obsluhu procesoru.
    • Velikost modelu má vliv také na vytvoření image. Vytváření modelů, které mají například 30 miliard parameters nebo více, může trvat aspoň hodinu.
    • Databricks znovu použije stejný kontejner při příštím nasazení stejné verze modelu, takže další nasazení budou trvat kratší dobu.
  • Automatické škálování pro obsluhu GPU trvá déle než pro obsluhu procesoru, a to kvůli zvýšenému set času pro modely obsluhované na výpočetních prostředcích GPU. Databricks doporučuje nadměrné zřizování, aby se zabránilo vypršení časového limitu požadavků.