לפני שמתחילים
- קובץ XPK שהותקן
- כלים של Kubernetes שהותקנו
- התקנתם את ה-CLI של gcloud
- הפעלתם את Google Kubernetes Engine API
- יצירת אשכול של Google Kubernetes Engine
במאמר הזה מוסבר איך לפתור בעיות שקשורות לעומסי עבודה ב-Pathways.
צפייה ביומנים
ב-Logs Explorer של Cloud Logging, משתמשים בשאילתה הבאה, שמותאמת לפרויקט, לאזור, לאשכול ולעומס העבודה שלכם.
resource.type="k8s_container" resource.labels.project_id="PROJECT" resource.labels.location="LOCATION" resource.labels.cluster_name="CLUSTER" resource.labels.namespace_name="default" resource.labels.pod_name:"WORKLOAD_NAME"
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT: מזהה הפרויקט ב- Google Cloud -
LOCATION: האזור או האזור שבו יצרתם את אשכול GKE -
CLUSTER: השם של אשכול GKE -
WORKLOAD_NAME: השם של עומס העבודה כשמשתמשים ב-XPK או השם של JobSet כשמשתמשים ב-kubectl
השאילתה הזו תתאים לכמה קונטיינרים של Kubernetes ב-Pathways עם שמות כמו pathways-rm, pathways-proxy, pathways-worker. כדי לצמצם את האפשרויות ולגלות איזה מאגר גורם לבעיה, אפשר להוסיף מסנן לפי שם המאגר, כמו resource.labels.container_name:"<container_name>"
מעקב
מעקב אחר בריאות
אפשר לעקוב אחרי תקינות הרכיבים השונים של Pathways על ידי חיפוש רשומות ביומני של הקונטיינר, למשל:
pathways-proxy מוכן לטפל בבקשות חדשות לחיבור כשהיומן הבא נכתב:
kubectl logs ${HEAD_POD_NAME} --container pathways-proxy
...
I1101 04:51:41.967764 1 proxy_server.cc:125] IFRT proxy server started with status OK
pathways-rm מוכן לטפל בבקשות חדשות לחיבור כשהיומן הבא נכתב:
kubectl logs $HEAD_POD_NAME --container pathways-rm
...
I1101 04:50:41.967764 1 server_lib.cc:1473] Pathways Server serving on [::]:29001
כדי לוודא שכל ה-TPU שרשומים ב-Pathways Resource Manager מוכנים, אפשר לחפש את ***<num slices>/<num slices> Pathways Slices Now Ready *** ביומני של מאגר התגים pathways-rm:
kubectl logs $HEAD_POD_NAME --container pathways-rm
...
I1101 04:52:41.967764 1 multi_job_allocator.cc:1063] *** 2/2 Pathways Slices Now Ready ***
לקוח Pathways יכול להתחבר לשרת ה-Proxy של IFRT כל עוד השרת מוכן, גם אם לא כל הפלחים מוכנים. העבודה שלכם מתבצעת עם פרוסות וירטואליות עד שהפרוסה מוכנה. פרוסות וירטואליות מאפשרות להריץ את הקוד כשאין גישה ל-TPU.
pathways-worker מוכן לטפל בבקשות חדשות לחיבור כשהיומן הבא נכתב:
kubectl logs $WORKER_POD_NAME --container pathways-worker
...
I1101 04:50:41.967764 1 server_lib.cc:1473] Pathways Server serving on [::]:29001
אוסף מדדים
התכונה 'תוכניות לימודים' יכולה לכתוב מדדים של מערכת ברמה נמוכה ל-Cloud Monitoring לצורך ניפוי באגים. המדדים כוללים:
- זמן האחזור של העברת נתונים ב-DCN
- זמן האחזור הכולל
- השהיית העברה ממארח למכשיר
- זמן האחזור של העברה ממכשיר למארח
אפשר למצוא את המדדים במרכז הבקרה של Cloud Monitoring שלGoogle Cloud הפרויקט שבו פועל אשכול GKE.
כדי לעקוב אחרי המדדים האלה באמצעות Metrics Explorer:
- עוברים אל Metrics Explorer.
- מסננים לפי שם המדד באמצעות השדה בחירת מדד.
- כדי לסנן לפי שם עומס העבודה וטווח הזמן, לוחצים על Add Filter (הוספת מסנן) ומסננים לפי pod_name.
- בוחרים סוג צבירה מתאים בהתאם למדד ולעומסי העבודה שאתם עוקבים אחריהם.
זמן האחזור של העברת נתונים ב-DCN
זהו מדד של Megascale XLA (MXLA) שמודד את ההתפלגות המצטברת של השהיות בהעברת נתונים ברשת עבור תעבורה של כמה פרוסות. מדידת זמן האחזור מתחילה כשמונפקת בקשה להעברת נתונים דרך ה-DCN, ומסתיימת כשמתקבל אישור שהעברת הנתונים הושלמה. כדי לעקוב אחרי המדד הזה, מסננים לפי dcn_transfer_latencies שם המדד.
זמן טעינה כולל
זהו מדד MXLA שמודד את ההתפלגות המצטברת של השהיה הכוללת של תנועת נתונים מרובת פרוסות. מדידת זמן האחזור מתחילה כשמוציאים בקשה לאוסף ומסתיימת כשמתקבל אישור שהעברת הנתונים הסתיימה. כדי לעקוב אחרי המדד הזה, מסננים לפי collective_e2e_latency שם המדד.
השהיית העברה ממארח למכשיר
זהו מדד MXLA שמודד את ההתפלגות המצטברת של השהיות בהעברה ממארח למכשיר עבור תעבורה של כמה פרוסות. מדידת זמן האחזור מתחילה כשמונפקת בקשה להעברת נתונים דרך ה-DCN, ומסתיימת כשמתקבל אישור שהעברת הנתונים הושלמה. כדי לעקוב אחרי המדד הזה, מסננים לפי host_to_device_transfer_latencies שם המדד.
זמן האחזור של העברה ממכשיר למארח
זהו מדד MXLA שמודד את ההתפלגות המצטברת של השהיות בהעברה ממכשיר למארח עבור תעבורה של כמה פרוסות. מדידת זמן האחזור מתחילה כשמוציאים בקשה להעברת נתונים דרך ה-DCN, ומסתיימת כשמתקבל אישור שהעברת הנתונים הושלמה. כדי לעקוב אחרי המדד הזה, מסננים לפי device_to_host_transfer_latencies שם המדד.
ניפוי באגים בשגיאות נפוצות
Unable to hash accelerator config warnings
ההודעות הבאות הן רק אזהרות ולא משפיעות על הביצועים של קוד JAX.
INFO:jax._src.cache_key:get (_hash_accelerator_config): unable to hash accelerator config, falling back to hashing devices + platform: UNIMPLEMENTED: GetTopologyForDevices is not supported for the IFRT proxy client. (type <class 'jaxlib.xla_extension.XlaRuntimeError'>)
ההרשאה logging.logEntries.create נדחתה במשאב
אם מופיעה השגיאה הבאה, צריך לוודא שלחשבון השירות של Compute Engine שבו נעשה שימוש ב-Vertex AI Workbench יש הרשאות לכתוב רשומות ביומן ב Google Cloud מערכת רישום היומנים.
INFO:absl:Created 'ArrayHandler' with primary_host=0, replica-id=0
WARNING:absl:pathwaysutils: Detected Pathways-on-Cloud backend. Applying changes.
Failed to submit 1 logs.
Traceback (most recent call last):
File "/opt/conda/lib/python3.10/site-packages/google/api_core/grpc_helpers.py", line 65, in error_remapped_callable
return callable_(**args, **kwargs)
File "/opt/conda/lib/python3.10/site-packages/grpc/_channel.py", line 1181, in __call__
return _end_unary_response_blocking(state, call, False, None)
File "/opt/conda/lib/python3.10/site-packages/google/api_core/grpc_helpers.py", line 1006, in _end_unary_response_blocking
raise _InactiveRpcError(state) # pytype: disable-not-instantiable
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.PERMISSION_DENIED
details = "Permission 'logging.logEntries.create' denied on resource (or it may not exist)."
debug_error_string = "UNKNOWN:Error received from peer ipv4:216.239.34.174:443 {created_time:"2024-10-03T20:30:44.820425276+00.00", grpc_status:7, grpc_message:"Permission \'logging.logEntries.create\' denied on resource (or it may not exist)."}"
>
כדי לפתור את הבעיה, צריך להוסיף את התפקיד Logs Writer לחשבון השירות של Compute Engine.
לא ניתן להתחבר לשרת ה-proxy של IFRT
אם השגיאה הזו מופיעה, לקוח ה-proxy של IFRT לא מצליח להתחבר לשרת ה-proxy של IFRT.
- מוודאים שהרשת של ה-VPC מוגדרת בצורה נכונה
- מוודאים שחומת האש מוגדרת כך שהחיבור יתאפשר
- מוודאים שהוקצה לכם אשכול של Pathways
- בדיקה אם יש הודעות שגיאה בהפעלה
כשמנסים להריץ את פקודת JAX הראשונה ששולחת פקודת IFRT לאשכול Pathways, המערכת מפסיקה להגיב למשך דקה בערך ואז מציגה RuntimeError כמו בדוגמה הבאה:
RuntimeError: Unable to initialize backend 'proxy': UNAVAILABLE: Unable to establish connection to ifrt_proxy server, please check provided address example-workload-proxy-0-0.example-workload.default.svc.example-cluster-domain.:38676'; detailed error: DNS resolution failed (set JAX_PLATFORMS='' to automatically choose an available backend)
קיים חיבור לאשכול Pathways
אפשר לשמור סשן עם לקוח אחד בלבד בכל פעם באשכול של נתיבי המרה. אם שני מחברות נפרדות מנסות להתחבר לאותו אשכול של Pathways, אחת מהן תצליח להתחבר והשנייה תציג את השגיאות הבאות.
INFO:absl:Created ArrayHandler with primary_host=0, replica_id=0
WARNING:absl:pathwaysutils: Detected Pathways-on-Cloud backend. Applying changes.
E0927 21:19:52.919607 37624 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
E0927 21:20:03.467547 37719 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
E0927 21:20:14.011645 37807 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
E0927 21:20:24.557955 37924 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
---------------------------------------------------------------------------
XlaRuntimeError Traceback (most recent call last)
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:887, in backends()
885 continue
--> 887 backend = _init_backend(platform)
888 _backends[platform] = backend
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:973, in _init_backend(platform)
972 logger.debug("Initializing backend '%s'", platform)
--> 973 backend = registration.factory()
974 # TODO: consider raising more descriptive errors directly from backend
975 # factories instead of returning None.
File /opt/conda/lib/python3.10/site-packages/pathwaysutils/proxy_backend.py:24, in register_backend_factory.<locals>.<lambda>()
21 def register_backend_factory():
22 xla_bridge.register_backend_factory(
23 "proxy",
---> 24 lambda: ifrt_proxy.get_client(
25 jax.config.read("jax_backend_target"),
26 ifrt_proxy.ClientConnectionOptions(),
27 ),
28 priority=-1,
29 )
XlaRuntimeError: UNAVAILABLE: Unable to establish connection to ifrt_proxy server, please check provided address example-workload-proxy-0-0.example-workload.default.svc.example-cluster-domain.:38676'; detailed error: Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
During handling of the above exception, another exception occurred:
RuntimeError Traceback (most recent call last)
Cell In[2], line 4
1 import pathwaysutils
3 import jax
----> 4 print(jax.devices())
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:1085, in devices(backend)
1060 def devices(
1061 backend: str | xla_client.Client | None = None
1062 ) -> list[xla_client.Device]:
1063 """Returns a list of all devices for a given backend.
1064
1065 .. currentmodule:: jaxlib.xla_extension
(...)
1083 List of Device subclasses.
1084 """
-> 1085 return get_backend(backend).devices()
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:1019, in get_backend(platform)
1015 @lru_cache(maxsize=None) # don't use util.memoize because there is no X64 dependence.
1016 def get_backend(
1017 platform: None | str | xla_client.Client = None
1018 ) -> xla_client.Client:
-> 1019 return _get_backend_uncached(platform)
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:998, in _get_backend_uncached(platform)
994 return platform
996 platform = (platform or _XLA_BACKEND.value or _PLATFORM_NAME.value or None)
--> 998 bs = backends()
999 if platform is not None:
1000 platform = canonicalize_platform(platform)
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:903, in backends()
901 else:
902 err_msg += " (you may need to uninstall the failing plugin package, or set JAX_PLATFORMS=cpu to skip this backend.)"
--> 903 raise RuntimeError(err_msg)
905 assert _default_backend is not None
906 if not config.jax_platforms.value:
RuntimeError: Unable to initialize backend 'proxy': UNAVAILABLE: Unable to establish connection to ifrt_proxy server, please check provided address 'example-workload-proxy-0-0.example-workload.default.svc.example-cluster-domain.:38676'; detailed error: Connection to IFRT proxy server was terminated: CANCELLED: Cancelled (set JAX_PLATFORMS='' to automatically choose an available backend)
אחרי שהלקוח המקורי יתנתק, הלקוח השני יוכל להתחבר. אחרי ניתוק לא צפוי, יכול להיות שתצטרכו להפעיל מחדש את אשכול Pathways כדי לאפשר ללקוחות אחרים להתחבר.
LocalProxy.init() קיבל ארגומנט מילת מפתח לא צפוי 'unbound_message'
אם השגיאה הזו מופיעה אחרי ייבוא של pathwaysutils, צריך לבדוק אם מותקנות בסביבה גרסאות לא עדכניות של Flask או Werkzeug:
pip3 list --outdated (replacing pip with pip3 as needed)
אם Flask או Werkzeug מופיעים ברשימה, כדאי לשדרג אותם, אבל צריך לזכור שפעולה כזו עלולה לגרום לבעיות בחבילות או בתלות אחרות בפרויקט:
pip install flask Werkzeug --upgrade ()
שגיאה פנימית משרת proxy
"Internal error from proxy server during Array::IsDeleted(): UNAVAILABLE:Connection to IFRT proxy server was terminated: FAILED_PRECONDITION:
GrpcClientSession: writes no longer allowed."
השגיאה הזו מציינת ששרת ה-Proxy של IFRT התנתק מהלקוח. כדי לפתור את הבעיה, אפשר להפעיל מחדש את הלקוח. במחברות, אפשר להפעיל מחדש את ליבת המחברת ולהריץ מחדש את המחברת.
SIGTERMS ו-HBM OOM
אם השגיאה RESOURCE_EXHAUSTED מופיעה ביומנים עם SIGTERM, יכול להיות שזו שגיאת OOM ב-HBM. במקרה כזה, אפשר להקטין את כמות הזיכרון ב-HBM שמשמשת בקוד JAX.
INVALID_ARGUMENT
"INVALID_ARGUMENT : Permanent error, with a last message of Lifecycle
matches_prefix cannot specify more than 50 prefixes per config.; Error while
initializing persistent cache storage Cloud Storage"
השגיאה הזו מתרחשת אם קטגוריה של Cloud Storage שעברה לסימון --pathways_gcs_location הגיעה למגבלה המקסימלית של מדיניות מחזור החיים. אם זה קורה, צריך לנקות את מדיניות מחזור החיים של Cloud Storage שלא נמצאת יותר בשימוש.
שגיאה קבועה
Permanent error, with a last message of The specified bucket does not exist.; Error while initializing persistent cache storage gcs
השגיאה הזו מודפסת בעובדים של מנהל המשאבים או Pathways כשמספקים מיקום לא תקין ב-Cloud Storage למאגרי Pathways.
תגובת שגיאה מהדמון
Error response from daemon: dockerfile parse error line 16: Unknown flag: exclude
הסיבה לכך היא גרסה ישנה של Docker. צריך לשדרג את גרסת Docker.
הלקוח והשרת של IFRT Proxy לא הצליחו להגיע להסכמה
IFRT Proxy client and server failed to agree on the protocol version; supported versions: client = [1, 1], server = [3, 14]
המשמעות היא שנעשה שימוש בגרסה ישנה יותר של MaxText, לכן צריך לוודא שאתם בונים מחדש את תמונת MaxText העדכנית ביותר.
המאמרים הבאים
- הסקת מסקנות מרובת מארחים באמצעות Pathways
- עומסי עבודה באצווה עם Pathways
- מצב אינטראקטיבי של תוכניות לימודים
- העברת עומסי עבודה של JAX ל-Pathways
- אימון גמיש עם תוכניות לימודים