קבלת תחזית אונליין

שירות החיזוי אונליין של Vertex AI ב-Google Distributed Cloud (GDC)‎ עם air gap מאפשר לשלוח בקשות סינכרוניות לנקודת הקצה של מודל החיזוי שנפרס. כדי לשלוח בקשות לחיזוי, אתם יכולים להשתמש ב-curl או בסקריפט של Python כדי להציג חיזויים אונליין עם זמן אחזור קצר.

לפני שמתחילים

כדי להשתמש ב-Online Prediction API, צריך פרויקט ופרטי כניסה מתאימים.

כדי לקבל חיזוי אונליין, צריך לבצע את הפעולות הבאות:

  1. הגדרת פרויקט ל-Vertex AI.
  2. כדי לקבל את ההרשאות שנדרשות לגישה לחיזוי אונליין, צריך לבקש מהאדמין של הפרויקט ב-IAM להקצות לכם את התפקיד "משתמש בחיזוי ב-Vertex AI" (vertex-ai-prediction-user).

    למידע על התפקיד הזה, ראו הכנת הרשאות IAM.

  3. יוצרים ומאמנים מודל חיזוי שמטרגט את אחד מהקונטיינרים הנתמכים.

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

  5. ייצוא פריטי המידע שנוצרו במודל לצורך חיזוי.

  6. פורסים את המודל בנקודת קצה.

  7. מציגים את הפרטים של המשאב בהתאמה אישית Endpoint של מודל החיזוי:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫PREDICTION_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig באשכול החיזוי.
    • ‫PREDICTION_ENDPOINT: השם של נקודת הקצה.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של פרויקט החיזוי.

    הפלט צריך להציג את השדה status, שמציג את שם הדומיין שמוגדר במלואו של נקודת הקצה בשדה endpointFQDN. כדי להשתמש בנתיב כתובת ה-URL של נקודת הקצה בבקשות, צריך לרשום אותו.

הגדרת משתני הסביבה

אם אתם רוצים לשלוח בקשה לנקודת הקצה של המודל באמצעות סקריפט Python ולהגדיר חשבון שירות בפרויקט כדי לבצע קריאות ל-API באופן פרוגרמטי, אתם יכולים להגדיר משתני סביבה בסקריפט כדי לגשת לערכים כמו מפתחות של חשבון השירות בזמן הריצה.

כדי להגדיר את משתני הסביבה הנדרשים בסקריפט Python:

  1. יוצרים JupyterLab notebook כדי לקיים אינטראקציה עם Online Prediction API.

  2. יוצרים סקריפט Python ב-notebook של JupyterLab.

  3. מוסיפים את הקוד הבא לסקריפט של Python:

    import os
    
    os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"
    

    מחליפים את APPLICATION_DEFAULT_CREDENTIALS_FILENAME בשם של קובץ ה-JSON שמכיל את המפתחות של חשבון השירות שיצרתם בפרויקט, למשל my-service-key.json.

  4. שומרים את הסקריפט של Python בשם כלשהו, למשל prediction.py.

  5. מריצים את הסקריפט של Python כדי להגדיר את משתני הסביבה:

    python SCRIPT_NAME
    

    מחליפים את SCRIPT_NAME בשם שנתתם לסקריפט Python, למשל prediction.py.

שליחת בקשה לנקודת קצה (endpoint)

שולחים בקשה לנקודת הקצה של המודל כדי לקבל חיזוי אונליין:

curl

כדי לשלוח בקשה ל-curl:

  1. יוצרים קובץ JSON בשם request.json לגוף הבקשה.

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

  2. קבל אסימון אימות.

  3. שולחים את הבקשה:

    curl -X POST -H "Content-Type: application/json; charset=utf-8" \
        -H "Authorization: Bearer TOKEN" \
        https://ENDPOINT_HOSTNAME:443/v1/model:predict \
        -d @request.json
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫TOKEN: אסימון האימות שקיבלתם.
    • ‫ENDPOINT_HOSTNAME: ה-FQDN של נקודת הקצה של המודל לבקשת החיזוי אונליין.

אם הפעולה בוצעה ללא שגיאות, תקבלו תגובת JSON לבקשת החיזוי אונליין.

הפלט הבא מציג דוגמה:

{
    "predictions": [[-357.10849], [-171.621658]
    ]
}

