יצירת מכונת A3 Mega,‏ A3 High או A3 Edge עם GPUDirect מופעל

במסמך הזה מתוארת ההגדרה של מכונות וירטואליות (VM) מסוג A3 Mega, ‏ A3 High או A3 Edge עם שמונה יחידות GPU מסוג NVIDIA H100 שמחוברות אליהן, שמשתמשות באחת מהטכנולוגיות הבאות של GPUDirect: ‏ GPUDirect-TCPX או GPUDirect-TCPXO. כדי ליצור מכונת A3 High עם פחות מ-8 מעבדי GPU, אפשר לעיין במאמר יצירת מכונת A3 High או A2.

הטכנולוגיה של GPUDirect שבה אתם משתמשים תלויה בסוג המכונה A3 שאתם בוחרים.

  • GPUDirect-TCPXO: הוא מחסנית רשת עם העברה למעבד, שדומה ל-RDMA, והוא נתמך בסוגי מכונות A3 Mega ‏ (a3-megagpu-8g) שיש להן שמונה GPUs מסוג H100.
  • GPUDirect-TCPX: גרסה אופטימלית של TCP לאורח שמספקת חביון נמוך יותר, והיא נתמכת בסוגי מכונות A3 High ‏ (a3-highgpu-8g) ו-A3 Edge ‏(a3-edgegpu-8g) עם שמונה יחידות GPU מסוג H100.

סדרת המכונות A3 שעברה אופטימיזציה להאצה כוללת 208 מעבדים וירטואליים (vCPU) ועד 1, 872GB של זיכרון. סוגי המכונות a3-megagpu-8g,‏ a3-highgpu-8g ו-a3-edgegpu-8g מציעים זיכרון GPU בנפח 80GB לכל GPU. סוגי המכונות האלה יכולים להגיע לרוחב פס של עד 1,800 Gbps ברשת, ולכן הם אידיאליים למודלים גדולים של שפה מבוססי-Transformer, למסדי נתונים ולמחשוב עתיר ביצועים (HPC).

הטכנולוגיות GPUDirect-TCPX ו-GPUDirect-TCPXO משתמשות בטכנולוגיית NVIDIA GPUDirect כדי לשפר את הביצועים ולהפחית את זמן האחזור במכונות הווירטואליות שלכם מסוג A3. הם עושים את זה על ידי העברה ישירה של נתוני מטען (payload) של חבילות נתונים מזיכרון ה-GPU לממשק הרשת, בלי לעבור דרך המעבד וזיכרון המערכת. זוהי צורה של גישה ישירה לזיכרון מרחוק (RDMA). בשילוב עם Google Virtual NIC‏ (gVNIC), מכונות וירטואליות מסוג A3 יכולות לספק את התפוקה הכי גבוהה בין מכונות וירטואליות באותו אשכול, בהשוואה לדור הקודם של מכונות מסוג A2 או G2 שעברו אופטימיזציה להאצה.

במאמר הזה מוסבר איך ליצור מכונה וירטואלית (VM) מסוג A3 Mega, ‏ A3 High או A3 Edge, ואיך להפעיל את GPUDirect-TCPX או GPUDirect-TCPXO כדי לבדוק את הביצועים המשופרים של רשת ה-GPU.

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

  • כדי לעיין במגבלות ובשלבי הכנה נוספים ליצירת מכונות עם GPU מצורף, כמו בחירת תמונת מערכת הפעלה ובדיקת מכסת ה-GPU, אפשר לעיין במאמר סקירה כללית על יצירת מכונה עם GPU מצורף.
  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Cloud de Confiance by S3NS . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:
    1. התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם. אחרי שנכנסתם לחשבון, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init
    2. הגדרת אזור ותחום כברירת מחדל

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

כדי לקבל את ההרשאות שנדרשות ליצירת מכונות וירטואליות, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד אדמין מכונות של Compute ‏ (v1) (roles/compute.instanceAdmin.v1) בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

ההרשאות הנדרשות

כדי ליצור מכונות וירטואליות, צריך את ההרשאות הבאות:

  • compute.instances.create בפרויקט
  • כדי להשתמש באימג' בהתאמה אישית ליצירת המכונה הווירטואלית (VM)‏: ‫compute.images.useReadOnly בקובץ אימג'
  • כדי להשתמש ב-snapshot ליצירת המכונה הווירטואלית: ‫compute.snapshots.useReadOnly בקובץ snapshot
  • כדי להשתמש בתבנית של הגדרות מכונה ליצירת המכונה הווירטואלית: compute.instanceTemplates.useReadOnly בתבנית של הגדרות המכונה
  • כדי לציין רשת משנה למכונה הווירטואלית: ‫compute.subnetworks.use בפרויקט או ברשת המשנה שנבחרה
  • כדי לציין כתובת IP סטטית למכונה הווירטואלית: ‫compute.addresses.use בפרויקט
  • כדי להקצות כתובת IP חיצונית למכונה הווירטואלית כשמשתמשים ברשת VPC: ‫compute.subnetworks.useExternalIp בפרויקט או ברשת המשנה שנבחרה
  • כדי להקצות רשת מדור קודם למכונה הווירטואלית: ‫compute.networks.use בפרויקט
  • כדי להקצות כתובת IP חיצונית למכונה הווירטואלית כשמשתמשים ברשת מדור קודם: ‫compute.networks.useExternalIp בפרויקט
  • כדי להגדיר מטא-נתונים של המכונה הווירטואלית: ‫compute.instances.setMetadata בפרויקט
  • כדי להגדיר תגים למכונה הווירטואלית: ‫compute.instances.setTags במכונה הווירטואלית
  • כדי להגדיר תוויות למכונה הווירטואלית: ‫compute.instances.setLabels במכונה הווירטואלית
  • כדי להגדיר חשבון שירות לשימוש של המכונה הווירטואלית: ‫compute.instances.setServiceAccount במכונה הווירטואלית
  • כדי ליצור דיסק חדש למכונה הווירטואלית: ‫compute.disks.create בפרויקט
  • כדי לצרף דיסק קיים במצב קריאה-בלבד או במצב קריאה וכתיבה: ‫compute.disks.use בדיסק
  • כדי לצרף דיסק קיים במצב קריאה-בלבד: ‫compute.disks.useReadOnly בדיסק

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

