מודל Vertex AI נפרס כברירת מחדל למכונה וירטואלית (VM) משלו. Vertex AI מציע את האפשרות לארח מודלים במשותף באותו מכונה וירטואלית, מה שמאפשר את היתרונות הבאים:
- שיתוף משאבים בין כמה פריסות.
- פרסום מודלים במחיר משתלם.
- שיפור בניצול הזיכרון ומשאבי החישוב.
במדריך הזה מוסבר איך לשתף משאבים בין כמה פריסות ב-Vertex AI.
סקירה כללית
התמיכה באירוח משותף של מודלים מציגה את הרעיון של DeploymentResourcePool, שמקבץ פריסות של מודלים שמשתפים משאבים במכונה וירטואלית אחת. אפשר לפרוס כמה נקודות קצה באותה מכונת VM בתוך DeploymentResourcePool. לכל נקודת קצה יש מודל אחד או יותר שפרוסים בה. אפשר לקבץ את המודלים שנפרסו לנקודת קצה מסוימת תחת אותו DeploymentResourcePool או תחת DeploymentResourcePool אחר.
בדוגמה הבאה יש ארבעה מודלים ושתי נקודות קצה:

האפליקציות Model_A, Model_B ו-Model_C נפרסות ב-Endpoint_1 והתנועה מנותבת לכולן. Model_D נפרס ב-Endpoint_2, שמקבל 100% מהתנועה לנקודת הקצה הזו.
במקום להקצות כל מודל למכונה וירטואלית נפרדת, אפשר לקבץ את המודלים באחת מהדרכים הבאות:
- מקבצים את
Model_Aו-Model_Bכדי לשתף מכונה וירטואלית, וכך הם הופכים לחלק מ-DeploymentResourcePool_X. - קיבוץ של
Model_Cו-Model_D(שלא נמצאים כרגע באותה נקודת קצה) כדי לשתף מכונה וירטואלית, וכך להפוך אותם לחלק מ-DeploymentResourcePool_Y.
מאגרי משאבים שונים לפריסה לא יכולים לשתף מכונה וירטואלית.
לתשומת ליבכם
אין הגבלה על מספר המודלים שאפשר לפרוס למאגר משאבי פריסה יחיד. זה תלוי בצורת המכונה הווירטואלית שנבחרה, בגדלים של המודלים ובדפוסי התנועה. אירוח משותף מתאים במקרים שבהם יש הרבה מודלים שפרוסים עם תנועת גולשים דלילה, כך שהקצאת מכונה ייעודית לכל מודל שפרוס לא מאפשרת ניצול יעיל של המשאבים.
אפשר לפרוס מודלים למאגר משאבי פריסה זהה בו-זמנית. עם זאת, יש מגבלה של 20 בקשות פריסה בו-זמניות בכל רגע נתון.
מאגר משאבים ריק לפריסה לא צורך את מכסת המשאבים שלכם. המשאבים מוקצים למאגר משאבי פריסה כשפורסים את המודל הראשון, והם משוחררים כשמבטלים את הפריסה של המודל האחרון.
מודלים במאגר משאבים של פריסה יחידה לא מבודדים זה מזה, ויכולים להתחרות על המעבד והזיכרון. רמת הביצועים של מודל מסוים עשויה להיות נמוכה יותר אם מודל אחר מעבד בקשת הסקה באותו הזמן.
מגבלות
יש מגבלות מסוימות כשפורסים מודלים עם שיתוף משאבים מופעל:
- התכונה הזו נתמכת רק בהגדרות הבאות:
- פריסות של מודלים ב-TensorFlow שמשתמשות בקונטיינרים מוכנים מראש ל-TensorFlow
- פריסות של מודלים של PyTorch שמשתמשות בקונטיינרים מוכנים מראש ל-PyTorch
- אין תמיכה בקונטיינרים מוכנים מראש שהוגדרו למסגרות אחרות.
- אין תמיכה במאגרי תגים בהתאמה אישית.
- יש תמיכה רק במודלים שעברו אימון בהתאמה אישית ובמודלים שיובאו. אין תמיכה במודלים של AutoML.
- אפשר לפרוס רק מודלים עם אותו קובץ אימג' של קונטיינר (כולל גרסת המסגרת) של קונטיינרים מוכנים מראש של Vertex AI להסקת מסקנות עבור TensorFlow או PyTorch באותו מאגר משאבים לפריסה.
- אין תמיכה ב-Vertex Explainable AI.
פריסת מודל
כדי לפרוס מודל ל-DeploymentResourcePool, מבצעים את השלבים הבאים:
- אם צריך, יוצרים מאגר משאבים לפריסה.
- אם צריך, יוצרים נקודת קצה.
- מאחזרים את מזהה נקודת הקצה.
- פורסים את המודל בנקודת הקצה במאגר משאבי הפריסה.
יצירת מאגר משאבים לפריסה
אם אתם פורסים מודל ל-DeploymentResourcePool קיים, דלגו על השלב הזה:
משתמשים ב-CreateDeploymentResourcePool כדי ליצור מאגר משאבים.
Cloud Console
נכנסים לדף Deployment Resource Pools במסוף Google Cloud של Vertex AI.
לוחצים על יצירה וממלאים את הטופס (שמוצג בהמשך).

