איסוף והבנה של יומני NCCL/gIB

במאמר הזה מוסבר איך לאסוף ולנתח יומנים של NCCL/gIB כדי לפתור בעיות של יציבות וביצועים ב-AI Hypercomputer, כולל הנחיות להשגת הדברים הבאים:

  • איסוף יומני NCCL.
  • הסבר על המבנה של רשומות ביומן NCCL.
  • מוודאים שהתוספים NCCL/gIB נטענים בצורה תקינה.
  • בודקים שהגרסאות של NCCL ו-gIB נכונות.
  • פתרון בעיות של אזהרות ושגיאות נפוצות ב-NCCL.

איסוף יומני NCCL

אפשר להשתמש ביומני NVIDIA Collective Communications Library‏ (NCCL) כדי לנפות באגים בכשלים של NCCL. לכל ניפוי באגים שקשור ליציבות או לביצועים, צריך לאסוף יומנים של NCCL מכל רמות הרישום ביומן בזמן שמריצים את עומס העבודה הבעייתי. מומלץ להימנע מהצגת רשומות ביומן במסוף, כי נפח היומנים עלול למנוע את המשך העבודה.

כדי לאסוף יומנים של NCCL, מגדירים את משתני הסביבה הבאים:

NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,ENV,GRAPH,NET,COLL,TUNING
NCCL_DEBUG_FILE=DESIRED_PATH/nccl_logs.VM_NAME.RANK_PROCESS_ID

מחליפים את מה שכתוב בשדות הבאים:

DESIRED_PATH: הנתיב שבו רוצים לאחסן את קובצי היומן.

VM_NAME: שם המכונה הווירטואלית

RANK_PROCESS_ID: מזהה התהליך של הדירוג

הפורמט של יומן NCCL

יומני NCCL נראים כך:

# A sample log entry from NCCL core.
a3ultra-vm-0:606:642 [6] NCCL INFO Using network gIB

# A sample log entry from the gIB network plugin.
a3ultra-vm-0:606:642 [6] NCCL INFO NET/gIB : Initializing gIB v1.0.2

ללא קשר למקור שלהם, ליומני NCCL יש קידומת שנראית כך:

<VM name>:<pid>:<tid> [<GPU device ID>] <log level> <log content>

מוודאים שהתוספים NCCL/gIB נטענים בצורה תקינה

‫NCCL/gIB מורכב מכמה תוספים שפותחו על ידי Google. אם טעינת הפלאגינים נכשלת, הביצועים עלולים להיות נמוכים, ובמקרים מסוימים עלולות להתרחש שגיאות חמורות.

כדי להבטיח את התכונות העדכניות ביותר, את הביצועים הטובים ביותר ואת היציבות הגבוהה ביותר, מומלץ להשתמש ב-NCCL שמצורף לחבילת ההתקנה של gIB. אם אתם בוחרים להשתמש בגרסה מותאמת אישית של NCCL לצורך בדיקה, כמו גרסת NCCL שמצורפת למסגרת הלמידה החישובית שבחרתם, אתם צריכים גם להתקין את חבילת nccl-gib-plugins.

פלאגין לרשת (libnccl-net.so)

אם התוסף gIB network נטען בצורה תקינה, אמורות להופיע רשומות ביומן NCCL שדומות לאלה:

... NCCL INFO Using network gIB

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

# Cannot find the gIB network plugin.
... NCCL INFO NET/Plugin: Could not find: libnccl-net.so. Using internal network plugin.

# Using the built-in TCP plugin.
... NCCL INFO Using network Socket

# Using the built-in IB plugin.
... NCCL INFO Using network IB

פלאגין של טיונר (libnccl-tuner.so)

אם התוסף gIB tuner נטען בצורה תקינה, אמורים להופיע רשומות ביומן של NCCL שדומות לרשומות הבאות:

NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v3 symbol.
NCCL INFO TUNER/Plugin: Using tuner plugin A3xTunerPlugin_v2

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

NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v2 symbol, using internal tuner instead.

הפלאגין CollNet

למרות שרשומות היומן האלה מצביעות על כשל, הן צפויות ולא צריכות לעורר דאגה:

