פריסת מודל לנקודת קצה

כדי להשתמש במודל להצגת חיזויים אונליין, צריך לפרוס אותו בנקודת קצה (endpoint). פריסת מודל משייכת משאבים פיזיים כדי להציג חיזויים אונליין עם זמן אחזור קצר.

בדף הזה מוסבר איך לפרוס מודל בנקודת קצה באמצעות Online Prediction.

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

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

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

לפני שפורסים את המודל בנקודת קצה, מייצאים את פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) של המודל לחיזוי ומוודאים שעומדים בכל הדרישות המוקדמות שמופיעות בדף הזה.

יצירת מאגר משאבים

משאב בהתאמה אישית של ResourcePool מאפשר לכם לשלוט באופן מדויק בהתנהגות של המודל. אתם יכולים לקבוע הגדרות כמו:

  • הגדרות של התאמה לעומס (autoscaling).
  • סוג המכונה, שמגדיר את דרישות המעבד (CPU) והזיכרון.
  • אפשרויות למאיצים, כמו משאבי GPU.

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

במאגר המשאבים של המודל שנפרס, מספר המאיצים והסוג שלהם קובעים את השימוש ב-GPU. סוג המכונה קובע רק את משאבי המעבד והזיכרון המבוקשים. לכן, כשכוללים מאיצי GPU במפרט של ResourcePool, השדה machineType שולט בדרישות המעבד (CPU) והזיכרון של המודל, והשדה acceleratorType שולט ב-GPU. בנוסף, השדה acceleratorCount קובע את מספר הפרוסות של ה-GPU.

כדי ליצור משאב בהתאמה אישית של ResourcePool:

  1. יוצרים קובץ YAML שמגדיר את המשאב בהתאמה אישית ResourcePool. הדוגמאות הבאות מכילות קובצי YAML למאגרי משאבים עם מאיצי GPU (מודלים מבוססי-GPU) וללא מאיצי GPU (מודלים מבוססי-CPU):

    מודלים שמבוססים על GPU

      apiVersion: prediction.aiplatform.gdc.goog/v1
      kind: ResourcePool
      metadata:
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
      spec:
        resourcePoolID: RESOURCE_POOL_NAME
        enableContainerLogging: false
        dedicatedResources:
          machineSpec:
            # The system adds computing overhead to the nodes for mandatory components.
            # Choose a machineType value that allocates fewer CPU and memory resources
            # than those used by the nodes in the prediction cluster.
            machineType: a2-highgpu-1g-gdc
            acceleratorType: nvidia-a100-80gb
            # The accelerator count is a slice of the requested virtualized GPUs.
            # The value corresponds to one-seventh of 80 GB of GPUs for each count.
            acceleratorCount: 2
          autoscaling:
            minReplica: 2
            maxReplica: 10
    

    מודלים שמבוססים על מעבד (CPU)

      apiVersion: prediction.aiplatform.gdc.goog/v1
      kind: ResourcePool
      metadata:
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
      spec:
        resourcePoolID: RESOURCE_POOL_NAME
        enableContainerLogging: false
        dedicatedResources:
          machineSpec:
            # The system adds computing overhead to the nodes for mandatory components.
            # Choose a machineType value that allocates fewer CPU and memory resources
            # than those used by the nodes in the prediction cluster.
            machineType: n2-highcpu-8-gdc
          autoscaling:
            minReplica: 2
            maxReplica: 10
    

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

    • ‫RESOURCE_POOL_NAME: השם שרוצים לתת לקובץ ההגדרה של ResourcePool.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של הפרויקט שמשויך לאשכול החיזוי.

    משנים את הערכים בשדות של dedicatedResources בהתאם למשאבים שצריך ולמה שזמין באשכול החיזוי.

  2. מחילים את קובץ ההגדרה ResourcePool על אשכול החיזוי:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f RESOURCE_POOL_NAME.yaml
    

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

    • ‫PREDICTION_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig באשכול החיזוי.
    • ‫RESOURCE_POOL_NAME: השם של קובץ ההגדרה של ResourcePool.

