Mengumpulkan dan memahami log NCCL/gIB untuk pemecahan masalah

Dokumen ini menjelaskan cara mengumpulkan dan menafsirkan log NCCL/gIB untuk memecahkan masalah stabilitas dan performa di AI Hypercomputer, termasuk panduan tentang cara mencapai hal berikut:

  • Kumpulkan log NCCL.
  • Memahami struktur entri log NCCL.
  • Pastikan plugin NCCL/gIB dimuat dengan benar.
  • Pastikan versi NCCL dan gIB sudah benar.
  • Memecahkan masalah peringatan dan error NCCL umum.

Mengumpulkan log NCCL

Anda dapat menggunakan log NVIDIA Collective Communications Library (NCCL) untuk men-debug kegagalan NCCL. Untuk men-debug stabilitas atau performa, kumpulkan log NCCL dari semua tingkat logging saat Anda menjalankan workload yang bermasalah. Hindari mencetak entri log ke konsol, karena volume log yang sangat besar dapat mencegah tugas dilanjutkan.

Untuk mengumpulkan log NCCL, tetapkan variabel lingkungan berikut:

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

Ganti kode berikut:

DESIRED_PATH: jalur tempat Anda ingin menyimpan file log

VM_NAME: Nama VM

RANK_PROCESS_ID: ID proses peringkat

Format log NCCL

Log NCCL mirip dengan berikut ini:

# 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

Terlepas dari sumbernya, log NCCL memiliki awalan yang mirip dengan berikut ini:

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

Memastikan plugin NCCL/gIB dimuat dengan benar

NCCL/gIB terdiri dari beberapa plugin yang dikembangkan Google. Kegagalan memuat salah satu plugin dapat menyebabkan performa yang buruk, dan dalam beberapa kasus, error fatal.

Plugin jaringan (libnccl-net.so)

Jika plugin jaringan gIB dimuat dengan benar, Anda akan melihat entri log NCCL yang mirip dengan berikut ini:

... NCCL INFO Using network gIB

Jika Anda melihat entri log yang mirip dengan salah satu entri berikut, gunakan langkah-langkah di bagian Objek bersama tidak dapat dimuat untuk memperbaiki masalah.

# 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

Plugin tuner (libnccl-tuner.so)

Jika plugin gIB tuner dimuat dengan benar, Anda akan melihat entri log NCCL yang mirip dengan berikut ini:

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

Jika Anda melihat entri log yang mirip dengan berikut ini, gunakan langkah-langkah di bagian Objek bersama tidak dapat dimuat untuk memperbaiki masalah.

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

Plugin CollNet

Meskipun entri log ini menunjukkan kegagalan, hal ini sudah diperkirakan dan bukan merupakan penyebab kekhawatiran:

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.

Periksa versi NCCL dan gIB

Sebaiknya gunakan NCCL yang disertakan dengan penginstal gIB untuk memastikan fitur terbaru, performa terbaik, dan stabilitas maksimal. Namun, Anda dapat memilih untuk menggunakan versi NCCL kustom untuk pengujian, seperti versi NCCL yang dibundel dengan framework machine learning pilihan Anda.

Untuk memeriksa versi NCCL dan gIB yang digunakan, cari entri log NCCL berikut:

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

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

Verifikasi variabel lingkungan NCCL/gIB

Untuk mencapai performa NCCL yang baik, kami menyediakan skrip yang dapat Anda gunakan untuk menyetel variabel lingkungan NCCL yang direkomendasikan. Sebelum menjalankan workload, jalankan skrip di lingkungan yang sama dengan workload. Dalam penginstal NCCL/gIB, skrip berada di /usr/local/gib/set_nccl_env.sh. Jika Anda tidak menggunakan skrip ini, dan akibatnya variabel lingkungan NCCL ditetapkan dengan tidak benar, ada kemungkinan bahwa gIB NCCL Config Checker akan menghentikan beban kerja, NCCL akan error, atau performa NCCL akan buruk.

Untuk memeriksa apakah variabel lingkungan NCCL/gIB diterapkan dengan benar, cari entri log NCCL yang mirip dengan berikut ini:

# 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.

Bandingkan nilai berikut dengan variabel lingkungan NCCL yang direkomendasikan.

Memeriksa manifes workload GKE

