יצירת אשכול GKE מותאם אישית ל-AI שמשתמש ב-A4 או ב-A3 Ultra

בדף הזה מוסבר איך ליצור אשכול Google Kubernetes Engine ‏ (GKE) שעבר אופטימיזציה ל-AI, שמשתמש במכונות וירטואליות (VM) מסוג A4 או A3 Ultra כדי לתמוך בעומסי העבודה של ה-AI וה-ML. ל-A4X, אפשר לעיין במאמר בנושא יצירת אשכול GKE מותאם אישית שעבר אופטימיזציה באמצעות AI ומשתמש ב-A4X.

סדרות המכונות A4 ו-A3 Ultra נועדו לאפשר לכם להריץ אשכולות AI/ML בקנה מידה גדול, עם תכונות כמו מיקום ממוקד של עומסי עבודה, אמצעי בקרה מתקדמים לתחזוקת אשכולות ותזמון מודע-טופולוגיה. מידע נוסף מופיע במאמר סקירה כללית על ניהול אשכולות.

‫GKE מספק פלטפורמה יחידה להרצת מגוון רחב של עומסי עבודה בארגונים, וכך מצמצם את העומס התפעולי שנובע מניהול של כמה פלטפורמות. אתם יכולים להריץ עומסי עבודה כמו אימון מוקדם מבוזר עם ביצועים גבוהים, כוונון עדין של מודלים, הסקת מסקנות ממודלים, שירותי אפליקציות ושירותי תמיכה.

בדף הזה מוסבר איך ליצור אשכול GKE באמצעות Google Cloud CLI כדי להגדיר את האשכול בצורה גמישה ככל האפשר בהתאם לצרכים של עומס העבודה. אפשר גם להשתמש ב-Cluster Toolkit כדי לפרוס במהירות את האשכול עם הגדרות ברירת מחדל שמשקפות שיטות מומלצות לתרחישי שימוש רבים. הוראות מפורטות מופיעות במאמר יצירת אשכול GKE שעבר אופטימיזציה ל-AI עם הגדרת ברירת מחדל.

אפשרויות להגדרת אשכולות עם GPUDirect RDMA

כדי ליצור את האשכול באמצעות Google Cloud CLI, אפשר לבחור באחת מאפשרויות ההגדרה הבאות של האשכול:

  • אם אתם לא מתכננים להריץ עומסי עבודה של AI מבוזר: צרו אשכול GKE בלי להשתמש ב-GPUDirect RDMA.
  • אם אתם מתכננים להריץ עומסי עבודה מבוזרים של AI: צריך ליצור אשכול GKE עם GPUDirect RDMA.

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

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות ליצירה ולניהול של אשכול GKE, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

בחירת אפשרות צריכה וקבלת קיבולת

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

    ב-GKE, כדאי לקחת בחשבון את המידע הנוסף הבא כשבוחרים אפשרות צריכה:

  2. קבלת קיבולת. כך מקבלים קיבולת לאפשרות התשלום לפי צריכה.

דרישות

הדרישות הבאות חלות על אשכול GKE שעבר אופטימיזציה באמצעות AI:

  • כדי להשתמש במודל הקצאת המשאבים עם התחלה גמישה, צריך להשתמש ב-GKE מגרסה 1.32.2-gke.1652000 ואילך.
  • חשוב לוודא שמשתמשים בגרסת מנהל ההתקן המינימלית של GPU, בהתאם לסוג המכונה:

    • A4: מעבדי ה-GPU מסוג B200 במכונות וירטואליות מסוג A4 דורשים לפחות את גרסת מנהל ההתקן של GPU מסוג R570. ב-GKE, כברירת מחדל, מותקנת אוטומטית גרסת הדרייבר הזו בכל צמתי A4 שמריצים את הגרסה המינימלית הנדרשת ל-A4, שהיא 1.32.1-gke.1729000 ואילך.
    • A3 Ultra: כדי להשתמש במעבדי ה-GPU מסוג H200 במכונות וירטואליות של A3 Ultra, צריך לפחות את גרסת מנהל ההתקן של GPU‏ R550, שזמינה בגרסה 1.31 של GKE בתור גרסת מנהל ההתקן latest. במכונות וירטואליות מסוג A3 Ultra, צריך להגדיר את הערך של השדה gpu-driver-version=latest עם GKE בגרסה 1.31. ב-GKE מגרסה 1.31.5-gke.1169000 ואילך, מערכת GKE מתקינה אוטומטית גרסאות של מנהלי התקנים של GPU מסוג R550 בצמתי A3 Ultra כברירת מחדל, כולל כשמשמיטים את הדגל gpu-driver-version.
  • כדי להשתמש ב-GPUDirect RDMA, צריך לעמוד בדרישות הנוספות הבאות:

    • משתמשים בגרסאות המינימליות הבאות, בהתאם לסוג המכונה:
      • A4: צריך להשתמש בגרסה 1.32.2-gke.1475000 ואילך.
      • A3 Ultra: שימוש בגרסה 1.31.4-gke.1183000 ואילך.
    • הצמתים של GKE צריכים להשתמש בקובץ אימג' של צומת של מערכת הפעלה שמותאמת לקונטיינרים. אין תמיכה בתמונות של צמתים ב-Ubuntu וב-Windows.
    • עומס העבודה ב-GKE צריך להשתמש בכל יחידות ה-GPU הזמינות, וה-Pod צריך להשתמש בכל כרטיסי ממשק הרשת המשני (NIC) הזמינים בצומת GKE יחיד. אי אפשר לשתף RDMA בין כמה Pods בצומת GKE יחיד.
    • במסגרת ההגדרה הזו מופעלת בדיקת NCCL. כדי להריץ את בדיקת NCCL הזו, צריך מכסת מכונות וירטואליות של 2 לפחות (כלומר, 16 יחידות GPU אם משתמשים בסוגי המכונות a4-highgpu-8g או a3-ultragpu-8g).
    • ‫GPUDirect RDMA לא תואם ל-NCCL Fast Socket או ל-GPUDirect TCPX/TCPXO. אל תפעילו את NCCL Fast Socket ואל תתקינו את הפלאגין TCPX/TCPXO באשכולות שמשתמשים ב-GPUDirect RDMA.
  • חשוב לוודא שאתם משתמשים במיקום שבו סוג המכונה שבחרתם זמין. מידע נוסף זמין במאמר בנושא מיקומי GPU.

