פתרון בעיות במשימת GPU ב-Dataflow

אם נתקלים בבעיות בהרצת משימת Dataflow עם מעבדי GPU, אפשר לפעול לפי השלבים הבאים:

  1. כדי לוודא שצינור עיבוד הנתונים מוגדר בצורה נכונה, פועלים לפי תהליך העבודה שמתואר במאמר שיטות מומלצות לעבודה עם GPU ב-Dataflow.
  2. מוודאים שמשימת Dataflow משתמשת ביחידות GPU. אפשר לעיין במאמר בנושא אימות של משימת Dataflow בקטע 'הפעלת צינור עיבוד נתונים עם יחידות GPU'.
  3. מנפים באגים במשימה, באמצעות מכונת VM עצמאית או באמצעות Dataflow.
  4. אם הבעיה נמשכת, כדאי לפעול לפי שאר השלבים לפתרון בעיות שבדף הזה.

ניפוי באגים במשימה

אם אפשר, מנפים באגים בעבודה באמצעות מכונה וירטואלית עצמאית, כי ניפוי באגים באמצעות מכונה וירטואלית עצמאית בדרך כלל מהיר יותר. עם זאת, אם מדיניות ארגונית מונעת מכם לבצע ניפוי באגים באמצעות מכונה וירטואלית עצמאית, אתם יכולים לבצע ניפוי באגים באמצעות Dataflow.

ניפוי באגים באמצעות מכונה וירטואלית עצמאית

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

כדי לנפות באגים בקונטיינר בהתאמה אישית במכונה וירטואלית עצמאית עם מעבדי GPU, צריך ליצור מכונה וירטואלית של Compute Engine שמריצה מעבדי GPU במערכת הפעלה שעברה אופטימיזציה לקונטיינרים, להתקין דרייברים ולהפעיל את הקונטיינר באופן הבא.

  1. יוצרים מופע של VM.

    gcloud compute instances create INSTANCE_NAME \
      --project "PROJECT" \
      --image-family cos-stable \
      --image-project=cos-cloud  \
      --zone=us-central1-f \
      --accelerator type=nvidia-l4,count=1 \
      --maintenance-policy TERMINATE \
      --restart-on-failure  \
      --boot-disk-size=200G \
      --scopes=cloud-platform
    
  2. משתמשים ב-ssh כדי להתחבר ל-VM.

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. מתקינים את הדרייברים של ה-GPU. אחרי שמתחברים ל-VM באמצעות ssh, מריצים את הפקודות הבאות ב-VM:

    # Run these commands on the virtual machine
    cos-extensions install gpu
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    /var/lib/nvidia/bin/nvidia-smi
    
  4. משיקים את מאגר התגים המותאם אישית.

    קונטיינרים של Apache Beam SDK משתמשים בנקודת הכניסה /opt/apache/beam/boot. למטרות ניפוי באגים, אפשר להפעיל את מאגר התגים באופן ידני עם נקודת כניסה שונה:

    docker-credential-gcr configure-docker -include-artifact-registry
    docker run --rm \
      -it \
      --entrypoint=/bin/bash \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin \
      --privileged \
      IMAGE
    

    מחליפים את IMAGE בנתיב של Artifact Registry לקובץ אימג' של Docker.

  5. מוודאים שלספריות ה-GPU שמותקנות במאגר יש גישה למכשירי ה-GPU.

    אם אתם משתמשים ב-TensorFlow, אתם יכולים להדפיס את המכשירים הזמינים במפרש Python באמצעות הפקודה הבאה:

    >>> import tensorflow as tf
    >>> print(tf.config.list_physical_devices("GPU"))
    

    אם אתם משתמשים ב-PyTorch, אתם יכולים לבדוק אילו מכשירים זמינים במתורגמן Python באמצעות הפקודה הבאה:

    >>> import torch
    >>> print(torch.cuda.is_available())
    >>> print(torch.cuda.device_count())
    >>> print(torch.cuda.get_device_name(0))
    

כדי לבצע איטרציה בצינור עיבוד הנתונים, אפשר להפעיל אותו ב-Direct Runner. אפשר גם להפעיל צינורות עיבוד נתונים ב-Dataflow Runner מהסביבה הזו.

ניפוי באגים באמצעות Dataflow

אם אילוצים ארגוניים מונעים מכם לבצע ניפוי באגים במכונה וירטואלית עצמאית, אתם יכולים לבצע ניפוי באגים באמצעות Dataflow.

מפשטים את צינור עיבוד הנתונים כך שהוא רק יזהה אם יש יחידות GPU, ואז מריצים את צינור עיבוד הנתונים ב-Dataflow. בדוגמה הבאה אפשר לראות איך הקוד של צינור העיבוד הזה יכול להיראות:

def check_if_gpus_present(element):
  import torch
  import tensorflow as tf

  tensorflow_detects_gpus = tf.config.list_physical_devices("GPU")
  torch_detects_gpus = torch.cuda.is_available()
  if tensorflow_detects_gpus and torch_detects_gpus:
    return element

  if tensorflow_detects_gpus:
    raise Exception('PyTorch failed to detect GPUs with your setup')
  if torch_detects_gpus:
    raise Exception('Tensorflow failed to detect GPUs with your setup')
  raise Exception('Both Tensorflow and PyTorch failed to detect GPUs with your setup')

with beam.Pipeline() as p:
  _ = (p | beam.Create([1,2,3]) # Create a PCollection of the prompts.
         | beam.Map(check_if_gpus_present)
  )

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

אם צינור העיבוד לא מצליח לזהות יחידות GPU, פועלים לפי השלבים שבקטע No GPU usage במסמך הזה.