NCCL INFO NET/Plugin: Failed to find ncclCollNetPlugin_v8 symbol.
NCCL INFO NET/Plugin: Failed to find ncclCollNetPlugin symbol (>= v5). ncclCollNetPlugin symbols v4 and lower are not supported.

בדיקת הגרסה של NCCL ו-gIB

כדי להבטיח את התכונות העדכניות ביותר, את הביצועים הטובים ביותר ואת היציבות הגבוהה ביותר, מומלץ להשתמש ב-NCCL שמצורף לחבילת ההתקנה של gIB. עם זאת, אפשר לבחור להשתמש בגרסה מותאמת אישית של NCCL לצורך בדיקה, כמו גרסת NCCL שמצורפת למסגרת הלמידה החישובית שבחרתם. במקרה כזה, צריך להתקין את החבילה nccl-gib-plugins.

כדי לבדוק את הגרסה של NCCL ו-gIB שבהן נעשה שימוש, מחפשים את הרשומות הבאות ביומן של NCCL:

# NCCL version.
... NCCL INFO NCCL version 2.23.4+cuda12.2

# gIB version.
... NCCL INFO NET/gIB : Initializing gIB v1.0.2

כדי לוודא שאתם מריצים את הגרסאות המומלצות, משווים בין הגרסאות של NCCL ו-gIB שרשומות ביומן לבין הגרסאות שכלולות בחבילה האחרונה של nccl-gib. מומלץ לעדכן את nccl-gib בכל הצמתים. אפשר לעיין במאמר בנושא התקנת NCCL/gIB.

אימות משתני הסביבה של NCCL/gIB

כדי להשיג ביצועים טובים של NCCL, אנחנו מספקים סקריפט שבו אפשר להשתמש כדי להגדיר את משתני הסביבה המומלצים של NCCL. לפני שמריצים את עומס העבודה, צריך להגדיר את הסקריפט באותה סביבה שבה מוגדר עומס העבודה. בתוך קובץ ההתקנה של NCCL/gIB, הסקריפט נמצא בנתיב /usr/local/gib/set_nccl_env.sh. אם לא משתמשים בסקריפט הזה, וכתוצאה מכך משתני הסביבה של NCCL מוגדרים בצורה שגויה, יכול להיות שכלי הבדיקה של תצורת gIB NCCL יסיים את עומס העבודה, ש-NCCL יקרוס או שהביצועים של NCCL יהיו נמוכים.

כדי לוודא שמשתני הסביבה של NCCL/gIB מוחלים בצורה נכונה, מחפשים רשומות ביומן של NCCL שדומות לרשומות הבאות:

# Explicitly set values.
... NCCL INFO NCCL_P2P_PCI_CHUNKSIZE set by environment to 131072.

# Using default values because the set value is invalid.
... NCCL INFO Invalid value INVALID_VALUE for NCCL_P2P_PCI_CHUNKSIZE, using default 131072.

משווים את הערכים הבאים למשתני הסביבה המומלצים של NCCL.

בדיקת מניפסט של עומס עבודה ב-GKE

ב-GKE, למניפסט של עומס העבודה ב-Kubernetes יש כמה הגדרות נדרשות כדי להשתמש ב-NCCL/gIB בצורה חלקה:

  • קובץ המניפסט צריך לטעון את קובצי ה-NCCL/gIB הבינאריים מ-/home/kubernetes/bin/gib ב-VM אל /usr/local/gib במאגר של עומס העבודה. שימו לב: /home/kubernetes/bin/nvidia במכונה הווירטואלית מותקן אוטומטית ב-/usr/local/nvidia במאגר של עומס העבודה.
  • במאגר של עומס העבודה צריך להגדיר את LD_LIBRARY_PATH ל-/usr/local/gib/lib64:/usr/local/nvidia/lib64.
  • צריך להגדיר באשכול ובמאגרי הצמתים את התכונה 'רישות מרובה' של GKE, ומניפסט העומס צריך לכלול את הערות הרישות המרובה כדי שלא יהיה צורך להגדיר את hostNetwork: true.