יצירת אשכול GKE שעבר אופטימיזציה ל-AI

כדי ליצור אשכול GKE שעומד בדרישות לאשכולות GKE שעברו אופטימיזציה ל-AI, פועלים לפי ההוראות בקטע הזה. אפשר לבחור אם ליצור אשכול עם GPUDirect RDMA או בלי.

שיקולים ליצירת אשכול

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

  • בוחרים מיקום של אשכול:
    • חשוב לוודא שאתם משתמשים במיקום שבו יש זמינות לסוג המכונה שבחרתם. מידע נוסף זמין במאמר בנושא מיקומי GPU.
    • כדי להזמין כמות גדולה של מכונות, אפשר ליצור אשכול אזורי. במקרה כזה, מחליפים את הדגל --region בדגל --zone=COMPUTE_ZONE, כאשר COMPUTE_ZONE הוא התחום של מישור הבקרה.
    • עבור עומסי עבודה שפועלים ביותר מ-1,000 צמתים ושנדרש להם זמן אחזור נמוך ברשת בין הצמתים, אפשר ליצור אשכול אזורי. כדי למקם פיזית את הצמתים הרגישים לביצועים, צריך ליצור מאגרי צמתים של GPU באזור אחד באמצעות הדגל --node-locations.
  • בוחרים גרסת מנהל התקן:
    • גרסת הדרייבר יכולה להיות אחת מהאפשרויות הבאות:
      • default: התקנת גרסת ברירת המחדל של הדרייבר לגרסת הצומת של GKE. מידע נוסף על הדרישות לגבי גרסאות ברירת מחדל של מנהלי התקנים זמין בקטע דרישות.
      • latest: התקנת הגרסה האחרונה של מנהל ההתקן שזמינה לגרסת GKE שלכם. האפשרות הזו זמינה רק לצמתים שמשתמשים במערכת הפעלה שמותאמת לקונטיינרים.
      • disabled: דילוג על התקנה אוטומטית של מנהל התקן. צריך להתקין מנהל התקן באופן ידני אחרי שיוצרים את מאגר הצמתים.
    • מידע נוסף על גרסאות ברירת המחדל והגרסאות האחרונות של מנהלי ההתקנים של GPU לגרסאות של צומתי GKE זמין במאמר בנושא התקנה ידנית של מנהלי התקנים של NVIDIA GPU.
  • בחירת שיוך להזמנה:

    • תוכלו למצוא מידע על ההזמנה, כמו שם ההזמנה או שם של בלוק ספציפי בהזמנה. כדי לראות את הערכים האלה, אפשר לעיין במאמר בנושא הצגת בקשות לשמירת מקום לעתיד.
    • הדגל --reservation-affinity יכול לקבל את הערכים specific או any. עם זאת, כדי להשיג ביצועים גבוהים בעומסי עבודה מבוזרים של AI, מומלץ להשתמש בהזמנה ספציפית.
    • כשמשתמשים בהזמנה ספציפית, כולל הזמנות משותפות, צריך לציין את הערך של הדגל --reservation בפורמט הבא:

      projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
      

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

      • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
      • RESERVATION_NAME: השם של ההזמנה.
      • BLOCK_NAME: השם של בלוק ספציפי בהזמנה.

