Recopila y comprende los registros de NCCL/gIB

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

  • Recopilar registros de NCCL
  • Comprender la estructura de las entradas de registro de NCCL
  • Verificar que los complementos de NCCL/gIB se carguen correctamente
  • Comprobar que las versiones de NCCL y gIB sean correctas
  • Solucionar problemas de 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 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: Es la ruta de acceso en la que deseas almacenar tus archivos de registro.

VM_NAME: Es el nombre de la VM.

RANK_PROCESS_ID: Es el ID de 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, se pueden producir errores fatales.

Te recomendamos que uses el NCCL incluido con el instalador de gIB para garantizar las funciones más recientes, el mejor rendimiento y la mayor estabilidad. Si eliges usar una versión personalizada de NCCL para realizar pruebas, como una versión de NCCL que se incluye con el framework de aprendizaje automático que elijas, también debes instalar el paquete nccl-gib-plugins.

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 alguna de las siguientes, usa 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 de sintonizador (libnccl-tuner.so)

Si el complemento de 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, usa 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

Aunque 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 el NCCL incluido con el instalador de gIB para garantizar las funciones más recientes, el mejor rendimiento y la mayor estabilidad. Sin embargo, puedes elegir usar una versión personalizada de NCCL para realizar pruebas, como una versión de NCCL que se incluye con el framework de aprendizaje automático que elijas. En ese caso, instala el paquete nccl-gib-plugins.

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

Para confirmar que estás ejecutando las versiones recomendadas, compara las versiones registradas de NCCL y gIB con las versiones incluidas en el paquete nccl-gib más reciente. Te recomendamos que mantengas nccl-gib actualizado en todos los nodos. Consulta Instala NCCL/gIB.

Verifica las variables de entorno de NCCL/gIB

Para lograr un buen rendimiento de NCCL, proporcionamos una secuencia de comandos que puedes usar para configurar 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. Dentro del 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 la carga de trabajo de Kubernetes tiene varias configuraciones obligatorias para consumir NCCL/gIB sin problemas:

  • El manifiesto debe activar los objetos binarios de NCCL/gIB desde /home/kubernetes/bin/gib en la VM a /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 el contenedor de la carga de trabajo.
  • El contenedor de la carga de trabajo debe establecer LD_LIBRARY_PATH en /usr/local/gib/lib64:/usr/local/nvidia/lib64.
  • Tu clúster y los grupos de nodos deben tener configurada la red múltiple de GKE, y el manifiesto de la carga de trabajo debe incluir las anotaciones de red múltiple 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 abordar de forma única el tráfico de RDMA. Si la tabla de GID está dañada, no puede pasar ningún tráfico de RDMA.

Proporcionamos una secuencia de comandos 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 instala en /var/lib/gib/scripts en la VM.

Cuando 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:
    • Para A3 Ultra o A4, 32 entradas con 4 entradas por CX-7.
    • Para A3 Mega, 32 entradas con 4 entradas por CX-7.
    • Para A3 High (8 GPUs), 16 entradas con 4 entradas por CX-7.
    • Para A4X, 16 entradas con 4 entradas por CX-7.
  • Las entradas de 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, desde ip a).

Si alguno de estos elementos es falso, la tabla de GID está dañada. Considera reiniciar tu 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 objetos 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 de 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 inhabilites el verificador de configuración de invitado porque ayuda a garantizar las prácticas recomendadas y la configuración adecuada. Sin embargo, si es necesario, puedes inhabilitar el verificador de configuración de 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 la guía 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 de 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. Configura 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 tu imagen (por ejemplo, Ubuntu 20.04 o versiones posteriores, RockyLinux 9 o versiones posteriores).

Mensaje truncado

El siguiente error se produce cuando usas versiones mixtas de NCCL en todos los 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 tu daemonset del instalador de NCCL/gIB (consulta las instrucciones para A3 Ultra y A4 o las instrucciones para A4X).

libibverbs no puede cargar la configuración del proveedor

El siguiente error se produce cuando no activaste el directorio que contiene los objetos 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 encontrar varios errores a medida que el complemento de red de gIB prepara los QPs para las transacciones de red reales.

Argumento no válido (errno 22)

Este error ocurre por uno de los siguientes motivos:

  1. El otro extremo del 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 de 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)

Este 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 para obtener ayuda.

QP obtuvo una finalización con error

Este error ocurre por uno de los siguientes motivos:

  1. Problemas de conexión de RDMA subyacentes (aletas de vínculo, 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 para obtener ayuda.