문제 해결을 위해 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: VM 이름

RANK_PROCESS_ID: 순위의 프로세스 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에서 개발한 여러 플러그인으로 구성됩니다. 플러그인을 로드하지 못하면 성능이 저하될 수 있으며, 심각한 오류가 발생할 수도 있습니다.

네트워크 플러그인 (libnccl-net.so)

gIB 네트워크 플러그인이 올바르게 로드되면 다음과 비슷한 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 튜너 플러그인이 올바르게 로드되면 다음과 비슷한 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 버전 확인

최신 기능, 최적의 성능, 최고의 안정성을 보장하려면 gIB 설치 프로그램과 함께 번들로 제공되는 NCCL을 사용하는 것이 좋습니다. 하지만 선택한 머신러닝 프레임워크와 번들로 제공되는 NCCL 버전과 같은 테스트용 맞춤 NCCL 버전을 사용할 수 있습니다.

사용된 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 성능을 높이기 위해 권장되는 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를 원활하게 사용하기 위한 몇 가지 필수 설정이 있습니다.

  • 매니페스트는 VM의 /home/kubernetes/bin/gib에서 워크로드 컨테이너의 /usr/local/gib로 NCCL/gIB 바이너리를 마운트해야 합니다. VM의 /home/kubernetes/bin/nvidia는 워크로드 컨테이너의 /usr/local/nvidia에 자동으로 마운트됩니다.
  • 워크로드 컨테이너는 LD_LIBRARY_PATH/usr/local/gib/lib64:/usr/local/nvidia/lib64로 설정해야 합니다.
  • 클러스터와 노드 풀에 GKE 멀티 네트워킹이 설정되어 있어야 하며, hostNetwork: true를 설정하지 않아도 되도록 워크로드 매니페스트에 멀티 네트워킹 주석이 포함되어 있어야 합니다.

GKE의 실제 Kubernetes 워크로드 매니페스트는 다음과 유사합니다.

...
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 트래픽이 전달될 수 없습니다.

GID 테이블을 표시하는 스크립트 show_gids.sh를 제공합니다. 설치 프로그램에서는 /usr/local/gib/scripts에 있습니다. 수정 없이 설치 프로그램을 사용한 경우 VM의 /var/lib/gib/scripts에 설치됩니다.

VM에서 스크립트를 실행하면 다음과 비슷한 출력이 표시됩니다.

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의 경우 CX-7당 항목 4개가 있는 항목 32개
    • A3 Mega의 경우 CX-7당 항목이 4개인 항목 32개
    • A3 High (GPU 8개)의 경우 CX-7당 항목 4개가 있는 항목 16개
    • A4X의 경우 CX-7당 4개의 항목이 있는 16개의 항목입니다.
  • 각 CX-7의 GID 항목에는 색인 0, 1, 2, 3이 있습니다.
  • 각 CX-7의 경우 인덱스 2와 3에 IPv4 주소가 있으며 이 IP 주소는 해당 기기의 IPv4와 일치합니다 (예: ip a에서).

이러한 항목 중 하나라도 거짓이면 GID 테이블이 손상된 것입니다. VM을 재부팅하거나 게스트 OS에서 네트워크 관리자를 다시 시작해 보세요.

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 바이너리가 VM의 /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_LAYERSUNUSED로 설정하여 게스트 구성 검사기를 사용 중지할 수 있습니다.

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. 게스트 구성 검사기 로그의 안내를 따릅니다.
  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 배포가 너무 오래되었기 때문일 가능성이 높습니다. 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를 사용하는 경우 NCCL/gIB 설치 프로그램 DaemonSet을 확인하거나 재설치하세요 (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 네트워크 플러그인이 실제 네트워크 트랜잭션을 위해 QP를 준비할 때 발생할 수 있는 오류가 여러 가지 있습니다.

잘못된 인수 (errno 22)

다음 오류는 다음 이유 중 하나로 인해 발생합니다.

  1. QP의 다른 쪽 끝에 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. 서명 No data available error 61이 있는 다른 ibv_modify_qp 오류를 찾아 오류 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. (단기) 문제가 있는 인터페이스의 IP 주소가 새로고침될 때까지 VM에서 네트워크 관리자 (예: networkd)를 다시 시작합니다.
    1. sudo systemctl restart systemd-networkd을 사용하여 VM에서 networkd을 다시 시작할 수 있습니다.
    2. ip a를 사용하여 모든 인터페이스의 IP 주소를 확인할 수 있습니다.
    3. GID 테이블이 복구되었는지 확인합니다.
  2. 장기적인 해결 방법을 지원받으려면 Google 지원팀에 문의하세요.

연결 시간 초과 (errno 110)

VM 간에 기본적인 연결 문제가 있는 경우 다음 오류가 발생합니다.

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

이 문제를 해결하려면 Google 지원팀에 문의하여 도움을 받으세요.

QP에 오류가 발생하여 완료됨

다음 오류는 다음 이유 중 하나로 인해 발생합니다.

  1. 기본 RDMA 연결 문제 (링크 플랩 등)
  2. NCCL/gIB 환경 변수가 잘못 구성되었습니다(특히 NCCL_IB_TIMEOUTNCCL_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 지원팀에 문의하여 도움을 받으세요.