Recopila y comprende los registros de NCCL/gIB para solucionar problemas

En este documento, se describe cómo recopilar e interpretar los registros de NCCL/gIB para solucionar problemas de estabilidad y rendimiento en AI Hypercomputer, y se incluye orientación para lograr lo siguiente:

  • Recopila registros de NCCL.
  • Comprende la estructura de las entradas de registro de NCCL.
  • Verifica que los complementos de NCCL/gIB se carguen correctamente.
  • Verifica que las versiones de NCCL y gIB sean correctas.
  • Soluciona problemas relacionados con advertencias y errores comunes de NCCL.

Recopila registros de NCCL

Puedes usar los registros de la biblioteca de comunicación colectiva de NVIDIA (NCCL) para depurar las fallas de NCCL. Para cualquier depuración de estabilidad o rendimiento, recopila registros de NCCL de todos los niveles de registro mientras ejecutas la carga de trabajo problemática. Evita volcar entradas de registro en la consola, ya que el gran volumen de registros puede impedir que el trabajo continúe.

Para recopilar registros de NCCL, configura las siguientes variables de entorno:

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

Reemplaza lo siguiente:

DESIRED_PATH: la ruta de acceso en la que deseas almacenar tus archivos de registro

VM_NAME: El nombre de la VM

RANK_PROCESS_ID: Es el ID del proceso del rango.

Formato de registro de NCCL

Los registros de NCCL son similares a los siguientes:

# 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

Independientemente de su fuente, los registros de NCCL tienen un prefijo similar al siguiente:

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

Verifica que los complementos de NCCL/gIB se carguen correctamente

NCCL/gIB se compone de varios complementos desarrollados por Google. Si no se carga alguno de los complementos, el rendimiento puede ser deficiente y, en algunos casos, pueden producirse errores fatales.

Complemento de red (libnccl-net.so)

Si el complemento de red de gIB se carga correctamente, deberías ver entradas de registro de NCCL similares a las siguientes:

... NCCL INFO Using network gIB

Si ves entradas de registro similares a cualquiera de las siguientes, sigue los pasos de la sección No se puede cargar un objeto compartido para solucionar el problema.

# 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

Complemento del sintonizador (libnccl-tuner.so)

Si el complemento del sintonizador de gIB se carga correctamente, deberías ver entradas de registro de NCCL similares a las siguientes:

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

Si ves una entrada de registro similar a la siguiente, sigue los pasos de la sección No se puede cargar un objeto compartido para solucionar el problema.

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

Complemento de CollNet

Si bien estas entradas de registro indican una falla, son esperadas y no son motivo de preocupación:

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.

Verifica la versión de NCCL y gIB

Te recomendamos que uses la biblioteca NCCL incluida en el instalador de gIB para garantizar las funciones más recientes, el mejor rendimiento y la mayor estabilidad. Sin embargo, puedes optar por usar una versión personalizada de NCCL para las pruebas, como una versión de NCCL que se incluya en el framework de aprendizaje automático que elijas.

Para verificar la versión de NCCL y gIB que se usa, busca las siguientes entradas de registro de NCCL:

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

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

Verifica las variables de entorno de NCCL/gIB

Para lograr un buen rendimiento de NCCL, proporcionamos una secuencia de comandos que puedes usar para establecer las variables de entorno de NCCL recomendadas. Antes de ejecutar tu carga de trabajo, obtén la secuencia de comandos en el mismo entorno que la carga de trabajo. En el instalador de NCCL/gIB, la secuencia de comandos se encuentra en /usr/local/gib/set_nccl_env.sh. Si no usas esta secuencia de comandos y, como resultado, las variables de entorno de NCCL se configuran de forma incorrecta, es posible que el verificador de configuración de NCCL de gIB finalice la carga de trabajo, que NCCL falle o que el rendimiento de NCCL sea deficiente.

Para verificar que las variables de entorno de NCCL/gIB se apliquen correctamente, busca entradas de registro de NCCL similares a las siguientes:

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

Compara los siguientes valores con las variables de entorno de NCCL recomendadas.

Verifica el manifiesto de la carga de trabajo de GKE