סקירה כללית

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

  1. הגדרה של רשת אחת או יותר של ענן וירטואלי פרטי (VPC) עם MTU גדול.
  2. יוצרים את מכונת ה-GPU.

הגדרת רשתות VPC

כדי לאפשר תקשורת יעילה בין מכונות וירטואליות של GPU, צריך ליצור רשת ניהול ורשת נתונים אחת או יותר. הרשת לניהול משמשת לגישה חיצונית, למשל SSH, ולרוב התקשורת הכללית ברשת. רשתות הנתונים משמשות לתקשורת עם ביצועים גבוהים בין מעבדי ה-GPU במכונות וירטואליות שונות, למשל לתנועה של Remote Direct Memory Access ‏ (RDMA).

ברשתות VPC האלה, מומלץ להגדיר ערך גדול יותר ליחידת השידור המקסימלית (MTU). ערכי MTU גבוהים יותר מגדילים את גודל החבילה ומקטינים את התקורה של כותרת החבילה, וכך מגדילים את קצב העברת הנתונים של המטען הייעודי. מידע נוסף על יצירת רשתות VPC זמין במאמר יצירה ואימות של רשת MTU עם מסגרת ג'מבו.

יצירת רשת ניהול, רשת משנה וכלל לחומת האש

כדי להגדיר את רשת הניהול:

  1. יוצרים את רשת הניהול באמצעות הפקודה networks create:

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
        --project=PROJECT_ID \
        --subnet-mode=custom \
        --mtu=8244
    
  2. יוצרים את רשת המשנה לניהול באמצעות הפקודה networks subnets create:

    gcloud compute networks subnets create NETWORK_NAME_PREFIX-mgmt-sub \
        --project=PROJECT_ID \
        --network=NETWORK_NAME_PREFIX-mgmt-net \
        --region=REGION \
        --range=192.168.0.0/24
    
  3. יוצרים כללים לחומת האש באמצעות הפקודה firewall-rules create.

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

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-internal \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=tcp:0-65535,udp:0-65535,icmp \
          --source-ranges=192.168.0.0/16
      
    2. יוצרים את כלל חומת האש tcp:22 כדי להגביל את כתובות ה-IP של המקור שיכולות להתחבר למכונה הווירטואלית באמצעות SSH.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ssh \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=tcp:22 \
          --source-ranges=SSH_SOURCE_IP_RANGE
      
    3. יוצרים את כלל חומת האש icmp שאפשר להשתמש בו כדי לבדוק בעיות בהעברת נתונים ברשת.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ping \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=icmp \
          --source-ranges=0.0.0.0/0
      

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

  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ולרשתות המשנה של ה-VPC.
  • PROJECT_ID : מזהה הפרויקט.
  • REGION: האזור שבו רוצים ליצור את הרשתות.
  • SSH_SOURCE_IP_RANGE: טווח כתובות IP בפורמט CIDR. ההגדרה הזו מציינת אילו כתובות IP של מקור יכולות להתחבר למכונה הווירטואלית באמצעות SSH.

יצירת רשתות נתונים, רשתות משנה וכלל לחומת האש

מספר רשתות הנתונים משתנה בהתאם לסוג מכונת ה-GPU שאתם יוצרים.

A3 Mega

ל-A3 Mega נדרשות שמונה רשתות נתונים. כדי ליצור שמונה רשתות נתונים, שלכל אחת מהן יש רשתות משנה וכללי חומת אש, משתמשים בפקודה הבאה.

for N in $(seq 1 8); do
gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
    --project=PROJECT_ID \
    --subnet-mode=custom \
    --mtu=8244

gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --region=REGION \
    --range=192.168.$N.0/24

gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=192.168.0.0/16
done

‫A3 High ו-A3 Edge

מכשירי A3 High ו-A3 Edge דורשים ארבע רשתות נתונים. כדי ליצור ארבע רשתות נתונים, שלכל אחת מהן יש רשתות משנה וכללי חומת אש, משתמשים בפקודה הבאה:

for N in $(seq 1 4); do
gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
    --project=PROJECT_ID \
    --subnet-mode=custom \
    --mtu=8244

gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --region=REGION \
    --range=192.168.$N.0/24

gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=192.168.0.0/16
done

יצירת מכונות A3 Mega ‏ (GPUDirect-TCPXO)