העובדים לא מתחילים

אם העבודה תקועה והעובדים של Dataflow אף פעם לא מתחילים לעבד נתונים, סביר להניח שיש בעיה שקשורה לשימוש במאגר מותאם אישית עם Dataflow. לפרטים נוספים, אפשר לקרוא את המדריך לפתרון בעיות במאגרי תגים בהתאמה אישית.

אם אתם משתמשים ב-Python, ודאו שהתנאים הבאים מתקיימים:

  • גרסת המשנה של רכיב התרגום ב-Python בקובץ אימג' של קונטיינר זהה לגרסה שבה אתם משתמשים כשאתם מפעילים את הפייפליין. אם יש אי התאמה, יכול להיות שיוצגו שגיאות כמו SystemError: unknown opcode עם דוח קריסות שכולל את apache_beam/internal/pickler.py.
  • אם אתם משתמשים ב-Apache Beam SDK בגרסה 2.29.0 או בגרסה קודמת, צריך לוודא ש-pip נגיש בתמונה ב-/usr/local/bin/pip.

בפעם הראשונה שמשתמשים בתמונה מותאמת אישית, מומלץ לצמצם את ההתאמות האישיות למינימום הנדרש כדי שהתמונה תפעל. משתמשים בתמונות לדוגמה של מאגרי תגים מותאמים אישית שמופיעות בדף הזה. צריך לוודא שאפשר להריץ צינור Dataflow פשוט עם תמונת הקונטיינר הזו בלי לבקש מעבדי GPU. לאחר מכן, משפרים את הפתרון.

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

המשימה נכשלת מיד בהפעלה

אם נתקלתם בשגיאות ZONE_RESOURCE_POOL_EXHAUSTED או ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS, תוכלו לבצע את הפעולות הבאות:

  • לא מציינים את אזור העובד כדי ש-Dataflow יבחר את האזור האופטימלי בשבילכם.

  • מפעילים את צינור הנתונים באזור אחר או עם סוג אחר של מאיץ.

  • קובעים מודל הקצאת הרשאות, כמו Flex-start. מידע נוסף זמין במאמר הגדרת מודל הקצאת הרשאות.

שגיאות נפוצות בהעברת GPU

אם אתם מעבירים עומסי עבודה ממעבדי GPU מסוג NVIDIA T4 או P4 שהוצאו משימוש אל משפחת המכונות הווירטואליות G2 ‏(NVIDIA L4) והעבודה לא מתחילה, כדאי לבדוק את הדברים הבאים:

  • זמינות באזור: מוודאים שסוגי המכונות G2 ו-GPU מסוג NVIDIA L4 זמינים באזור היעד. מידע נוסף זמין במאמר זמינות של אזורים ואזורים גיאוגרפיים של GPU.
  • זמינות המכסה: יכול להיות שתצטרכו לבקש מכסה חדשה של GPU ב-Compute Engine באזורי היעד כדי לבצע את ההעברה ל-G2/L4. מידע נוסף זמין במאמר בנושא בקשת מכסת GPU.
  • מטא-נתונים של תבניות Flex: אם צינור עיבוד הנתונים משתמש בתבניות Flex של Dataflow, צריך לעדכן את קובצי metadata.json ואת קובצי Dockerfile כדי לשקף את סוגי המכונות החדשים ואת מנהלי ההתקנים של ה-GPU.

המשימה נכשלת בזמן הריצה

אם העבודה נכשלת בזמן הריצה, צריך לבדוק אם יש שגיאות של חוסר זיכרון (OOM) במכונת העובד וב-GPU. שגיאות GPU OOM עשויות להופיע כשגיאות cudaErrorMemoryAllocation out of memory ביומני העובדים. אם אתם משתמשים ב-TensorFlow, ודאו שאתם משתמשים רק בתהליך TensorFlow אחד כדי לגשת למכשיר GPU אחד. מידע נוסף זמין במאמר בנושא מעבדים גרפיים (GPU) ומקביליות של עובדים.

אין שימוש ב-GPU

אם נראה שהעבודה לא משתמשת ביחידות GPU, פועלים לפי השלבים שבקטע ניפוי באגים בעבודה במסמך הזה כדי לוודא שיחידות ה-GPU זמינות בקובץ אימג' של Docker.

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

אם הצינור לא מצליח לזהות כרטיסי GPU, צריך לוודא את הדברים הבאים:

  • הספריות של NVIDIA שמותקנות בקובץ אימג' של קונטיינר תואמות לדרישות של קוד המשתמש של צינור הנתונים ולספריות שבהן הוא משתמש.
  • אפשר לגשת לספריות NVIDIA שמותקנות בתמונות של קונטיינרים כספריות משותפות.

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

פתרון בעיות ב-TensorFlow

אם PyTorch מזהה GPUs בצינור העיבוד אבל TensorFlow לא, כדאי לנסות את השלבים הבאים לפתרון בעיות:

  • מוודאים שיש לכם שילוב תואם של TensorFlow, גרסת cuDNN וגרסת CUDA Toolkit. מידע נוסף זמין במאמר Tested build configurations (הגדרות build שנבדקו) במסמכי TensorFlow.
  • אם אפשר, משדרגים לגרסאות התואמות האחרונות של TensorFlow ו-CUDA.
  • כדאי לעיין בבעיות הידועות ב-TensorFlow וב-CUDA כדי לבדוק אם בעיה ידועה גורמת לבעיות בצינור העיבוד. לדוגמה, הבעיה הידועה הבאה יכולה למנוע מ-TensorFlow לזהות מעבדי GPU: TF 2.17.0 RC0 לא פועל עם מעבדי GPU.

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