En GKE, el manifiesto de carga de trabajo de Kubernetes tiene varios parámetros de configuración obligatorios para consumir NCCL/gIB sin problemas:

  • El manifiesto debe activar los archivos binarios de NCCL/gIB desde /home/kubernetes/bin/gib en la VM hasta /usr/local/gib en el contenedor de la carga de trabajo. Ten en cuenta que /home/kubernetes/bin/nvidia en la VM se activa automáticamente en /usr/local/nvidia en tu contenedor de carga de trabajo.
  • El contenedor de carga de trabajo debe establecer LD_LIBRARY_PATH en /usr/local/gib/lib64:/usr/local/nvidia/lib64.
  • Tu clúster y tus grupos de nodos deben tener configurada la función de redes múltiples de GKE, y el manifiesto de tu carga de trabajo debe incluir las anotaciones de redes múltiples para evitar la necesidad de configurar hostNetwork: true.

Un manifiesto de carga de trabajo de Kubernetes real en GKE es similar al siguiente:

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

Verifica la tabla de GID

En RoCE, la tabla de identificadores globales (GID) se usa para direccionar de forma única el tráfico de RDMA. Si la tabla de GID está dañada, no se puede pasar tráfico de RDMA.

Proporcionamos un script show_gids.sh para mostrar la tabla de GID. En el instalador, se encuentra en /usr/local/gib/scripts. Si usaste nuestro instalador sin modificaciones, se instalará en /var/lib/gib/scripts en la VM.

A medida que ejecutes la secuencia de comandos en la VM, deberías ver un resultado similar al siguiente:

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

Revisa el resultado y confirma lo siguiente:

  • La tabla de GID tiene la cantidad correcta de entradas:
    • En el caso de A3 Ultra o A4, 32 entradas con 4 entradas por CX-7.
    • En el caso de A3 Mega, 32 entradas con 4 entradas por CX-7.
    • Para A3 High (8 GPUs), 16 entradas con 4 entradas por CX-7.
    • En el caso del A4X, 16 entradas con 4 entradas por CX-7.
  • Las entradas del GID de cada CX-7 tienen los índices 0, 1, 2 y 3.
  • Para cada CX-7, los índices 2 y 3 tienen una dirección IPv4, y esa dirección IP coincide con la IPv4 de ese dispositivo (por ejemplo, de ip a).

Si alguno de estos elementos es falso, la tabla de GID está dañada. Considera reiniciar la VM o el administrador de red en tu SO invitado.

Advertencias de NCCL

Los registros de NCCL tienen varios niveles, y las advertencias de NCCL (NCCL WARN) son las más graves. Por lo general, las advertencias de NCCL indican fallas, que pueden ser fatales o no. NCCL no tiene un nivel de registro que detenga automáticamente la carga de trabajo.

No se puede cargar un objeto compartido

El siguiente error se produce cuando no se puede cargar un objeto compartido debido a tu configuración.

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

Para resolver el problema, sigue estos pasos:

  1. Asegúrate de que el objeto compartido esté instalado en tu entorno.
  2. Asegúrate de que el directorio del objeto compartido esté en la variable de entorno $LD_LIBRARY_PATH.

No se pudo asignar el segmento del objeto compartido

El siguiente error se produce cuando el directorio del objeto compartido no es ejecutable.

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

Para resolver el problema, ejecuta los siguientes comandos (en estos ejemplos, se supone que los archivos binarios de gIB están instalados en /var/lib/gib en las VMs):

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

El verificador de configuración de invitado no puede encontrar un archivo de configuración

Las entradas de registro como estas aparecen cuando el verificador de configuración invitado no puede encontrar un archivo de configuración para usar.

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

Para resolver el problema, puedes configurar la variable de entorno NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE para que apunte a la ubicación de guest_config.txtpb. La ubicación predeterminada del instalador de NCCL/gIB para el archivo de configuración es /usr/local/gib/configs/guest_config.txtpb.

No te recomendamos que inhabilite el verificador de configuración de invitado, ya que ayuda a garantizar las prácticas recomendadas y la configuración adecuada. Sin embargo, si es necesario, puedes inhabilitar el verificador de configuración invitado configurando la variable de entorno NCCL_SHIMNET_SHIM_LAYERS en UNUSED.

Los siguientes errores se producen cuando las variables de entorno de NCCL/gIB no se configuran según lo recomendado.

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

