יצירת אשכול ב-Cluster Director באמצעות Pathways

בדף הזה מוסבר לאדמינים של פלטפורמות ולמהנדסי למידת מכונה (ML) איך ליצור אשכול Cluster Director שמנוהל על ידי Slurm, ולהגדיר אותו לעומסי עבודה של Pathways. בשלבים האלה מקצים אשכול עם פרוסות TPU v6e, צומת בקר של מעבד (CPU), מערכת קבצים משותפת של Google Cloud Managed Lustre וסביבת זמן הריצה של /home/pathways. ‫Pathways לא מותקן מראש באשכול של Cluster Director: אחרי שיוצרים את האשכול, מורידים את הסקריפטים של Pathways לצומת ההתחברות ומריצים סקריפט הגדרות פעם אחת.

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

  • צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:

    gcloud

    מפעילים את Cloud Shell במסוף Google Cloud .

    הפעלת Cloud Shell

    בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

    REST

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.

      התקינו את ה-CLI של Google Cloud.

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .

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

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

  • מתקינים את Google Cloud CLI.
  • מפעילים את Hypercompute Cluster API.
  • מוודאים שלחשבון המשתמש ולחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את התפקידים של ניהול הזהויות והרשאות הגישה (IAM) שנדרשים כדי ליצור אשכול ב-Cluster Director ולהתחבר אליו. רשימת התפקידים מופיעה בקטע לפני שמתחילים במדריך למתחילים של Cluster Director.
  • יוצרים הזמנה של TPU v6e באזור שבו מתכננים ליצור את האשכול (לדוגמה, לפחות ארבע מכונות וירטואליות של ct6e-standard-4t לשני פרוסות של 2x4).
  • מגדירים sudo ללא סיסמה בצומתי האשכול לשחזור פרוסות אוטומטי. מבקשים מהאדמין להקצות לכם את התפקיד "התחברות אדמין למערכת ההפעלה של Compute"‏ (roles/compute.osAdminLogin) בפרויקט.
  • יוצרים קטגוריה של Cloud Storage לנתונים זמניים ולפלט של עומסי העבודה של Pathways, ונותנים את התפקיד Storage Object User‏ (roles/storage.objectUser) בפרויקט לחשבון המשתמש ולחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine.

הגדרת הסביבה המקומית

נכנסים באמצעות פרטי הכניסה של Google Cloud :

gcloud auth login

מגדירים את משתני הסביבה הבאים עם ערכים שמתאימים לעומס העבודה:

export PROJECT=PROJECT_ID
export REGION=REGION
export ZONE=ZONE
export CLUSTER_ID=CLUSTER_ID
export RESERVATION_NAME=RESERVATION_NAME

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

  • ‫PROJECT_ID: מזהה הפרויקט ב-Google Cloud .
  • ‫REGION: האזור שבו יוצרים את המשאבים.
  • ‫ZONE: האזור שבו יוצרים את המשאבים.
  • ‫CLUSTER_ID: שם האשכול. השם יכול להכיל עד 10 תווים, ורק מספרים ואותיות קטנות.
  • ‫RESERVATION_NAME: השם של ההזמנה של TPU v6e ב-ZONE.

יצירת אשכול ב-Cluster Director

