共用方式為


布建的輸送量基礎模型 API

本文示範如何使用基礎模型 API 搭配布建的輸送量來部署模型。 Databricks 建議針對生產工作負載布建的輸送量,並提供效能保證的底層模型的優化推斷。

如需支援的模型架構清單,請參閱 布建的輸送量基礎模型 API

需求

請參閱 需求

若要部署微調的基礎模型,

  • 您的模型必須使用 MLflow 2.11 或更新版本、OR Databricks Runtime 15.0 ML 或更新版本來記錄。
  • Databricks 建議在 Unity 目錄中使用模型,以便更快速地上傳和下載大型模型。

重要

這項功能處於公開預覽狀態

Databricks 建議使用 Unity 目錄中預安裝的基礎模型。 您可以在架構的目錄system下找到這些模型(system.ai)。ai

若要部署基礎模型:

  1. 在目錄總管中瀏覽至 system.ai
  2. 按兩下要部署的模型名稱。
  3. 在模型頁面上,按兩下 [ 提供此模型] 按鈕。
  4. [ 建立服務端點 ] 頁面隨即出現。 請參閱 使用UI建立布建的輸送量端點。

從 Databricks Marketplace 部署基礎模型

或者,您可以從 Databricks Marketplace 將基礎模型安裝到 Unity 目錄

您可以搜尋模型系列,並從模型頁面選取 [ 取得存取 權],並提供登入認證,以將模型安裝至 Unity 目錄。

將模型安裝到 Unity 目錄之後,您可以使用服務 UI 建立服務端點的模型。

部署 DBRX 模型

Databricks 建議為您的工作負載提供 DBRX 指示模型。 若要使用布建的輸送量來提供 DBRX 指示模型,請遵循 [建議] 從 Unity 目錄部署基礎模型中的指引。

提供這些 DBRX 模型時,布建的輸送量支援最多 16k 的內容長度。

DBRX 模型會使用下列預設系統提示,以確保模型回應的相關性和精確度:

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.

記錄微調的基礎模型

如果您無法使用架構中的 system.ai 模型,或從 Databricks Marketplace 安裝模型,您可以將模型記錄至 Unity 目錄,以部署微調的基礎模型。 下列示範如何設定程式代碼,將 MLflow 模型記錄至 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}"

您可以使用 MLflow transformers 類別來記錄模型,並從下列選項使用適當的模型類型介面指定工作自變數:

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

這些自變數會指定用於服務端點之模型的 API 簽章,而以這種方式記錄的模型符合布建輸送量的資格。

從封裝記錄的 sentence_transformers 模型也支援定義 "llm/v1/embeddings" 端點類型。

對於使用 MLflow 2.12 或更新版本記錄的模型,自 log_model 變數 task 會自動設定 metadatatask 索引鍵的值。 如果自 task 變數和 metadatatask 自變數設定為不同的值, Exception 則會引發 。

以下是如何使用 MLflow 2.12 或更新版本記錄的文字完成語言模型範例:

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
    )

針對使用 MLflow 2.11 或更新版本記錄的模型,您可以使用下列元數據值來指定連接點的介面:

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

以下是如何使用 MLflow 2.11 或更新版本記錄的文字完成語言模型範例:

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
    )

布建的輸送量也支援小型和大型 BGE 內嵌模型。 以下是如何記錄模型的範例, BAAI/bge-small-en-v1.5 因此可以使用 MLflow 2.11 或更新版本來提供布建輸送量:

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
    )

記錄微調的 BGE 模型時,您也必須指定 model_type 元數據索引鍵:

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

使用UI建立布建的輸送量端點

記錄的模型位於 Unity 目錄之後,請使用下列步驟建立布建的輸送量服務端點:

  1. 流覽至 工作區中的 [服務 UI ]。
  2. 選取 [ 建立服務端點]。
  3. 在 [ 實體] 欄位中,從 Unity 目錄選取您的模型。 針對合格的模型,服務實體的UI會顯示 [布建的輸送量] 畫面。
  4. 在 [ 上到 ] 下拉式清單中,您可以為您的端點設定每秒最大令牌輸送量。
    1. 布建的輸送量端點會自動調整,因此您可以選取 [修改 ],以檢視端點可相應減少到的最小令牌數。

佈建的輸送量

使用 REST API 建立布建的輸送量端點

若要使用 REST API 在布建的輸送量模式中部署模型,您必須在要求中指定 min_provisioned_throughputmax_provisioned_throughput 字段。

若要識別模型的適當布建輸送量範圍,請參閱 以遞增方式取得布建的輸送量。

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

以遞增方式取得布建的輸送量

布建的輸送量會以每秒的令牌增量提供,而特定增量會依模型而不同。 若要識別適合您需求的範圍,Databricks 建議在平臺中使用模型優化資訊 API。

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

以下是來自 API 的範例回應:

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

筆記本範例

下列筆記本示範如何建立布建輸送量基礎模型 API 的範例:

為 Llama2 模型筆記本布建的輸送量服務

取得筆記本

為Mistral模型筆記本布建的輸送量服務

取得筆記本

BGE 模型筆記本的布建輸送量服務

取得筆記本

限制

  • 模型部署可能會因為 GPU 容量問題而失敗,這會導致端點建立或更新期間發生逾時。 請連絡 Databricks 帳戶小組以協助解決。
  • 基礎模型 API 的自動調整速度比 CPU 模型服務慢。 Databricks 建議過度布建,以避免要求逾時。

其他資源