Mehrere Modelle für einen Model-Serving-Endpunkt bereitstellen

In diesem Artikel wird beschrieben, wie Sie einen Endpunkt für die Modellbereitstellung programmgesteuert so konfigurieren, dass mehrere Modelle bereitgestellt werden und der Datenverkehr zwischen ihnen aufgeteilt wird.

Die Bereitstellung mehrerer Modelle von einem einzelnen Endpunkt ermöglicht es Ihnen, den Datenverkehr zwischen verschiedenen Modellen zu teilen, um ihre Leistung zu vergleichen und A/B-Tests zu vereinfachen. Sie können auch verschiedene Versionen eines Modells gleichzeitig bedienen, wodurch das Experimentieren mit neuen Versionen erleichtert wird und gleichzeitig die aktuelle Version in der Produktion beibehalten wird.

Sie können jeden der folgenden Modelltypen für einen Model Serve-Endpunkt bereitstellen. Sie können in einem einzelnen Endpunkt keine verschiedenen Modelltypen bereitstellen. Sie können z. B. kein benutzerdefiniertes Modell und ein externes Modell im selben Endpunkt bedienen.

Anforderungen

Siehe die Anforderungen für die Erstellung eines Endpunkts für die Modellbereitstellung.

Informationen zu den Optionen für die Zugriffssteuerung von Modellbereitstellungsendpunkten sowie zu Best Practices für die Endpunktverwaltung finden Sie unter ACLs für Modellbereitstellungsendpunkte.

Erstellen Sie einen Endpunkt und legen Sie die anfängliche Datenverkehrsaufteilung fest

Wenn Sie mithilfe der Modellbereitstellungs-API oder der Model Serving UI Modellbereitstellungsendpunkte erstellen, können Sie auch die anfängliche Traffic-Aufteilung für die Modelle festlegen, die Sie auf diesem Endpunkt bereitstellen möchten. Die folgenden Abschnitte enthalten Beispiele zum Festlegen der Datenverkehrsteilung für mehrere benutzerdefinierte Modelle oder Foundation Models, die auf einem Endpunkt bereitgestellt werden.

Bereitstellen mehrerer benutzerdefinierter Modelle an einen Endpunkt

Im folgenden REST-API-Beispiel wird ein einzelner Endpunkt mit zwei benutzerdefinierten Modellen im Unity-Katalog erstellt und der Endpunktdatenverkehr zwischen diesen Modellen aufgeteilt. Die bereitgestellte Entität, currenthoste Version 1 von model-A und ruft 90 % des Endpunktdatenverkehrs ab, während die andere bereitgestellte Entität, challengerversion 1 von model-B und ruft 10 % des Endpunktdatenverkehrs ab.

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

Bereitstellen mehrerer Modelle an einen bereitgestellten Durchsatzendpunkt

Das folgende REST-API-Beispiel erstellt einen einzelnen Foundation-Model-APIs-Endpunkt mit bereitgestelltem Durchsatz für zwei Modelle und legt die Datenverkehrsaufteilung des Endpunkts zwischen diesen Modellen fest. Der Endpunkt mit dem Namen multi-pt-model beherbergt Version 2 von meta_llama_v3_1_70b_instruct, die 60 % des Endpunktdatenverkehrs erhält, und außerdem Version 3 von meta_llama_v3_1_8b_instruct, die 40 % des Endpunktdatenverkehrs erhält.


POST /api/2.0/serving-endpoints
{
   "name":"multi-pt-model"
   "config":
   {
      "served_entities":
      [
         {
            "name":"meta_llama_v3_1_70b_instruct",
            "entity_name":"system.ai.meta_llama_v3_1_70b_instruct",
            "entity_version":"4",
            "min_provisioned_throughput":0,
            "max_provisioned_throughput":2400
         },
         {
            "name":"meta_llama_v3_1_8b_instruct",
            "entity_name":"system.ai.meta_llama_v3_1_8b_instruct",
            "entity_version":"4",
            "min_provisioned_throughput":0,
            "max_provisioned_throughput":1240
         }
      ],
      "traffic_config":
      {
         "routes":
         [
            {
               "served_model_name":"meta_llama_v3_1_8b_instruct",
               "traffic_percentage":"60"
            },
            {
               "served_model_name":"meta_llama_v3_1_70b_instruct",
               "traffic_percentage":"40"
            }
         ]
      }
   }
}

Bereitstellen mehrerer externer Modelle an einen Endpunkt

Sie können auch mehrere externe Modelle in einem dienenden Endpunkt konfigurieren, solange alle über denselben Aufgabentyp verfügen und jedes Modell über einen eindeutigen name. Sie können nicht sowohl externe Modelle als auch nicht externe Modelle im selben Bereitstellungsendpunkt haben.

Das folgende Beispiel erstellt einen Serving-Endpunkt, der 50 % des Traffics an gpt-4, bereitgestellt von OpenAI, und die verbleibenden 50 % an claude-3-opus-20240229, bereitgestellt von Anthropic, weiterleitet.

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}
            ]
        },
    }
)

Aktualisieren Sie die Traffic-Aufteilung zwischen bereitgestellten Modellen

Sie können auch die Datenverkehrsaufteilung zwischen bereitgestellten Modellen aktualisieren. Im folgenden REST-API-Beispiel wird das bereitgestellte Modell current so festgelegt, dass es 50 % des Endpoint-Datenverkehrs erhält, und das andere Modell challenger so, dass es die verbleibenden 50 % des Datenverkehrs erhält.

Sie können dieses Update auch über die Registerkarte Serving auf der Benutzeroberfläche Azure Databricks ui mithilfe der Schaltfläche Edit configuration vornehmen.

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

Einzelne Modelle hinter einem Endpunkt abfragen

In einigen Szenarien möchten Sie möglicherweise einzelne Modelle hinter dem Endpunkt abfragen.

Sie können dazu Folgendes verwenden:

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

Hier wird das spezifische bereitgestellte Modell abgefragt. Das Anforderungsformat entspricht dem Abfragen des Endpunkts. Beim Abfragen eines einzelnen bereitgestellten Modells werden die Datenverkehrseinstellungen ignoriert.

Wenn im Kontext des Endpunktbeispiels multi-model alle Anforderungen an /serving-endpoints/multi-model/served-models/challenger/invocations gesendet werden, werden alle Anforderungen vom bereitgestellten Modell challenger verarbeitet.