בדוגמה הבאה, יוצרים אשכול עם שתי פרוסות TPU v6e 2x4 (ארבע מכונות וירטואליות ct6e-standard-4t) מההזמנה, וצומת מעבד אחד לבקר Pathways. כל הצמתים טוענים מערכת קבצים משותפת של Managed Lustre ב-/home. מידע נוסף על השדות בהגדרת האשכול זמין במאמר יצירת אשכול בהתאמה אישית.

  1. יוצרים את האשכול באמצעות ה-API בארכיטקטורת REST:

    יוצרים את גוף הבקשה:

    cat <<EOF > "${CLUSTER_ID}_create.json"
    {
      "networkResources": {
        "net": {
          "config": {
            "newNetwork": {
              "network": "projects/${PROJECT}/global/networks/${CLUSTER_ID}-net"
            }
          }
        }
      },
      "storageResources": {
        "home": {
          "config": {
            "newLustre": {
              "lustre": "projects/${PROJECT}/locations/${ZONE}/instances/${CLUSTER_ID}-lustre",
              "filesystem": "lustre",
              "capacityGb": "18000",
              "perUnitStorageThroughput": "500"
            }
          }
        }
      },
      "computeResources": {
        "crtpu": {
          "config": {
            "newReservedInstances": {
              "reservation": "projects/${PROJECT}/zones/${ZONE}/reservations/${RESERVATION_NAME}"
            }
          }
        },
        "crcpu": {
          "config": {
            "newOnDemandInstances": {
              "zone": "${ZONE}",
              "machineType": "n2-highmem-32"
            }
          }
        }
      },
      "orchestrator": {
        "slurm": {
          "loginNodes": {
            "count": "1",
            "zone": "${ZONE}",
            "machineType": "n2-standard-16",
            "enableOsLogin": true,
            "enablePublicIps": true,
            "bootDisk": {
              "type": "pd-balanced",
              "sizeGb": "100"
            },
            "storageConfigs": [
              {
                "id": "home",
                "localMount": "/home"
              }
            ]
          },
          "nodeSets": [
            {
              "id": "nstpu",
              "computeId": "crtpu",
              "staticNodeCount": "4",
              "maxDynamicNodeCount": "0",
              "enablePublicIps": true,
              "resourcePolicyConfig": {
                "acceleratorTopology": "2x4"
              },
              "computeInstance": {
                "bootDisk": {
                  "type": "hyperdisk-balanced",
                  "sizeGb": "100"
                }
              },
              "storageConfigs": [
                {
                  "id": "home",
                  "localMount": "/home"
                }
              ]
            },
            {
              "id": "nscpu",
              "computeId": "crcpu",
              "staticNodeCount": "1",
              "maxDynamicNodeCount": "0",
              "enablePublicIps": true,
              "computeInstance": {
                "bootDisk": {
                  "type": "pd-balanced",
                  "sizeGb": "100",
                  "image": "projects/clusterdirector-public-images/global/images/family/tpu-v6e-v5p-ubuntu2204-slurm2605-v20260902"
                }
              },
              "storageConfigs": [
                {
                  "id": "home",
                  "localMount": "/home"
                }
              ]
            }
          ],
          "partitions": [
            {
              "id": "tpu",
              "nodeSetIds": ["nstpu"]
            },
            {
              "id": "cpu",
              "nodeSetIds": ["nscpu"]
            }
          ],
          "defaultPartition": "tpu",
          "config": {
            "requeueExitCodes": [1, 2, 134, 137, 139, 143]
          }
        }
      }
    }
    EOF
    

    ואז שולחים את הבקשה:

    curl -s -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -d @"${CLUSTER_ID}_create.json" \
        "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters?clusterId=${CLUSTER_ID}"
    

    האשכול כולל את:

    • ‫מחיצה tpu: קבוצת צמתים סטטית של מכונות וירטואליות שמורות של TPU v6e. ‫staticNodeCount הוא מספר המכונות הווירטואליות, ו-acceleratorTopology הוא הטופולוגיה של כל פרוסה. בכל מכונה וירטואלית מסוג ct6e-standard-4t יש ארבעה צ'יפים, כך שבפרוסה מסוג 2x4 יש שתי מכונות וירטואליות. כדי להכין יותר פרוסות, צריך להכפיל: בשביל שתי פרוסות של 2x4 צריך staticNodeCount של 4.
    • מחיצה cpu: מכונה וירטואלית אחת על פי דרישה שמריצה את מנהל המשאבים של Pathways, את שרת ה-proxy של IFRT ואת הלקוח של MaxText. הסקריפטים של Pathways שולחים משימות למחיצה בשם cpu. המכונה הווירטואלית משתמשת בסוג המכונה n2-highmem-32 כי שירות Pathways ו-MaxText צריכים ביחד עד 240GB של זיכרון בזמן שהם שומרים נקודות ביקורת. הוא גם משתמש בתמונה עם Slurm 26.05, שתומכת בפרוסות TPU, כי שירות Pathways שולח את משימות ה-TPU worker מה-VM הזה.
    • ‫requeueExitCodes: ‏Slurm מוסיף מחדש לתור משימה שנסגרה עם אחד מהקודים האלה. ההגדרה הזו מאפשרת ל-Slurm להפעיל מחדש משימה של TPU worker כשמכונה וירטואלית כלשהי בפרוסה נקטעת, ולא רק הראשונה.
  2. מחכים עד שהאשכול יהיה מוכן. אפשר לעקוב אחרי ההתקדמות בדף Cluster Director במסוף Google Cloud , או לוודא שהערך של reconciling הוא false בפלט של הפקודה הבאה:

    curl -s \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters/${CLUSTER_ID}"
    

