Menggunakan rute kustom arbitrer pada satu deployment

Dalam penayangan LLM modern, server model menerapkan dan mendukung beberapa rute inferensi untuk berbagai tujuan. Untuk kasus penggunaan tersebut, Vertex Inference merekomendasikan penggunaan metode invoke untuk mengakses beberapa rute pada satu deployment.

Metode invoke dapat diaktifkan saat mengupload Model dengan menetapkan invokeRoutePrefix sebagai "/*". Setelah Model di-deploy ke endpoint, semua rute non-root di server model akan dapat diakses dengan panggilan HTTP invoke. Misalnya, "/invoke/foo/bar" akan diteruskan sebagai "/foo/bar" ke server model.

Fitur ini berada dalam tahap pratinjau publik dan memiliki batasan berikut:

  • Model yang diaktifkan untuk pemanggilan hanya dapat di-deploy ke endpoint khusus.
  • Hanya panggilan HTTP yang didukung untuk model yang diaktifkan pemanggilan, dan RPC tidak didukung.
  • Saat mengupload model, hanya salah satu dari predictRoute atau invokeRoutePrefix yang dapat disetel. Nilai defaultnya adalah predictRoute. Jika kolom invokeRoutePrefix ditetapkan pada Model, semua rute Vertex selain invoke (misalnya :predict, :rawPredict ..) akan dinonaktifkan setelah di-deploy.
  • "/*" adalah satu-satunya nilai yang diizinkan untuk invokeRoutePrefix, dan nilai ini mengekspos semua jalur non-root. Penanganan yang hati-hati untuk rute yang tidak ingin Anda ekspos sangat disarankan.

Mengupload Model yang mendukung pemanggilan

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

Men-deploy Model yang diaktifkan pemanggilan

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

Membuat permintaan inferensi pada rute kustom arbitrer

Rute pemanggilan memungkinkan akses ke semua jalur permintaan non-root dalam deployment. Misalnya, /invoke/foo/bar akan diteruskan sebagai /foo/bar ke server model. Ada dua cara untuk mengakses rute.

Merutekan permintaan khusus ke endpoint khusus

Permintaan pemanggilan ke endpoint khusus akan dirutekan ke salah satu model yang di-deploy berdasarkan konfigurasi pembagian traffic.

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)

Permintaan rute kustom ke model yang di-deploy

Permintaan pemanggilan dapat dilakukan untuk menargetkan model yang di-deploy tertentu. Hal ini dapat berguna untuk pengujian dan proses debug.

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)