איך שומרים מקום בעזרת אימון

במאמר הזה מוסבר איך להשתמש בהזמנות של Compute Engine כדי להבטיח שלמשימות האימון ללא שרת (serverless) יהיו משאבי המכונות הווירטואליות (VM) הנדרשים להפעלה.

הזמנות הן תכונה של Compute Engine. אתם יכולים לשמור מקום כדי לוודא שמתי שתצטרכו יהיו לכם משאבים בשביל ליצור מכונות וירטואליות עם אותה חומרה (זיכרון ו-vCPU) ומשאבים אופציונליים (מעבדי CPU,‏ GPU,‏ TPU ודיסקים מקומיים של SSD).

כשיוצרים מקום שמור, המערכת של Compute Engine בודקת אם הקיבולת שביקשתם זמינה באזור שציינתם. אם כן, המשאבים נשמרים ב-Compute Engine, הבקשה נוצרת וקורים הדברים הבאים:

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

מגבלות ודרישות

כשמשתמשים בהזמנות של Compute Engine עם Agent Platform, חשוב להביא בחשבון את המגבלות והדרישות הבאות:

  • ב-Agent Platform אפשר להשתמש רק במקומות שמורים ל-CPU, למכונות וירטואליות של GPU או ל-TPU (גרסת טרום-השקה (Preview)).
  • ‫Agent Platform לא יכולה לצרוך הקצאות של מכונות וירטואליות שמחוברים אליהן ידנית דיסקים מסוג Local SSD.
  • אפשר להשתמש במקומות שמורים ב-Compute Engine ב-Agent Platform רק לאימון בלי שרת (serverless), להסקת מסקנות ול-Gemini Enterprise Agent Platform Workbench (גרסת טרום-השקה).
  • כדי להשתמש במכונה הווירטואלית שהזמנתם, המאפיינים שלה צריכים להיות זהים לאלה של עומס העבודה בפלטפורמת הסוכנים. לדוגמה, אם בהזמנה מצוין סוג מכונה a2-ultragpu-8g, עומס העבודה של Agent Platform יכול לצרוך את ההזמנה רק אם הוא משתמש גם בסוג מכונה a2-ultragpu-8g. לדרישות
  • כדי להשתמש במכונות וירטואליות של GPU או ב-TPU שהוקצו במשותף, צריך להשתמש בהם באמצעות הפרויקט הבעלים או פרויקט צרכן שההקצאה משותפת איתו. איך פועלות הזמנות משותפות
  • כדי לתמוך בעדכונים שוטפים של פריסות Agent Platform, מומלץ להגדיל את מספר המכונות הווירטואליות במכונה וירטואלית אחת נוספת לפחות לכל פריסה בו-זמנית.
  • אפשר להשתמש ב-Flex Start ל-מתזמן משימות לפריסת workload דינמית (DWS) ולהריץ משימות אימון במשאב לטווח ארוך, חוץ ממקרים שבהם משתמשים במקומות שמורים ב-Compute Engine עם אימון ב-Agent Platform.

חיוב

כשאתם משתמשים במקומות שמורים ב-Compute Engine, אתם מחויבים על:

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

איך מאפשרים שימוש בהזמנה

לפני שמשתמשים במקום שמור למעבדי CPU, למכונות וירטואליות של GPU או למעבדי TPU, צריך להגדיר את מדיניות השיתוף כך שתאפשר ל-Agent Platform להשתמש במקום השמור. כדי לעשות את זה, משתמשים באחת מהשיטות הבאות:

אישור צריכה בזמן יצירת הזמנה

כשיוצרים הזמנה לפרויקט יחיד או הזמנה משותפת של מכונות וירטואליות של GPU, אפשר לאפשר ל-Agent Platform להשתמש בהזמנה באופן הבא:

  • אם משתמשים במסוף Cloud de Confiance , בקטע Google Cloud services בוחרים באפשרות Share reservation.
  • אם משתמשים ב-Google Cloud CLI, צריך לכלול את הדגל --reservation-sharing-policy שמוגדר ל-ALLOW_ALL.
  • אם משתמשים ב-API בארכיטקטורת REST, בגוף הבקשה צריך לכלול את השדה serviceShareType עם הערך ALLOW_ALL.

איך משתמשים בהזמנה קיימת

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

כדי לאפשר ל-Agent Platform להשתמש בהזמנה קיימת, אפשר להשתמש באחת מהשיטות הבאות:

איך בודקים אם נעשה שימוש בהזמנה

כדי לוודא שההזמנה מנוצלת, קראו את המאמר אימות ניצול ההזמנות במסמכי התיעוד של Compute Engine.