יצירת אשכול ללא GPUDirect RDMA

כדי ליצור אשכול ללא GPUDirect RDMA, פועלים לפי ההוראות הבאות כדי ליצור אשכול עם מאגר צמתים שמוגדר כברירת מחדל על בסיס CPU ומאגרי צמתים נוספים עם GPU. הגישה הזו מאפשרת למאגר הצמתים שמוגדר כברירת מחדל להריץ שירותים אחרים.

  1. יוצרים את האשכול:

      gcloud container clusters create CLUSTER_NAME \
          --cluster-version=CLUSTER_VERSION \
          --region=COMPUTE_REGION
    

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

    • CLUSTER_NAME: השם של האשכול החדש.
    • CLUSTER_VERSION: הגרסה של האשכול החדש. מידע נוסף על הגרסה של GKE שתומכת בהגדרה שלכם זמין בקטע דרישות.
    • COMPUTE_REGION: האזור של האשכול החדש. אם אתם מתכננים ליצור אשכול אזורי, אתם צריכים להשתמש בדגל --zone במקום בדגל --region. לדוגמה: --zone=COMPUTE_ZONE. מחליפים את COMPUTE_ZONE באזור של מישור הבקרה.
  2. יוצרים את מאגר הצמתים מבוסס ה-GPU באמצעות אחת מהפקודות הבאות. הפקודה שצריך להריץ תלויה באפשרות הצריכה שבה אתם משתמשים לפריסה. בוחרים את הכרטיסייה שמתאימה למודל ההקצאה של אפשרות הצריכה.

    הזמנה בלבד

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

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --num-nodes=NUM_NODES \
          --reservation-affinity=specific \
          --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME
    

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

    • NODE_POOL_NAME: שם מאגר הצמתים.
    • COMPUTE_REGION: האזור של האשכול החדש.
    • CLUSTER_NAME: השם של האשכול החדש.
    • COMPUTE_ZONE: האזור של מאגר הצמתים.
    • GPU_TYPE: סוג ה-GPU המואץ:

      • מכונות וירטואליות מסוג A4: מזינים nvidia-b200.
      • מכונות VM מסוג A3 Ultra: מזינים nvidia-h200-141gb.
    • AMOUNT: מספר המעבדים הגרפיים לצירוף לצמתים במאגר הצמתים. לדוגמה, בשתי המכונות הווירטואליות a4-highgpu-8g ו-a3-ultragpu-8g, מספר יחידות ה-GPU הוא 8.

    • DRIVER_VERSION: גרסת הדרייבר של NVIDIA להתקנה. אפשר להשתמש באחד מהערכים הבאים: default, latest או disabled.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • NUM_NODES: מספר הצמתים במאגר הצמתים.

    • RESERVATION_NAME: השם של ההזמנה. כדי למצוא את הערך הזה, אפשר לעיין במאמר בנושא צפייה במקום שמור לעתיד.

    • BLOCK_NAME: השם של בלוק ספציפי בהזמנה. הוראות לאיתור הערך הזה מופיעות במאמר איך צופים בבקשות לשמירת מקום לעתיד.

    Flex-start

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

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --flex-start --enable-autoscaling --num-nodes=0 \
          --total-max-nodes TOTAL_MAX_NODES \
          --no-enable-autorepair --location-policy=ANY \
          --reservation-affinity=none [\
          --enable-queued-provisioning]
    

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

    • NODE_POOL_NAME: שם מאגר הצמתים.
    • COMPUTE_REGION: האזור של האשכול החדש.
    • CLUSTER_NAME: השם של האשכול החדש.
    • COMPUTE_ZONE: האזור של מאגר הצמתים.
    • GPU_TYPE: סוג ה-GPU המואץ:

      • מכונות וירטואליות מסוג A4: מזינים nvidia-b200.
      • מכונות VM מסוג A3 Ultra: מזינים nvidia-h200-141gb.
    • AMOUNT: מספר המעבדים הגרפיים לצירוף לצמתים במאגר הצמתים. לדוגמה, בשתי המכונות הווירטואליות a4-highgpu-8g ו-a3-ultragpu-8g, מספר יחידות ה-GPU הוא 8.

    • DRIVER_VERSION: גרסת הדרייבר של NVIDIA להתקנה. אפשר להשתמש באחד מהערכים הבאים: default, latest או disabled.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • TOTAL_MAX_NODES: המספר המקסימלי של הצמתים שניתן להרחבה אוטומטית עבור כל מאגר הצמתים.

      כדי להשתמש בהקצאת משאבים עם גמישות בהתחלה, צריך לכלול את הדגל --enable-queued-provisioning.

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

    כרטיס Spot

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

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --num-nodes=NUM_NODES \
          --spot
    

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

    • NODE_POOL_NAME: שם מאגר הצמתים.
    • COMPUTE_REGION: האזור של האשכול החדש.
    • CLUSTER_NAME: השם של האשכול החדש.
    • COMPUTE_ZONE: האזור של מאגר הצמתים.
    • GPU_TYPE: סוג ה-GPU המואץ:

      • מכונות וירטואליות מסוג A4: מזינים nvidia-b200.
      • מכונות VM מסוג A3 Ultra: מזינים nvidia-h200-141gb.
    • AMOUNT: מספר המעבדים הגרפיים לצירוף לצמתים במאגר הצמתים. לדוגמה, בשתי המכונות הווירטואליות a4-highgpu-8g ו-a3-ultragpu-8g, מספר יחידות ה-GPU הוא 8.

    • DRIVER_VERSION: גרסת הדרייבר של NVIDIA להתקנה. אפשר להשתמש באחד מהערכים הבאים: default, latest או disabled.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • NUM_NODES: מספר הצמתים במאגר הצמתים.

      מידע נוסף על יצירת אשכולות עם מכונות Spot VM זמין במאמר הרצת עומסי עבודה עמידים בכשלים בעלויות נמוכות יותר באמצעות מכונות Spot VM.

  3. מתחברים לאשכול כדי להריץ את הפקודות של kubectl בקטעים הבאים:

      gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

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