Para resolver el problema, sigue estos pasos:

  1. Sigue las instrucciones de los registros del verificador de configuración de invitado.
  2. Verifica las variables de entorno de NCCL/gIB.

El sintonizador no puede encontrar un archivo de configuración

El siguiente error se produce cuando el complemento del sintonizador no puede encontrar un archivo de configuración para usar.

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

Para resolver el problema, sigue estos pasos:

  1. Establece la variable de entorno NCCL_TUNER_CONFIG_PATH para que apunte a la ubicación de tuner_config.txtpb. La ubicación predeterminada del instalador de NCCL/gIB para el archivo de configuración es /usr/local/gib/configs/guest_config.txtpb.
  2. Verifica las variables de entorno de NCCL/gIB.

Versión de glibc insuficiente

El siguiente error se produce cuando la versión de glibc local de tu distribución es demasiado antigua, probablemente porque la distribución de Linux en tu entorno local es demasiado antigua. Los objetos binarios de NCCL/gIB requieren la versión 2.29 de glibc.

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

Para resolver el problema, actualiza la distribución de la imagen (por ejemplo, Ubuntu 20.04 o versiones posteriores, RockyLinux 9 o versiones posteriores).

Mensaje truncado

El siguiente error ocurre cuando usas versiones mixtas de NCCL en diferentes rangos.

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

Para resolver el problema, verifica tu versión de NCCL y gIB. Si usas GKE, verifica o reinstala el DaemonSet del instalador de NCCL/gIB (consulta las instrucciones para A3U y A4 o las instrucciones para A4X).

libibverbs no puede cargar la configuración del proveedor

El siguiente error ocurre cuando no montaste el directorio que contiene los archivos binarios de gIB en /usr/local/gib. Esto no causará una falla en la carga de trabajo. Sin embargo, NCCL recurre al uso de TCP y puede causar un rendimiento deficiente.

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

Para resolver el problema, si usas GKE, verifica el manifiesto de tu carga de trabajo.

Errores de ibv_modify_qp

Puedes encontrarte con varios errores mientras el complemento de red de gIB prepara los QP para las transacciones de red reales.

Argumento no válido (errno 22)

El siguiente error ocurre por uno de los siguientes motivos:

  1. El otro extremo de la QP tiene una tabla de GID dañada.
  2. Las variables de entorno de NCCL/gIB están mal configuradas, en especial NCCL_IB_GID_INDEX, NCCL_IB_TC y NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22

Para resolver el problema, sigue estos pasos:

  1. Busca otros errores ibv_modify_qp con la firma No data available error 61 y sigue las instrucciones de mitigación para el error 61.
  2. Verifica las variables de entorno de NCCL/gIB.

No hay datos disponibles (errno 61)

El siguiente error ocurre por uno de los siguientes motivos:

  1. Esta VM tiene una tabla de GID dañada.
  2. Las variables de entorno de NCCL/gIB están mal configuradas, en especial NCCL_IB_GID_INDEX, NCCL_IB_TC y NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61

Para resolver el problema, primero verifica la causa:

  1. Verifica la tabla de GID.
  2. Verifica las variables de entorno de NCCL/gIB.

Si la tabla de GID está dañada, prueba las siguientes mitigaciones:

  1. (A corto plazo) Reinicia el administrador de red (por ejemplo, networkd) en la VM hasta que se actualice la dirección IP de la interfaz problemática.
    1. Puedes reiniciar networkd en la VM con sudo systemctl restart systemd-networkd.
    2. Puedes ver la dirección IP de todas las interfaces con ip a.
    3. Verifica que se haya recuperado la tabla de GID.
  2. Comunícate con el equipo de Atención al cliente de Google para obtener ayuda con una solución a largo plazo.

Se agotó el tiempo de espera de la conexión (errno 110)

El siguiente error se produce cuando hay un problema de conectividad básico entre las VMs.

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

Para resolver el problema, comunícate con el equipo de Atención al cliente de Google.

QP Got Completion with Error

El siguiente error ocurre por uno de los siguientes motivos:

  1. Problemas subyacentes de conexión RDMA (fluctuaciones de vínculos, etc.).
  2. Las variables de entorno de NCCL/gIB están mal configuradas, en especial NCCL_IB_TIMEOUT y 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

Para resolver el problema, comunícate con el equipo de Atención al cliente de Google.