Beliebige benutzerdefinierte Routen in einer einzelnen Bereitstellung verwenden

Bei der modernen LLM-Bereitstellung implementieren und unterstützen Modellserver mehrere Inferenzrouten für unterschiedliche Zwecke. Für diese Anwendungsfälle empfiehlt Vertex Inference, die invoke-Methode zu verwenden, um auf mehrere Routen in einer einzelnen Bereitstellung zuzugreifen.

Die invoke-Methode kann beim Hochladen eines Model aktiviert werden, indem invokeRoutePrefix als "/*" festgelegt wird. Sobald das Modell auf einem Endpunkt bereitgestellt wurde, ist jede Nicht-Root-Route auf dem Modellserver über einen HTTP-Aufruf zugänglich. „/invoke/foo/bar“ würde beispielsweise als „/foo/bar“ an den Modellserver weitergeleitet.

Diese Funktion befindet sich in der öffentlichen Vorschau und unterliegt den folgenden Einschränkungen:

  • Aktivierte Modelle können nur auf einem dedizierten Endpunkt bereitgestellt werden.
  • Für Modelle, die für den Aufruf aktiviert sind, werden nur HTTP-Aufrufe unterstützt. RPC wird nicht unterstützt.
  • Beim Hochladen eines Modells kann nur entweder predictRoute oder invokeRoutePrefix festgelegt werden. Der Standardwert ist predictRoute. Wenn das Feld invokeRoutePrefix für ein Modell festgelegt ist, werden nach der Bereitstellung alle anderen Vertex-Routen außer invoke (z. B. :predict, :rawPredict usw.) deaktiviert.
  • "/*" ist der einzige zulässige Wert für invokeRoutePrefix und macht alle Nicht-Root-Pfade verfügbar. Routen, die Sie nicht preisgeben möchten, sollten mit Vorsicht behandelt werden.

Hochladen eines Modells mit aktivierter Aufruffunktion

from google.cloud import aiplatform

invoke_enabled_model = aiplatform.Model.upload(
    display_name="invoke-enabled-model",
    serving_container_image_uri=IMAGE_URI,
    serving_container_invoke_route_prefix="/*",
    serving_container_health_route=HEALTH_ROUTE,
    serving_container_environment_variables={"KEY": "VALUE"},
    serving_container_args=[],
    sync=True,
)

Bereitstellung eines Modells mit Aufruffunktion

dedicated_endpoint = aiplatform.Endpoint.create(
    display_name="dedicated-endpoint-for-invoke-enabled-model",
    dedicated_endpoint_enabled=True,
    sync=True,
)

dedicated_endpoint.deploy(
    model=model,
    traffic_percentage=100,
    machine_type=MACHINE_TYPE,
    accelerator_type=ACCELERATOR_TYPE,
    accelerator_count=1,
    max_replica_count=1,
)

Inferenzanfrage für eine beliebige benutzerdefinierte Route stellen

Die Invoke-Route ermöglicht den Zugriff auf alle Nicht-Root-Anfragepfade in der Bereitstellung. Beispiel: /invoke/foo/bar wird als /foo/bar an den Modellserver weitergeleitet. Es gibt zwei Möglichkeiten, auf die Route zuzugreifen.

Benutzerdefinierte Route zu einem dedizierten Endpunkt anfordern

Anfragen an einen dedizierten Endpunkt werden basierend auf der Konfiguration für die Traffic-Aufteilung an eines der bereitgestellten Modelle weitergeleitet.

def invoke_tabular_sample(
    project: str,
    location: str,
    endpoint_id: str,
    request_path: str,
    http_request_body: Dict[str, Any],
    stream: bool = False,
):
    aiplatform.init(project=project, location=location)

    dedicated_endpoint = aiplatform.Endpoint(endpoint_id)
    if stream:
        for chunk in dedicated_endpoint.invoke(
            request_path=request_path,
            body=json.dumps(http_request_body).encode("utf-8"),
            headers={"Content-Type": "application/json"},
            stream=True,
        ):
            print(chunk)
    else:
        response = dedicated_endpoint.invoke(
            request_path=request_path,
            body=json.dumps(http_request_body).encode("utf-8"),
            headers={"Content-Type": "application/json"},
        )
        print(response)

Benutzerdefinierte Routenanfrage an ein bereitgestelltes Modell

Anfragen zum Aufrufen können an ein bestimmtes bereitgestelltes Modell gerichtet werden. Das kann beim Testen und Debuggen hilfreich sein.

def invoke_direct_deployed_model_inference_tabular_sample(
    project: str,
    location: str,
    endpoint_id: str,
    request_path: str,
    http_request_body: Dict[str, Any],
    deployed_model_id: str,
    stream: bool = False,
):
    aiplatform.init(project=project, location=location)

    dedicated_endpoint = aiplatform.Endpoint(endpoint_id)
    if stream:
        for chunk in dedicated_endpoint.invoke(
            request_path=request_path,
            body=json.dumps(http_request_body).encode("utf-8"),
            headers={"Content-Type": "application/json"},
            deployed_model_id=deployed_model_id,
            stream=True,
        ):
            print(chunk)
    else:
        response = dedicated_endpoint.invoke(
            request_path=request_path,
            body=json.dumps(http_request_body).encode("utf-8"),
            headers={"Content-Type": "application/json"},
            deployed_model_id=deployed_model_id,
        )
        print(response)