מניפסט של עומס עבודה בפועל ב-Kubernetes ב-GKE נראה בערך כך:

...
metadata:
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"gvnic-1"},
        {"interfaceName":"gpu0rdma0","network":"rdma-0"},
        {"interfaceName":"gpu1rdma0","network":"rdma-1"},
        {"interfaceName":"gpu2rdma0","network":"rdma-2"},
        {"interfaceName":"gpu3rdma0","network":"rdma-3"},
        {"interfaceName":"gpu4rdma0","network":"rdma-4"},
        {"interfaceName":"gpu5rdma0","network":"rdma-5"},
        {"interfaceName":"gpu6rdma0","network":"rdma-6"},
        {"interfaceName":"gpu7rdma0","network":"rdma-7"}
      ]
spec:
  volumes:
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
...
containers:
  - name: my-container
    volumeMounts:
      - name: gib
     mountPath: /usr/local/gib
    env:
      - name: LD_LIBRARY_PATH
        value: /usr/local/gib/lib64:/usr/local/nvidia/lib64
    resources:
      limits:
        nvidia.com/gpu: 8

בדיקת טבלת ה-GID

ב-RoCE, טבלת המזהים הגלובליים (GID) משמשת לטיפול ייחודי בתנועת נתונים של RDMA. אם טבלת ה-GID פגומה, לא יכולה לעבור תנועת RDMA.

אנחנו מספקים סקריפט show_gids.sh להצגת טבלת ה-GID. בתוכנת ההתקנה, הוא נמצא ב-/usr/local/gib/scripts. אם השתמשתם בכלי ההתקנה שלנו ללא שינויים, הוא מותקן ב-/var/lib/gib/scripts במכונה הווירטואלית.

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

DEV     PORT  INDEX  GID                                      IPv4         VER  DEV
---     ----  -----  ---                                      ----         ---  ---
mlx5_0  1     0      fe80:0000:0000:0000:689c:b8ff:fedf:3b01               v1   gp0rdma0
mlx5_0  1     1      fe80:0000:0000:0000:689c:b8ff:fedf:3b01               v2   gp0rdma0
mlx5_0  1     2      0000:0000:0000:0000:0000:ffff:c0a8:0202  192.168.2.2  v1   gp0rdma0
mlx5_0  1     3      0000:0000:0000:0000:0000:ffff:c0a8:0202  192.168.2.2  v2   gp0rdma0
...

בודקים את הפלט ומאשרים את הפרטים הבאים:

  • בטבלת ה-GID יש את המספר הנכון של רשומות:
    • ב-A3 Ultra או ב-A4, ‏ 32 רשומות עם 4 רשומות לכל CX-7.
    • ב-A3 Mega, ‏ 32 רשומות עם 4 רשומות לכל CX-7.
    • ‫A3 High (8 GPUs), ‏ 16 רשומות עם 4 רשומות לכל CX-7.
    • ב-A4X, יש 16 רשומות עם 4 רשומות לכל CX-7.
  • רשומות ה-GID של כל CX-7 הן באינדקסים 0, 1, 2 ו-3.
  • בכל CX-7, האינדקסים 2 ו-3 מכילים כתובת IPv4, וכתובת ה-IP הזו תואמת לכתובת ה-IPv4 של המכשיר (לדוגמה, מ-ip a).

אם אחד מהפריטים האלה הוא false, סימן שטבלת ה-GID פגומה. כדאי להפעיל מחדש את המכונה הווירטואלית או את מנהל הרשת במערכת ההפעלה האורחת.

אזהרות NCCL

בלוגים של NCCL יש כמה רמות, והאזהרות של NCCL ‏ (NCCL WARN) הן החמורות ביותר. אזהרות של NCCL מצביעות בדרך כלל על כשלים, שיכולים להיות קריטיים או לא קריטיים. ל-NCCL אין רמת יומן שגורמת להפסקת עומס העבודה באופן אוטומטי.

לא ניתן לטעון אובייקט ששותף

השגיאה הבאה מתרחשת כשאי אפשר לטעון אובייקט משותף בגלל ההגדרה שלכם.