REST
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
- LOCATION_ID: האזור שבו אתם משתמשים ב-Vertex AI.
- PROJECT_ID: מזהה הפרויקט.
-
MACHINE_TYPE: אופציונלי. משאבי המכונה שמשמשים לכל צומת בפריסה הזו. הגדרת ברירת המחדל היא
n1-standard-2. מידע נוסף על סוגי מכונות - ACCELERATOR_TYPE: סוג המאיץ שיצורף למכונה. אופציונלי אם לא מציינים את ACCELERATOR_COUNT או אם הערך שלו הוא אפס. לא מומלץ לשימוש במודלים של AutoML או במודלים שעברו אימון בהתאמה אישית ומשתמשים בתמונות שלא מבוססות על GPU. מידע נוסף
- ACCELERATOR_COUNT: מספר המאיצים שכל רפליקה צריכה להשתמש בהם. זה שינוי אופציונלי. הערך צריך להיות אפס או לא מוגדר במודלים של AutoML או במודלים שאומנו בהתאמה אישית שמשתמשים בתמונות שלא מבוססות על GPU.
- MIN_REPLICA_COUNT: מספר הצמתים המינימלי לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים לפי הצורך בהתאם לעומס ההסקה, עד למספר המקסימלי של הצמתים ולפחות למספר הזה של הצמתים. הערך הזה חייב להיות שווה ל-1 או גדול ממנו.
- MAX_REPLICA_COUNT: המספר המקסימלי של הצמתים לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים בהתאם לעומס ההסקה, עד למספר הצמתים הזה ולעולם לא פחות ממספר הצמתים המינימלי.
- REQUIRED_REPLICA_COUNT: אופציונלי. מספר הצמתים הנדרש כדי שהפריסה הזו תסומן כהצלחה. הערך חייב להיות גדול מ-1 או שווה לו, וקטן ממספר הצמתים המינימלי או שווה לו. אם לא מציינים ערך, ערך ברירת המחדל הוא המספר המינימלי של הצמתים.
-
DEPLOYMENT_RESOURCE_POOL_ID: שם ל-
DeploymentResourcePool. האורך המקסימלי הוא 63 תווים, והתווים התקפים הם /^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$/.
ה-method של ה-HTTP וכתובת ה-URL:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/deploymentResourcePools
תוכן בקשת JSON:
{
"deploymentResourcePool":{
"dedicatedResources":{
"machineSpec":{
"machineType":"MACHINE_TYPE",
"acceleratorType":"ACCELERATOR_TYPE",
"acceleratorCount":"ACCELERATOR_COUNT"
},
"minReplicaCount":MIN_REPLICA_COUNT,
"maxReplicaCount":MAX_REPLICA_COUNT,
"requiredReplicaCount":REQUIRED_REPLICA_COUNT
}
},
"deploymentResourcePoolId":"DEPLOYMENT_RESOURCE_POOL_ID"
}
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/deploymentResourcePools/DEPLOYMENT_RESOURCE_POOL_ID/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateDeploymentResourcePoolOperationMetadata",
"genericMetadata": {
"createTime": "2022-06-15T05:48:06.383592Z",
"updateTime": "2022-06-15T05:48:06.383592Z"
}
}
}
אפשר לבדוק את סטטוס הפעולה עד שהתגובה כוללת את "done": true.
Python
# Create a deployment resource pool.
deployment_resource_pool = aiplatform.DeploymentResourcePool.create(
deployment_resource_pool_id="DEPLOYMENT_RESOURCE_POOL_ID", # User-specified ID
machine_type="MACHINE_TYPE", # Machine type
min_replica_count=MIN_REPLICA_COUNT, # Minimum number of replicas
max_replica_count=MAX_REPLICA_COUNT, # Maximum number of replicas
)
מחליפים את מה שכתוב בשדות הבאים:
-
DEPLOYMENT_RESOURCE_POOL_ID: שם ל-DeploymentResourcePool. האורך המקסימלי הוא 63 תווים, והתווים התקפים הם /^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$/. -
MACHINE_TYPE: אופציונלי. משאבי המכונה שמשמשים לכל צומת בפריסה הזו. ערך ברירת המחדל הואn1-standard-2. מידע נוסף על סוגי מכונות -
MIN_REPLICA_COUNT: מספר הצמתים המינימלי לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים בהתאם לעומס ההסקה, עד למספר המקסימלי של הצמתים, אבל לא פחות ממספר הצמתים הזה. הערך הזה חייב להיות שווה ל-1 או גדול ממנו. -
MAX_REPLICA_COUNT: המספר המקסימלי של צמתים לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים בהתאם לעומס ההסקה, עד למספר הצמתים הזה ולעולם לא פחות ממספר הצמתים המינימלי.
יצירת נקודת קצה
במאמר יצירת נקודת קצה ציבורית באמצעות ה-CLI של gcloud או Vertex AI API מוסבר איך ליצור נקודת קצה. השלב הזה זהה לפריסת מודל יחיד.
אחזור מזהה נקודת הקצה
כדי לאחזר את מזהה נקודת הקצה, אפשר לעיין במאמר בנושא פריסת מודל באמצעות ה-CLI של gcloud או Vertex AI API. השלב הזה זהה לפריסת מודל יחיד.
פריסת המודל במאגר משאבי פריסה
אחרי שיוצרים DeploymentResourcePool ונקודת קצה (endpoint), אפשר לבצע פריסה באמצעות שיטת ה-API DeployModel. התהליך הזה דומה לפריסה של מודל יחיד. אם יש DeploymentResourcePool, מציינים את shared_resources של DeployModel עם שם המשאב של DeploymentResourcePool שפורסים.
Cloud Console
נכנסים לדף Model Registry של Vertex AI במסוף Google Cloud .
מאתרים את המודל ולוחצים על Deploy to endpoint (פריסה לנקודת קצה).
בקטע Model settings (הגדרות המודל) שמוצג למטה, בוחרים באפשרות Deploy to a shared deployment resource pool (פריסה למאגר משותף של משאבי פריסה).

