複数のモデルをモデルサービングエンドポイントでサーブする

この記事では、複数のモデルとそれらの間でトラフィックを分割するようにモデルサービングエンドポイントをプログラムで設定する方法について説明します。

1 つのエンドポイントから複数のモデルを提供することで、トラフィックを異なるモデル間で分割してパフォーマンスを比較し、A/B テストを容易にすることができます。 また、モデルの異なるバージョンを同時に提供することもできるため、現在のバージョンを本番運用に保持しながら、新しいバージョンでのエクスペリメントが容易になります。

次のモデルタイプのいずれかを Mosaic AI Model Serving エンドポイントで提供できます。 1 つのエンドポイントで異なるモデルタイプを提供することはできません。 たとえば、カスタムモデルと外部モデルを同じエンドポイントで提供することはできません。

要件

モデルサービングエンドポイント作成 の要件 を参照してください。

モデル サービング エンドポイントのアクセス制御オプションとエンドポイント管理のベスト プラクティス ガイダンスを理解するには、「 モデル サービング エンドポイント ACL」を参照してください。

エンドポイントを作成し、初期トラフィック分割を設定する

Databricks Mosaic AI サービング API または Databricks Mosaic AI サービング UI を使用してモデルサービングエンドポイントを作成する場合、そのエンドポイントでサブリングするモデルの初期トラフィック分割を設定することもできます。 次のセクションでは、複数のカスタムモデルまたはエンドポイントで提供される生成AI モデルのトラフィック分割を設定する例を示します。

エンドポイントに複数のカスタムモデルを提供する

次の REST API の例では、Unity Catalog に 2 つのカスタム モデルを持つ 1 つのエンドポイントを作成し、それらのモデル間でエンドポイント トラフィックの分割を設定します。 配信されるエンティティ currentは、 model-A のバージョン 1 をホストし、エンドポイント トラフィックの 90% を取得します。一方、他の配信エンティティである challengerは、 model-B のバージョン 1 をホストし、エンドポイント トラフィックの 10% を取得します。

POST /api/2.0/serving-endpoints

{
   "name":"multi-model"
   "config":
   {
      "served_entities":
      [
         {
            "name":"current",
            "entity_name":"catalog.schema.model-A",
            "entity_version":"1",
            "workload_size":"Small",
            "scale_to_zero_enabled":true
         },
         {
            "name":"challenger",
            "entity_name":"catalog.schema.model-B",
            "entity_version":"1",
            "workload_size":"Small",
            "scale_to_zero_enabled":true
         }
      ],
      "traffic_config":
      {
         "routes":
         [
            {
               "served_model_name":"current",
               "traffic_percentage":"90"
            },
            {
               "served_model_name":"challenger",
               "traffic_percentage":"10"
            }
         ]
      }
   }
}

プロビジョニングされたスループットエンドポイントに複数のモデルを提供する

次の REST API 次の例では、2 つのモデルを持つ 1 つの基盤モデル APIs プロビジョニング スループット エンドポイントを作成し、それらのモデル間でエンドポイント トラフィックの分割を設定します。 multi-pt-modelという名前のエンドポイントは、エンドポイント トラフィックの 60% を取得する mistral_7b_instruct_v0_1-2 のバージョン 2 をホストし、エンドポイント トラフィックの 40% を取得する mixtral_8x7b_instruct_v0_1-3 のバージョン 3 もホストします。