error while loading shared libraries: libnccl.so.2: cannot open shared object file: No such file or directory

כדי לפתור את הבעיה:

  1. מוודאים שהאובייקט ששותף מותקן בסביבה שלכם.
  2. מוודאים שהספרייה של האובייקט המשותף נמצאת במשתנה הסביבה $LD_LIBRARY_PATH.

מיפוי הפלח מאובייקט משותף נכשל

השגיאה הבאה מתרחשת כשהספרייה של האובייקט המשותף לא ניתנת להרצה.

error while loading shared libraries: libnccl.so.2: failed to map segment from shared object: Operation not permitted

כדי לפתור את הבעיה, מריצים את הפקודות הבאות (בדוגמאות האלה מניחים שקבצי ה-gIB הבינאריים מותקנים ב-/var/lib/gib במכונות הווירטואליות):

sudo mount --bind /var/lib/gib /var/lib/gib
sudo mount -o remount,exec /var/lib/gib

כלי לבדיקת הגדרות אורח לא מוצא קובץ הגדרות

רשומות ביומן כמו אלה מופיעות כשבודק ההגדרות לא מוצא קובץ הגדרה לשימוש.

... NCCL WARN cannot find config file at default paths; you must specify NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE

... NCCL WARN NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE does not exist: /path/to/guest_config.txtpb

כדי לפתור את הבעיה, אפשר להגדיר את משתנה הסביבה NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE כך שיצביע על המיקום של guest_config.txtpb. מיקום ברירת המחדל של קובץ התצורה של NCCL/gIB בתוכנת ההתקנה הוא /usr/local/gib/configs/guest_config.txtpb.

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

השגיאות הבאות מתרחשות כשמשתני הסביבה של NCCL/gIB לא מוגדרים כמומלץ.

# The guest Config Checker enforcing an environment variable.
# This ends the workload.
... NCCL WARN NCCL/NET (shim) mismatch enforced: NCCL_P2P_NVL_CHUNKSIZE=524288 (expected 262144)

# The guest Config Checker recommending an environment variable.
# This does not end the workload.
... NCCL WARN NCCL/NET (shim) mismatch recommended: NCCL_MAX_P2P_NCHANNELS=8 (expected unset)

כדי לפתור את הבעיה:

  1. פועלים לפי ההנחיות ביומני Config Checker של האורח.
  2. מאמתים את משתני הסביבה של NCCL/gIB.

הכלי להגדרת ערוצים לא מוצא קובץ הגדרה

השגיאה הבאה מתרחשת כשתוסף הכוונון לא מצליח למצוא קובץ הגדרה לשימוש.

... NCCL WARN No NCCL_TUNER_CONFIG_PATH provided. Please populate NCCL_TUNER_CONFIG_PATH to use config-based tuner plugin.

כדי לפתור את הבעיה:

  1. מגדירים את משתנה הסביבה NCCL_TUNER_CONFIG_PATH כך שיצביע על המיקום של tuner_config.txtpb. מיקום ברירת המחדל של קובץ התצורה של NCCL/gIB בתוכנת ההתקנה הוא /usr/local/gib/configs/guest_config.txtpb.
  2. מאמתים את משתני הסביבה של NCCL/gIB.

הגרסה של glibc לא מספיקה

השגיאה הבאה מתרחשת כשגרסת ה-glibc המקומית של ההפצה ישנה מדי, לרוב כי הפצת ה-Linux בסביבה המקומית ישנה מדי. קובצי ה-binary של NCCL/gIB דורשים את גרסת glibc 2.29.

/usr/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /usr/local/gib/lib64/libnccl.so.2)

כדי לפתור את הבעיה, צריך לשדרג את הפצת התמונות (לדוגמה, Ubuntu 20.04 ואילך, RockyLinux 9 ואילך).

ההודעה נחתכה

השגיאה הבאה מתרחשת כשמשתמשים בגרסאות מעורבות של NCCL בדרגות שונות.

... NCCL WARN Message truncated : received ### bytes instead of ###