יצירת משימת אימון ללא שרת (serverless) עם הזמנה

משתמשים ב-API בארכיטקטורת REST כדי ליצור משימת אימון ללא שרת (serverless) שצורכת הקצאה של מכונות וירטואליות עם GPU ב-Compute Engine.

איך פועלים השיוך והאימות של ההזמנות

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

  • ב-ANY_RESERVATION:
    • באזור של המשימה צריכה להיות לפחות הזמנה אחת שנוצלה באופן אוטומטי, והיא צריכה להיות משותפת עם Agent Platform (וגם עם הפרויקט שלכם, אם ההזמנה נמצאת בפרויקט מארח אחר).
    • השדות key ו-values ב-reservationAffinity צריכים להיות מושמטים או ריקים.
  • ב-SPECIFIC_RESERVATION:
    • בשדה key צריך להגדיר את הערך compute.googleapis.com/reservation-name, ובשדה values צריך לציין הקצאה קיימת אחת באזור בתוך אזור המשימה.
    • המקום השמור שציינתם צריך להיות מוגדר לטירגוט ספציפי (ולא לצריכה אוטומטית), וצריך לשתף אותו עם Agent Platform (ועם הפרויקט שלכם, אם המקום השמור נמצא בפרויקט מארח אחר).

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

בטבלה הבאה מוסבר איך Agent Platform מטפלת במשימת אימון, בהתאם למצב ההזמנה ול-reservationAffinityType:

תרחיש התנהגות עם ANY_RESERVATION התנהגות עם SPECIFIC_RESERVATION
יש מקום שמור שתואם למאפייני המכונה, ויש בו קיבולת פנויה המשימה מתקבלת, מנותבת לאזור של ההזמנה וצורכת את ההזמנה. המשימה מתקבלת וצורכת את ההזמנה שצוינה.
ההזמנה קיימת ותואמת למאפייני המכונה, אבל היא מלאה המשימה מתקבלת ומועברת לאזור שבו נמצאת ההזמנה התואמת. מכיוון שהקיבולת השמורה מוצתה, Agent Platform מנסה להקצות קיבולת על פי דרישה. המשימה מתקבלת, אבל אם לא מתפנה קיבולת בהזמנה המטורגטת, Agent Platform. היא לא חוזרת לקיבולת על פי דרישה.
ההזמנה קיימת, אבל היא לא משותפת עם Agent Platform או עם פרויקט הצרכן המשימה נכשלת מיד עם השליחה ומוצגת השגיאה INVALID_ARGUMENT (אלא אם קיימת באזור הזמנה אחרת שנגישה ומוקצית באופן אוטומטי). המשימה נכשלת מיד עם השליחה ומופיעה השגיאה INVALID_ARGUMENT.
אין הזמנה נגישה באזור של המשימה המשימה נכשלת מיד עם השליחה ומופיעה השגיאה INVALID_ARGUMENT. הוא לא חוזר לקיבולת על פי דרישה. המשימה נכשלת מיד עם השליחה ומופיעה השגיאה INVALID_ARGUMENT.