יצירת אשכול עם GPUDirect RDMA

במקרים של עומסי עבודה מבוזרים של AI, לעיתים קרובות מקשרים בין כמה צמתים של GPU כדי שיפעלו כמחשב אחד. מכונות וירטואליות מסוג A4 ומכונות וירטואליות מסוג A3 Ultra מגיעות עם מתאם רשת Titanium ML, שמבוסס על כרטיסי רשת (NIC) מסוג NVIDIA ConnectX-7 ‏(CX7). גם מכונות וירטואליות מסוג A4 וגם מכונות וירטואליות מסוג A3 Ultra מספקות תעבורה לא חוסמת של 3.2Tbps בין צמתים של GPU ל-GPU באמצעות RDMA over Converged Ethernet ‏ (RoCE). ‫RoCE מאפשרת הרחבה ושיתוף פעולה בין כמה מעבדי GPU, ומספקת חוויית ענן עם ביצועים גבוהים לעומסי עבודה של AI.

מידע נוסף על יצירת אשכולות GKE באמצעות Google Cloud CLI ו-GPUDirect TCPX (מכונות וירטואליות מסוג A3 High) או TCPXO (מכונות וירטואליות מסוג A3 Mega) זמין במאמרים בנושא הגדלת רוחב הפס של רשת ה-GPU באשכולות במצב Autopilot או הגדלת רוחב הפס של רשת ה-GPU באשכולות במצב רגיל.

כדי ליצור אשכולות GKE במצב Autopilot או במצב רגיל עם GPUDirect RDMA, צריך לבצע את השלבים הבאים, שמתוארים בקטעים הבאים:

  1. יצירת רשתות VPC ותת-רשתות
  2. יצירת אשכול GKE עם רישות מרובה
  3. יצירת אובייקטים של רשת GKE
  4. התקנה של קובץ ה-RDMA הבינארי והגדרה של NCCL
  5. פריסה והרצה של בדיקת NCCL
  6. הגדרת מניפסטים של Pod ל-GPUDirect-RDMA

יצירת רשתות VPC ורשתות משנה

למכונות הווירטואליות A4 ולמכונות הווירטואליות A3 Ultra יש את ההגדרה הבאה:

  • שמונה מעבדי GPU של NVIDIA B200 (A4) או H200 (A3 Ultra) לכל מכונה וירטואלית שמחוברת באמצעות NVLink
  • שני מעבדי Intel Emerald Rapids
  • שמונה כרטיסי רשת CX-7 במהירות 400 Gbps לרשת GPU ל-GPU
  • שני כרטיסי רשת של Google Titanium‏ (NIC) עם מהירות של ‎200 Gbps לשירותים חיצוניים

עומסי עבודה של AI ו-ML, כמו אימון מבוזר, דורשים האצה חזקה כדי לשפר את הביצועים על ידי קיצור הזמן שנדרש להשלמת המשימות. עבור עומסי עבודה שדורשים ביצועים גבוהים, תפוקה גבוהה וחביון נמוך, GPUDirect RDMA מצמצם את מספר הקפיצות ברשת שנדרשות להעברת מטענים אל וממעבדים גרפיים, וכך משתמש בצורה יעילה יותר ברוחב הפס הזמין ברשת. הטכנולוגיה GPUDirect RDMA מיועדת לשיפור משמעותי של קצב העברת הנתונים בהשוואה ל-GPU שלא משתמשים ב-GPUDirect.