הגדרת סביבת Pathways

סביבת Pathways נמצאת ב-/home/pathways במערכת הקבצים המשותפת, ולכן צריך להגדיר אותה פעם אחת לכל אשכול. הוא מכיל את קובצי האימג' של קונטיינר Pathways, סביבת Python עם JAX ו-pathwaysutils, ואת הסקריפטים של Pathways.

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

    gcloud compute ssh ${CLUSTER_ID}-login-001 \
        --project=${PROJECT} \
        --zone=${ZONE} \
        --tunnel-through-iap
    
  2. מוודאים שהמחיצות cpu ו-tpu קיימות ונמצאות במצב idle:

    sinfo -o "%P %a %D %T %N %f"
    

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

    PARTITION AVAIL NODES STATE NODELIST FEATURES
    tpu* up 4 idle ${CLUSTER_ID}-nstpu-[0-3]
    cpu up 1 idle ${CLUSTER_ID}-nscpu-0
    
  3. מורידים את הסקריפטים של Pathways לצומת ההתחברות:

    mkdir -p ~/pathways-scripts && cd ~/pathways-scripts
    for f in setup_env.sh start_pathways.sh run_worker_slice.sh run_maxtext.sh; do
      curl -fsSLO "https://raw.githubusercontent.com/GoogleCloudPlatform/slurm-gcp/tpu-2605/pathways/scripts/${f}"
    done
    

    הפקודה הזו מורידה את הסקריפטים הבאים:

    • ‫setup_env.sh: הגדרה חד-פעמית של סביבת Pathways.
    • ‫start_pathways.sh: הפעלת שירות Pathways.
    • ‫run_worker_slice.sh: הפעלת ה-worker של Pathways לפרוסת TPU אחת (נשלח על ידי start_pathways.sh).
    • ‫run_maxtext.sh: מריץ עומס עבודה לדוגמה לאימון MaxText.
  4. מריצים את סקריפט ההגדרות. התהליך נמשך כ-5 דקות:

    chmod +x *.sh
    ./setup_env.sh
    

    הסקריפט שולף את תמונות השרת וה-proxy של Pathways, יוצר סביבת Python עם JAX,‏ pathwaysutils ו-MaxText, מעתיק את הסקריפטים אל /home/pathways ומקשר את ~/pathways אל /home/pathways. הוא מסתיים בפלט שדומה לזה:

    Environment ready: JAX 0.11.1
    
  5. אופציונלי: כדי לתת למשתמשים אחרים באשכול גישה לסביבת Pathways, צריך לבקש מהם לקשר את /home/pathways לספריית הבית שלהם:

    ln -sfn /home/pathways ~/pathways
    

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

נתקלתם בבעיות? קראו את המאמר פתרון בעיות ב-Pathways ב-Cloud.

סידור וארגון

כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם בדף הזה, מחקו את האשכול של Cluster Director בסיום:

curl -s -X DELETE \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters/${CLUSTER_ID}"

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