במדריך הזה נסביר איך להגדיר את 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
.במסוף Google Cloud ייפתח סשן של Cloud Shell בתוך מסגרת חדשה, ותופיע הודעה של שורת הפקודה.
יצירת אשכול 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 מופעל. התוסף מתקין באופן אוטומטי את ה-webhook של Ray TPU במישור הבקרה של האשכול.
-
כדי לתקשר עם האשכול, צריך להגדיר את
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 וביומנים הרלוונטיים.
ריי מגדיר משאב TPU-{accelerator}-Head כדי לזהות את צומת העובד של ריי שמתאים לערך 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
- מידע נוסף על TPU ב-GKE