כדי להשתמש במודל להצגת חיזויים אונליין, צריך לפרוס אותו בנקודת קצה (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:
יוצרים קובץ 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בהתאם למשאבים שצריך ולמה שזמין באשכול החיזוי.-
מחילים את קובץ ההגדרה
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)
אם יש לכם מאגר משאבים, אתם יכולים לפרוס יותר ממודל אחד בנקודת קצה, ואתם יכולים לפרוס מודל ביותר מנקודת קצה אחת. פורסים מודל חיזוי שמטרגט מאגרי תגים נתמכים. בהתאם לנקודת הקצה, בוחרים באחת משתי השיטות הבאות:
פריסת מודל בנקודת קצה חדשה
כדי לפרוס מודל חיזוי בנקודת קצה חדשה:
יוצרים קובץ 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כשיצרתם מאגר משאבים לאירוח המודל.
משנים את הערכים בשדות שנותרו בהתאם למודל החיזוי.
-
מחילים את קובץ ההגדרה
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ומציג אותו באשכול החיזוי.-
יוצרים קובץ 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בהתאם לאופן שבו רוצים לפצל את התנועה בין המודלים בנקודת הקצה הזו. משנים את הערכים בשדות שנותרו בהתאם להגדרות של נקודת הקצה.-
מחילים את קובץ ההגדרה
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: השם של מרחב השמות של פרויקט החיזוי.
פריסת מודל בנקודת קצה קיימת
אפשר לפרוס מודל בנקודת קצה קיימת רק אם פרסתם בעבר מודל אחר בנקודת הקצה הזו כשהיא הייתה חדשה. המערכת דורשת את השלב הקודם הזה כדי ליצור את נקודת הקצה.
כדי לפרוס מודל חיזוי בנקודת קצה קיימת:
יוצרים קובץ 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כשיצרתם מאגר משאבים לאירוח המודל.
משנים את הערכים בשדות שנותרו בהתאם למודל החיזוי.
-
מחילים את קובץ ההגדרה
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ומציג אותו באשכול החיזוי.-
מציגים את הפרטים של המשאב הקיים בהתאמה אישית
Endpoint:kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yamlמחליפים את
ENDPOINT_NAMEבשם של קובץ ההגדרה שלEndpoint.מעדכנים את קובץ ה-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בהתאם לאופן שבו רוצים לפצל את התנועה בין המודלים של נקודת הקצה הזו. משנים את הערכים בשדות שנותרו בהתאם להגדרות של נקודת הקצה.-
מחילים את קובץ ההגדרה
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: השם של מרחב השמות של פרויקט החיזוי.