אימון מודל באמצעות TPU v6e
במאמר הזה מוסבר איך לאמן מודלים ב-Cloud TPU v6e (שנקרא גם Trillium). המאמר כולל הסברים על הגדרת הסביבה, אופטימיזציה של הביצועים ודוגמאות מעשיות לאימון באמצעות JAX ו-PyTorch/XLA.
TPU v6e, שנקרא גם Trillium, הוא הדור השישי של TPUs מבית Google. בכל הפלטפורמות הטכניות, כמו ה-API והיומנים, ובכל המסמך הזה, Trillium יופיע כ-v6e. עם 256 שבבים לכל Pod, הארכיטקטורה של TPU v6e דומה מאוד ל-v5e. TPU v6e מותאם לאימון, לכוונון עדין ולשימוש של טרנספורמרים, של יצירת תמונות לפי טקסט ושל רשתות נוירונים קונבולוציוניות (CNN). מידע נוסף על הארכיטקטורה וההגדרות של מערכת TPU v6e זמין במאמר TPU v6e.
למידע על הפעלת הסקה ב-Cloud TPU v6e, אפשר לעיין במדריכים הבאים:
- הסקת מסקנות של MaxDiffusion בגרסה v6e
- הסקת מסקנות של vLLM בגרסה v6e
- ביצוע הסקה מרובת מארחים באמצעות Pathways
לפני שמתחילים
לפני שמתחילים, צריך:
- יצירת חשבון ופרויקט ב- Google Cloud עם חיוב מופעל
- התקנה של רכיבי אלפא של Google Cloud CLI
- הפעלת Cloud TPU API
- יצירת סוכן שירות של Cloud TPU
- יצירה של חשבון שירות של Cloud TPU והענקת הרשאות
מידע נוסף מופיע במאמר בנושא הגדרת סביבת Cloud TPU.
אימות המכסה וההרשאות
צריך לוודא שלפרויקט מוקצות המכסות הבאות:
- מכסת TPU v6e שניתן לקטוע או על פי דרישה
- מכסת כתובות IP
מכסת נפח אחסון ל-Hyperdisk Balanced ולכל סוג אחר של דיסק שרוצים להשתמש בו
אם אתם משתמשים ב-Google Kubernetes Engine (GKE) עם XPK (חבילת עיבוד מואץ), תצטרכו הרשאות נוספות במסוף Google Cloud . מידע נוסף זמין במאמר ההרשאות שנדרשות במסוף Google Cloud .
אפשרויות הקצאת הרשאות
אפשר להקצות ולנהל TPU v6e באמצעות השיטות הבאות:
- GKE: אתם יכולים להשתמש ב-GKE כדי להקצות ולנהל יחידות TPU כמאגר של מאיצים לעומסי עבודה של למידת מכונה בקונטיינרים. מידע נוסף זמין במאמר מידע על TPU ב-GKE.
- GKE ו-XPK: XPK הוא כלי שורת פקודה שמפשט את יצירת האשכולות והרצת עומסי העבודה ב-GKE. הוא מיועד למומחים בתחום למידת המכונה (ML) כדי לספק TPU ולהריץ משימות אימון בלי צורך במומחיות ב-Kubernetes. מידע נוסף זמין במאגר XPK ב-GitHub.
- משאבים בתור של Cloud TPU: משאבים בתור מאפשרים לכם לבקש קיבולת TPU שמוקצית כשהיא הופכת לזמינה. הוא אידיאלי למשימות באצווה ולעומסי עבודה (workloads) עמידים בכשלים שיכולים לחכות בתור. אתם יכולים לציין חלון זמן לבקשה. מידע נוסף זמין במאמר בנושא ניהול משאבים בתור.
הקצאת מעבדי TPU מדגם v6e באמצעות GKE ו-XPK
אם אתם משתמשים ב-GKE עם TPU מדגם v6e, אתם יכולים להשתמש בפקודות Kubernetes או ב-XPK כדי להקצות TPU ולאמן או להפעיל מודלים. למידע נוסף על שימוש ב-GKE עם TPU, אפשר לעיין במאמר מידע על TPU ב-GKE.
Cloud TPU v6e תומך בהגדרות של כרטיס רשת (NIC) שמאפשרות לכם להגדיל את קצב העברת הנתונים בכמה רשתות. בסעיפים הבאים מפורטות פקודות ליצירת אשכול GKE עם תמיכה בכרטיס רשת יחיד או עם תמיכה בכמה כרטיסי רשת באמצעות XPK. ברוב עומסי העבודה של פרוסות יחידות, כרטיס רשת יחיד מספק ביצועים מספיקים עם פחות הגדרות. לעומסי עבודה של Multislice ולעומסי עבודה שדורשים מהירויות גבוהות של הכנסת נתונים, משתמשים ב-multi-NIC.
יצירת אשכול עם תמיכה בכרטיס רשת יחיד באמצעות XPK
ברוב עומסי העבודה של פרוסות יחידות, כרטיס רשת יחיד מספק ביצועים מספיקים עם פחות הגדרות. לעומסי עבודה של Multislice ולעומסי עבודה שדורשים מהירויות גבוהות של הכנסת נתונים, משתמשים ב-multi-NIC.
בקטעים הבאים מוסבר איך ליצור אשכול GKE עם תמיכה בכרטיס רשת יחיד באמצעות XPK.
התקנת XPK והגדרת משתני סביבה
מתקינים XPK. פועלים לפי ההוראות במאגר XPK GitHub.
מגדירים משתני סביבה עבור האשכול:
export CLUSTER_NAME=XPK_CLUSTER_NAME export ZONE=us-east1-d export PROJECT_ID=PROJECT_ID export ACCELERATOR_TYPE=ACCELERATOR_TYPE export NUM_SLICES=1
מגדירים את משתני הסביבה הבאים:
-
CLUSTER_NAME: שם לאשכול. -
ZONE: האזור שבו ייווצר אשכול ה-TPU. מידע נוסף על אזורים נתמכים זמין במאמר אזורים ותחומים. -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
ACCELERATOR_TYPE: סוג ה-TPU, שנקרא גם סוג המאיץ, מציין את הגרסה והגודל של Cloud TPU שרוצים ליצור. לדוגמה,v6e-256. מידע נוסף על סוגי המאיצים הנתמכים בכל גרסה של TPU זמין במאמר גרסאות TPU. -
NUM_SLICES: מספר פרוסות ה-TPU באשכול. בכל פרוסה יש את מספר הצ'יפים שצוין ב-ACCELERATOR_TYPE. במקרה של אשכול עם פרוסה אחת, מגדירים אתNUM_SLICESל-1. במקרה של אשכול Multislice, מציינים את מספר ה-slices על סמך דרישות ההתאמה של עומס העבודה. המספר הכולל של הצ'יפים באשכול הוא מספר הצ'יפים ב-ACCELERATOR_TYPEכפולNUM_SLICES.
-
יצירת האשכול
בוחרים אחת מהאפשרויות הבאות כדי ליצור את האשכול. כדי להשיג ביצועים אופטימליים, מומלץ להשתמש ברשת מותאמת אישית עם MTU של 8,896. מידע נוסף זמין במאמר בנושא הגדרת MTU.
רשת בהתאמה אישית
כדי ליצור רשת בהתאמה אישית עם MTU של 8,896 ולהשתמש בה באשכול, פועלים לפי השלבים הבאים:
מגדירים משתני סביבה לשמות של הרשת ושל חומת האש:
export NETWORK_NAME=NETWORK_NAME export NETWORK_FW_NAME=FIREWALL_NAME
מחליפים את מה שכתוב בשדות הבאים:
- NETWORK_NAME: שם לרשת.
- FIREWALL_NAME: שם של כלל חומת אש בין רשתות.
כדי ליצור רשת בהתאמה אישית עם MTU של 8,896:
gcloud compute networks create ${NETWORK_NAME} \ --mtu=8896 \ --project=${PROJECT_ID} \ --subnet-mode=auto \ --bgp-routing-mode=regional
יוצרים כלל של חומת אש שמאפשר תעבורת נתונים מסוג TCP, ICMP ו-UDP ברשת:
gcloud compute firewall-rules create ${NETWORK_FW_NAME} \ --network=${NETWORK_NAME} \ --allow tcp,icmp,udp \ --project=${PROJECT_ID}
מגדירים משתנה סביבה לארגומנטים של אשכול XPK כדי להשתמש ברשת שיצרתם:
export CLUSTER_ARGUMENTS="--network=${NETWORK_NAME} --subnetwork=${NETWORK_NAME}"
יוצרים את אשכול ה-XPK. הפקודה הבאה מקצה קיבולת לפי דרישה:
xpk cluster create --cluster=${CLUSTER_NAME} \ --cluster-cpu-machine-type=e2-standard-8 \ --num-slices=${NUM_SLICES} \ --tpu-type=${ACCELERATOR_TYPE} \ --zone=${ZONE} \ --project=${PROJECT_ID} \ --on-demand \ --custom-cluster-arguments="${CLUSTER_ARGUMENTS}"
כדי להשתמש בקיבולת שמורה, מחליפים את
--on-demandב---reservation=RESERVATION_NAME. כדי להשתמש במכונות וירטואליות מסוג TPU Spot, מחליפים את--on-demandב---spot.
רשת ברירת המחדל
אם אתם לא צריכים רשת עם MTU גבוה, אתם יכולים ליצור אשכול שמשתמש ברשת VPC שמוגדרת כברירת מחדל. הפקודה הבאה מקצה קיבולת לפי דרישה:
xpk cluster create --cluster=${CLUSTER_NAME} \ --cluster-cpu-machine-type=e2-standard-8 \ --num-slices=${NUM_SLICES} \ --tpu-type=${ACCELERATOR_TYPE} \ --zone=${ZONE} \ --project=${PROJECT_ID} \ --on-demand
כדי להשתמש בקיבולת שמורה, מחליפים את --on-demand ב---reservation=RESERVATION_NAME. כדי להשתמש במכונות וירטואליות מסוג TPU Spot, מחליפים את --on-demand ב---spot.
יצירת אשכול עם תמיכה בכרטיסי רשת מרובים באמצעות XPK
לעומסי עבודה של Multislice או לעומסי עבודה אחרים שדורשים רוחב פס גבוה ברשת, כמו הטמנת נתונים, אפשר להשתמש ב-multi-NIC כדי לשפר את הביצועים. כשמשתמשים ב-multi-NIC, לכל מכונת TPU וירטואלית מוקצים ממשקי רשת נוספים, שכל אחד מהם מחובר לרשת VPC ייחודית, וכך משפרים את התפוקה הכוללת של הרשת. ברוב עומסי העבודה של פרוסות יחידות, כרטיס רשת יחיד מספק ביצועים מספיקים עם פחות הגדרות.
בקטעים הבאים מוסבר איך ליצור אשכול GKE עם תמיכה בכמה כרטיסי NIC באמצעות XPK.
התקנת XPK והגדרת משתני סביבה
מתקינים XPK. פועלים לפי ההוראות במאגר XPK GitHub.
מגדירים משתני סביבה עבור האשכול והרשת הראשית:
export CLUSTER_NAME=XPK_CLUSTER_NAME export REGION=REGION export ZONE=us-east1-d export PROJECT_ID=PROJECT_ID export ACCELERATOR_TYPE=ACCELERATOR_TYPE export NUM_SLICES=2 export NETWORK_NAME_1=${CLUSTER_NAME}-mtu9k-1-${ZONE} export SUBNET_NAME_1=${CLUSTER_NAME}-privatesubnet-1-${ZONE} export FIREWALL_RULE_NAME_1=${CLUSTER_NAME}-privatefirewall-1-${ZONE} export ROUTER_NAME_1=${CLUSTER_NAME}-network-1-${ZONE} export NAT_CONFIG_1=${CLUSTER_NAME}-natconfig-1-${ZONE} export NETWORK_NAME_2=${CLUSTER_NAME}-mtu9k-2-${ZONE} export SUBNET_NAME_2=${CLUSTER_NAME}-privatesubnet-2-${ZONE} export FIREWALL_RULE_NAME_2=${CLUSTER_NAME}-privatefirewall-2-${ZONE} export ROUTER_NAME_2=${CLUSTER_NAME}-network-2-${ZONE} export NAT_CONFIG_2=${CLUSTER_NAME}-natconfig-2-${ZONE}
מגדירים את משתני הסביבה הבאים:
-
CLUSTER_NAME: שם לאשכול. -
REGION: האזור שבו ייצור אשכול ה-TPU. -
ZONE: האזור שבו ייווצר אשכול ה-TPU. מידע נוסף על אזורים נתמכים זמין במאמר אזורים ותחומים. -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
ACCELERATOR_TYPE: סוג המאיץ מציין את הגרסה והגודל של Cloud TPU שרוצים ליצור. לדוגמה,v6e-256. מידע נוסף על סוגי המאיצים הנתמכים בכל גרסת TPU זמין במאמר גרסאות TPU. -
NUM_SLICES: מספר פרוסות ה-TPU באשכול. בכל פרוסה יש את מספר הצ'יפים שצוין ב-ACCELERATOR_TYPE. במקרה של אשכול עם פרוסה אחת, מגדירים אתNUM_SLICESל-1. במקרה של אשכול Multislice, מציינים את מספר ה-slices על סמך דרישות ההתאמה של עומס העבודה. המספר הכולל של הצ'יפים באשכול הוא מספר הצ'יפים ב-ACCELERATOR_TYPEכפולNUM_SLICES.
-
יצירת משאבי הרשת הראשיים
יוצרים את הרשת הראשית עם יחידת שידור מקסימלית (MTU) של 8,896:
gcloud compute networks create ${NETWORK_NAME_1} \ --mtu=8896 \ --bgp-routing-mode=regional \ --subnet-mode=custom \ --project=${PROJECT_ID}
שימוש ברשת בהתאמה אישית עם MTU של 8,896 מספק ביצועים טובים יותר. מידע נוסף זמין במאמר בנושא הגדרת MTU.
יוצרים את רשת המשנה הראשית:
gcloud compute networks subnets create ${SUBNET_NAME_1} \ --network=${NETWORK_NAME_1} \ --range=10.11.0.0/18 \ --region=${REGION} \ --project=${PROJECT_ID}
יוצרים כלל חומת אש לרשת הראשית שמאפשר תעבורת נתונים מסוג
tcp,icmpו-udpברשת הראשית:gcloud compute firewall-rules create ${FIREWALL_RULE_NAME_1} \ --network=${NETWORK_NAME_1} \ --allow tcp,icmp,udp \ --project=${PROJECT_ID}
יוצרים Cloud Router לרשת הראשית:
gcloud compute routers create ${ROUTER_NAME_1} \ --project=${PROJECT_ID} \ --network=${NETWORK_NAME_1} \ --region=${REGION}
מגדירים NAT לרשת הראשית. הפקודה הבאה מאפשרת לתנועה מהאשכול שלכם להגיע לאינטרנט:
gcloud compute routers nats create ${NAT_CONFIG_1} \ --router=${ROUTER_NAME_1} \ --region=${REGION} \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges \ --project=${PROJECT_ID} \ --enable-logging
יצירת משאבי הרשת המשנית
יוצרים את הרשת המשנית:
gcloud compute networks create ${NETWORK_NAME_2} --mtu=8896 \ --bgp-routing-mode=regional \ --subnet-mode=custom \ --project=${PROJECT_ID}יוצרים רשת משנה לרשת המשנית:
gcloud compute networks subnets create ${SUBNET_NAME_2} \ --network=${NETWORK_NAME_2} \ --range=10.10.0.0/18 \ --region=${REGION} \ --project=${PROJECT_ID}יוצרים כלל חומת אש שמאפשר תעבורת נתונים ברשת החדשה:
gcloud compute firewall-rules create ${FIREWALL_RULE_NAME_2} \ --network=${NETWORK_NAME_2} \ --allow tcp,icmp,udp \ --source-ranges 10.10.0.0/18 \ --project=${PROJECT_ID}יוצרים Cloud Router לרשת המשנית:
gcloud compute routers create ${ROUTER_NAME_2} \ --project=${PROJECT_ID} \ --network=${NETWORK_NAME_2} \ --region=${REGION}יוצרים הגדרת NAT ל-Cloud Router:
gcloud compute routers nats create ${NAT_CONFIG_2} \ --router=${ROUTER_NAME_2} \ --region=${REGION} \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges \ --project=${PROJECT_ID} \ --enable-logging
יצירת האשכול
מגדירים משתנה סביבה לארגומנטים של אשכול ומאגר צמתים כדי להשתמש ברשתות וברשתות המשנה שיצרתם:
export CLUSTER_ARGUMENTS="--enable-dataplane-v2 --enable-ip-alias --enable-multi-networking --network=${NETWORK_NAME_1} --subnetwork=${SUBNET_NAME_1}" export NODE_POOL_ARGUMENTS="--additional-node-network network=${NETWORK_NAME_2},subnetwork=${SUBNET_NAME_2}"הארגומנטים האלה מגדירים את האשכול לשימוש בשתי הרשתות שיצרתם לתמיכה בכרטיסי רשת מרובים.
יוצרים את האשכול. הפקודה הבאה מקצה קיבולת לפי דרישה:
xpk cluster create \ --cluster=${CLUSTER_NAME} \ --cluster-cpu-machine-type=e2-standard-8 \ --num-slices=${NUM_SLICES} \ --tpu-type=${ACCELERATOR_TYPE} \ --zone=${ZONE} \ --project=${PROJECT_ID} \ --on-demand \ --custom-cluster-arguments="${CLUSTER_ARGUMENTS}" \ --custom-nodepool-arguments="${NODE_POOL_ARGUMENTS}" \ --create-vertex-tensorboard
כדי להשתמש בקיבולת שמורה, מחליפים את
--on-demandב---reservation=RESERVATION_NAME. כדי להשתמש במכונות וירטואליות מסוג TPU Spot, מחליפים את--on-demandב---spot.
אימות ההגדרה של מספר כרטיסי רשת
אחרי שיוצרים אשכול עם תמיכה בכמה כרטיסי רשת, אפשר לוודא ששני כרטיסי הרשת נמצאים בשימוש על ידי יצירת עומס עבודה של XPK והוספת הדגל --command ifconfig.
משתמשים בפקודה הבאה כדי להציג את הפלט של הפקודה
ifconfigביומני המסוףGoogle Cloud . צריך לציין את האפשרות--base-docker-image maxtext_base_imageכדי להשתמש בתמונת הבסיס MaxText, כמו בדוגמה הבאה, או לציין את האפשרות--docker-imageואת התמונה שרוצים להשתמש בה.xpk workload create \ --cluster ${CLUSTER_NAME} \ --base-docker-image maxtext_base_image \ --workload=${USER}-xpk-${ACCELERATOR_TYPE}-${NUM_SLICES} \ --tpu-type=${ACCELERATOR_TYPE} \ --num-slices=${NUM_SLICES} \ --on-demand \ --zone=${ZONE} \ --project=${PROJECT_ID} \ --command "ifconfig"
אם רוצים להפעיל יומני ניפוי באגים או להשתמש ב- Vertex AI TensorBoard, מוסיפים את הארגומנטים האופציונליים הבאים לפקודה:
--enable-debug-logs \ --use-vertex-tensorboard
בודקים את הפלט של עומס העבודה של XPK ביומני המסוף כדי לוודא שערך ה-MTU של eth0 ו-eth1 מוגדר ל-8,896. Google Cloud
הגדרת JAX או PyTorch
במקורות המידע הבאים מוסבר איך להגדיר JAX או PyTorch ב-TPU, בהתאם לשיטת ההקצאה והניהול שבה אתם משתמשים:
- GKE Autopilot: הכנת אפליקציית TPU
- GKE Standard: הכנת עומסי העבודה
- GKE ו-XPK: XPK README
- Cloud TPU עם מארח יחיד באמצעות JAX: הפעלת חישוב במכונה וירטואלית של Cloud TPU באמצעות JAX
- Multi-host Cloud TPU using JAX: Run JAX code on TPU slices
- Cloud TPU עם מארח יחיד באמצעות PyTorch: הפעלת חישוב במכונת TPU וירטואלית ב-Cloud באמצעות PyTorch
- Multi-host Cloud TPU using PyTorch: Run PyTorch code on TPU slices
כדי להגדיר ולהפעיל XPK עם MaxText, אפשר לעיין במאמר הפעלת MaxText בהיקף גדול באמצעות XPK .
שיפור הגדרות TCP
אם הקצאתם את ה-TPU מדגם v6e באמצעות משאבים בתור, אתם יכולים להריץ את הפקודה הבאה כדי לשפר את ביצועי הרשת על ידי הגדלת המגבלות של מאגר הנתונים הזמני לקבלת TCP.
gcloud alpha compute tpus queued-resources ssh "${QUEUED_RESOURCE_ID}" \ --project "${PROJECT_ID}" \ --zone "${ZONE}" \ --node=all \ --worker=all \ --command=' sudo sh -c "echo \"4096 41943040 314572800\" > /proc/sys/net/ipv4/tcp_rmem"'
שימוש ב-SkyPilot
אפשר להשתמש ב-Cloud TPU v6e עם SkyPilot. SkyPilot הוא פריימוורק בקוד פתוח שמפשט את התהליך של הפעלה, ניהול והרחבה של עומסי עבודה של AI. אפשר להוסיף ל-SkyPilot מידע על מיקום ותמחור שקשור ל-v6e. מידע נוסף זמין בדוגמה ל-SkyPilot TPU v6e.
דוגמאות לאימון
בקטעים הבאים מופיעות דוגמאות לאימון מודלים של MaxText, MaxDiffusion ו-PyTorch ב-Cloud TPU v6e.
הדוגמאות האלה נבדקו עם גרסאות התוכנה הבאות:
- Python
3.10ואילך - גרסאות תוכנה ליליות:
- JAX ללילה
0.4.32.dev20240912 - LibTPU ללילה
0.1.dev20240912+nightly
- JAX ללילה
- גרסאות יציבות של התוכנה:
- JAX + JAX Lib גרסה 0.4.37
אימון של MaxText ו-MaxDiffusion ב-Cloud TPU v6e
בקטעים הבאים מוסבר על מחזור החיים של האימון של מודלים MaxText ו-MaxDiffusion.
באופן כללי, השלבים הם:
- יוצרים את תמונת הבסיס של עומס העבודה.
- מריצים את עומס העבודה באמצעות XPK.
- יוצרים את פקודת ההדרכה לעומס העבודה.
- פורסים את עומס העבודה.
- עוקבים אחרי עומס העבודה וצופים במדדים.
- אם אין צורך בעומס העבודה XPK, מוחקים אותו.
- למחוק את האשכול כשכבר לא צריך אותו.
יצירת תמונת בסיס
מתקינים את MaxText או MaxDiffusion ויוצרים את קובץ אימג' של Docker:
משכפלים את המאגר שרוצים להשתמש בו ועוברים לספרייה של המאגר:
MaxText:
git clone https://github.com/google/maxtext.git && cd maxtextMaxDiffusion:
git clone https://github.com/google/maxdiffusion.git && cd maxdiffusion && git checkout 4a8155ec0129512812b31930f0a91c6d5a141103מגדירים את Docker לשימוש ב-Google Cloud CLI:
gcloud auth configure-dockerיוצרים את קובץ האימג' של Docker באמצעות הפקודה הבאה או באמצעות קובץ אימג' של JAX AI. מידע נוסף על תמונות AI ב-JAX זמין במאמר תמונות AI ב-JAX.
MaxText:
bash docker_build_dependency_image.sh MODE=stable JAX_VERSION=0.4.35MaxDiffusion:
bash .github/workflows/build_and_upload_images.sh CLOUD_IMAGE_NAME=maxdiffusion_jax_stable_stack MODE=jax_ai_image PROJECT=${PROJECT_ID} LOCAL_IMAGE_NAME=maxdiffusion_jax_stable_stack BASEIMAGE=us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latestמגדירים את מזהה הפרויקט בהגדרות האישיות הפעילות של ה-CLI של gcloud:
gcloud config set project ${PROJECT_ID}אם מפעילים את עומס העבודה ממכונה שבה התמונה לא נוצרה באופן מקומי, צריך להעלות את התמונה.
מגדירים את משתנה הסביבה
CLOUD_IMAGE_NAME:export CLOUD_IMAGE_NAME=${USER}_runnerמעלים את התמונה:
bash docker_upload_runner.sh ${CLOUD_IMAGE_NAME}
הפעלת עומס העבודה באמצעות XPK
אם אתם לא משתמשים בערכי ברירת המחדל שהוגדרו על ידי MaxText או MaxDiffusion, אתם צריכים להגדיר את משתני הסביבה הבאים:
export BASE_OUTPUT_DIR=gs://YOUR_BUCKET export PER_DEVICE_BATCH_SIZE=2 export NUM_STEPS=30 export MAX_TARGET_LENGTH=8192
יוצרים את סקריפט המודל. הסקריפט הזה יועתק כפקודת אימון בשלב מאוחר יותר.
אל תריצו עדיין את סקריפט המודל.
MaxText
MaxText הוא מודל שפה גדול (LLM) בקוד פתוח, עם ביצועים גבוהים ורמת מדרגיות גבוהה. הוא כתוב ב-Python וב-JAX טהורים, ומיועד ל-TPU ול-GPU לצורך אימון והסקת מסקנות. Google Cloud
JAX_PLATFORMS=tpu,cpu \ ENABLE_PJRT_COMPATIBILITY=true \ TPU_SLICE_BUILDER_DUMP_CHIP_FORCE=true \ TPU_SLICE_BUILDER_DUMP_ICI=true && \ python3 -m MaxText.train MaxText/configs/base.yml \ base_output_directory=${BASE_OUTPUT_DIR} \ dataset_type=synthetic \ per_device_batch_size=${PER_DEVICE_BATCH_SIZE} \ enable_checkpointing=false \ gcs_metrics=true \ profiler=xplane \ skip_first_n_steps_for_profiler=5 \ steps=${NUM_STEPS} # attention='dot_product'"Gemma2
Gemma היא משפחה של מודלים מסוג LLM עם משקלים פתוחים שפותחו על ידי Google DeepMind, על סמך מחקר וטכנולוגיה של Gemini.
python3 -m MaxText.train MaxText/configs/base.yml \ model_name=gemma2-27b \ run_name=gemma2-27b-run \ base_output_directory=${BASE_OUTPUT_DIR} \ max_target_length=${MAX_TARGET_LENGTH} \ per_device_batch_size=${PER_DEVICE_BATCH_SIZE} \ steps=${NUM_STEPS} \ enable_checkpointing=false \ use_iota_embed=true \ gcs_metrics=true \ dataset_type=synthetic \ profiler=xplane \ attention=flashMixtral 8x7b
Mixtral הוא מודל AI מתקדם שפותח על ידי Mistral AI, והוא מבוסס על ארכיטקטורה של שילוב מומחים (MoE) דליל.
python3 -m MaxText.train MaxText/configs/base.yml \ base_output_directory=${BASE_OUTPUT_DIR} \ per_device_batch_size=${PER_DEVICE_BATCH_SIZE} \ model_name=mixtral-8x7b \ steps=${NUM_STEPS} \ max_target_length=${MAX_TARGET_LENGTH} \ tokenizer_path=assets/tokenizer.mistral-v1 \ attention=flash \ dtype=bfloat16 \ dataset_type=synthetic \ profiler=xplaneLlama3-8b
Llama היא משפחה של מודלים גדולים של שפה (LLM) עם משקלים פתוחים שפותחו על ידי Meta.
דוגמה להרצת Llama3 ב-PyTorch אפשר לראות במודלים של torch_xla במאגר torchprime.
MaxDiffusion
MaxDiffusion הוא אוסף של יישומי הפניה של מודלים שונים של דיפוזיה סמויה שנכתבו ב-Python וב-JAX טהורים, שפועלים במכשירי XLA, כולל Cloud TPU ומעבדי GPU. Stable Diffusion הוא מודל סמוי של יצירת תמונות לפי טקסט שיוצר תמונות פוטו-ריאליסטיות מכל קלט טקסט.
כדי להריץ את MaxDiffusion, צריך להתקין הסתעפות Git ספציפית, כמו שמוצג בתסריט ההדרכה הבא.
git clone https://github.com/google/maxdiffusion.git && cd maxdiffusion && git checkout 4a8155ec0129512812b31930f0a91c6d5a141103 && pip install -r requirements.txt && pip install . && pip install huggingface_hub==0.30.2 && OUT_DIR=${BASE_OUTPUT_DIR} && python src/maxdiffusion/train_sdxl.py \ src/maxdiffusion/configs/base_xl.yml \ revision=refs/pr/95 \ activations_dtype=bfloat16 \ weights_dtype=bfloat16 \ resolution=1024 \ per_device_batch_size=1 \ output_dir=${OUT_DIR} \ jax_cache_dir=${OUT_DIR}/cache_dir/ \ max_train_steps=200 \ attention=flash \ run_name=sdxl-ddp-v6eמייצאים את המשתנים הבאים:
export CLUSTER_NAME=CLUSTER_NAME export ACCELERATOR_TYPE=ACCELERATOR_TYPE export NUM_SLICES=NUM_SLICES export YOUR_MODEL_SCRIPT=YOUR_MODEL_SCRIPT
תיאורים של משתני סביבה
-
CLUSTER_NAME: השם של האשכול. -
ACCELERATOR_TYPE: סוג המאיץ מציין את הגרסה והגודל של Cloud TPU שרוצים ליצור. מידע נוסף על סוגי המאיצים הנתמכים בכל גרסת TPU זמין במאמר גרסאות TPU. -
NUM_SLICES: מספר פרוסות ה-TPU. -
YOUR_MODEL_SCRIPT: סקריפט המודל להרצה כפקודת אימון.
-
מריצים את המודל באמצעות הסקריפט שיצרתם בשלב הקודם. צריך לציין את הדגל
--base-docker-imageכדי להשתמש בתמונת הבסיס MaxText, או לציין את הדגל--docker-imageואת התמונה שרוצים להשתמש בה.אפשר להוסיף את הדגלים האופציונליים הבאים:
- אפשר להפעיל רישום של ניפוי הבאגים ביומן על ידי הוספת הדגל
--enable-debug-logs. מידע נוסף זמין במאמר ניפוי באגים ב-JAX ב-MaxText. - כדי להעלות נתונים ל-Vertex AI TensorBoard, אפשר ליצור ניסוי ב-Vertex AI ולכלול בו את הדגל
--use-vertex-tensorboard. מידע נוסף זמין במאמר מעקב אחרי JAX ב-MaxText באמצעות Vertex AI.
xpk workload create \ --cluster ${CLUSTER_NAME} \ {--base-docker-image maxtext_base_image | --docker-image gcr.io/${PROJECT_ID}/${CLOUD_IMAGE_NAME}:latest} \ --workload=${USER}-xpk-${ACCELERATOR_TYPE}-${NUM_SLICES} \ --tpu-type=${ACCELERATOR_TYPE} \ --num-slices=${NUM_SLICES} \ --on-demand \ --zone=${ZONE} \ --project=${PROJECT_ID} \ --command="${YOUR_MODEL_SCRIPT}"
הפלט כולל קישור למעקב אחרי עומס העבודה. פותחים את הקישור ולוחצים על הכרטיסייה Logs (יומנים) כדי לעקוב אחרי עומס העבודה בזמן אמת.
- אפשר להפעיל רישום של ניפוי הבאגים ביומן על ידי הוספת הדגל
ניפוי באגים ב-JAX ב-MaxText
משתמשים בפקודות XPK משלימות כדי לאבחן למה האשכול או עומס העבודה לא פועלים:
- רשימת עומסי עבודה של XPK
- XPK inspector
- מפעילים רישום מפורט (verbose) ביומני עומס העבודה באמצעות הדגל
--enable-debug-logsכשיוצרים את עומס העבודה של XPK
מעקב אחרי JAX ב-MaxText באמצעות Vertex AI
כדי להשתמש ב-TensorBoard, לחשבון המשתמש שלכם ב- Google Cloud צריכה להיות הרשאת aiplatform.user. מריצים את הפקודה הבאה כדי להקצות את התפקיד הזה:
gcloud projects add-iam-policy-binding your-project-id \ --member='user:your-email' \ --role='roles/aiplatform.user'
הצגת נתונים סקלריים ונתוני פרופיל באמצעות TensorBoard מנוהל של Vertex AI.
הגדלת הבקשות לניהול משאבים (CRUD) באזור שבו אתם משתמשים מ-600 ל-5,000. יכול להיות שזו לא בעיה בעומסי עבודה קטנים שמשתמשים בפחות מ-16 מכונות וירטואליות.
מתקינים יחסי תלות כמו
cloud-accelerator-diagnosticsל-Vertex AI:# xpk dependencies will install cloud-accelerator-diagnostics for Vertex AI cd ~/xpk pip install .
יוצרים את האשכול באמצעות הדגל
--create-vertex-tensorboard, כמו שמתואר במאמר יצירת Vertex AI TensorBoard. אפשר גם להריץ את הפקודה הזו באשכולות קיימים.יוצרים את הניסוי ב-Vertex AI כשמריצים את עומס העבודה של XPK באמצעות הדגל
--use-vertex-tensorboardוהדגל האופציונלי--experiment-name. רשימת השלבים המלאה מופיעה במאמר בנושא יצירת ניסוי ב-Vertex AI כדי להעלות נתונים ל-Vertex AI TensorBoard.
היומנים כוללים קישור ל-Vertex AI TensorBoard, בדומה לקישור הבא:
View your TensorBoard at https://us-central1.tensorboard.googleusercontent.com/experiment/project_id+locations+us-central1+tensorboards+hash+experiments+name
אפשר למצוא את הקישור ל-Vertex AI TensorBoard גם במסוף Google Cloud . עוברים אל Vertex AI Experiments במסוף Google Cloud . בוחרים את האזור המתאים מהתפריט הנפתח.
הספרייה של TensorBoard נכתבת גם לקטגוריה של Cloud Storage שציינתם באמצעות ${BASE_OUTPUT_DIR}.
מחיקת עומס העבודה של XPK
משתמשים בפקודה xpk workload delete כדי למחוק עומסי עבודה על סמך הקידומת של המשימה או הסטטוס שלה. הפקודה הזו יכולה להיות שימושית אם שלחתם עומסי עבודה של XPK שלא צריך להריץ יותר, או אם יש לכם משימות שנתקעו בתור.
מחיקת האשכול
משתמשים בפקודה xpk cluster delete כדי למחוק את האשכול:
xpk cluster delete --cluster ${CLUSTER_NAME} \ --zone=${ZONE} --project=${PROJECT_ID}
תוצאות השוואה של MaxDiffusion
הפעלנו את סקריפט ההדרכה של MaxDiffusion ב-v6e-4, ב-v6e-16 ובשני v6e-16. בטבלה הבאה מוצגים נתוני התפוקה שנמדדו.
| v6e-4 | v6e-16 | Two v6e-16 | |
|---|---|---|---|
| שלבי ההדרכה | 0.069 | 0.073 | 0.13 |
| גודל אצווה גלובלי | 8 | 32 | 64 |
| קצב העברת הנתונים (דוגמאות/שנייה) | 115.9 | 438.4 | 492.3 |
אימון מודלים של Llama באמצעות PyTorch/XLA ב-Cloud TPU v6e
בקטע הזה מוסבר איך לאמן מודלים של Llama באמצעות PyTorch/XLA ב-Cloud TPU v6e באמצעות מערך הנתונים WikiText.
גישה ל-Hugging Face ולמודל Llama 3
כדי להשתמש בדוגמה הזו, צריך טוקן גישה למשתמש ב-Hugging Face. מידע על יצירת אסימוני גישה למשתמשים זמין במסמכי Hugging Face בנושא אסימוני גישה למשתמשים.
צריך גם הרשאה לגשת למודל Llama-3-8B ב-Hugging Face. כדי לקבל גישה, עוברים אל מודל Meta-Llama-3-8B ב-HuggingFace ומבקשים גישה.
יצירת מכונת וירטואלית של Cloud TPU
בדוגמה הזו, יוצרים Cloud TPU v6e עם 8 שבבים.
מגדירים משתני סביבה:
export PROJECT_ID=your-project-id export TPU_NAME=your-tpu-name export ZONE=us-east1-d export ACCELERATOR_TYPE=v6e-8 export RUNTIME_VERSION=v2-alpha-tpuv6e
תיאורים של משתני סביבה
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . משתמשים בפרויקט קיים או יוצרים פרויקט חדש.-
TPU_NAME: השם של ה-TPU. -
ZONE: האזור שבו תיצור את מכונת ה-TPU הווירטואלית. מידע נוסף על אזורים נתמכים זמין במאמר אזורים ותחומים של TPU. -
ACCELERATOR_TYPE: סוג המאיץ מציין את הגרסה והגודל של Cloud TPU שרוצים ליצור. מידע נוסף על סוגי המאיצים הנתמכים בכל גרסת TPU זמין במאמר בנושא גרסאות TPU. -
RUNTIME_VERSION: גרסת התוכנה של Cloud TPU.
יוצרים מכונת וירטואלית של Cloud TPU:
gcloud alpha compute tpus tpu-vm create ${TPU_NAME} --version=${RUNTIME_VERSION} \ --accelerator-type=${ACCELERATOR_TYPE} \ --zone=${ZONE} \ --project=${PROJECT_ID}
התקנה
מתקינים את pytorch-tpu/transformers fork של Hugging Face transformers ואת יחסי התלות. הדוגמה הזו נבדקה עם גרסאות התלות הבאות:
-
torch: תואם לגרסה 2.5.0 -
torch_xla[tpu]: תואם לגרסה 2.5.0 jax: 0.4.33jaxlib: 0.4.33
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} \ --project=${PROJECT_ID} \ --zone ${ZONE} \ --worker=all \ --command='git clone -b flash_attention https://github.com/pytorch-tpu/transformers.git cd transformers sudo pip3 install -e . pip3 install datasets pip3 install evaluate pip3 install scikit-learn pip3 install accelerate pip install torch~=2.6.0 torch_xla[tpu]~=2.6.0 -f https://storage.googleapis.com/libtpu-releases/index.html -f https://storage.googleapis.com/libtpu-wheels/index.html pip install jax==0.4.38 jaxlib==0.4.38 -i https://us-python.pkg.dev/ml-oss-artifacts-published/jax/simple/'
הגדרת קובצי תצורה של מודלים
פקודת האימון שמופיעה בקטע הבא, הפעלת המודל, משתמשת בשני קובצי הגדרות JSON כדי להגדיר פרמטרים של מודל והגדרות של Fully Sharded Data Parallel (FSDP). חלוקת FSDP מאפשרת להשתמש בגודל אצווה גדול יותר במהלך האימון על ידי חלוקת משקלי המודל בין כמה יחידות TPU. כשמאמנים מודלים קטנים יותר, יכול להיות שמספיק להשתמש במקביליות נתונים ולשכפל את המשקלים בכל מכשיר. מידע נוסף על חלוקת טנסורים למקטעים במכשירים ב-PyTorch/XLA זמין במדריך למשתמש של PyTorch/XLA SPMD.
יוצרים את קובץ התצורה של פרמטר המודל. בהמשך מוצגת הגדרת הפרמטרים של המודל Llama-3-8B. למודלים אחרים, אפשר למצוא את קובץ התצורה ב-Hugging Face. לדוגמה, אפשר לעיין בהגדרות של Llama-2-7B.
cat > llama-config.json << EOF { "architectures": [ "LlamaForCausalLM" ], "attention_bias": false, "attention_dropout": 0.0, "bos_token_id": 128000, "eos_token_id": 128001, "hidden_act": "silu", "hidden_size": 4096, "initializer_range": 0.02, "intermediate_size": 14336, "max_position_embeddings": 8192, "model_type": "llama", "num_attention_heads": 32, "num_hidden_layers": 32, "num_key_value_heads": 8, "pretraining_tp": 1, "rms_norm_eps": 1e-05, "rope_scaling": null, "rope_theta": 500000.0, "tie_word_embeddings": false, "torch_dtype": "bfloat16", "transformers_version": "4.40.0.dev0", "use_cache": false, "vocab_size": 128256 } EOFיוצרים את קובץ התצורה של FSDP:
cat > fsdp-config.json << EOF { "fsdp_transformer_layer_cls_to_wrap": [ "LlamaDecoderLayer" ], "xla": true, "xla_fsdp_v2": true, "xla_fsdp_grad_ckpt": true } EOFמידע נוסף על FSDP זמין במאמר Fully Sharded Data Parallel using SPMD .
מעלים את קובצי ההגדרות למכונות הווירטואליות של Cloud TPU באמצעות הפקודה הבאה:
gcloud alpha compute tpus tpu-vm scp llama-config.json fsdp-config.json ${TPU_NAME}:. \ --worker=all \ --project=${PROJECT_ID} \ --zone=${ZONE}
הפעלת המודל
בעזרת קובצי ההגדרות שיצרתם בקטע הקודם, מריצים את הסקריפט run_clm.py כדי לאמן את מודל Llama-3-8B על מערך הנתונים WikiText. סקריפט האימון נמשך כ-10 דקות בהרצה ב-Cloud TPU v6e-8.
נכנסים אל Hugging Face ב-Cloud TPU באמצעות הפקודה הבאה:
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} \ --project=${PROJECT_ID} \ --zone ${ZONE} \ --worker=all \ --command=' pip3 install "huggingface_hub[cli]" huggingface-cli login --token HUGGING_FACE_TOKEN'
מריצים את אימון המודל:
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} \ --project=${PROJECT_ID} \ --zone ${ZONE} \ --worker=all \ --command=' export PJRT_DEVICE=TPU export XLA_USE_SPMD=1 export ENABLE_PJRT_COMPATIBILITY=true # Optional variables for debugging: export XLA_IR_DEBUG=1 export XLA_HLO_DEBUG=1 export PROFILE_EPOCH=0 export PROFILE_STEP=3 export PROFILE_DURATION_MS=100000 # Set PROFILE_LOGDIR to a local VM path or gs://my-bucket/profile_path export PROFILE_LOGDIR=PROFILE_PATH python3 transformers/examples/pytorch/language-modeling/run_clm.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --per_device_train_batch_size 16 \ --do_train \ --output_dir /home/$USER/tmp/test-clm \ --overwrite_output_dir \ --config_name /home/$USER/llama-config.json \ --cache_dir /home/$USER/cache \ --tokenizer_name meta-llama/Meta-Llama-3-8B \ --block_size 8192 \ --optim adafactor \ --save_strategy no \ --logging_strategy no \ --fsdp "full_shard" \ --fsdp_config /home/$USER/fsdp-config.json \ --torch_dtype bfloat16 \ --dataloader_drop_last yes \ --flash_attention \ --max_steps 20'
פתרון בעיות ב-PyTorch/XLA
אם הגדרתם את המשתנים האופציונליים לניפוי באגים בקטע הקודם, הפרופיל של המודל יאוחסן במיקום שצוין על ידי המשתנה PROFILE_LOGDIR. אפשר לחלץ את הקובץ xplane.pb שמאוחסן במיקום הזה ולהשתמש ב-tensorboard כדי להציג את הפרופילים בדפדפן באמצעות ההוראות של TensorBoard.
אם הביצועים של PyTorch/XLA לא מספקים, אפשר לעיין במדריך לפתרון בעיות, שכולל הצעות לניפוי באגים, ליצירת פרופילים ולאופטימיזציה של המודל.