למידע נוסף על תגובות, ראו פרטים על גוף התגובה.

Python

כדי להשתמש בשירות Online Prediction מסקריפט Python:

  1. יוצרים קובץ JSON בשם request.json לגוף הבקשה.

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

  2. מתקינים את הגרסה העדכנית של ספריית הלקוח של Vertex AI Platform.

  3. הגדרת משתני הסביבה הנדרשים בסקריפט של Python.

  4. מאמתים את בקשת ה-API.

  5. מוסיפים את הקוד הבא לסקריפט Python שיצרתם:

    import json
    import os
    from typing import Sequence
    
    import grpc
    from absl import app
    from absl import flags
    import google
    
    from google.auth.transport import requests
    from google.protobuf import json_format
    from google.protobuf.struct_pb2 import Value
    from google.cloud.aiplatform_v1.services import prediction_service
    
    _INPUT = flags.DEFINE_string("input", None, "input", required=True)
    _ENDPOINT_HOSTNAME = flags.DEFINE_string("endpoint_hostname", None, "Prediction endpoint FQDN", required=True)
    _PROJECT_NAME = flags.DEFINE_string("project_name", None, "project name", required=True)
    _ENDPOINT_NAME = flags.DEFINE_string("endpoint_name", None, "endpoint name", required=True)
    
    os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "path-to-ca-cert-file.cert"
    
    def get_sts_token(endpoint_hostname):
      creds = None
      try:
        creds, _ = google.auth.default()
        creds = creds.with_gdch_audience("https://"+endpoint_hostname+":443")
        req = requests.Request()
        creds.refresh(req)
      except Exception as e:
        print("Caught exception" + str(e))
        raise e
      return creds.token
    
    # predict_client_secure builds a client that requires TLS
    def predict_client_secure(endpoint_hostname, token):
      with open(os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"], 'rb') as f:
        channel_creds = grpc.ssl_channel_credentials(f.read())
    
      call_creds = grpc.access_token_call_credentials(token)
    
      creds = grpc.composite_channel_credentials(
        channel_creds,
        call_creds,
      )
    
      client = prediction_service.PredictionServiceClient(
          transport=prediction_service.transports.grpc.PredictionServiceGrpcTransport(
           channel=grpc.secure_channel(target=endpoint_hostname+":443", credentials=creds)))
    
      return client
    
    def predict_func(client, instances):
      # The endpoint resource name is required for authorization.
      # A wrong value might lead to an access denied error.
      endpoint_resource_name = f"projects/{_PROJECT_NAME.value}/locations/{_PROJECT_NAME.value}/endpoints/{_ENDPOINT_NAME.value}"
      resp = client.predict(
        endpoint=endpoint_resource_name,
        instances=instances,
        metadata=[("x-vertex-ai-endpoint-id", _ENDPOINT_NAME.value)]
      )
      print(resp)
    
    def main(argv: Sequence[str]):
      del argv  # Unused.
      with open(_INPUT.value) as json_file:
          data = json.load(json_file)
          instances = [json_format.ParseDict(s, Value()) for s in data["instances"]]
    
      token = get_sts_token(_ENDPOINT_HOSTNAME.value)
      client = predict_client_secure(_ENDPOINT_HOSTNAME.value, token)
      predict_func(client=client, instances=instances)
    
    if __name__=="__main__":
      app.run(main)
    
  6. שומרים את הסקריפט של Python בשם כלשהו, למשל prediction.py.

  7. שולחים את הבקשה לשרת החיזוי:

    python SCRIPT_NAME --input request.json \
        --endpoint_hostname ENDPOINT_FQDN \
        --project_name PROJECT_NAME \
        --endpoint_name ENDPOINT_NAME
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫SCRIPT_NAME: השם של הסקריפט ב-Python, למשל prediction.py.
    • ‫ENDPOINT_FQDN: שם הדומיין שמוגדר במלואו (FQDN) של נקודת הקצה לבקשת החיזוי אונליין.
    • ‫PROJECT_NAME: שם הפרויקט של נקודת הקצה.
    • ‫ENDPOINT_NAME: השם של נקודת הקצה שאליה תתבצע הקריאה.

אם הפעולה בוצעה ללא שגיאות, תקבלו תגובת JSON לבקשת החיזוי אונליין. למידע נוסף על תגובות, ראו פרטים על גוף התגובה.