במדריך הזה מוסבר איך להגדיר את KubeRay עם TPU Trillium ב-Google Kubernetes Engine (GKE). בקישור הבא מוסבר איך להגדיר תצורות TPU עם מארח יחיד ועם כמה מארחים, כולל משתני הסביבה הדרושים ומפרטי ה-Pod עבור TPU Trillium.
המדריך הזה מיועד לאדמינים ולמפעילים של פלטפורמות ולמומחים בתחום הנתונים וה-AI שרוצים ללמוד איך להגדיר את ההפעלה של TPU Trillium באמצעות KubeRay עבור מאגרי צמתים של מארח יחיד ומארחים מרובים. במדריך הזה מוצג איך להריץ סקריפט עם Jax שמאמת את האתחול המוצלח של TPU. במדריך הזה לא פורסים מודל.
לפני שמגדירים את KubeRay ב-GKE, חשוב להכיר את ההגדרות והטרמינולוגיה של Ray ב-GKE.
סקירה כללית
במדריך הזה מוסבר איך להריץ סקריפט Python עם Jax כדי לוודא שההפעלה של TPU Trillium עם KubeRay בוצעה בהצלחה. Jax היא ספרייה של חישובים מספריים עתירי ביצועים שתומכת בעומסי עבודה של למידת מכונה. KubeRay הוא אופרטור של Kubernetes שמספק דרך מאוחדת לפרוס, לנהל ולנטר אפליקציות של Ray ב-Kubernetes.
ב-TPU מדור Trillium (v6e) נדרשים משתני סביבה ומפרטי Pod ספציפיים, ששונים מדורות קודמים של TPU. במדריך הזה מוסבר איך לבצע את ההגדרות הנדרשות כדי לפרוס בהצלחה עומס עבודה באמצעות KubeRay ב-TPU של Trillium.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שמותקן Ray CLI (גרסה 2.37.0).
הפעלת Cloud Shell
ב-Cloud Shell מותקנים מראש כלי שורת הפקודה gcloud, helm ו-kubectl שמשמשים במדריך הזה.
- עוברים אל Google Cloud המסוף.
בחלק העליון של Google Cloud חלון המסוף, לוחצים על הלחצן Activate Cloud Shell
.בחלק התחתון של המסוף ייפתח סשן של Cloud Shell בתוך מסגרת חדשה ותופיע הודעה של שורת הפקודה. Google Cloud
יצירת אשכול GKE ומאגר צמתים
אפשר להגדיר את KubeRay ב-TPU באשכול GKE Autopilot או באשכול רגיל. מומלץ להשתמש באשכול Autopilot כדי ליהנות מחוויית Kubernetes מנוהלת באופן מלא. כדי לבחור את מצב הפעולה של GKE שהכי מתאים לעומסי העבודה שלכם, אפשר לעיין במאמר מידע על מצבי הפעולה של GKE.
טייס אוטומטי
ב-Cloud Shell, מריצים את הפקודה הבאה:
gcloud container clusters create-auto CLUSTER_NAME \ --enable-ray-operator \ --release-channel=rapid \ --location=LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
LOCATION: האזור שבו קיבולת ה-TPU Trillium שלכם זמינה. מידע נוסף מופיע במאמר זמינות של TPU ב-GKE.
GKE יוצר אשכול Autopilot עם התוסף Ray operator מופעל. תוסף Ray TPU webhook מותקן אוטומטית במישור הבקרה של האשכול.
-
כדי לתקשר עם האשכול, צריך להגדיר את
kubectl:gcloud container clusters get-credentials CLUSTER_NAME --location=LOCATION
רגילה
ב-Cloud Shell, יוצרים אשכול Standard שמופעל בו התוסף Ray operator על ידי הרצת הפקודה הבאה :
gcloud container clusters create CLUSTER_NAME \ --location LOCATION \ --addons=RayOperator \ --cluster-version=1.33 \ --machine-type=n1-standard-16מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
LOCATION: האזור שבו קיבולת ה-TPU Trillium שלכם זמינה. מידע נוסף זמין במאמר זמינות של TPU ב-GKE.
יצירת האשכול עשויה להימשך כמה דקות.
-
כדי לתקשר עם האשכול, צריך להגדיר את
kubectl:gcloud container clusters get-credentials CLUSTER_NAME --location=LOCATIONאפשר ליצור מאגר צמתים עם פרוסת TPU במארח יחיד או בכמה מארחים:
מארח יחיד
ב-Cloud Shell, מריצים את הפקודה הבאה:
gcloud container node-pools create v6e-4 \
--location=us-central2-b \
--cluster=CLUSTER_NAME \
--machine-type=ct6e-standard-4t \
--num-nodes=1 \
--threads-per-core=1 \
--tpu-topology=2x2
מארחים מרובים
ב-Cloud Shell, מריצים את הפקודה הבאה:
gcloud container node-pools create v6e-16 \
--location=us-central2-b \
--cluster=CLUSTER_NAME \
--machine-type=ct6e-standard-4t \
--num-nodes=4 \
--threads-per-core=1 \
--tpu-topology=4x4
הפעלת משאב מותאם אישית של RayJob
כשמגדירים מניפסט של RayJob, נותנים ל-KubeRay את ההוראות הבאות:
- יצירת RayCluster: מפרט RayJob כולל
rayClusterSpecשמגדיר את ההגדרה של אשכול Ray (קבוצות ראשוניות וקבוצות עובדים) שרוצים. - הפעלת משימה ספציפית: השדה
entrypointב-RayJob מציין את הפקודה או הסקריפט להפעלה באשכול Ray שנוצר. במדריך הזה,entrypointהוא סקריפט Python (tpu_list_devices.py) שנועד לאמת את האתחול של TPU Trillium.
כדי ליצור משאב מותאם אישית של RayJob:
מארח יחיד
יוצרים את קובץ המניפסט
ray-job.tpu-v6e-singlehost.yamlהבא:החלת המניפסט:
kubectl apply -f ray-job.tpu-v6e-singlehost.yamlמוודאים ש-RayJob נוצר ופועל:
kubectl get rayjobs v6e-4-jobהפלט אמור להיראות כך:
NAME JOB STATUS DEPLOYMENT STATUS RAY CLUSTER NAME START TIME END TIME AGE v6e-4-job PENDING Running v6e-4-job-raycluster 2024-10-15T23:15:22Z 20sמדפיסים את הפלט של RayJob.
kubectl logs -l=job-name=v6e-4-jobהפלט אמור להיראות כך:
2024-10-15 16:15:40,222 INFO cli.py:300 -- ray job stop v6e-4-job-hzq5q 2024-10-15 16:15:40,246 INFO cli.py:307 -- Tailing logs until the job exits (disable with --no-wait): 2024-10-15 16:15:40,112 INFO job_manager.py:528 -- Runtime env is setting up. 2024-10-15 16:15:50,181 INFO worker.py:1461 -- Using address 10.84.1.25:6379 set in the environment variable RAY_ADDRESS 2024-10-15 16:15:50,181 INFO worker.py:1601 -- Connecting to existing Ray cluster at address: 10.84.1.25:6379... 2024-10-15 16:15:50,186 INFO worker.py:1777 -- Connected to Ray cluster. View the dashboard at 10.84.1.25:8265 ['TPU cores:4'] 2024-10-15 16:16:12,349 SUCC cli.py:63 -- ------------------------------------- 2024-10-15 16:16:12,349 SUCC cli.py:64 -- Job 'v6e-4-job-hzq5q' succeeded 2024-10-15 16:16:12,349 SUCC cli.py:65 -- -------------------------------------
מארחים מרובים
יוצרים את קובץ המניפסט
ray-job.tpu-v6e-multihost.yamlהבא:החלת המניפסט:
kubectl apply -f ray-job.tpu-v6e-multihost.yamlמוודאים ש-RayJob v6e-16 נוצר ופועל:
kubectl get rayjobs v6e-16-jobהפלט אמור להיראות כך:
NAME JOB STATUS DEPLOYMENT STATUS RAY CLUSTER NAME START TIME END TIME AGE v6e-16-job Running v6e-16-job-raycluster-qr6vk 2024-10-16T19:28:19Z 66sמדפיסים את הפלט של v6e-16 RayJob:
kubectl logs -l=job-name=v6e-16-jobהפלט אמור להיראות כך:
2024-10-16 12:21:33,986 INFO cli.py:300 -- ray job stop v6e-16-job-z44s7 2024-10-16 12:21:34,011 INFO cli.py:307 -- Tailing logs until the job exits (disable with --no-wait): 2024-10-16 12:21:33,826 INFO job_manager.py:528 -- Runtime env is setting up. 2024-10-16 12:21:46,327 INFO worker.py:1461 -- Using address 10.84.1.61:6379 set in the environment variable RAY_ADDRESS 2024-10-16 12:21:46,327 INFO worker.py:1601 -- Connecting to existing Ray cluster at address: 10.84.1.61:6379... 2024-10-16 12:21:46,333 INFO worker.py:1777 -- Connected to Ray cluster. View the dashboard at 10.84.1.61:8265 ['TPU cores:16', 'TPU cores:16', 'TPU cores:16', 'TPU cores:16'] 2024-10-16 12:22:12,156 SUCC cli.py:63 -- --------------------------------- 2024-10-16 12:22:12,156 SUCC cli.py:64 -- Job 'v6e-16-job-z44s7' succeeded 2024-10-16 12:22:12,156 SUCC cli.py:65 -- ---------------------------------
הצגת ה-RayJob ב-Ray Dashboard
מוודאים ש-GKE יצר את שירות RayCluster ומתחברים למופע RayCluster.
מארח יחיד
אחזור השם של RayCluster שנוצר עבור RayJob:
export RAYCLUSTER_NAME=$(kubectl get rayjob v6e-4-job -o jsonpath='{.status.rayClusterName}')מאחזרים את השם של שירות ה-head של RayCluster:
export HEAD_SVC=$(kubectl get svc -l ray.io/cluster=$RAYCLUSTER_NAME,ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')מתחברים ללוח הבקרה של Ray על ידי העברה ליציאה אחרת של שירות הראשי:
kubectl port-forward svc/$HEAD_SVC 8265:8265 2>&1 >/dev/null &פותחים דפדפן אינטרנט ומזינים את כתובת ה-URL הבאה:
http://localhost:8265/#/jobsצופים בסטטוס של RayJob וביומנים הרלוונטיים.
מארחים מרובים
אחזור השם של RayCluster שנוצר עבור RayJob:
export RAYCLUSTER_NAME=$(kubectl get rayjob v6e-16-job -o jsonpath='{.status.rayClusterName}')מאחזרים את השם של שירות ה-head של RayCluster:
export HEAD_SVC=$(kubectl get svc -l ray.io/cluster=$RAYCLUSTER_NAME,ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')מתחברים ללוח הבקרה של Ray על ידי העברה ליציאה אחרת של שירות הראשי:
kubectl port-forward svc/$HEAD_SVC 8265:8265 2>&1 >/dev/null &פותחים דפדפן אינטרנט ומזינים את כתובת ה-URL הבאה:
http://localhost:8265/#/jobsצופים בסטטוס של RayJob וביומנים הרלוונטיים.
Ray מגדיר משאב TPU-{accelerator}-Head כדי לזהות את צומת העובד של Ray שמתאים לערך TPU_WORKER_ID=0. בקבוצת TPU מרובת-מארחים, הצומת Ray עם TPU_WORKER_ID=0 כולל את הערך TPU-v6e-16-head: 1.0 במשאבים שלו. משתנה הסביבה TPU_WORKER_ID הזה מוגדר על ידי webhook משנה של GKE עבור KubeRay.
הסרת המשאבים
כדי למנוע חיובים לא רצויים בחשבון אחרי שמסיימים את המדריך, צריך למחוק את RayJob:
מארח יחיד
kubectl delete rayjobs v6e-4-job
מארחים מרובים
kubectl delete rayjobs v6e-16-job
המאמרים הבאים
- מידע נוסף על Ray ב-Kubernetes
- איך מפעילים vLLM ב-GKE עם TPU
- איך מפעילים את SDXL ב-GKE עם TPU
- מידע נוסף על TPUs ב-GKE