שימוש בנתיבים שרירותיים בהתאמה אישית בפריסה יחידה

בשרתים מודרניים של מודלי שפה גדולים (LLM), מיושמות ומתוחזקות כמה דרכי הסקה למטרות שונות. בתרחישי השימוש האלה, מומלץ להשתמש בשיטה invoke כדי לגשת לכמה נתיבים בפריסה אחת של Vertex Inference.

אפשר להפעיל את השיטה invoke כשמעלים Model על ידי הגדרת invokeRoutePrefix כ-"/*". אחרי פריסת המודל לנקודת קצה, אפשר לגשת לכל נתיב שאינו נתיב הבסיס בשרת המודל באמצעות קריאת HTTP להפעלה. לדוגמה, הנתיב '/invoke/foo/bar' יועבר כ-'/foo/bar' לשרת המודל.

התכונה הזו נמצאת בשלב של גרסת טרום-השקה (Preview) לציבור, ויש לה את המגבלות הבאות:

  • אפשר לפרוס מודלים שמופעלים באמצעות קריאה לפונקציה רק בנקודת קצה ייעודית.
  • יש תמיכה רק בקריאות HTTP למודלים שמופעלת בהם הפעלה, ואין תמיכה ב-RPC.
  • כשמעלים מודל, אפשר להגדיר רק אחת מהאפשרויות predictRoute או invokeRoutePrefix. ערך ברירת המחדל הוא predictRoute. אם השדה invokeRoutePrefix מוגדר במודל, כל המסלולים האחרים של Vertex מלבד invoke (למשל :predict,‏ :rawPredict וכו') יושבתו אחרי הפריסה.
  • הערך המותר היחיד ל-invokeRoutePrefix הוא "/*", והוא חושף את כל הנתיבים שאינם נתיבי הבסיס. מומלץ לנקוט משנה זהירות לגבי מסלולים שלא רוצים לחשוף.

העלאת מודל עם הפעלת קריאה

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

פריסה של מודל עם הפעלה

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

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

שליחת בקשת הסקה במסלול מותאם אישית שרירותי

הפעלת מסלול מאפשרת גישה לכל נתיבי הבקשות שאינם נתיבי הבסיס בפריסה. לדוגמה, המחרוזת /invoke/foo/bar תועבר כ-/foo/bar לשרת של המודל. יש שתי דרכים לגשת למסלול.

בקשת ניתוב מותאמת אישית לנקודת קצה ייעודית

הפעלת בקשה לנקודת קצה ייעודית תנותב לאחד מהמודלים שנפרסו על סמך הגדרת חלוקת התנועה.

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)

בקשת ניתוב בהתאמה אישית למודל שפרסתם

אפשר לשלוח בקשת הפעלה כדי לטרגט מודל ספציפי שפרסתם. הוא יכול להיות שימושי לבדיקה ולניפוי באגים.

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)