אחד ממתאמי הרשת של Google Titanium שמשויך למעבד משתמש ברשת ברירת המחדל ב-GKE. אם יש לכם מספיק טווחי כתובות IP ברשת שמוגדרת כברירת מחדל, לא צריך ליצור רשת VPC חדשה בשביל כרטיס ה-NIC הזה.

יוצרים VPC אחד עבור כרטיס ה-NIC השני של Titanium CPU ‏ (gVNIC) ועוד VPC עבור שמונת כרטיסי ה-NIC של CX-7 RDMA באמצעות הפקודות הבאות.

  1. מגדירים משתני סביבה בהתאם לפריסה:

    export REGION="COMPUTE_REGION"
    export ZONE="COMPUTE_ZONE"
    export PROJECT="PROJECT_ID"
    export GVNIC_NETWORK_PREFIX="GVNIC_NETWORK_PREFIX"
    export RDMA_NETWORK_PREFIX="RDMA_NETWORK_PREFIX"
    

    מחליפים את המשתנים הבאים:

    • COMPUTE_REGION: האזור של האשכול.
    • COMPUTE_ZONE: האזור של מאגר הצמתים.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • GVNIC_NETWORK_PREFIX: ‏a4high-gvnic למכונות וירטואליות מסוג A4 או a3ultra-gvnic למכונות וירטואליות מסוג A3 Ultra.
    • RDMA_NETWORK_PREFIX: ‏a4high-rdma למכונות וירטואליות מסוג A4 או a3ultra-rdma למכונות וירטואליות מסוג A3 Ultra.
  2. יוצרים שתי רשתות VPC:

    # Create a VPC for the additional Google Titanium CPU NIC
    gcloud compute --project=${PROJECT} \
      networks create \
      ${GVNIC_NETWORK_PREFIX}-net \
      --subnet-mode=custom
    
    gcloud compute --project=${PROJECT} \
      networks subnets create \
      ${GVNIC_NETWORK_PREFIX}-sub \
      --network=${GVNIC_NETWORK_PREFIX}-net \
      --region=${REGION} \
      --range=192.168.0.0/24
    
    gcloud compute --project=${PROJECT} \
      firewall-rules create \
      ${GVNIC_NETWORK_PREFIX}-internal \
      --network=${GVNIC_NETWORK_PREFIX}-net \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=192.168.0.0/16
    
    # Create HPC VPC for the RDMA NICs with 8 subnets.
    gcloud beta compute --project=${PROJECT} \
      networks create ${RDMA_NETWORK_PREFIX}-net \
      --network-profile=${ZONE}-vpc-roce \
      --subnet-mode=custom
    
    # Create subnets for the HPC VPC.
    for N in $(seq 0 7); do
      gcloud compute --project=${PROJECT} \
        networks subnets create \
        ${RDMA_NETWORK_PREFIX}-sub-$N \
        --network=${RDMA_NETWORK_PREFIX}-net \
        --region=${REGION} \
        --range=192.168.$((N+1)).0/24 &  # offset to avoid overlap with gvnics
    done
    

יצירת אשכול GKE עם ריבוי רשתות

טייס אוטומטי

  1. יצירת אשכול GKE Autopilot עם רשתות מרובות:

    gcloud container clusters create-auto CLUSTER_NAME \
        --enable-multi-networking \
        --cluster-version=CLUSTER_VERSION \
        --region=COMPUTE_REGION
    

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

    • CLUSTER_NAME: השם של האשכול.
    • CLUSTER_VERSION: הגרסה של האשכול החדש. כדי לגלות איזו גרסה של GKE תומכת בהגדרה שלכם, אפשר לעיין בקטע דרישות.
    • COMPUTE_REGION: השם של אזור ה-Compute.
  2. מתחברים לאשכול כדי להריץ את הפקודות של kubectl בקטעים הבאים:

    gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

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

    • CLUSTER_NAME: השם של האשכול.
    • COMPUTE_REGION: השם של אזור ה-Compute.

    מידע נוסף זמין במאמר התקנה של kubectl והגדרת גישה לאשכול.

רגילה

