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

שירות החיזוי אונליין של Vertex AI מאפשר לכם לשלוח בקשות סינכרוניות לנקודת הקצה של מודל החיזוי שלכם.

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

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

כדי להתחיל להשתמש ב-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 כדי ליצור אינטראקציה עם 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.

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

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

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

כדי להשתמש בשירות חיזוי אונליין מסקריפט 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)
        print("Got token: ")
        print(creds.token)
      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: שם דומיין שמוגדר במלואו של נקודת הקצה של בקשת החיזוי אונליין.
    • PROJECT_NAME: שם הפרויקט של נקודת הקצה.
    • ENDPOINT_NAME: השם של נקודת הקצה שאליה מתקשרים.

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