REST
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
- LOCATION_ID: האזור שבו אתם משתמשים ב-Vertex AI.
- PROJECT: מזהה הפרויקט.
- ENDPOINT_ID: המזהה של נקודת הקצה.
- MODEL_ID: המזהה של המודל שרוצים לפרוס.
-
DEPLOYED_MODEL_NAME: שם ל-
DeployedModel. אפשר להשתמש גם בשם המוצג שלModelבשבילDeployedModel. -
DEPLOYMENT_RESOURCE_POOL_ID: שם ל-
DeploymentResourcePool. האורך המקסימלי הוא 63 תווים, והתווים התקפים הם /^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$/. - TRAFFIC_SPLIT_THIS_MODEL: אחוז תנועת התחזיות לנקודת הקצה הזו שתנותב למודל שנפרס באמצעות הפעולה הזו. ברירת המחדל היא 100. סכום כל האחוזים של התנועה צריך להיות 100. מידע נוסף על פיצול תנועה
- DEPLOYED_MODEL_ID_N: אופציונלי. אם מודלים אחרים נפרסים בנקודת הקצה הזו, צריך לעדכן את אחוזי חלוקת התנועה שלהם כך שסכום כל האחוזים יהיה 100.
- TRAFFIC_SPLIT_MODEL_N: ערך אחוז חלוקת התנועה למזהה המודל שנפרס.
- PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי בפרויקט
ה-method של ה-HTTP וכתובת ה-URL:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID:deployModel
תוכן בקשת JSON:
{
"deployedModel": {
"model": "projects/PROJECT/locations/us-central1/models/MODEL_ID",
"displayName": "DEPLOYED_MODEL_NAME",
"sharedResources":"projects/PROJECT/locations/us-central1/deploymentResourcePools/DEPLOYMENT_RESOURCE_POOL_ID"
},
"trafficSplit": {
"0": TRAFFIC_SPLIT_THIS_MODEL,
"DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
"DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
},
}
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployModelOperationMetadata",
"genericMetadata": {
"createTime": "2022-06-19T17:53:16.502088Z",
"updateTime": "2022-06-19T17:53:16.502088Z"
}
}
}
Python
# Deploy model in a deployment resource pool.
model = aiplatform.Model("MODEL_ID")
model.deploy(deployment_resource_pool=deployment_resource_pool)
מחליפים את MODEL_ID במזהה של המודל שרוצים לפרוס.
חוזרים על הבקשה הקודמת עם מודלים שונים שיש להם את אותם משאבים משותפים, כדי לפרוס כמה מודלים לאותו מאגר משאבי פריסה.
קבלת מסקנות
אפשר לשלוח בקשות הסקה למודל ב-DeploymentResourcePool כמו לכל מודל אחר שנפרס ב-Vertex AI.