פתרון בעיות במשימת 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-tesla-t4,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. אחרי שמתחברים למכונה הווירטואלית באמצעות ssh, מריצים את הפקודות הבאות במכונה הווירטואלית:

    # 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
    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. מידע נוסף זמין במאמר הגדרת מודל הקצאת הרשאות.

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

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

אין שימוש ב-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.

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