במאמר הזה מוסבר איך להגדיר מכונות וירטואליות (VM) מסוג A3 Mega, A3 High או A3 Edge עם שמונה מעבדי NVIDIA H100 GPU, שמשתמשות באחת מהטכנולוגיות הבאות של GPUDirect: GPUDirect-TCPX או GPUDirect-TCPXO. כדי ליצור מכונה מסוג A3 High עם פחות מ-8 מעבדי GPU, קראו את המאמר יצירת מכונה מסוג A3 High או A2.
טכנולוגיית GPUDirect שבה משתמשים תלויה בסוג המכונה של A3 שבוחרים.
- GPUDirect-TCPXO: מקבץ רשת (network stack) שדומה ל-RDMA, שמועבר ל-offload ונתמך במכונות מסוג A3 Mega (
a3-megagpu-8g) עם שמונה יחידות GPU מסוג 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,800Gbps, ולכן הם אידיאליים למודלים גדולים של שפה שמבוססים על טרנספורמרים, למסדי נתונים ולמחשוב עתיר ביצועים (HPC).
גם GPUDirect-TCPX וגם GPUDirect-TCPXO משתמשים בטכנולוגיית NVIDIA GPUDirect כדי לשפר את הביצועים ולהפחית את זמן האחזור של מכונות וירטואליות מסוג A3. כדי לעשות את זה, הם מאפשרים להעביר מטענים ייעודיים (payloads) של חבילות נתונים ישירות מזיכרון ה-GPU לממשק הרשת, בלי לעבור דרך המעבד וזיכרון המערכת. זוהי צורה של גישה ישירה מרוחקת לזיכרון (RDMA). בשילוב עם Google Virtual NIC (gVNIC), מכונות וירטואליות מסוג A3 יכולות לספק את קצב העברת הנתונים הגבוה ביותר בין מכונות וירטואליות באשכול, בהשוואה לסוגי המכונות מדור קודם, A2 או G2, שעברו אופטימיזציה למאיצים.
במאמר הזה מוסבר איך ליצור מכונה וירטואלית מסוג A3 Mega, A3 High או A3 Edge, ולהפעיל את GPUDirect-TCPX או את GPUDirect-TCPXO כדי לבדוק את הביצועים המשופרים של רשת ה-GPU.
לפני שמתחילים
- כדי לבדוק את המגבלות ואת השלבים הנוספים שצריך לבצע לפני שיוצרים מכונות עם GPUs מצורפים, כמו בחירת קובץ אימג' של מערכת ההפעלה ובדיקת המכסה של ה-GPU, קראו את המאמר סקירה כללית של יצירת מכונה עם GPUs מצורפים.
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא התהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Cloud de Confiance by S3NS . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים האלה:
-
התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם. אחרי שנכנסתם לחשבון, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:
gcloud init - הגדרת אזור ותחום כברירת מחדל.
-
התפקידים הנדרשים
כדי לקבל את ההרשאות שנדרשות ליצירת מכונות וירטואליות, צריך לבקש מהאדמין להקצות לכם ב-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, מבצעים את השלבים הבאים:
- מגדירים רשת אחת או יותר של ענן וירטואלי פרטי (VPC) עם MTU גדול.
- יוצרים מכונת GPU.
הגדרת רשתות VPC
כדי לאפשר תקשורת יעילה למכונות הווירטואליות של ה-GPU, צריך ליצור רשת ניהול ורשת נתונים אחת או יותר. רשת הניהול משמשת לגישה חיצונית, למשל SSH, ולרוב התקשורת הכללית ברשת. רשתות הנתונים משמשות לתקשורת עם ביצועים גבוהים בין יחידות ה-GPU במכונות וירטואליות שונות, למשל לתנועה של גישה ישירה מרוחקת לזיכרון (RDMA).
ברשתות VPC כאלה, מומלץ להגדיר ערך גדול יותר ליחידת ההעברה המקסימלית (MTU). ערכי MTU גבוהים יותר מגדילים את גודל החבילה ומפחיתים את התקורה של כותרת החבילה, וכך מגדילים את תפוקת הנתונים של המטען הייעודי (payload). מידע נוסף על יצירת רשתות VPC זמין במאמר יצירה ואימות של רשת MTU עם מסגרות גדולות.
יצירת רשת ניהול, רשת משנה וכלל חומת אש
כדי להגדיר את רשת הניהול:
יוצרים את רשת הניהול באמצעות הפקודה
networks create:gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \ --project=PROJECT_ID \ --subnet-mode=custom \ --mtu=8244יוצרים את רשת המשנה לניהול באמצעות הפקודה
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יוצרים כללים לחומת האש באמצעות הפקודה
firewall-rules create.יוצרים כלל של חומת אש לרשת הניהול.
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יוצרים את הכלל
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יוצרים את הכלל
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: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה.
אם רוצים להחיל מדיניות מיקום על המכונה הווירטואלית, משתמשים באותה פקודה עם הדגל --resource-policies.
אפשר ליצור את ה-VM רק באותו אזור שבו נמצאת מדיניות המיקום.
כרטיס 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: השם של המכונה הווירטואלית. -
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=MAX_RUN_DURATION \
--request-valid-for-duration=VALID_FOR_DURATION
מחליפים את מה שכתוב בשדות הבאים:
-
VM_NAME: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה. -
TERMINATION_ACTION: אם לעצור או למחוק את המכונה הווירטואלית בסיום משך ההרצה שלה. מציינים אחד מהערכים הבאים:- כדי לעצור את המכונה הווירטואלית:
STOP - כדי למחוק את המכונה הווירטואלית:
DELETE
- כדי לעצור את המכונה הווירטואלית:
-
MAX_RUN_DURATION: משך הזמן המקסימלי שהמכונה הווירטואלית פועלת לפני ש-Compute Engine עוצר או מוחק אותה. צריך להזין את הערך כמספר ימים, שעות, דקות או שניות, ואחריוd,h,mו-sבהתאמה. לדוגמה, הערך30mמגדיר משך זמן של 30 דקות, והערך1h2m3sמגדיר משך זמן של שעה, שתי דקות ו-3 שניות. אפשר לציין ערך בין 10 דקות ל-7 ימים. -
VALID_FOR_DURATION`: משך הזמן המקסימלי להמתנה להקצאת המשאבים שביקשתם. צריך לציין את הערך כמספר ימים, שעות, דקות או שניות, ואחריוd,h,mו-sבהתאמה. בהתאם לדרישות של עומס העבודה באזור, ציינו את אחד ממשכי הזמן הבאים כדי להגדיל את הסיכויים שהבקשה ליצירת מכונה וירטואלית תצליח:- אם עומס העבודה מחייב ליצור את המכונה הווירטואלית באזור ספציפי, צריך לציין משך זמן בין 90 שניות (
90s) לשעתיים (2h). ככל שמשך הזמן ארוך יותר, כך גדלים הסיכויים לקבל משאבים. - אם אפשר להריץ את המכונה הווירטואלית בכל אזור, מציינים משך זמן של אפס שניות (
0s). הערך הזה מציין ש-Compute Engine מקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, נסו שוב את הבקשה באזור אחר.
- אם עומס העבודה מחייב ליצור את המכונה הווירטואלית באזור ספציפי, צריך לציין משך זמן בין 90 שניות (
אם רוצים להחיל מדיניות למיקום קומפקטי על המכונה הווירטואלית כדי לצמצם את זמן האחזור ברשת בין המכונות הווירטואליות, משתמשים באותה פקודה עם הדגל --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: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה. -
TERMINATION_ACTION: אם לעצור או למחוק את המכונה הווירטואלית בסיום תקופת ההזמנה. מציינים אחד מהערכים הבאים:- כדי לעצור את המכונה הווירטואלית:
STOP - כדי למחוק את המכונה הווירטואלית:
DELETE
- כדי לעצור את המכונה הווירטואלית:
-
RESERVATION_URL: כתובת ה-URL של המקום שרוצים להזמין. מציינים אחד מהערכים הבאים:- אם יצרתם את ההזמנה באותו פרויקט:
RESERVATION_NAME - אם ההזמנה נמצאת בפרויקט אחר, ואפשר להשתמש בה בפרויקט שלכם:
projects/PROJECT_ID/reservations/RESERVATION_NAME.
- אם יצרתם את ההזמנה באותו פרויקט:
התקנת מנהלי התקנים של GPU
מתקינים את מנהלי ההתקנים של ה-GPU בכל מכונה וירטואלית של A3 Mega.
מתקינים את מנהלי ההתקנים (דרייברים) של NVIDIA GPU.
sudo cos-extensions install gpu -- --version=latest
מפעילים מחדש את הנתיב.
sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
מתן גישה ל-NIC אל ה-GPU
בכל מכונה וירטואלית של A3 Mega, נותנים לכרטיסי ה-NIC גישה למעבדי ה-GPU.
- משנים את ההגדרות של חומת האש כדי לאשר את כל חיבורי ה-TCP הנכנסים ולאפשר תקשורת בין הצמתים באשכול:
sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
- מגדירים את המודול
dmabuf. טוענים את המודולimport-helper, שהוא חלק מה-framework שלdmabuf. המסגרת הזו מאפשרת שיתוף זיכרון במהירות גבוהה ובלי העתקה בין ה-GPU לבין כרטיס הרשת (NIC), רכיב קריטי לטכנולוגיית GPUDirect:sudo modprobe import-helper
- מגדירים את Docker לאימות בקשות ל-Artifact Registry.
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
- מפעילים את
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, מבצעים את הפעולות הבאות:
- מתקינים את הספרייה
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 - מפעילים קונטיינר ייעודי
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:
- פותחים מעטפת bash אינטראקטיבית בתוך מאגר
nccl-tests.docker exec -it nccl bash
מתוך מעטפת ה-bash של מאגר
nccl-tests, מבצעים את הפעולות הבאות:- מגדירים את הסביבה להרצה בכמה צמתים באמצעות הגדרת 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. - מריצים את הערכת הביצועים של
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
- מגדירים את הסביבה להרצה בכמה צמתים באמצעות הגדרת SSH ויצירת קובצי מארחים. מחליפים את
בני
כדי לבדוק את ביצועי הרשת באמצעות 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: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה.
אם רוצים להחיל מדיניות מיקום על המכונה הווירטואלית, משתמשים באותה פקודה עם הדגל --resource-policies.
אפשר ליצור את ה-VM רק באותו אזור שבו נמצאת מדיניות המיקום.
כרטיס 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: השם של המכונה הווירטואלית. -
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=MAX_RUN_DURATION \
--request-valid-for-duration=VALID_FOR_DURATION
מחליפים את מה שכתוב בשדות הבאים:
-
VM_NAME: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה. -
TERMINATION_ACTION: אם לעצור או למחוק את המכונה הווירטואלית בסיום משך ההרצה שלה. מציינים אחד מהערכים הבאים:- כדי לעצור את המכונה הווירטואלית:
STOP - כדי למחוק את המכונה הווירטואלית:
DELETE
- כדי לעצור את המכונה הווירטואלית:
-
MAX_RUN_DURATION: משך הזמן המקסימלי שהמכונה הווירטואלית פועלת לפני ש-Compute Engine עוצר או מוחק אותה. צריך להזין את הערך כמספר הימים, השעות, הדקות או השניות, ואחריוd,h,mו-sבהתאמה. לדוגמה, הערך30mמגדיר משך זמן של 30 דקות, והערך1h2m3sמגדיר משך זמן של שעה, שתי דקות ו-3 שניות. אפשר לציין ערך בין 10 דקות ל-7 ימים. -
VALID_FOR_DURATION: משך הזמן המקסימלי להמתנה להקצאת המשאבים שביקשתם. צריך לציין את הערך כמספר ימים, שעות, דקות או שניות, ואחריוd,h,mו-sבהתאמה. בהתאם לדרישות של עומס העבודה באזור, ציינו את אחד ממשכי הזמן הבאים כדי להגדיל את הסיכויים שהבקשה ליצירת מכונה וירטואלית תצליח:- אם עומס העבודה מחייב ליצור את המכונה הווירטואלית באזור ספציפי, צריך לציין משך זמן בין 90 שניות (
90s) לשעתיים (2h). ככל שמשך הזמן ארוך יותר, כך גדלים הסיכויים לקבל משאבים. - אם אפשר להריץ את המכונה הווירטואלית בכל אזור, מציינים משך זמן של אפס שניות (
0s). הערך הזה מציין ש-Compute Engine מקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, נסו שוב את הבקשה באזור אחר.
- אם עומס העבודה מחייב ליצור את המכונה הווירטואלית באזור ספציפי, צריך לציין משך זמן בין 90 שניות (
אם רוצים להחיל מדיניות למיקום קומפקטי על המכונה הווירטואלית כדי לצמצם את זמן האחזור ברשת בין המכונות הווירטואליות, משתמשים באותה פקודה עם הדגל --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: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה. -
TERMINATION_ACTION: אם לעצור או למחוק את המכונה הווירטואלית בסיום תקופת ההזמנה. מציינים אחד מהערכים הבאים:- כדי לעצור את המכונה הווירטואלית:
STOP - כדי למחוק את המכונה הווירטואלית:
DELETE
- כדי לעצור את המכונה הווירטואלית:
-
RESERVATION_URL: כתובת ה-URL של המקום שרוצים להזמין. מציינים אחד מהערכים הבאים:- אם יצרתם את ההזמנה באותו פרויקט:
RESERVATION_NAME - אם ההזמנה נמצאת בפרויקט אחר, ואפשר להשתמש בה בפרויקט שלכם:
projects/PROJECT_ID/reservations/RESERVATION_NAME.
- אם יצרתם את ההזמנה באותו פרויקט:
מתן גישה ל-NIC אל ה-GPU
בכל מכונה וירטואלית של A3 Mega, נותנים לכרטיסי ה-NIC גישה למעבדי ה-GPU.
- מתקינים את חבילות הדרישות המוקדמות למודול
dmabuf:sudo dnf -y install epel-release kernel-devel-$(uname -r) git sudo dnf -y install dkms
- מתקינים וטוענים את המודול
import-helper, שהוא חלק מה-framework של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
- מתקינים ומגדירים את 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אחרי שמריצים את הפקודות הקודמות, יוצאים מהחשבון ונכנסים אליו שוב כדי שהשינויים ייכנסו לתוקף.
- מפעילים את
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, מבצעים את הפעולות הבאות:
- מתקינים את הספרייה
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 - מגדירים את הדגלים של טעינת הצמצם.
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') - מפעילים קונטיינר ייעודי
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:
- פותחים מעטפת bash אינטראקטיבית בתוך מאגר
nccl-tests.docker exec -it nccl bash
מתוך מעטפת ה-bash של מאגר
nccl-tests, מבצעים את הפעולות הבאות:- מגדירים את הסביבה להרצה בכמה צמתים באמצעות הגדרת 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. - מריצים את הערכת הביצועים של
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
- מגדירים את הסביבה להרצה בכמה צמתים באמצעות הגדרת SSH ויצירת קובצי מארחים. מחליפים את
יצירת מכונות A3 High ו-Edge (GPUDirect-TCPX)
כדי ליצור מכונות A3 High ו-Edge, צריך להשתמש בקובץ אימג' של מערכת הפעלה שמותאמת לקונטיינרים בגרסה 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 הווירטואליים האחרים מותאמים ל-NUMA עם שניים מתוך שמונת ה-GPU באותו מתג PCIe.
בהתאם למודל ההקצאה שבו רוצים להשתמש כדי ליצור את המכונה הווירטואלית, בוחרים באחת מהאפשרויות הבאות:
רגילה
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: השם של המכונה הווירטואלית. -
PROJECT_ID: מזהה הפרויקט. -
ZONE: אזור שתומך בסוג המכונה. -
MACHINE_TYPE: סוג המכונה של ה-VM. צריך לצייןa3-highgpu-8gאוa3-edgegpu-8g. -
BOOT_DISK_SIZE: גודל דיסק האתחול ב-GB, לדוגמה50. -
NETWORK_NAME_PREFIX: התחילית של השם שמשמשת לרשתות ה-VPC ולרשתות המשנה.
אם רוצים להחיל מדיניות מיקום על המכונה הווירטואלית, משתמשים באותה פקודה עם הדגל --resource-policies.
אפשר ליצור את ה-VM רק באותו אזור שבו נמצאת מדיניות המיקום.
כרטיס 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: השם של המכונה הווירטואלית. -
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=MAX_RUN_DURATION \
--request-valid-for-duration=VALID_FOR_DURATION
מחליפים את מה שכתוב בשדות הבאים:
-
VM_NAME: השם של המכונה הווירטואלית. -
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
- כדי לעצור את המכונה הווירטואלית:
-
MAX_RUN_DURATION: משך הזמן המקסימלי שהמכונה הווירטואלית פועלת לפני ש-Compute Engine עוצר או מוחק אותה. צריך להזין את הערך כמספר הימים, השעות, הדקות או השניות, ואחריוd,h,mו-sבהתאמה. לדוגמה, הערך30mמגדיר משך זמן של 30 דקות, והערך1h2m3sמגדיר משך זמן של שעה, שתי דקות ו-3 שניות. אפשר לציין ערך בין 10 דקות ל-7 ימים. -
VALID_FOR_DURATION: משך הזמן המקסימלי להמתנה להקצאת המשאבים שביקשתם. צריך לציין את הערך כמספר ימים, שעות, דקות או שניות, ואחריוd,h,mו-sבהתאמה. בהתאם לדרישות של עומס העבודה באזור, ציינו את אחד ממשכי הזמן הבאים כדי להגדיל את הסיכויים שהבקשה ליצירת מכונה וירטואלית תצליח:- אם עומס העבודה מחייב ליצור את המכונה הווירטואלית באזור ספציפי, צריך לציין משך זמן בין 90 שניות (
90s) לשעתיים (2h). ככל שמשך הזמן ארוך יותר, כך גדלים הסיכויים לקבל משאבים. - אם אפשר להריץ את המכונה הווירטואלית בכל אזור, מציינים משך זמן של אפס שניות (
0s). הערך הזה מציין ש-Compute Engine מקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, נסו שוב את הבקשה באזור אחר.
- אם עומס העבודה מחייב ליצור את המכונה הווירטואלית באזור ספציפי, צריך לציין משך זמן בין 90 שניות (
אם רוצים להחיל מדיניות למיקום קומפקטי על המכונה הווירטואלית כדי לצמצם את זמן האחזור ברשת בין המכונות הווירטואליות, משתמשים באותה פקודה עם הדגל --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: השם של המכונה הווירטואלית. -
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 של המקום שרוצים להזמין. מציינים אחד מהערכים הבאים:- אם יצרתם את ההזמנה באותו פרויקט:
example-reservation - אם ההזמנה נמצאת בפרויקט אחר, ואפשר להשתמש בה בפרויקט שלכם:
projects/PROJECT_ID/reservations/example-reservation.
- אם יצרתם את ההזמנה באותו פרויקט:
התקנת מנהלי התקנים של GPU
בכל מכונה וירטואלית מסוג A3 High או Edge, מבצעים את הפעולות הבאות.
- מריצים את הפקודה הבאה כדי להתקין את מנהלי ההתקנים של NVIDIA GPU:
sudo cos-extensions install gpu -- --version=latest
- מריצים את הפקודה הבאה כדי לטעון מחדש את הנתיב:
sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
מתן גישה ל-NIC אל ה-GPU
בכל מכונה וירטואלית מסוג A3 High או Edge, נותנים לכרטיסי הרשת גישה ליחידות ה-GPU:
- מגדירים את המרשם.
- אם אתם משתמשים ב-Container Registry, מריצים את הפקודה הבאה:
docker-credential-gcr configure-docker
- אם אתם משתמשים ב-Artifact Registry, הריצו את הפקודה הבאה:
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
- אם אתם משתמשים ב-Container Registry, מריצים את הפקודה הבאה:
- מגדירים את מנהל נתיב הנתונים לקבלה. שירות ניהול, 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" - מוודאים שהמאגר
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...
- כדי להפסיק את הצפייה ביומנים, לוחצים על
ctrl-c. - התקנת כללים של טבלת IP.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
- מגדירים את 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 לפי השלבים הבאים:
- מפעילים את מאגר התגים.
#!/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 \ "$@" }הפקודה מבצעת את הפעולות הבאות:
- הפקודה טוענת מכשירי NVIDIA מ-
/devלתוך הקונטיינר - הגדרת מרחב השמות של הרשת של מאגר הנתונים למארח
- הגדרת מרחב השמות של המשתמשים במאגר למארח
- הוספת
CAP_IPC_LOCKליכולות של הקונטיינר - הפעולה טוענת את
/tmpשל המארח אל/tmpשל הקונטיינר - טוען את נתיב ההתקנה של NCCL ושל הפלאגין GPUDirect-TCPX NCCL בקונטיינר, ומוסיף את הנתיב הטעון אל
LD_LIBRARY_PATH
- הפקודה טוענת מכשירי NVIDIA מ-
- אחרי שמפעילים את הקונטיינר, אפשר להריץ אפליקציות שמשתמשות ב-NCCL מתוך הקונטיינר. לדוגמה, כדי להריץ את הבדיקה
run-allgather:- בכל מכונה וירטואלית מסוג A3 High או Edge, מריצים את הפקודה הבאה:
$ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
- מריצים את הפקודות הבאות במכונה וירטואלית אחת:
- מגדירים חיבור בין המכונות הווירטואליות. מחליפים את
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בכל VM. - מריצים את הסקריפט.
/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.
- בכל מכונה וירטואלית מסוג A3 High או Edge, מריצים את הפקודה הבאה:
Multi-Instance GPU
GPU עם כמה מופעים במקביל מחלק GPU אחד של NVIDIA H100 באותו VM לעד שבעה מופעי GPU נפרדים. הם פועלים בו-זמנית, ולכל אחד מהם יש זיכרון, מטמון ובלוקי SM (Streaming Multiprocessor) משלו. ההגדרה הזו מאפשרת ל-NVIDIA H100 GPU לספק איכות שירות (QoS) עקבית, עם ניצול גבוה עד פי 7 בהשוואה לדגמי GPU קודמים.
אפשר ליצור עד שבעה מעבדי GPU עם כמה מופעים במקביל. ב-GPU מדגם H100 80GB, לכל GPU עם כמה מופעים במקביל מוקצה זיכרון בנפח 10GB.
למידע נוסף על השימוש ב-GPU עם כמה מופעים במקביל, קראו את המדריך למשתמש של NVIDIA Multi-Instance GPU.
כדי ליצור GPU עם כמה מופעים במקביל, יש לבצע את השלבים הבאים:
יוצרים את המכונות מסוג A3 Mega, A3 High או A3 Edge.
מתקינים את מנהלי ההתקנים של ה-GPU.
מפעילים את מצב MIG. הוראות מפורטות מופיעות במאמר הפעלת MIG.
מגדירים את המחיצות של ה-GPU. הוראות מפורטות מופיעות במאמר עבודה עם מחיצות GPU.