כשיוצרים את המשאב בהתאמה אישית ResourcePool, ה-API של Kubernetes ושירות ה-webhook מאמתים את קובץ ה-YAML ומדווחים על הצלחה או כישלון. כשפורסים את המודלים בנקודת קצה (endpoint), מפעיל החיזוי מקצה את המשאבים ממאגר המשאבים ושומר אותם.

פריסת המודל בנקודת קצה (endpoint)

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

פריסת מודל בנקודת קצה חדשה

כדי לפרוס מודל חיזוי בנקודת קצה חדשה:

  1. יוצרים קובץ YAML שמגדיר משאב בהתאמה אישית של DeployedModel:

    TensorFlow

    קובץ ה-YAML הבא מציג הגדרה לדוגמה של מודל TensorFlow:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      # The endpoint path structure is endpoints/<endpoint-id>
      endpointPath: endpoints/PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket-fqn/tensorflow
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: img-detection-model
        modelDisplayName: my_img_detection_model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/img-detection-model/1
        # The model version ID must match the name of the first folder in
        # the artifactLocation bucket, inside the 'tensorflow' folder.
        # For example, if the bucket path is
        # s3://my-prediction-bucket-fqn/tensorflow/1/,
        # then the value for the model version ID is "1".
        modelVersionID: "1"
        modelContainerSpec:
          args:
          - --model_config_file=/models/models.config
          - --rest_api_port=8080
          - --port=8500
          - --file_system_poll_wait_seconds=30
          - --model_config_file_poll_wait_seconds=30
          command:
          - /bin/tensorflow_model_server
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/tf2-cpu.2-18:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-18:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-18:latest
          ports:
          - 8080
          grpcPorts:
          - 8500
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

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

    • ‫DEPLOYED_MODEL_NAME: השם שרוצים לתת לקובץ ההגדרה של DeployedModel.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של הפרויקט שמשויך לאשכול החיזוי.
    • ‫PREDICTION_ENDPOINT: השם שרוצים לתת לנקודת הקצה החדשה, למשל my-img-prediction-endpoint.
    • ‫PATH_TO_MODEL: הנתיב למודל בקטגוריית האחסון.
    • ‫RESOURCE_POOL_NAME: השם שנתתם לקובץ ההגדרה של ResourcePool כשיצרתם מאגר משאבים לאירוח המודל.

    משנים את הערכים בשדות שנותרו בהתאם למודל החיזוי.

    PyTorch

    קובץ ה-YAML הבא מציג הגדרה לדוגמה של מודל PyTorch:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      endpointPath: PREDICTION_ENDPOINT
      endpointInfo:
        id: PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 prefix that
        # includes the model artifacts for the model version.
        # For example, s3://my-prediction-bucket-fqn/pytorch-model/1
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: "pytorch"
        modelDisplayName: my-pytorch-model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/pytorch/1
        modelVersionID: "1"
        modelContainerSpec:
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/pytorch-cpu.2-1:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/pytorch-gpu.2-1:latest
          imageURI: gcr.io/aiml/prediction/containers/pytorch-cpu.2-1:latest
          ports:
          - 8080
          grpcPorts:
          - 7070
      sharesResourcePool: false
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

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

    • ‫DEPLOYED_MODEL_NAME: השם שרוצים לתת לקובץ ההגדרה של DeployedModel.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של הפרויקט שמשויך לאשכול החיזוי.
    • ‫PREDICTION_ENDPOINT: השם שרוצים לתת לנקודת הקצה החדשה, למשל my-img-prediction-endpoint.
    • ‫PATH_TO_MODEL: הנתיב למודל בקטגוריית האחסון.
    • ‫RESOURCE_POOL_NAME: השם שנתתם לקובץ ההגדרה של ResourcePool כשיצרתם מאגר משאבים לאירוח המודל.

    משנים את הערכים בשדות שנותרו בהתאם למודל החיזוי.

  2. מחילים את קובץ ההגדרה DeployedModel על אשכול החיזוי:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

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

    • ‫PREDICTION_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig באשכול החיזוי.
    • ‫DEPLOYED_MODEL_NAME: השם של קובץ ההגדרה של DeployedModel.

    כשיוצרים את המשאב בהתאמה אישית DeployedModel, ה-API של Kubernetes ושירות ה-webhook מאמתים את קובץ ה-YAML ומדווחים על הצלחה או כישלון. האופרטור של החיזוי מתאים את המשאב המותאם אישית של DeployedModel ומציג אותו באשכול החיזוי.

  3. יוצרים קובץ YAML שמגדיר משאב בהתאמה אישית של Endpoint.

    קובץ ה-YAML הבא מציג הגדרה לדוגמה:

    apiVersion: aiplatform.gdc.goog/v1
    kind: Endpoint
    metadata:
      name: ENDPOINT_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      createDns: true
      id: PREDICTION_ENDPOINT
      destinations:
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_2
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
    

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

    • ‫ENDPOINT_NAME: השם שרוצים לתת לקובץ ההגדרה של Endpoint.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של הפרויקט שמשויך לאשכול החיזוי.
    • ‫PREDICTION_ENDPOINT: השם של נקודת הקצה החדשה. הגדרת את השם הזה בקובץ ההגדרה DeployedModel.
    • ‫DEPLOYED_MODEL_NAME: השם שנתתם לקובץ ההגדרה של DeployedModel.

    יכול להיות לכם יעד אחד או יותר של serviceRef. אם יש לכם אובייקט serviceRef שני, הוסיפו אותו לקובץ ה-YAML בשדה destinations והחליפו את DEPLOYED_MODEL_NAME_2 בשם שנתתם לקובץ ההגדרה השני של DeployedModel שיצרתם. אפשר להמשיך להוסיף או להסיר אובייקטים של serviceRef לפי הצורך, בהתאם למספר המודלים שאתם פורסים.

    מגדירים את השדות של trafficPercentage בהתאם לאופן שבו רוצים לפצל את התנועה בין המודלים בנקודת הקצה הזו. משנים את הערכים בשדות שנותרו בהתאם להגדרות של נקודת הקצה.

  4. מחילים את קובץ ההגדרה Endpoint על אשכול החיזוי:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    מחליפים את ENDPOINT_NAME בשם של קובץ ההגדרה של Endpoint.