יצירת אשכול GKE Standard ומאגר צמתים של GPU עם ריבוי רשתות:

  1. יוצרים את האשכול:

    gcloud container clusters create CLUSTER_NAME \
      --region=COMPUTE_REGION \
      --cluster-version=CLUSTER_VERSION \
      --enable-dataplane-v2 --enable-ip-alias --enable-multi-networking [\
      --services-ipv4-cidr=SERVICE_CIDR \
      --cluster-ipv4-cidr=POD_CIDR]
    

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

    • CLUSTER_NAME: השם של האשכול.
    • CLUSTER_VERSION: הגרסה של האשכול החדש. כדי לגלות איזו גרסה של GKE תומכת בהגדרה שלכם, אפשר לעיין בקטע דרישות.
    • COMPUTE_REGION: השם של אזור ה-Compute.

    אופציונלי: אפשר לציין במפורש את טווחי ה-CIDR המשניים לשירותים ול-Pods. אם משתמשים בדגלים האופציונליים האלה, צריך להחליף את המשתנים הבאים:

    • SERVICE_CIDR: טווח ה-CIDR המשני לשירותים.
    • POD_CIDR: טווח ה-CIDR המשני של ה-Pods.

    כשמשתמשים בדגלים שלמעלה, צריך לאמת את הדברים הבאים:

    • רשתות המשנה שאתם יוצרים מאפשרות לכם להוסיף מספר מספיק של צמתים לאשכול. מידע נוסף זמין במאמר בנושא תכנון כתובות IP.
    • טווח ה-CIDR לא חופף לטווח תת-הרשתות של רשתות צמתים נוספות. לדוגמה, הטווחים בערכים SERVICE_CIDR=10.65.0.0/19 ו-POD_CIDR=10.64.0.0/19 לא חופפים. מידע נוסף מופיע במאמר בנושא הוספת טווחי כתובות IPv4 של Pod.
  2. יוצרים את מאגר הצמתים. הפקודה שצריך להריץ תלויה באפשרות הצריכה שבה אתם משתמשים לפריסה. בוחרים את הכרטיסייה שמתאימה למודל ההקצאה של אפשרות הצריכה.

    הזמנה בלבד

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

    gcloud container node-pools create NODE_POOL_NAME \
      --region COMPUTE_REGION --cluster CLUSTER_NAME \
      --node-locations COMPUTE_ZONE \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
      --machine-type MACHINE_TYPE \
      --num-nodes=NUM_NODES \
      --reservation-affinity=specific \
      --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME  \
      --additional-node-network network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7
    

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

    • NODE_POOL_NAME: שם מאגר הצמתים.
    • COMPUTE_REGION: האזור של האשכול החדש.
    • CLUSTER_NAME: השם של האשכול החדש.
    • COMPUTE_ZONE: האזור של מאגר הצמתים.
    • GPU_TYPE: סוג ה-GPU המואץ:

      • מכונות וירטואליות מסוג A4: מזינים nvidia-b200.
      • מכונות VM מסוג A3 Ultra: מזינים nvidia-h200-141gb.
    • AMOUNT: מספר המעבדים הגרפיים לצירוף לצמתים במאגר הצמתים. לדוגמה, בשתי המכונות הווירטואליות a4-highgpu-8g ו-a3-ultragpu-8g, מספר יחידות ה-GPU הוא 8.

    • DRIVER_VERSION: גרסת הדרייבר של NVIDIA להתקנה. אפשר להשתמש באחד מהערכים הבאים: default, latest או disabled.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • NUM_NODES: מספר הצמתים במאגר הצמתים. עבור התחלה גמישה (Flex-start), הערך הזה צריך להיות 0.

    • RESERVATION_NAME: השם של ההזמנה. כדי למצוא את הערך הזה, אפשר לעיין במאמר בנושא צפייה במקום שמור לעתיד.

    • BLOCK_NAME: השם של בלוק ספציפי בהזמנה. הוראות לאיתור הערך הזה מופיעות במאמר איך צופים בבקשות לשמירת מקום לעתיד.

    Flex-start

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

    gcloud container node-pools create NODE_POOL_NAME \
      --region COMPUTE_REGION --cluster CLUSTER_NAME \
      --node-locations COMPUTE_ZONE \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
      --machine-type MACHINE_TYPE \
      --num-nodes=NUM_NODES \
      --flex-start --num-nodes=0 --enable-autoscaling \
      --total-max-nodes TOTAL_MAX_NODES \
      --no-enable-autorepair --location-policy=ANY \
      --reservation-affinity=none \
      [--enable-queued-provisioning \]
      --additional-node-network network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7
    

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

    • NODE_POOL_NAME: שם מאגר הצמתים.
    • COMPUTE_REGION: האזור של האשכול החדש.
    • CLUSTER_NAME: השם של האשכול החדש.
    • COMPUTE_ZONE: האזור של מאגר הצמתים.
    • GPU_TYPE: סוג ה-GPU המואץ:

      • מכונות וירטואליות מסוג A4: מזינים nvidia-b200.
      • מכונות VM מסוג A3 Ultra: מזינים nvidia-h200-141gb.
    • AMOUNT: מספר המעבדים הגרפיים לצירוף לצמתים במאגר הצמתים. לדוגמה, בשתי המכונות הווירטואליות a4-highgpu-8g ו-a3-ultragpu-8g, מספר יחידות ה-GPU הוא 8.

    • DRIVER_VERSION: גרסת הדרייבר של NVIDIA להתקנה. אפשר להשתמש באחד מהערכים הבאים: default, latest או disabled.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור הצמתים. לדוגמה, משתמשים ב-a4-highgpu-8g למכונות וירטואליות מסוג A4 וב-a3-ultragpu-8g למכונות וירטואליות מסוג A3 Ultra.

    • NUM_NODES: מספר הצמתים במאגר הצמתים. עבור התחלה גמישה (Flex-start), הערך הזה צריך להיות 0.

    • TOTAL_MAX_NODES: המספר המקסימלי של הצמתים שניתן להרחבה אוטומטית עבור כל מאגר הצמתים.

    כדי להשתמש בהקצאת משאבים עם גמישות בהתחלה, צריך לכלול את הדגל --enable-queued-provisioning.

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

  3. מתחברים לאשכול כדי להריץ את הפקודות של kubectl בקטעים הבאים:

    gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

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

    • CLUSTER_NAME: השם של האשכול.
    • COMPUTE_REGION: השם של אזור ה-Compute.

    מידע נוסף זמין במאמר התקנה של kubectl והגדרת גישה לאשכול.

