במסמך הזה מתוארת ההגדרה של מכונות וירטואליות (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 באחת מהדרכים הבאות:
-
התקינו את ה-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 במכונות וירטואליות שונות, למשל לתנועה של Remote Direct Memory Access (RDMA).
ברשתות VPC האלה, מומלץ להגדיר ערך גדול יותר ליחידת השידור המקסימלית (MTU). ערכי MTU גבוהים יותר מגדילים את גודל החבילה ומקטינים את התקורה של כותרת החבילה, וכך מגדילים את קצב העברת הנתונים של המטען הייעודי. מידע נוסף על יצירת רשתות 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: השם של מופע ה-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 יקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, צריך לנסות שוב את הבקשה באזור אחר.
- אם עומס העבודה מחייב אתכם ליצור את המכונה הווירטואלית באזור ספציפי, אתם צריכים לציין משך זמן בין 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: השם של מופע ה-VM. -
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
בכל מכונה וירטואלית של A3 Mega, מתקינים את מנהלי ההתקנים (דרייברים) של ה-GPU.
מתקינים את הדרייברים של 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, שהוא חלק ממסגרת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: השם של מופע ה-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 יקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, צריך לנסות שוב את הבקשה באזור אחר.
- אם עומס העבודה מחייב אתכם ליצור את המכונה הווירטואלית באזור ספציפי, אתם צריכים לציין משך זמן בין 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: השם של מופע ה-VM. -
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, שהוא חלק מהמסגרת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, צריך להשתמש בתמונת מערכת הפעלה שמותאמת לקונטיינרים (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 יקצה משאבים רק אם הם זמינים באופן מיידי. אם בקשת היצירה נכשלת כי המשאבים לא זמינים, צריך לנסות שוב את הבקשה באזור אחר.
- אם עומס העבודה מחייב אתכם ליצור את המכונה הווירטואלית באזור ספציפי, אתם צריכים לציין משך זמן בין 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: השם של ה-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 של ההזמנה שרוצים להשתמש בה. מציינים אחד מהערכים הבאים:- אם יצרתם את ההזמנה באותו פרויקט:
example-reservation - אם ההזמנה נמצאת בפרויקט אחר, ו הפרויקט שלכם יכול להשתמש בה:
projects/PROJECT_ID/reservations/example-reservation.
- אם יצרתם את ההזמנה באותו פרויקט:
התקנת דרייברים של GPU
בכל מכונת A3 High או Edge VM, מבצעים את השלבים הבאים.
- מריצים את הפקודה הבאה כדי להתקין את מנהלי ההתקנים (דרייברים) של 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, צריך לתת לכרטיסי ה-NIC גישה ליחידות ה-GPU. לשם כך, מבצעים את השלבים הבאים:
- מגדירים את ה-Registry.
- אם אתם משתמשים ב-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 \ "$@" }הפקודה מבצעת את הפעולות הבאות:
- מבצעת Mount למכשירי NVIDIA מ-
/devלתוך הקונטיינר - הגדרת מרחב שמות ברשת של המאגר למארח
- הגדרה של מרחב שמות המשתמש של הקונטיינר למארח
- הוספת
CAP_IPC_LOCKליכולות של מאגר התגים - התקנת
/tmpשל המארח ב-/tmpשל הקונטיינר - מטעינים את נתיב ההתקנה של NCCL ואת הפלאגין GPUDirect-TCPX NCCL לקונטיינר ומוסיפים את הנתיב הטעון ל-
LD_LIBRARY_PATH
- מבצעת Mount למכשירי 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 אחת, מריצים את הפקודות הבאות:
- מגדירים את החיבור בין מכונות ה-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בכל מכונה וירטואלית. - מריצים את הסקריפט.
/scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2
- מגדירים את החיבור בין מכונות ה-VM. מחליפים את
הרצת הסקריפט
run-allgatherנמשכת כשתי דקות. בסוף היומנים, אתם אמורים לראות את התוצאותall-gather.אם השורה הבאה מופיעה ביומני NCCL, סימן שהשורה הזו מאמתת ש-GPUDirect-TCPX אותחל בהצלחה.
NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.
- בכל מכונה וירטואלית מסוג A3 High או Edge, מריצים את הפקודה הבאה:
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 מרובי-מופעים, מבצעים את השלבים הבאים:
יוצרים את מופעי A3 Mega, A3 High או A3 Edge.
מתקינים את הדרייברים של ה-GPU.
מפעילים את מצב ה-MIG. הוראות מפורטות מופיעות במאמר בנושא הפעלת MIG.
מגדירים את המחיצות של ה-GPU. הוראות מפורטות מופיעות במאמר בנושא עבודה עם מחיצות GPU.