REST

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫LOCATION: האזור שבו יופעלו הקונטיינר או חבילת Python.
  • ‫PROJECT_ID: הפרויקט שבו נוצרה ההזמנה. כדי להשתמש בהזמנה משותפת מפרויקט אחר, צריך לשתף את ההזמנה עם הפרויקט הזה. מידע נוסף זמין במאמר שינוי הפרויקטים של הצרכנים בהזמנה משותפת.
  • ‫JOB_NAME: שדה חובה. השם המוצג של CustomJob.
  • ‫MACHINE_TYPE: סוג המכונה שבה משתמשים למשימה. הגדרת ברירת המחדל היא n1-standard-2. מידע נוסף על סוגי המכונות הנתמכים זמין במאמר הגדרת משאבי מחשוב לאימון בהתאמה אישית.
  • ‫ACCELERATOR_TYPE: סוג המאיץ שרוצים לצרף למכונה. למידע נוסף על סוג ה-GPU שכל סוג מכונה תומך בו, קראו את המאמר מעבדי GPU לעומסי עבודה של Compute.
  • ‫ACCELERATOR_COUNT: מספר המאיצים שרוצים לצרף למכונה.
  • מגדירים את משימת האימון בהתאמה אישית:
    • ‫RESERVATION_AFFINITY_TYPE: הערך חייב להיות ANY_RESERVATION, SPECIFIC_RESERVATION או NO_RESERVATION.

      • ANY_RESERVATION פירושו שהמכונות הווירטואליות של customJob יכולות להשתמש באופן אוטומטי בכל הזמנה עם מאפיינים תואמים.
      • ‫SPECIFIC_RESERVATION פירושו שהמכונות הווירטואליות של customJob יכולות להשתמש רק במקום שהמכונות הווירטואליות מטרגטות באופן ספציפי לפי שם.
      • ‫NO_RESERVATION פירושו שהמכונות הווירטואליות של customJob לא יכולות להשתמש באף מקום שמור. ההשפעה של ציון NO_RESERVATION זהה להשפעה של השמטת מפרט של זיקה להזמנה.
    • ‫ZONE: האזור שבו נוצרה ההזמנה.
    • ‫RESERVATION_NAME: שם ההזמנה.
    • ‫DISK_TYPE: אופציונלי. סוג דיסק האתחול שבו משתמשים במשימה, pd-standard (ברירת המחדל) או pd-ssd. מידע נוסף על סוגי דיסקים
    • ‫DISK_SIZE: אופציונלי. גודל דיסק האתחול ב-GB שמשמש למשימה. ערך ברירת המחדל הוא 100.
    • ‫REPLICA_COUNT: מספר הרפליקות של ה-worker שבהן צריך להשתמש. ברוב המקרים, צריך להגדיר את הערך 1 במאגר ה-Workers הראשון.
    • אם אפליקציית האימון פועלת בקונטיינר בהתאמה אישית, צריך לציין את הפרטים הבאים:
      • ‫CUSTOM_CONTAINER_IMAGE_URI: ה-URI של קובץ אימג' של קונטיינר ב-Artifact Registry או ב-Docker Hub, שצריך להריץ בכל רפליקה של Worker.
      • ‫CUSTOM_CONTAINER_COMMAND: אופציונלי. הפקודה שמופעלת כשהקונטיינר מופעל. הפקודה הזו מבטלת את נקודת הכניסה שמוגדרת כברירת מחדל בקונטיינר.
      • ‫CUSTOM_CONTAINER_ARGS: אופציונלי. הארגומנטים שיועברו כשמפעילים את הקונטיינר.
    • אם אפליקציית האימון היא חבילת Python שפועלת בקונטיינר מוגדר מראש, צריך לציין את הפרטים הבאים:
      • ‫EXECUTOR_IMAGE_URI: ה-URI של קובץ האימג' של הקונטיינר שמריץ את הקוד שסופק. קונטיינרים זמינים מובנים לאימון
      • ‫PYTHON_PACKAGE_URIS: רשימה מופרדת בפסיקים של מזהי URI של Cloud Storage, שמציינים את קובצי חבילת Python שהם תוכנית האימון והחבילות התלויות שלה. המספר המקסימלי של מזהי URI של חבילות הוא 100.
      • ‫PYTHON_MODULE: השם של מודול Python שצריך להריץ אחרי התקנת החבילות.
      • ‫PYTHON_PACKAGE_ARGS: אופציונלי. ארגומנטים של שורת הפקודה שיועברו למודול Python.
    • ‫TIMEOUT: אופציונלי. זמן הריצה המקסימלי של המשימה.
  • מציינים את LABEL_NAME ו-LABEL_VALUE לכל התוויות שרוצים להחיל על המשימה הייעודית הזו.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

גוף בקשת JSON:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "MACHINE_TYPE",
          "acceleratorType": "ACCELERATOR_TYPE",
          "acceleratorCount": ACCELERATOR_COUNT,
          "reservationAffinity": {
            "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
            // Use the following key and values only if
            // the reservationAffinityType is SPECIFIC_RESERVATION.
            "key": "compute.googleapis.com/reservation-name",
            "values": [
              "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
            ]
          },
        },
        "replicaCount": REPLICA_COUNT,
        "diskSpec": {
          "bootDiskType": DISK_TYPE,
          "bootDiskSizeGb": DISK_SIZE
        },

        // Union field task can be only one of the following:
        "containerSpec": {
          "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
          "command": [
            CUSTOM_CONTAINER_COMMAND
          ],
          "args": [
            CUSTOM_CONTAINER_ARGS
          ]
        },
        "pythonPackageSpec": {
          "executorImageUri": EXECUTOR_IMAGE_URI,
          "packageUris": [
            PYTHON_PACKAGE_URIS
          ],
          "pythonModule": PYTHON_MODULE,
          "args": [
            PYTHON_PACKAGE_ARGS
          ]
        }
        // End of list of possible types for union field task.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "timeout": TIMEOUT
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

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

curl

שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"

PowerShell

שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

התשובה מכילה מידע על המפרטים וגם את TRAININGPIPELINE_ID.

המאמרים הבאים