יצירת אובייקטים של רשת GKE

צריך להגדיר את רשתות ה-VPC שנוצרו בקטע הקודם באמצעות קבוצות של פרמטרים של רשת GKE. ספציפית, צריך להגדיר את כרטיס ה-NIC השני של Titanium (gVNIC) במצב NetDevice, ואת כל שמונת כרטיסי ה-NIC של CX-7 RDMA במצב RDMA.

הפקודה הזו משתמשת בשמות הבאים:

  • רשת ה-VPC של כרטיס הרשת (NIC) של CPU Titanium‏ (gVNIC) נקראת ${GVNIC_NETWORK_PREFIX}-net עם תת-רשת בשם ${GVNIC_NETWORK_PREFIX}-sub
  • רשת ה-VPC של כרטיסי ה-NIC מסוג CX-7 RDMA נקראת ${RDMA_NETWORK_PREFIX}-net עם רשתות משנה בשם ${RDMA_NETWORK_PREFIX}-sub-[0…7]

כדי ליצור את אובייקטי הרשת של GKE, מריצים את הפקודה הבאה:

kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: gvnic-1
spec:
  vpc: ${GVNIC_NETWORK_PREFIX}-net
  vpcSubnet: ${GVNIC_NETWORK_PREFIX}-sub
  deviceMode: NetDevice
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: gvnic-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: gvnic-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-0
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-0
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-0
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-0
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-1
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-1
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-2
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-2
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-2
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-2
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-3
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-3
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-3
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-3
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-4
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-4
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-4
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-4
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-5
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-5
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-5
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-5
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-6
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-6
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-6
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-6
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-7
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-7
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-7
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-7
EOF

התקנה של קובץ הבינארי RDMA והגדרה של NCCL

מחילים את DaemonSet הבא כדי להתקין את הקבצים הבינאריים של RDMA ואת ספריית NCCL בכל צומת. בכל מכונה וירטואלית בסיסית, קובצי ה-RDMA הבינאריים מותקנים בספרייה /home/kubernetes/bin/gib, וספריית ה-NCCL מותקנת בספרייה /home/kubernetes/bin/nvidia/lib64.

טייס אוטומטי

במצב GKE Autopilot, מריצים את הפקודה הבאה:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer-autopilot.yaml

רגילה

במצב GKE Standard, מריצים את הפקודה הבאה:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer.yaml

הרצת בדיקות NCCL

כדי לוודא שהאשכול שהוקצה פועל כמו שצריך, אפשר להריץ בדיקת NCCL. הוראות מפורטות זמינות במאמר בנושא פריסה והפעלה של בדיקת NCCL.

הגדרת מניפסטים של Pod ל-GPUDirect RDMA