Di GKE, manifes workload Kubernetes Anda memiliki beberapa penyiapan yang diperlukan agar dapat menggunakan NCCL/gIB dengan lancar:

  • Manifes harus memasang biner NCCL/gIB dari /home/kubernetes/bin/gib di VM ke /usr/local/gib di container workload Anda. Perhatikan bahwa /home/kubernetes/bin/nvidia di VM otomatis di-mount ke /usr/local/nvidia di container workload Anda.
  • Container beban kerja Anda harus menetapkan LD_LIBRARY_PATH ke /usr/local/gib/lib64:/usr/local/nvidia/lib64.
  • Cluster dan node pool Anda harus telah menyiapkan multi-jaringan GKE, dan manifes workload Anda harus menyertakan anotasi multi-jaringan untuk menghindari kebutuhan akan setelan hostNetwork: true.

Manifes workload Kubernetes sebenarnya di GKE mirip dengan berikut ini:

...
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

Memeriksa tabel GID

Di RoCE, tabel ID global (GID) digunakan untuk menangani traffic RDMA secara unik. Jika tabel GID rusak, tidak ada traffic RDMA yang dapat diteruskan.

Kami menyediakan skrip show_gids.sh untuk menampilkan tabel GID. Di penginstal, file ini terletak di /usr/local/gib/scripts. Jika Anda menggunakan penginstal kami tanpa modifikasi, penginstal akan diinstal ke /var/lib/gib/scripts di VM.

Saat menjalankan skrip di VM, Anda akan melihat output yang mirip dengan berikut ini:

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
...

Tinjau output dan konfirmasi hal berikut:

  • Tabel GID memiliki jumlah entri yang tepat:
    • Untuk A3 Ultra atau A4, 32 entri dengan 4 entri per CX-7.
    • Untuk A3 Mega, 32 entri dengan 4 entri per CX-7.
    • Untuk A3 High (8 GPU), 16 entri dengan 4 entri per CX-7.
    • Untuk A4X, 16 entri dengan 4 entri per CX-7.
  • Entri GID setiap CX-7 memiliki indeks 0, 1, 2, dan 3.
  • Untuk setiap CX-7, indeks 2 dan 3 memiliki alamat IPv4, dan alamat IP tersebut cocok dengan IPv4 perangkat tersebut (misalnya dari ip a).

Jika salah satu item ini salah, tabel GID akan rusak. Pertimbangkan untuk me-reboot VM atau memulai ulang pengelola jaringan di OS tamu Anda.

Peringatan NCCL

Log NCCL memiliki beberapa tingkat, dengan peringatan NCCL (NCCL WARN) sebagai yang paling parah. Peringatan NCCL biasanya menunjukkan kegagalan, yang mungkin atau mungkin tidak fatal. NCCL tidak memiliki tingkat log yang otomatis menghentikan workload.

Objek bersama tidak dapat dimuat

Error berikut terjadi saat objek bersama tidak dapat dimuat karena penyiapan Anda.

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

Untuk mengatasi masalah ini:

  1. Pastikan objek bersama diinstal di lingkungan Anda.
  2. Pastikan direktori objek bersama berada dalam variabel lingkungan $LD_LIBRARY_PATH.

Gagal memetakan segmen dari objek bersama

Error berikut terjadi saat direktori objek bersama tidak dapat dieksekusi.

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

Untuk mengatasi masalah ini, jalankan perintah berikut (contoh ini mengasumsikan bahwa biner gIB diinstal di /var/lib/gib pada VM):

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

Pemeriksa Konfigurasi Tamu tidak dapat menemukan file konfigurasi

Entri log seperti ini muncul saat Pemeriksa Konfigurasi tamu tidak dapat menemukan file konfigurasi untuk digunakan.

... 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

Untuk mengatasi masalah ini, Anda dapat menetapkan variabel lingkungan NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE agar menunjuk ke lokasi guest_config.txtpb. Lokasi default penginstal NCCL/gIB untuk file konfigurasi adalah /usr/local/gib/configs/guest_config.txtpb.

Sebaiknya jangan nonaktifkan Pemeriksa Konfigurasi tamu karena membantu memastikan praktik terbaik dan konfigurasi yang tepat. Namun, jika perlu, Anda dapat menonaktifkan Pemeriksa Konfigurasi tamu dengan menyetel variabel lingkungan NCCL_SHIMNET_SHIM_LAYERS ke UNUSED.

Error berikut terjadi jika variabel lingkungan NCCL/gIB tidak ditetapkan seperti yang direkomendasikan.

# 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)

Untuk mengatasi masalah ini:

  1. Ikuti panduan log Pemeriksa Konfigurasi tamu.
  2. Verifikasi variabel lingkungan NCCL/gIB.