כדי לפתור את הבעיה, צריך לבדוק את הגרסה של NCCL ושל gIB. אם אתם משתמשים ב-GKE, צריך לבדוק או להתקין מחדש את daemonset של NCCL/gIB (ראו הוראות ל-A3U ול-A4 או הוראות ל-A4X).

‫libibverbs לא יכול לטעון את הגדרות הספק

השגיאה הבאה מתרחשת אם לא העליתם את הספרייה שמכילה קבצים בינאריים של gIB אל /usr/local/gib. הפעולה הזו לא תגרום לכשל בעומס העבודה. עם זאת, NCCL חוזר לשימוש ב-TCP, וזה עלול לגרום לביצועים נמוכים.

libibverbs: Warning: couldn't open config directory '/usr/local/gib/rdma-core/build/etc/libibverbs.d'.

כדי לפתור את הבעיה, אם אתם משתמשים ב-GKE, בדקו את מניפסט העומס שלכם.

שגיאות ibv_modify_qp

יכולות להיות כמה שגיאות שיתרחשו בזמן שהתוסף gIB network מכין את ה-QP לעסקאות רשת בפועל.

ארגומנט לא תקף (errno 22)

השגיאה הבאה מתרחשת בגלל אחת מהסיבות הבאות:

  1. בצד השני של התור יש טבלת GID פגומה.
  2. ההגדרות של משתני הסביבה של NCCL/gIB שגויות, במיוחד NCCL_IB_GID_INDEX, NCCL_IB_TC ו-NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22

כדי לפתור את הבעיה:

  1. מחפשים שגיאות אחרות של ibv_modify_qp עם החתימה No data available error 61 ופועלים לפי הוראות ההקלה לשגיאה 61.
  2. מאמתים את משתני הסביבה של NCCL/gIB.

אין נתונים זמינים (errno 61)

השגיאה הבאה מתרחשת בגלל אחת מהסיבות הבאות:

  1. ב-VM הזה יש טבלת GID פגומה.
  2. ההגדרות של משתני הסביבה של NCCL/gIB שגויות, במיוחד NCCL_IB_GID_INDEX, NCCL_IB_TC ו-NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61

כדי לפתור את הבעיה, צריך קודם לבדוק מה הגורם לה:

  1. בודקים את טבלת ה-GID.
  2. אימות משתני הסביבה של NCCL/gIB.

אם טבלת ה-GID פגומה, אפשר לנסות את הפתרונות הבאים:

  1. (פתרון לטווח קצר) מפעילים מחדש את מנהל הרשת (לדוגמה, networkd) במכונה הווירטואלית עד שכתובת ה-IP של הממשק הבעייתי מתעדכנת.
    1. אפשר להפעיל מחדש את networkd ב-VM באמצעות sudo systemctl restart systemd-networkd.
    2. אפשר לראות את כתובת ה-IP של כל הממשקים באמצעות ip a.
    3. בודקים שטבלת ה-GID שוחזרה.
  2. כדי לקבל עזרה במציאת פתרון לטווח ארוך, אפשר לפנות לתמיכה של Google.

תם פרק הזמן שהוקצב להתחברות (מספר השגיאה 110)

השגיאה הבאה מתרחשת כשיש בעיה בסיסית בקישוריות בין המכונות הווירטואליות.

... NCCL WARN Call to ibv_modify_qp failed with error Connection timed out errno 110

כדי לפתור את הבעיה, אפשר לפנות לתמיכה של Google.

QP Got Completion with Error

השגיאה הבאה מתרחשת בגלל אחת מהסיבות הבאות:

  1. בעיות בחיבור RDMA (שינויים במצב הקישור, וכו').
  2. ההגדרות של משתני הסביבה של NCCL/gIB לא תקינות, במיוחד NCCL_IB_TIMEOUT ו-NCCL_IB_RETRY_CNT.
... NCCL WARN NET/gIB : Got completion from peer 192.168.0.9<55224> with status=12 opcode=0 len=0 vendor err 129 (Recv) localGid ::ffff:192.168.3.6 remoteGids::ffff:192.168.3.9

כדי לפתור את הבעיה, אפשר לפנות לתמיכה של Google.