Neste documento, descrevemos como coletar e interpretar registros do NCCL/gIB para resolver problemas de estabilidade e desempenho no Hipercomputador de IA, incluindo orientações sobre como fazer o seguinte:
- Coletar registros do NCCL.
- Entender a estrutura das entradas de registro do NCCL.
- Verificar se os plug-ins do NCCL/gIB estão carregados corretamente.
- Verificar se as versões do NCCL e do gIB estão corretas.
- Resolver problemas comuns de avisos e erros do NCCL.
Coletar registros do NCCL
É possível usar os registros da Biblioteca de Comunicações Coletivas da NVIDIA (NCCL, na sigla em inglês) para depurar falhas do NCCL. Para qualquer depuração de estabilidade ou desempenho, colete registros do NCCL de todos os níveis de registro enquanto executa a carga de trabalho problemática. Evite despejar entradas de registro no console, porque o grande volume de registros pode impedir que o job continue.
Para coletar registros do NCCL, defina as seguintes variáveis de ambiente:
NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,ENV,GRAPH,NET,COLL,TUNING
NCCL_DEBUG_FILE=DESIRED_PATH/nccl_logs.VM_NAME.RANK_PROCESS_ID
Substitua:
DESIRED_PATH: o caminho em que você quer armazenar seus arquivos de registro
VM_NAME: o nome da VM
RANK_PROCESS_ID: o ID do processo da classificação
Formato do registro do NCCL
Os registros do NCCL são semelhantes a estes:
# 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
Independente da origem, os registros do NCCL têm um prefixo semelhante a este:
<VM name>:<pid>:<tid> [<GPU device ID>] <log level> <log content>
Verificar se os plug-ins do NCCL/gIB estão carregados corretamente
O NCCL/gIB é composto por vários plug-ins desenvolvidos pelo Google. A falha ao carregar qualquer um dos plug-ins pode resultar em desempenho ruim e, em alguns casos, erros fatais.
Recomendamos que você use o NCCL incluído no instalador do gIB para garantir os recursos mais recentes, o melhor desempenho e a maior estabilidade. Se você optar por usar uma
versão personalizada do NCCL para testes, como uma versão do NCCL incluída na
estrutura de aprendizado de máquina de sua escolha, também será necessário
instalar o pacote nccl-gib-plugins.
Plug-in de rede (libnccl-net.so)
Se o plug-in de rede gIB estiver carregado corretamente, você verá entradas de registro do NCCL semelhantes a estas:
... NCCL INFO Using network gIB
Se você encontrar entradas de registro semelhantes a qualquer uma das seguintes, siga as etapas na seção Um objeto compartilhado não pode ser carregado para corrigir o 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
Plug-in do sintonizador (libnccl-tuner.so)
Se o plug-in do sintonizador gIB estiver carregado corretamente, você verá entradas de registro do NCCL semelhantes a estas:
NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v3 symbol.
NCCL INFO TUNER/Plugin: Using tuner plugin A3xTunerPlugin_v2
Se você encontrar uma entrada de registro semelhante a esta, siga as etapas na seção Um objeto compartilhado não pode ser carregado para corrigir o problema.
NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v2 symbol, using internal tuner instead.
Plug-in CollNet
Embora essas entradas de registro indiquem uma falha, elas são esperadas e não são motivo de preocupação:
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.
Verificar a versão do NCCL e do gIB
Recomendamos que você use o NCCL incluído no instalador do gIB para garantir os recursos mais recentes, o melhor desempenho e a maior estabilidade. No entanto, é possível usar uma versão personalizada do NCCL para testes, como uma versão do NCCL incluída na estrutura de aprendizado de máquina de sua escolha. Nesse caso, instale o pacote nccl-gib-plugins.
Para verificar a versão do NCCL e do gIB usada, procure as seguintes entradas de registro do 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 você está executando as versões recomendadas, compare as versões registradas do NCCL e do gIB com as versões incluídas no pacote nccl-gib mais recente. Recomendamos manter o nccl-gib atualizado em todos os
nós. Consulte Instalar o NCCL/gIB.
Verificar as variáveis de ambiente do NCCL/gIB
Para alcançar um bom desempenho do NCCL, oferecemos um script que pode ser usado para definir as variáveis de ambiente recomendadas do NCCL. Antes de executar a carga de trabalho, crie o script no mesmo ambiente da carga de trabalho. No instalador do NCCL/gIB, o script está em /usr/local/gib/set_nccl_env.sh. Se você não usar esse script e, como resultado, as variáveis de ambiente do NCCL forem definidas incorretamente, é possível que o verificador de configuração do gIB NCCL encerre a carga de trabalho, o NCCL falhe ou o desempenho do NCCL seja ruim.
Para verificar se as variáveis de ambiente do NCCL/gIB foram aplicadas corretamente, procure entradas de registro do NCCL semelhantes a estas:
# 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.
Compare os valores a seguir com as variáveis de ambiente recomendadas do NCCL.
Verificar o manifesto da carga de trabalho do GKE
No GKE, o manifesto da carga de trabalho do Kubernetes tem várias configurações necessárias para consumir o NCCL/gIB sem problemas:
- O manifesto precisa ativar os binários do NCCL/gIB de
/home/kubernetes/bin/gibna VM para/usr/local/gibno contêiner da carga de trabalho. Observe que/home/kubernetes/bin/nvidiana VM é ativado automaticamente para/usr/local/nvidiano contêiner da carga de trabalho. - O contêiner da carga de trabalho precisa definir
LD_LIBRARY_PATHcomo/usr/local/gib/lib64:/usr/local/nvidia/lib64. - O cluster e os pools de nós precisam ter a multirrede do GKE configurada, e o manifesto da carga de trabalho precisa incluir as anotações de multirrede para evitar a necessidade de definir
hostNetwork: true.
Um manifesto real de carga de trabalho do Kubernetes no GKE é semelhante a este:
...
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
Verificar a tabela GID
No RoCE, a tabela de identificador global (GID) é usada para endereçar exclusivamente o tráfego RDMA. Se a tabela GID estiver corrompida, nenhum tráfego RDMA poderá passar.
Oferecemos um script show_gids.sh para mostrar a tabela GID. No instalador, ele está localizado em /usr/local/gib/scripts. Se você usou nosso instalador sem modificações, ele será instalado em /var/lib/gib/scripts na VM.
Ao executar o script na VM, você verá uma saída semelhante a esta:
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
...
Analise a saída e confirme o seguinte:
- A tabela GID tem o número adequado de entradas:
- Para A3 Ultra ou A4, 32 entradas com 4 entradas por CX-7.
- Para A3 Mega, 32 entradas com 4 entradas por CX-7.
- Para A3 High (8 GPUs), 16 entradas com 4 entradas por CX-7.
- Para A4X, 16 entradas com 4 entradas por CX-7.
- As entradas GID de cada CX-7 têm índices 0, 1, 2 e 3.
- Para cada CX-7, os índices 2 e 3 têm um endereço IPv4, e esse endereço IP corresponde ao IPv4 desse dispositivo (por exemplo, de
ip a).
Se algum desses itens for falso, a tabela GID estará corrompida. Considere reiniciar a VM ou o gerenciador de rede no SO convidado.
Avisos do NCCL
Os registros do NCCL têm vários níveis, sendo os avisos do NCCL (NCCL WARN) os mais graves. Os avisos do NCCL geralmente indicam falhas, que podem ou não ser fatais. O NCCL não tem um nível de registro que interrompa automaticamente a carga de trabalho.
Um objeto compartilhado não pode ser carregado
O erro a seguir ocorre quando um objeto compartilhado não pode ser carregado devido à configuração.
error while loading shared libraries: libnccl.so.2: cannot open shared object file: No such file or directory
Para resolver o problema:
- Verifique se o objeto compartilhado está instalado no seu ambiente.
- Verifique se o diretório do objeto compartilhado está na variável de ambiente
$LD_LIBRARY_PATH.
Falha ao mapear o segmento do objeto compartilhado
O erro a seguir ocorre quando o diretório do objeto compartilhado não é executável.
error while loading shared libraries: libnccl.so.2: failed to map segment from shared object: Operation not permitted
Para resolver o problema, execute os comandos a seguir. Esses exemplos pressupõem que os binários gIB estejam instalados em /var/lib/gib nas VMs:
sudo mount --bind /var/lib/gib /var/lib/gib
sudo mount -o remount,exec /var/lib/gib
O verificador de configuração do convidado não consegue encontrar um arquivo de configuração
Entradas de registro como essas aparecem quando o verificador de configuração do convidado não consegue encontrar um arquivo de configuração 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 o problema, defina a variável de ambiente NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE para apontar para o local de guest_config.txtpb. O local padrão do instalador do NCCL/gIB para o arquivo de configuração é /usr/local/gib/configs/guest_config.txtpb.
Não recomendamos desativar o verificador de configuração do convidado, porque ele ajuda a garantir as práticas recomendadas e a configuração adequada. No entanto, se necessário, é possível desativar o verificador de configuração do convidado definindo a variável de ambiente NCCL_SHIMNET_SHIM_LAYERS como UNUSED.
O verificador de configuração do convidado aplicou ou recomendou uma configuração
Os erros a seguir ocorrem quando as variáveis de ambiente do NCCL/gIB não estão definidas conforme 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 o problema:
- Siga as orientações dos registros do verificador de configuração do convidado.
- Verifique as variáveis de ambiente do NCCL/gIB.
O sintonizador não consegue encontrar um arquivo de configuração
O erro a seguir ocorre quando o plug-in do sintonizador não consegue encontrar um arquivo de configuração para usar.
... NCCL WARN No NCCL_TUNER_CONFIG_PATH provided. Please populate NCCL_TUNER_CONFIG_PATH to use config-based tuner plugin.
Para resolver o problema:
- Defina a variável de ambiente
NCCL_TUNER_CONFIG_PATHpara apontar para o local detuner_config.txtpb. O local padrão do instalador do NCCL/gIB para o arquivo de configuração é/usr/local/gib/configs/guest_config.txtpb. - Verifique as variáveis de ambiente do NCCL/gIB.
Versão do glibc insuficiente
O erro a seguir ocorre quando a versão do glibc local da distribuição é muito antiga, provavelmente porque a distribuição Linux no ambiente local é muito antiga. Os binários do NCCL/gIB exigem a versão 2.29 do 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 o problema, faça upgrade da distribuição de imagens (por exemplo, Ubuntu 20.04 ou mais recente, RockyLinux 9 ou mais recente).
Mensagem truncada
O erro a seguir ocorre quando você está usando versões mistas do NCCL em todas as classificações.
... NCCL WARN Message truncated : received ### bytes instead of ###
Para resolver o problema, verifique a versão do NCCL e do gIB. Se você estiver usando o GKE, verifique ou reinstale o daemonset do instalador do NCCL/gIB (consulte as instruções para A3U e A4 ou as instruções para A4X).
libibverbs não consegue carregar a configuração do provedor
O erro a seguir ocorre quando você não ativa o diretório que contém binários gIB para /usr/local/gib. Isso não causa uma falha na carga de trabalho. No entanto, o NCCL volta a usar o TCP e pode causar um desempenho ruim.
libibverbs: Warning: couldn't open config directory '/usr/local/gib/rdma-core/build/etc/libibverbs.d'.
Para resolver o problema, se você estiver usando o GKE, verifique o manifesto da carga de trabalho.
Erros ibv_modify_qp
Há vários erros que podem ocorrer quando o plug-in de rede gIB prepara QPs para transações de rede reais.
Argumento inválido (errno 22)
Esse erro ocorre por um dos seguintes motivos:
- A outra extremidade do QP tem uma tabela GID corrompida.
- As variáveis de ambiente do NCCL/gIB estão mal configuradas, especialmente
NCCL_IB_GID_INDEX,NCCL_IB_TCeNCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22
Para resolver o problema:
- Procure outros erros
ibv_modify_qpcom a assinaturaNo data available error 61e siga as instruções de mitigação para o erro 61. - Verifique as variáveis de ambiente do NCCL/gIB.
Nenhum dado disponível (errno 61)
Esse erro ocorre por um dos seguintes motivos:
- Essa VM tem uma tabela GID corrompida.
- As variáveis de ambiente do NCCL/gIB estão mal configuradas, especialmente
NCCL_IB_GID_INDEX,NCCL_IB_TCeNCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61
Para resolver o problema, primeiro verifique a causa:
Se a tabela GID estiver corrompida, tente as seguintes mitigações:
- (Curto prazo) Reinicie o gerenciador de rede (por exemplo,
networkd) na VM até que o endereço IP da interface problemática seja atualizado.- É possível reiniciar
networkdna VM usandosudo systemctl restart systemd-networkd. - É possível conferir o endereço IP de todas as interfaces usando
ip a. - Verifique se a tabela GID foi recuperada.
- É possível reiniciar
- Entre em contato com o suporte do Google para receber ajuda com uma solução de longo prazo.
A conexão expirou (errno 110)
O erro a seguir ocorre quando há um problema de conectividade básico entre as VMs.
... NCCL WARN Call to ibv_modify_qp failed with error Connection timed out errno 110
Para resolver o problema, entre em contato com o suporte do Google para receber ajuda.
QP recebeu conclusão com erro
Esse erro ocorre por um dos seguintes motivos:
- Problemas de conexão RDMA subjacentes (flaps de link etc.).
- As variáveis de ambiente do NCCL/gIB estão mal configuradas, especialmente
NCCL_IB_TIMEOUTeNCCL_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 o problema, entre em contato com o suporte do Google para receber ajuda.