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 orientacisplit
.{ "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 orientacirecords
.{ "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ů.