כדי לקבל את נתיב כתובת ה-URL של נקודת הקצה של מודל החיזוי, מריצים את הפקודה הבאה:

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

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

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

פריסת מודל בנקודת קצה קיימת

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

כדי לפרוס מודל חיזוי בנקודת קצה קיימת:

  1. יוצרים קובץ YAML שמגדיר משאב בהתאמה אישית של DeployedModel.

    קובץ ה-YAML הבא מציג הגדרה לדוגמה:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      # The endpoint path structure is endpoints/<endpoint-id>
      endpointPath: endpoints/PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket-fqn/tensorflow
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: img-detection-model-v2
        modelDisplayName: my_img_detection_model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/img-detection-model/2
        # The model version ID must match the name of the first folder in
        # the artifactLocation bucket,
        # inside the 'tensorflow' folder.
        # For example, if the bucket path is
        # s3://my-prediction-bucket-fqn/tensorflow/2/,
        # then the value for the model version ID is "2".
        modelVersionID: "2"
        modelContainerSpec:
          args:
          - --model_config_file=/models/models.config
          - --rest_api_port=8080
          - --port=8500
          - --file_system_poll_wait_seconds=30
          - --model_config_file_poll_wait_seconds=30
          command:
          - /bin/tensorflow_model_server
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/tf2-cpu.2-6:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-6:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-6:latest
          ports:
          - 8080
          grpcPorts:
          - 8500
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

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

    • ‫DEPLOYED_MODEL_NAME: השם שרוצים לתת לקובץ ההגדרה של DeployedModel.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של הפרויקט שמשויך לאשכול החיזוי.
    • ‫PREDICTION_ENDPOINT: השם של נקודת הקצה הקיימת, למשל my-img-prediction-endpoint.
    • ‫PATH_TO_MODEL: הנתיב למודל בקטגוריית האחסון.
    • ‫RESOURCE_POOL_NAME: השם שנתתם לקובץ ההגדרה של ResourcePool כשיצרתם מאגר משאבים לאירוח המודל.

    משנים את הערכים בשדות שנותרו בהתאם למודל החיזוי.

  2. מחילים את קובץ ההגדרה DeployedModel על אשכול החיזוי:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

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

    • ‫PREDICTION_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig באשכול החיזוי.
    • ‫DEPLOYED_MODEL_NAME: השם של קובץ ההגדרה של DeployedModel.

    כשיוצרים את המשאב בהתאמה אישית DeployedModel, ה-API של Kubernetes ושירות ה-webhook מאמתים את קובץ ה-YAML ומדווחים על הצלחה או כישלון. האופרטור של החיזוי מתאים את המשאב המותאם אישית של DeployedModel ומציג אותו באשכול החיזוי.

  3. מציגים את הפרטים של המשאב הקיים בהתאמה אישית Endpoint:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yaml
    

    מחליפים את ENDPOINT_NAME בשם של קובץ ההגדרה של Endpoint.

  4. מעדכנים את קובץ ה-YAML של הגדרת המשאב בהתאמה אישית של Endpoint על ידי הוספת אובייקט serviceRef חדש בשדה destinations. באובייקט החדש, כוללים את שם השירות המתאים על סמך המשאב המותאם אישית של DeployedModel שיצרתם.

    קובץ ה-YAML הבא מציג הגדרה לדוגמה:

    apiVersion: aiplatform.gdc.goog/v1
    kind: Endpoint
    metadata:
      name: ENDPOINT_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      createDns: true
      id: PREDICTION_ENDPOINT
      destinations:
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 40
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_2
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_3
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 10
          grpcPort: 8501
          httpPort: 8081
    

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

    • ‫ENDPOINT_NAME: השם של קובץ ההגדרה הקיים של Endpoint.
    • ‫PROJECT_NAMESPACE: השם של מרחב השמות של הפרויקט שמשויך לאשכול החיזוי.
    • ‫PREDICTION_ENDPOINT: השם של נקודת הקצה הקיימת. הפנית לשם הזה בקובץ ההגדרה של DeployedModel.
    • ‫DEPLOYED_MODEL_NAME: השם של קובץ הגדרה של DeployedModel שנוצר בעבר.
    • ‫DEPLOYED_MODEL_NAME_2: השם שנתתם לקובץ ההגדרה החדש של DeployedModel.

    יכול להיות לכם יעד אחד או יותר של serviceRef. אם יש לכם אובייקט serviceRef שלישי, הוסיפו אותו לקובץ ה-YAML בשדה destinations והחליפו את DEPLOYED_MODEL_NAME_3 בשם שנתתם לקובץ ההגדרה השלישי של DeployedModel שיצרתם. אפשר להמשיך להוסיף או להסיר אובייקטים של serviceRef לפי הצורך, בהתאם למספר המודלים שאתם פורסים.

    מגדירים את השדות של trafficPercentage בהתאם לאופן שבו רוצים לפצל את התנועה בין המודלים של נקודת הקצה הזו. משנים את הערכים בשדות שנותרו בהתאם להגדרות של נקודת הקצה.

  5. מחילים את קובץ ההגדרה Endpoint על אשכול החיזוי:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    מחליפים את ENDPOINT_NAME בשם של קובץ ההגדרה של Endpoint.

כדי לקבל את נתיב כתובת ה-URL של נקודת הקצה של מודל החיזוי, מריצים את הפקודה הבאה:

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

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

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