POST /api/2.0/serving-endpoints
{
   "name":"multi-pt-model"
   "config":
   {
      "served_entities":
      [
         {
            "name":"mistral_7b_instruct_v0_1-2",
            "entity_name":"system.ai.mistral_7b_instruct_v0_1",
            "entity_version":"2",
            "min_provisioned_throughput":0,
            "max_provisioned_throughput":1940
         },
         {
            "name":"mixtral_8x7b_instruct_v0_1-3",
            "entity_name":"system.ai.mixtral_8x7b_instruct_v0_1",
            "entity_version":"3",
            "min_provisioned_throughput":0,
            "max_provisioned_throughput":1240
         }
      ],
      "traffic_config":
      {
         "routes":
         [
            {
               "served_model_name":"mistral_7b_instruct_v0_1-2",
               "traffic_percentage":"60"
            },
            {
               "served_model_name":"mixtral_8x7b_instruct_v0_1-3",
               "traffic_percentage":"40"
            }
         ]
      }
   }
}

エンドポイントに複数の外部モデルを提供する

また、サービングエンドポイントで複数の 外部モデル を設定することもできますが、これらはすべて同じタスクタイプを持ち、各モデルに固有の nameがあります。 外部モデルと非外部モデルの両方を同じサービスエンドポイントに含めることはできません。

次の例では、トラフィックの 50% を OpenAI が提供する gpt-4 にルーティングし、残りの 50% を Anthropic が提供する claude-3-opus-20240229 にルーティングするサービングエンドポイントを作成します。

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")

client.create_endpoint(
    name="mix-chat-endpoint",
    config={
        "served_entities": [
            {
                "name": "served_model_name_1",
                "external_model": {
                    "name": "gpt-4",
                    "provider": "openai",
                    "task": "llm/v1/chat",
                    "openai_config": {
                        "openai_api_key": "{{secrets/my_openai_secret_scope/openai_api_key}}"
                    }
                }
            },
            {
                "name": "served_model_name_2",
                "external_model": {
                    "name": "claude-3-opus-20240229",
                    "provider": "anthropic",
                    "task": "llm/v1/chat",
                    "anthropic_config": {
                        "anthropic_api_key": "{{secrets/my_anthropic_secret_scope/anthropic_api_key}}"
                    }
                }
            }
        ],
        "traffic_config": {
            "routes": [
                {"served_model_name": "served_model_name_1", "traffic_percentage": 50},
                {"served_model_name": "served_model_name_2", "traffic_percentage": 50}
            ]
        },
    }
)

配信モデル間のトラフィック分割の更新

また、提供されるモデル間のトラフィック分割を更新することもできます。 次の REST API の例では、提供されるモデル currentがエンドポイント トラフィックの 50% を取得するように設定され、他のモデル challengerがトラフィックの残りの 50% を取得するように設定されています。

この更新は、Databricks Mosaic AI UI の [サービス ] タブから [ 構成の編集 ] ボタンを使用して行うこともできます。

PUT /api/2.0/serving-endpoints/{name}/config

{
   "served_entities":
   [
      {
         "name":"current",
         "entity_name":"catalog.schema.model-A",
         "entity_version":"1",
         "workload_size":"Small",
         "scale_to_zero_enabled":true
      },
      {
         "name":"challenger",
         "entity_name":"catalog.schema.model-B",
         "entity_version":"1",
         "workload_size":"Small",
         "scale_to_zero_enabled":true
      }
   ],
   "traffic_config":
   {
      "routes":
      [
         {
            "served_model_name":"current",
            "traffic_percentage":"50"
         },
         {
            "served_model_name":"challenger",
            "traffic_percentage":"50"
         }
      ]
   }
}

エンドポイントの背後にある個々のモデルをクエリーする

一部のシナリオでは、エンドポイントの背後にある個々のモデルをクエリしたい場合があります。

これを行うには、以下を使用します。

POST /serving-endpoints/{endpoint-name}/served-models/{served-model-name}/invocations

ここで提供される特定のモデルはクエリーです。 要求の形式は、エンドポイントのクエリと同じです。 個々のサービス モデルを照会している間、トラフィック設定は無視されます。

multi-model エンドポイントの例のコンテキストでは、すべての要求が /serving-endpoints/multi-model/served-models/challenger/invocationsに送信された場合、すべての要求は challenger サービスモデルによって処理されます。