כדי להריץ את עומסי העבודה באמצעות GPUDirect RDMA, צריך להגדיר את מניפסטים של ה-Pod לפי השלבים הבאים:

  1. מוסיפים את ההערות הבאות למטא-נתונים של ה-Pod.

    טייס אוטומטי

    משתמשים בהערה הבאה למצב GKE Autopilot:

    metadata:
    annotations:
      networking.gke.io/default-interface: 'eth0'
      networking.gke.io/interfaces: |
        [
          {"interfaceName":"eth0","network":"default"},
          {"interfaceName":"eth1","network":"gvnic-1"},
          {"interfaceName":"eth2","network":"rdma-0"},
          {"interfaceName":"eth3","network":"rdma-1"},
          {"interfaceName":"eth4","network":"rdma-2"},
          {"interfaceName":"eth5","network":"rdma-3"},
          {"interfaceName":"eth6","network":"rdma-4"},
          {"interfaceName":"eth7","network":"rdma-5"},
          {"interfaceName":"eth8","network":"rdma-6"},
          {"interfaceName":"eth9","network":"rdma-7"}
        ]
    

    רגילה

    ההערה הבאה למצב GKE Standard לא כוללת מפרט של gvnic-1, אבל אפשר להוסיף אותו אם עומסי העבודה שלכם דורשים זאת.

    משתמשים בהערה הבאה למצב GKE Standard:

    metadata:
    annotations:
      networking.gke.io/default-interface: 'eth0'
      networking.gke.io/interfaces: |
        [
          {"interfaceName":"eth0","network":"default"},
          {"interfaceName":"eth2","network":"rdma-0"},
          {"interfaceName":"eth3","network":"rdma-1"},
          {"interfaceName":"eth4","network":"rdma-2"},
          {"interfaceName":"eth5","network":"rdma-3"},
          {"interfaceName":"eth6","network":"rdma-4"},
          {"interfaceName":"eth7","network":"rdma-5"},
          {"interfaceName":"eth8","network":"rdma-6"},
          {"interfaceName":"eth9","network":"rdma-7"}
        ]
    
  2. מציינים את סוג ה-GPU שנבחר ואת ההזמנה הספציפית באמצעות בוררי צמתים:

    spec:
      nodeSelector:
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-affinity: "specific"
    

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

    • ACCELERATOR: המאיץ שהזמנתם בהזמנת הקיבולת של Compute Engine. חובה להשתמש באחד מהערכים הבאים:
      • nvidia-b200: NVIDIA B200 ‏ (180GB) למכונות וירטואליות מסוג A4
      • nvidia-h200-141gb: NVIDIA H200 ‏ (141GB) למכונות VM מסוג A3 Ultra
    • RESERVATION_NAME: השם של הזמנת הקיבולת ב-Compute Engine.

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

  3. מוסיפים את אמצעי האחסון הבאים למפרט של ה-Pod:

    spec:
      volumes:
        - name: library-dir-host
          hostPath:
            path: /home/kubernetes/bin/nvidia
        - name: gib
          hostPath:
            path: /home/kubernetes/bin/gib
    
  4. מוסיפים את המשאבים, משתני הסביבה וה-volume mounts הבאים לקונטיינר שמבקש יחידות GPU. הקונטיינר של עומס העבודה צריך לבקש את כל שמונת המעבדים הגרפיים:

    טייס אוטומטי

    במצב GKE Autopilot, מגדירים את המשאבים הבאים:

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
            readOnly: true
          - name: gib
            mountPath: /usr/local/gib
            readOnly: true
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 8
    

    רגילה

    במצב GKE Standard, מגדירים את המשאבים הבאים:

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
          - name: gib
            mountPath: /usr/local/gib
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 8
    
  5. מגדירים את כל משתני הסביבה הנדרשים כדי להגדיר את NCCL באמצעות סקריפט מעטפת הבא ממכולת עומס העבודה:

    source /usr/local/gib/scripts/set_nccl_env.sh
    

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

טייס אוטומטי

במצב GKE Autopilot, מניפסט Pod שהושלם צריך להיראות בערך כך:

apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"gvnic-1"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
        {"interfaceName":"eth6","network":"rdma-4"},
        {"interfaceName":"eth7","network":"rdma-5"},
        {"interfaceName":"eth8","network":"rdma-6"},
        {"interfaceName":"eth9","network":"rdma-7"}
      ]
spec:
  ...
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
          readOnly: true
        - name: gib
          mountPath: /usr/local/gib
          readOnly: true
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
          ...

רגילה

במצב GKE Standard, מניפסט Pod שהושלם צריך להיראות בערך כך:

apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
        {"interfaceName":"eth6","network":"rdma-4"},
        {"interfaceName":"eth7","network":"rdma-5"},
        {"interfaceName":"eth8","network":"rdma-6"},
        {"interfaceName":"eth9","network":"rdma-7"}
      ]
spec:
  ...
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
        - name: gib
          mountPath: /usr/local/gib
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
          ...

בדיקת ביצועי הרשת עבור אשכולות שמשתמשים ב-GPUDirect RDMA

מומלץ לאמת את הפונקציונליות של האשכולות שהוקצו. כדי לעשות זאת, משתמשים בבדיקות NCCL/gIB, שהן בדיקות של NVIDIA Collective Communications Library ‏ (NCCL) שעברו אופטימיזציה לסביבת Google.

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