プロビジョニング スループット Foundation Model API

この記事では、プロビジョニング スループットで Foundation Model API を使用してモデルをデプロイする方法について説明します。 Databricks では、運用環境のワークロードに対してプロビジョニング スループットが推奨され、パフォーマンスが保証された基盤モデルの最適化された推論が提供されます。

サポートされるモデル アーキテクチャの一覧については、プロビジョニング スループット Foundation Model API に関する記事を参照してください。

要件

要件」を参照してください。

微調整された基盤モデルをデプロイする場合

  • モデルをログするには、MLflow 2.11 以降または Databricks Runtime 15.0 ML 以降を使う必要があります。
  • Databricks では、大規模なモデルのアップロードとダウンロードを高速化するために、Unity Catalog でモデルを使うことを推奨しています。

Databricks Marketplace を使って、Unity Catalog にベース基盤モデルをインストールできます。

Databricks では、Databricks Marketplace を使って基盤モデルをインストールすることを推奨しています。 モデル ファミリを検索し、モデル ページから [アクセスの取得] を選び、ログイン資格情報を指定してモデルを Unity Catalog にインストールできます。

モデルを Unity Catalog にインストールした後、Serving UI を使用してモデルの提供のエンドポイントを作成できます。 「UI を使用してプロビジョニング スループット エンドポイントを作成する」を参照してください。

Databricks Marketplace の DBRX モデル

Databricks では、ワークロードに対して DBRX Instruct モデルを提供することが推奨されます。 プロビジョニング スループットを使用して DBRX Base と DBRX Instruct モデルを提供するには、前のセクションのガイダンスに従って、Databricks Marketplace から Unity Catalog にこれらのモデルをインストールする必要があります。

これらの 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.

微調整された基盤モデルをログする

Databricks Marketplace からモデルをインストールできない場合は、Unity Catalog にログを記録することで、微調整された基盤モデルをデプロイできます。 MLflow モデルを 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}"

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 引数 taskmetadatatask キーの値が自動的に設定されます。 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 埋め込みモデルのいずれもサポートします。 MLflow 2.11 以降を使用してプロビジョニング スループットでサービスを提供できるように、モデル BAAI/bge-small-en-v1.5 をログする方法の例を次に示します:

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 Catalog でモデルをログしたら、次の手順でプロビジョニング スループットの提供のエンドポイントを作成します。

  1. ワークスペース内の [提供 UI] に移動します。
  2. [提供エンドポイントの作成] を選択します。
  3. [エンティティ] フィールドで、Unity Catalog からモデルを選択します。 対象モデルの場合、提供されるエンティティの UI にはプロビジョニング スループット画面が表示されます。
  4. [最大] ドロップダウンで、エンドポイントの最大トークン/秒のスループットを構成できます。
    1. プロビジョニング スループット エンドポイントは自動的にスケーリングするため、[変更] を選択すると、エンドポイントがスケールダウンできる 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))

プロビジョニング スループットを増分で取得する

プロビジョニング スループットは、モデルによって異なる特定の増分を含む 1 秒あたりのトークンの増分で利用可能です。 お客様のニーズに適した範囲を特定するために、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
}

ノートブックの例

次のノートブックは、プロビジョニング スループット Foundation Model API を作成する方法の例を示しています。

Llama2 モデル ノートブックのプロビジョニング スループット提供

ノートブックを入手

Mistral モデル ノートブックのプロビジョニング スループット提供

ノートブックを入手

BGE モデル ノートブックのプロビジョニング スループット提供

ノートブックを入手

制限事項

  • エンドポイントの作成または更新中にタイムアウトが発生する GPU 容量の問題により、モデル デプロイに失敗する場合があります。 解決のお手伝いが必要な場合は、Databricks アカウント チームにお問い合わせください。
  • Foundation Models API の自動スケーリングは、CPU モデル提供よりも低速です。 Databricks では、要求のタイムアウトを回避するために、過剰なプロビジョニングを推奨しています。

その他のリソース