Tuner tidak dapat menemukan file konfigurasi

Error berikut terjadi saat plugin tuner tidak dapat menemukan file konfigurasi yang akan digunakan.

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

Untuk mengatasi masalah ini:

  1. Tetapkan variabel lingkungan NCCL_TUNER_CONFIG_PATH agar menunjuk ke lokasi tuner_config.txtpb. Lokasi default penginstal NCCL/gIB untuk file konfigurasi adalah /usr/local/gib/configs/guest_config.txtpb.
  2. Verifikasi variabel lingkungan NCCL/gIB.

Versi glibc tidak memadai

Error berikut terjadi saat versi glibc lokal distribusi Anda terlalu lama, kemungkinan besar karena distribusi Linux di lingkungan lokal Anda terlalu lama. Biner NCCL/gIB memerlukan glibc versi 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)

Untuk mengatasi masalah ini, upgrade distribusi image Anda (misalnya Ubuntu 20.04 atau yang lebih baru, RockyLinux 9 atau yang lebih baru).

Pesan terpotong

Error berikut terjadi saat Anda menggunakan versi NCCL campuran di seluruh peringkat.

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

Untuk mengatasi masalah ini, periksa Versi NCCL dan gIB Anda. Jika Anda menggunakan GKE, periksa atau instal ulang daemonset penginstal NCCL/gIB (lihat petunjuk untuk A3U dan A4 atau petunjuk untuk A4X).

libibverbs tidak dapat memuat konfigurasi penyedia

Error berikut terjadi jika Anda tidak memasang direktori yang berisi biner gIB ke /usr/local/gib. Hal ini tidak akan menyebabkan kegagalan beban kerja. Namun, NCCL akan kembali menggunakan TCP dan dapat menyebabkan performa yang buruk.

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

Untuk mengatasi masalah ini, jika Anda menggunakan GKE, periksa manifes workload Anda.

ibv_modify_qp errors

Ada sejumlah error yang dapat Anda temui saat plugin jaringan gIB menyiapkan QP untuk transaksi jaringan yang sebenarnya.

Argumen tidak valid (errno 22)

Error berikut terjadi karena salah satu alasan berikut:

  1. Ujung QP lainnya memiliki tabel GID yang rusak.
  2. Variabel lingkungan NCCL/gIB salah dikonfigurasi, terutama NCCL_IB_GID_INDEX, NCCL_IB_TC, dan NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22

Untuk mengatasi masalah ini:

  1. Cari error ibv_modify_qp lainnya dengan tanda tangan No data available error 61, lalu ikuti petunjuk mitigasi untuk error 61.
  2. Verifikasi variabel lingkungan NCCL/gIB.

Data tidak tersedia (errno 61)

Error berikut terjadi karena salah satu alasan berikut:

  1. VM ini memiliki tabel GID yang rusak.
  2. Variabel lingkungan NCCL/gIB salah dikonfigurasi, terutama NCCL_IB_GID_INDEX, NCCL_IB_TC, dan NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61

Untuk mengatasi masalah ini, periksa terlebih dahulu penyebabnya:

  1. Periksa tabel GID.
  2. Verifikasi variabel lingkungan NCCL/gIB.

Jika tabel GID rusak, coba mitigasi berikut:

  1. (Jangka pendek) Mulai ulang pengelola jaringan (misalnya networkd) di VM hingga alamat IP antarmuka yang bermasalah diperbarui.
    1. Anda dapat memulai ulang networkd di VM menggunakan sudo systemctl restart systemd-networkd.
    2. Anda dapat melihat alamat IP semua antarmuka menggunakan ip a.
    3. Periksa bahwa tabel GID telah dipulihkan.
  2. Hubungi Dukungan Google untuk mendapatkan bantuan terkait solusi jangka panjang.

Waktu koneksi habis (errno 110)

Error berikut terjadi jika ada masalah konektivitas dasar antar-VM.

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

Untuk menyelesaikan masalah ini, hubungi Dukungan Google untuk mendapatkan bantuan.

QP Mendapatkan Penyelesaian dengan Error

Error berikut terjadi karena salah satu alasan berikut:

  1. Masalah koneksi RDMA yang mendasarinya (link flapping, dll.).
  2. Variabel lingkungan NCCL/gIB salah dikonfigurasi, terutama NCCL_IB_TIMEOUT dan 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

Untuk menyelesaikan masalah ini, hubungi Dukungan Google untuk mendapatkan bantuan.