יוצרים את מכונות A3 Mega באמצעות קובץ האימג' של מערכת הפעלה שמותאמת לקונטיינרים cos-121-lts ואילך או קובץ האימג' של Rocky Linux‏ rocky-linux-8-optimized-gcp-nvidia-580.

COS

כדי לבדוק את ביצועי הרשת באמצעות GPUDirect-TCPXO, צריך ליצור לפחות שתי מכונות וירטואליות מסוג A3 Mega. יוצרים כל מכונה וירטואלית באמצעות קובץ אימג' של מערכת הפעלה שמותאמת לקונטיינרים מגרסה cos-121-lts ואילך, ומציינים את רשתות ה-VPC שיצרתם בשלב הקודם.

מכונות וירטואליות מסוג A3 Mega דורשות תשעה ממשקי רשת של Google Virtual NIC ‏ (gVNIC), אחד לרשת הניהול ושמונה לרשתות הנתונים.

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

רגילה

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ה-VPC ולרשתות המשנה.

אם רוצים להחיל מדיניות מיקום על מכונה וירטואלית, משתמשים באותה פקודה עם הדגל --resource-policies. אפשר ליצור את המכונה הווירטואלית רק באותו אזור שבו מוגדרת מדיניות המיקום.

כרטיס Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם לשימוש ברשתות ה-VPC וברשתות המשנה.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית (VM) כשהיא מפסיקה לפני הזמן. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE

Flex-start

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם לשימוש ברשתות ה-VPC וברשתות המשנה.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית בסיום משך ההפעלה שלה. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE
  • RUN_DURATION: הזמן המקסימלי שהמכונה הווירטואלית פועלת לפני ש-Compute Engine מפסיק את הפעילות שלה או מוחק אותה. הערך צריך להיות בפורמט של מספר הימים, השעות, הדקות או השניות, ואחריו d, h, m ו-s בהתאמה. לדוגמה, הערך 30m מגדיר זמן של 30 דקות, והערך 1h2m3s מגדיר זמן של שעה, שתי דקות ושלוש שניות. אפשר לציין ערך בין 10 דקות לבין שבעה ימים.
  • VALID_FOR_DURATION`: הזמן המקסימלי להמתנה להקצאת המשאבים המבוקשים. הערך צריך להיות בפורמט של מספר הימים, השעות, הדקות או השניות, ואחריו d, h, m ו-s בהתאמה. בהתאם לדרישות האזוריות של עומס העבודה, מציינים את אחד משני משכי הזמן הבאים כדי להגדיל את הסיכוי שהבקשה ליצירת מכונה וירטואלית תצליח:
    • אם עומס העבודה מחייב אתכם ליצור את המכונה הווירטואלית באזור ספציפי, אתם צריכים לציין משך זמן בין 90 שניות (90s) לשעתיים (2h). משך זמן ארוך יותר מגדיל את הסיכויים לקבל משאבים.
    • אם המכונה הווירטואלית יכולה לפעול בכל תחום באזור, צריך לציין משך של אפס שניות (0s). הערך הזה מציין ש-Compute Engine יקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, צריך לנסות שוב את הבקשה באזור אחר.

אם רוצים להחיל מדיניות מיקום קומפקטית על המכונה הווירטואלית כדי לצמצם את זמן האחזור ברשת בין מכונות וירטואליות, משתמשים באותה פקודה עם הדגל --resource-policies=RESOURCE_POLICY_NAME.

הזמנה בלבד

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם לשימוש ברשתות ה-VPC וברשתות המשנה.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית בסיום תקופת ההזמנה. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE
  • RESERVATION_URL: כתובת ה-URL של ההזמנה שרוצים להשתמש בה. מציינים אחד מהערכים הבאים:

התקנת דרייברים של GPU

בכל מכונה וירטואלית של A3 Mega, מתקינים את מנהלי ההתקנים (דרייברים) של ה-GPU.

  1. מתקינים את הדרייברים של NVIDIA GPU.

    sudo cos-extensions install gpu -- --version=latest
    
  2. מבצעים טעינה מחדש של הנתיב.

    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    

נותנים לכרטיסי ה-NIC גישה למעבדי ה-GPU

בכל מכונה וירטואלית מסוג A3 Mega, נותנים לכרטיסי ה-NIC גישה ליחידות ה-GPU.

  1. משנים את הגדרות חומת האש כך שיקבלו את כל חיבורי ה-TCP הנכנסים ויאפשרו תקשורת בין הצמתים באשכול:
    sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
  2. מגדירים את המודול dmabuf. טוענים את המודול import-helper, שהוא חלק ממסגרת dmabuf. המסגרת הזו מאפשרת שיתוף זיכרון במהירות גבוהה, ללא העתקה, בין ה-GPU לבין כרטיס הרשת (NIC), שהוא רכיב חיוני בטכנולוגיית GPUDirect:
    sudo modprobe import-helper
  3. מגדירים את Docker לאימות בקשות ל-Artifact Registry.
    docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  4. מפעילים את RxDM בקונטיינר. ‫RxDM הוא שירות ניהול שפועל לצד אפליקציית ה-GPU כדי לנהל את זיכרון ה-GPU. השירות הזה מקצה מראש זיכרון GPU ומנהל אותו עבור תעבורת רשת נכנסת. זהו רכיב מרכזי בטכנולוגיית GPUDirect, והוא חיוני לרשתות עם ביצועים גבוהים. מפעילים קונטיינר Docker בשם rxdm:
    docker run --pull=always --rm --detach --name rxdm \
        --network=host  --cap-add=NET_ADMIN  \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.21 \
        --num_hops=2 --num_nics=8

    כדי לוודא ש-RxDM הופעל בהצלחה, מריצים את הפקודה. צריך להמתין להודעה Buffer manager initialization complete (האתחול של מנהל המאגר הושלם) כדי לוודא שהאתחול RxDMהצליח.

    docker container logs --follow  rxdm

    אפשרות אחרת היא לבדוק את RxDMיומן השלמת האתחול.

    docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"

הגדרת סביבת NCCL

בכל מכונת A3 Mega וירטואלית, מבצעים את השלבים הבאים:

  1. מתקינים את ספריית nccl-net, פלאגין ל-NCCL שמאפשר תקשורת GPUDirect ברשת. הפקודה הבאה מושכת את תמונת מנהל ההתקנה ומתקינה את קובצי הספרייה הנדרשים ב-/var/lib/tcpxo/lib64/.
    NCCL_NET_IMAGE="us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.15"
    
    docker run --pull=always --rm --privileged \
        --network=host --cap-add=NET_ADMIN \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib:/var/lib \
        --device /dev/nvidia0:/dev/nvidia0   \
        --device /dev/nvidia1:/dev/nvidia1  \
        --device /dev/nvidia2:/dev/nvidia2  \
        --device /dev/nvidia3:/dev/nvidia3  \
        --device /dev/nvidia4:/dev/nvidia4  \
        --device /dev/nvidia5:/dev/nvidia5  \
        --device /dev/nvidia6:/dev/nvidia6  \
        --device /dev/nvidia7:/dev/nvidia7  \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm  \
        --device /dev/nvidiactl:/dev/nvidiactl  \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper  \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} install  --install-nccl
    
    sudo mount --bind /var/lib/tcpxo /var/lib/tcpxo && sudo mount -o remount,exec /var/lib/tcpxo
    
  2. מפעילים קונטיינר ייעודי nccl-tests לבדיקות NCCL. הקונטיינר הזה מוגדר מראש עם הכלים והסקריפטים הנדרשים, כדי לספק סביבה נקייה ועקבית לאימות הביצועים של הגדרת GPUDirect.

    הפקודה הזו משתמשת מחדש במשתנה NCCL_NET_IMAGE שהגדרתם בשלב הקודם.

    docker run --pull=always --rm --detach --name nccl \
        --network=host --cap-add=NET_ADMIN \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib/tcpxo:/var/lib/tcpxo \
        --shm-size=8g \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} daemon

הרצת בנצ'מרק של nccl-tests

כדי להריץ את מדד הביצועים nccl-tests במכונה וירטואלית אחת מסוג A3 Mega, מבצעים את השלבים הבאים:

  1. פותחים מעטפת bash אינטראקטיבית בתוך מאגר nccl-tests.
    docker exec -it nccl bash

    מתוך מעטפת ה-Bash של מאגר התגים nccl-tests, מבצעים את השלבים הבאים.

    1. מגדירים את הסביבה להרצה של כמה צמתים על ידי הגדרת SSH ויצירת קובצי מארחים. מחליפים את VM_NAME_1 ואת VM_NAME_2 בשמות של כל מכונה וירטואלית.
      /scripts/init_ssh.sh VM_NAME_1 VM_NAME_2
      /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
        

      הפעולה הזו יוצרת ספרייה בשם /scripts/hostfiles2.

    2. מריצים את all_gather_perfההשוואה לשוק כדי למדוד את הביצועים הכוללים של התקשורת:
      /scripts/run-nccl-tcpxo.sh all_gather_perf "${LD_LIBRARY_PATH}" 8 eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8 1M 512M 3 2 10 8 2 10

בני

כדי לבדוק את ביצועי הרשת באמצעות GPUDirect-TCPXO, צריך ליצור לפחות שתי מכונות וירטואליות מסוג A3 Mega. יוצרים כל מכונה וירטואלית באמצעות תמונה של Rocky Linux בגרסה rocky-linux-8-optimized-gcp-nvidia-580 ואילך, ומציינים את רשתות ה-VPC שיצרתם בשלב הקודם.

מכונות וירטואליות מסוג A3 Mega דורשות תשעה ממשקי רשת של Google Virtual NIC ‏ (gVNIC), אחד לרשת הניהול ושמונה לרשתות הנתונים.

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

רגילה

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ה-VPC ולרשתות המשנה.

אם רוצים להחיל מדיניות מיקום על המכונה הוירטואלית, משתמשים באותה פקודה עם הדגל --resource-policies. אפשר ליצור את המכונה הווירטואלית רק באותו אזור שבו מוגדרת מדיניות המיקום.

כרטיס Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם לשימוש ברשתות ה-VPC וברשתות המשנה.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית (VM) כשהיא מפסיקה לפני הזמן. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE

Flex-start

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם לשימוש ברשתות ה-VPC וברשתות המשנה.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית בסיום משך ההפעלה שלה. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE
  • RUN_DURATION: הזמן המקסימלי שהמכונה הווירטואלית פועלת לפני ש-Compute Engine מפסיק את הפעילות שלה או מוחק אותה. הערך צריך להיות בפורמט של מספר הימים, השעות, הדקות או השניות, ואחריו d, h, m ו-s בהתאמה. לדוגמה, הערך 30m מגדיר זמן של 30 דקות, והערך 1h2m3s מגדיר זמן של שעה, שתי דקות ושלוש שניות. אפשר לציין ערך בין 10 דקות לבין שבעה ימים.
  • VALID_FOR_DURATION: הזמן המקסימלי להמתנה להקצאת המשאבים המבוקשים. הערך צריך להיות בפורמט של מספר הימים, השעות, הדקות או השניות, ואחריו d, h, m ו-s בהתאמה. בהתאם לדרישות האזוריות של עומס העבודה, מציינים את אחד מהמשכים הבאים כדי להגדיל את הסיכויים לכך שבקשת יצירת ה-VM תצליח:
    • אם עומס העבודה מחייב אתכם ליצור את המכונה הווירטואלית באזור ספציפי, אתם צריכים לציין משך זמן בין 90 שניות (90s) לשעתיים (2h). משך זמן ארוך יותר מגדיל את הסיכויים לקבל משאבים.
    • אם המכונה הווירטואלית יכולה לפעול בכל תחום באזור, צריך לציין משך של אפס שניות (0s). הערך הזה מציין ש-Compute Engine יקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, צריך לנסות שוב את הבקשה באזור אחר.

אם רוצים להחיל מדיניות מיקום קומפקטית על המכונה הווירטואלית כדי לצמצם את זמן האחזור ברשת בין מכונות וירטואליות, משתמשים באותה פקודה עם הדגל --resource-policies=RESOURCE_POLICY_NAME.

הזמנה בלבד

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

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

  • VM_NAME: השם של מופע ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם לשימוש ברשתות ה-VPC וברשתות המשנה.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית בסיום תקופת ההזמנה. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE
  • RESERVATION_URL: כתובת ה-URL של ההזמנה שרוצים להשתמש בה. מציינים אחד מהערכים הבאים:

נותנים לכרטיסי ה-NIC גישה למעבדי ה-GPU

בכל מכונה וירטואלית מסוג A3 Mega, נותנים לכרטיסי ה-NIC גישה ליחידות ה-GPU.

  1. מתקינים את חבילות הדרישות המוקדמות עבור המודול dmabuf:
    sudo dnf -y install epel-release kernel-devel-$(uname -r) git
    sudo dnf -y install dkms
      
  2. מתקינים וטוענים את המודול import-helper, שהוא חלק מהמסגרת dmabuf. המסגרת הזו מאפשרת שיתוף זיכרון במהירות גבוהה, ללא העתקה, בין ה-GPU לבין כרטיס הרשת (NIC), שהוא רכיב חיוני בטכנולוגיית GPUDirect:
    sudo git clone https://github.com/google/dmabuf_importer_helper.git /usr/src/import_helper-1.0
    sudo dkms install import_helper/1.0
    sudo modprobe import_helper
      
  3. מתקינים ומגדירים את Docker כדי לאמת בקשות ל-Artifact Registry.
    sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
    sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    sudo systemctl --now enable docker
    sudo usermod -a -G docker $(whoami)
    curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
      sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
    export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
    sudo dnf install -y \
          nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}
    sudo nvidia-ctk runtime configure --runtime=docker
    sudo systemctl restart docker
    gcloud auth configure-docker us-docker.pkg.dev
      

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

  4. מפעילים את RxDM בקונטיינר. ‫RxDM הוא שירות ניהול שפועל לצד אפליקציית ה-GPU כדי לנהל את זיכרון ה-GPU. השירות הזה מקצה מראש זיכרון GPU ומנהל אותו בשביל תעבורת רשת נכנסת. זהו רכיב מרכזי בטכנולוגיית GPUDirect וחיוני לרשתות עם ביצועים גבוהים. מפעילים קונטיינר Docker בשם rxdm:
    docker run --pull=always --rm --detach --name rxdm \
        --network=host  --cap-add=NET_ADMIN  \
        --gpus all \
        --privileged \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/lib64  \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.21 \
        --num_hops=2 --nic_metric_directory=/tmp

    כדי לוודא ש-RxDM הופעל בהצלחה, מריצים את הפקודה הבאה. מחכים להודעה 'Buffer manager initialization complete' (האתחול של מנהל המאגר הושלם) כדי לוודא שRxDMהאתחול הושלם בהצלחה.

    docker container logs --follow  rxdm

    אפשרות אחרת היא לבדוק את RxDMיומן השלמת האתחול.

    docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"

הגדרת סביבת NCCL

בכל מכונת A3 Mega וירטואלית, מבצעים את השלבים הבאים:

  1. מתקינים את ספריית nccl-net, פלאגין ל-NCCL שמאפשר תקשורת GPUDirect ברשת. הפקודה הבאה מושכת את תמונת מנהל ההתקנה ומתקינה את קובצי הספרייה הנדרשים ב-/var/lib/tcpxo/lib64/.
    NCCL_NET_IMAGE="us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.15"
    
    docker run --pull=always --rm --privileged \
        --network=host --cap-add=NET_ADMIN \
        --volume /var/lib:/var/lib \
        --env LD_LIBRARY_PATH=/usr/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} install  --install-nccl
    
    sudo mount --bind /var/lib/tcpxo /var/lib/tcpxo && sudo mount -o remount,exec /var/lib/tcpxo
    
  2. מגדירים את הדגלים של תושבת הצמצם.
    aperture_mount_flags="";
    while IFS= read -r line; do
        BDF=$( echo "$line" | awk '{print $1}' );
        host_aperture_device="/sys/bus/pci/devices/$BDF"
        # replace '/sys/bus/pci/devices' with '/dev/aperture_devices'
        container_aperture_device="${host_aperture_device/\/sys\/bus\/pci\/devices/\/dev\/aperture_devices}";
        aperture_mount_flags+="--mount type=bind,src=${host_aperture_device},target=${container_aperture_device} ";
    done < <(lspci -nn -D | grep '1ae0:0084')
    
  3. מפעילים קונטיינר ייעודי nccl-tests לבדיקות NCCL. הקונטיינר הזה מוגדר מראש עם הכלים והסקריפטים הנדרשים, כדי לספק סביבה נקייה ועקבית לאימות הביצועים של הגדרת GPUDirect.

    הפקודה הזו משתמשת מחדש במשתנה NCCL_NET_IMAGE שהגדרתם בשלב הקודם.

    docker run --pull=always --rm --detach --name nccl \
        --network=host --cap-add=NET_ADMIN \
        --privileged \
        --volume /var/lib/:/var/lib  \
        --shm-size=8g \
        --gpus all \
        $aperture_mount_flags \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} daemon

הרצת בנצ'מרק של nccl-tests

כדי להריץ את מדד הביצועים nccl-tests במכונה וירטואלית אחת מסוג A3 Mega, מבצעים את השלבים הבאים:

  1. פותחים מעטפת bash אינטראקטיבית בתוך מאגר nccl-tests.
    docker exec -it nccl bash

    מתוך מעטפת ה-Bash של מאגר התגים nccl-tests, מבצעים את השלבים הבאים.

    1. מגדירים את הסביבה להרצה של כמה צמתים על ידי הגדרת SSH ויצירת קובצי מארחים. מחליפים את VM_NAME_1 ואת VM_NAME_2 בשמות של כל מכונה וירטואלית.
      /scripts/init_ssh.sh VM_NAME_1 VM_NAME_2
      /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
        

      הפעולה הזו יוצרת ספרייה בשם /scripts/hostfiles2.

    2. מריצים את all_gather_perfההשוואה לשוק כדי למדוד את הביצועים הכוללים של התקשורת:
      /scripts/run-nccl-tcpxo.sh all_gather_perf "${LD_LIBRARY_PATH}" 8 enp134s0,enp135s0,enp13s0,enp14s0,enp141s0,enp142s0,enp6s0,enp7s0 1M 8G 3 2 10 8 2 10 enp0s12

יצירת מכונות A3 High ומכונות Edge ‏ (GPUDirect-TCPX)

כדי ליצור את מופעי A3 High ו-Edge, צריך להשתמש בתמונת מערכת הפעלה שמותאמת לקונטיינרים (Container-Optimized OS) מגרסה cos-121-lts ואילך.

COS

כדי לבדוק את ביצועי הרשת באמצעות GPUDirect-TCPX, צריך ליצור לפחות שני מכונות וירטואליות מסוג A3 High או Edge. יוצרים כל מכונה וירטואלית באמצעות תמונת מערכת הפעלה שמותאמת לקונטיינרים בגרסה cos-121-lts ואילך, ומציינים את רשתות ה-VPC שיצרתם בשלב הקודם.

המכונות הווירטואליות צריכות להשתמש בממשק הרשת של Google Virtual NIC ‏ (gVNIC). במכונות וירטואליות מסוג A3 High או Edge, צריך להשתמש במנהל התקן gVNIC מגרסה 1.4.0rc3 ואילך. גרסת הדרייבר הזו זמינה במערכת ההפעלה שמותאמת לקונטיינרים. כרטיס ה-NIC הווירטואלי הראשון משמש ככרטיס ה-NIC הראשי לרשת ולאחסון באופן כללי. ארבעת כרטיסי ה-NIC הווירטואליים האחרים מיושרים ל-NUMA עם שניים מתוך שמונת כרטיסי ה-GPU באותו מתג PCIe.

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

רגילה

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address

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

  • VM_NAME: השם של ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • MACHINE_TYPE: סוג המכונה של ה-VM. צריך לציין a3-highgpu-8g או a3-edgegpu-8g.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ה-VPC ולתת-הרשתות.

אם רוצים להחיל מדיניות מיקום על המכונה הוירטואלית, משתמשים באותה פקודה עם הדגל --resource-policies. אפשר ליצור את המכונה הווירטואלית רק באותו אזור שבו מוגדרת מדיניות המיקום.

כרטיס Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

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

  • VM_NAME: השם של ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • MACHINE_TYPE: סוג המכונה של ה-VM. צריך לציין a3-highgpu-8g או a3-edgegpu-8g.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ה-VPC ולתת-הרשתות.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית (VM) כשהיא מפסיקה לפני הזמן. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE

Flex-start

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

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

  • VM_NAME: השם של ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • MACHINE_TYPE: סוג המכונה של ה-VM. צריך לציין a3-highgpu-8g או a3-edgegpu-8g.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ה-VPC ולתת-הרשתות.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית בסיום משך ההפעלה שלה. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE
  • RUN_DURATION: הזמן המקסימלי שהמכונה הווירטואלית פועלת לפני ש-Compute Engine מפסיק את הפעילות שלה או מוחק אותה. הערך צריך להיות בפורמט של מספר הימים, השעות, הדקות או השניות, ואחריו d, h, m ו-s בהתאמה. לדוגמה, הערך 30m מגדיר זמן של 30 דקות, והערך 1h2m3s מגדיר זמן של שעה, שתי דקות ושלוש שניות. אפשר לציין ערך בין 10 דקות לבין שבעה ימים.
  • VALID_FOR_DURATION: הזמן המקסימלי להמתנה להקצאת המשאבים המבוקשים. הערך צריך להיות בפורמט של מספר הימים, השעות, הדקות או השניות, ואחריו d, h, m ו-s בהתאמה. בהתאם לדרישות האזוריות של עומס העבודה, מציינים את אחד מהמשכים הבאים כדי להגדיל את הסיכויים לכך שבקשת יצירת ה-VM תצליח:
    • אם עומס העבודה מחייב אתכם ליצור את המכונה הווירטואלית באזור ספציפי, אתם צריכים לציין משך זמן בין 90 שניות (90s) לשעתיים (2h). משך זמן ארוך יותר מגדיל את הסיכויים לקבל משאבים.
    • אם המכונה הווירטואלית יכולה לפעול בכל תחום באזור, צריך לציין משך של אפס שניות (0s). הערך הזה מציין ש-Compute Engine יקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, צריך לנסות שוב את הבקשה באזור אחר.

אם רוצים להחיל מדיניות מיקום קומפקטית על המכונה הווירטואלית כדי לצמצם את זמן האחזור ברשת בין מכונות וירטואליות, משתמשים באותה פקודה עם הדגל --resource-policies=RESOURCE_POLICY_NAME.

הזמנה בלבד

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

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

  • VM_NAME: השם של ה-VM.
  • PROJECT_ID: מזהה הפרויקט.
  • ZONE: אזור שתומך בסוג המכונה.
  • MACHINE_TYPE: סוג המכונה של ה-VM. צריך לציין a3-highgpu-8g או a3-edgegpu-8g.
  • BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB. לדוגמה: 50.
  • NETWORK_NAME_PREFIX: תחילית השם שתשמש לרשתות ה-VPC ולתת-הרשתות.
  • TERMINATION_ACTION: האם לעצור או למחוק את המכונה הווירטואלית בסיום תקופת ההזמנה. מציינים אחד מהערכים הבאים:
    • כדי לעצור את המכונה הווירטואלית: STOP
    • כדי למחוק את המכונה הווירטואלית: DELETE
  • RESERVATION_URL: כתובת ה-URL של ההזמנה שרוצים להשתמש בה. מציינים אחד מהערכים הבאים:

התקנת דרייברים של GPU

בכל מכונת A3 High או Edge VM, מבצעים את השלבים הבאים.

  1. מריצים את הפקודה הבאה כדי להתקין את מנהלי ההתקנים (דרייברים) של NVIDIA GPU:
    sudo cos-extensions install gpu -- --version=latest
  2. מריצים את הפקודה הבאה כדי להרכיב מחדש את הנתיב:
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia

נותנים לכרטיסי ה-NIC גישה למעבדי ה-GPU

בכל מכונה וירטואלית מסוג A3 High או Edge, צריך לתת לכרטיסי ה-NIC גישה ליחידות ה-GPU. לשם כך, מבצעים את השלבים הבאים:

  1. מגדירים את ה-Registry.
    • אם אתם משתמשים ב-Container Registry, מריצים את הפקודה הבאה:
      docker-credential-gcr configure-docker
    • אם אתם משתמשים ב-Artifact Registry, מריצים את הפקודה הבאה:
      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  2. הגדרת המנהל של נתיב קבלת הנתונים. שירות ניהול, GPUDirect-TCPX Receive Data Path Manager, צריך לפעול לצד האפליקציות שמשתמשות ב-GPUDirect-TCPX. כדי להפעיל את השירות בכל מכונה וירטואלית של מערכת הפעלה שמותאמת לקונטיינרים, מריצים את הפקודה הבאה:
    docker run --pull=always --rm \
        --name receive-datapath-manager \
        --detach \
        --privileged \
        --cap-add=NET_ADMIN --network=host \
        --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        --volume /run/tcpx:/run/tcpx \
        --entrypoint /tcpgpudmarxd/build/app/tcpgpudmarxd \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd \
        --gpu_nic_preset a3vm --gpu_shmem_type fd --uds_path "/run/tcpx" --setup_param "--verbose 128 2 0"
       
  3. מוודאים שהמאגר receive-datapath-manager הופעל.
    docker container logs --follow receive-datapath-manager

    הפלט אמור להיראות כך:

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
  4. כדי להפסיק את הצגת היומנים, לוחצים על ctrl-c.
  5. מתקינים כללים בטבלת ה-IP.
    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
  6. מגדירים את NVIDIA Collective Communications Library‏ (NCCL) ואת הפלאגין GPUDirect-TCPX.

    כדי להשתמש ב-NCCL עם GPUDirect-TCPX, צריך גרסה ספציפית של ספריית NCCL ושילוב בינארי של תוסף GPUDirect-TCPX. Cloud de Confiance by S3NS סיפקה חבילות שעומדות בדרישה הזו.

    כדי להתקין את חבילת Cloud de Confiance by S3NS , מריצים את הפקודה הבאה:

    docker run --rm -v /var/lib:/var/lib us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx install --install-nccl
    sudo mount --bind /var/lib/tcpx /var/lib/tcpx
    sudo mount -o remount,exec /var/lib/tcpx

    אם הפקודה הזו מסתיימת ללא שגיאות, הקבצים libnccl-net.so ו-libnccl.so ממוקמים בספרייה /var/lib/tcpx/lib64.

הרצת בדיקות

בכל מכונה וירטואלית מסוג A3 High או Edge, מריצים בדיקת NCCL על ידי ביצוע השלבים הבאים:

  1. מפעילים את הקונטיינר.
    #!/bin/bash
    
    function run_tcpx_container() {
    docker run \
       -u 0 --network=host \
       --cap-add=IPC_LOCK \
       --userns=host \
       --volume /run/tcpx:/tmp \
       --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
       --volume /var/lib/tcpx/lib64:/usr/local/tcpx/lib64 \
       --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
       --device /dev/nvidia0:/dev/nvidia0 \
       --device /dev/nvidia1:/dev/nvidia1 \
       --device /dev/nvidia2:/dev/nvidia2 \
       --device /dev/nvidia3:/dev/nvidia3 \
       --device /dev/nvidia4:/dev/nvidia4 \
       --device /dev/nvidia5:/dev/nvidia5 \
       --device /dev/nvidia6:/dev/nvidia6 \
       --device /dev/nvidia7:/dev/nvidia7 \
       --device /dev/nvidia-uvm:/dev/nvidia-uvm \
       --device /dev/nvidiactl:/dev/nvidiactl \
       --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/local/tcpx/lib64 \
       "$@"
    }
    

    הפקודה מבצעת את הפעולות הבאות:

    • מבצעת Mount למכשירי NVIDIA מ-/dev לתוך הקונטיינר
    • הגדרת מרחב שמות ברשת של המאגר למארח
    • הגדרה של מרחב שמות המשתמש של הקונטיינר למארח
    • הוספת CAP_IPC_LOCK ליכולות של מאגר התגים
    • התקנת /tmp של המארח ב-/tmp של הקונטיינר
    • מטעינים את נתיב ההתקנה של NCCL ואת הפלאגין GPUDirect-TCPX NCCL לקונטיינר ומוסיפים את הנתיב הטעון ל-LD_LIBRARY_PATH
  2. אחרי שמפעילים את הקונטיינר, אפשר להפעיל אפליקציות שמשתמשות ב-NCCL מתוך הקונטיינר. לדוגמה, כדי להריץ את הבדיקה run-allgather:
    1. בכל מכונה וירטואלית מסוג A3 High או Edge, מריצים את הפקודה הבאה:
      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
    2. במכונת VM אחת, מריצים את הפקודות הבאות:
      1. מגדירים את החיבור בין מכונות ה-VM. מחליפים את VM-0 ואת VM-1 בשמות של כל מכונה וירטואלית.
        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd

        הפעולה הזו יוצרת ספרייה /scripts/hostfiles2 בכל מכונה וירטואלית.

      2. מריצים את הסקריפט.
        /scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2

    הרצת הסקריפט run-allgather נמשכת כשתי דקות. בסוף היומנים, אתם אמורים לראות את התוצאות all-gather.

    אם השורה הבאה מופיעה ביומני NCCL, סימן שהשורה הזו מאמתת ש-GPUDirect-TCPX אותחל בהצלחה.

    NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.
    

Multi-Instance GPU

Multi-Instance GPU (חלוקת GPU למספר מקרים) מחלקת GPU יחיד של NVIDIA H100 באותה מכונה וירטואלית למספר מקרים של GPU עצמאיים, עד שבעה. הן פועלות בו-זמנית, ולכל אחת מהן יש זיכרון, מטמון ומעבדים מרובי-ליבות משלה. ההגדרה הזו מאפשרת ל-GPU‏ NVIDIA H100 לספק איכות שירות (QoS) עקבית עם ניצול גבוה פי 7 בהשוואה לדגמי GPU קודמים.

אפשר ליצור עד שבעה כרטיסי GPU מרובי-מופעים. ב-GPU‏ H100 80GB, לכל GPU רב-מופע מוקצה זיכרון בנפח 10GB.

מידע נוסף על שימוש ב-GPU מרובה מופעים זמין במדריך למשתמש של NVIDIA בנושא GPU מרובה מופעים.

כדי ליצור כרטיסי GPU מרובי-מופעים, מבצעים את השלבים הבאים:

  1. יוצרים את מופעי A3 Mega,‏ A3 High או A3 Edge.

  2. מתקינים את הדרייברים של ה-GPU.

  3. מפעילים את מצב ה-MIG. הוראות מפורטות מופיעות במאמר בנושא הפעלת MIG.

  4. מגדירים את המחיצות של ה-GPU. הוראות מפורטות מופיעות במאמר בנושא עבודה עם מחיצות GPU.