A Alibaba Collective Communication Library (ACCL) é uma biblioteca proprietária de comunicação coletiva da Alibaba Cloud baseada na Nvidia Collective Communication Library (NCCL). A ACCL aproveita a arquitetura de rede e a experiência da Alibaba Cloud no ajuste de comunicação para tarefas de modelos de linguagem grandes (LLM). Essa combinação oferece maior desempenho de comunicação para suas tarefas, além de recursos de diagnóstico de falhas e autorrecuperação. Este tópico descreve os principais recursos da ACCL e como instalá-la.
Recursos aprimorados da ACCL
A ACCL oferece os seguintes recursos aprimorados. Ative ou desative qualquer recurso por meio de variáveis de ambiente:
Corrige bugs da versão open source da NCCL.
Otimiza diversos operadores e tamanhos de mensagem para comunicação coletiva, garantindo desempenho superior ao da NCCL open source.
Analisa estatisticamente a comunicação coletiva durante o treinamento. Esse recurso auxilia no diagnóstico de problemas como lentidão ou travamentos causados por falhas em dispositivos. Em conjunto com o AIMaster: Elastic automatic fault tolerance engine e o C4D: Model training task problem diagnosis tool do PAI, permite detecção rápida de anomalias e tolerância a falhas automática.
Oferece suporte a transmissão multicaminho e balanceamento de carga. Isso reduz ou elimina congestionamentos provocados por hashing desigual em clusters de treinamento e melhora o desempenho geral do processo.
Limites
Instale a ACCL apenas ao enviar tarefas do DLC que utilizam recursos Lingjun e imagens personalizadas em regiões onde há AI compute resources (Lingjun resources) implantados.
Método de instalação
As imagens oficiais Lingjun do PAI já incluem a ACCL pré-instalada. Se você utilizar uma imagem oficial Lingjun para enviar uma tarefa do DLC, ignore as etapas abaixo.
Etapa 1: Verificar se a biblioteca NCCL da qual o PyTorch depende é dinâmica
Execute os passos a seguir no contêiner da imagem personalizada:
-
Confirme o local da biblioteca do PyTorch.
Se souber o diretório de instalação do PyTorch, pesquise diretamente nesse local. Por exemplo, se o PyTorch estiver em
/usr/local/lib, execute o comando abaixo para encontrar o caminho exato do arquivolibtorch.so:find /usr/local/lib -name "libtorch*" # Example output: /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchcuda.so /usr/local/lib/python3.10/dist-packages/torch/lib/libtorch.so /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchbindtest.so -
Use o comando
lddpara verificar como a biblioteca do PyTorch depende da biblioteca NCCL.ldd libtorch.so | grep nccl-
Se o comando retornar um resultado semelhante ao exemplo abaixo, o PyTorch depende da NCCL como biblioteca dinâmica. Nesse caso, baixe e instale a ACCL.
libnccl.so.2=>/usr/lib/x86_64-linux-gnu/libnccl.so.2(0x00007feab3b27000) Se o comando não retornar nenhuma saída, o PyTorch depende da NCCL como biblioteca estática e não é possível instalar a ACCL. Nessa situação, crie sua própria imagem com base em uma imagem oficial NVIDIA NGC ou mude para uma versão do PyTorch que utilize a biblioteca NCCL dinâmica antes de instalar a ACCL.
-
Etapa 2: Verificar a versão do CUDA na imagem
No contêiner da imagem personalizada, execute o comando abaixo para conferir a versão do CUDA no ambiente atual.
nvidia-smi
A saída exibirá a versão do CUDA, como 12,2. Utilize o número de versão retornado pelo comando nas etapas seguintes.
Etapa 3: Baixar a versão da ACCL correspondente à sua versão do CUDA
A tabela a seguir apresenta os links de download da ACCL para diferentes versões do CUDA:
|
Versão do CUDA |
Link de download da biblioteca ACCL |
|
12,8 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.8/lib/libnccl.so.2 |
|
12,6 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.6/lib/libnccl.so.2 |
|
12,5 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.5/lib/libnccl.so.2 |
|
12,4 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.4/lib/libnccl.so.2 |
|
12,3 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2 |
|
12,2 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.2/lib/libnccl.so.2 |
|
12,1 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.1/lib/libnccl.so.2 |
|
11,8 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.8/lib/libnccl.so.2 |
|
11,7 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.7/lib/libnccl.so.2 |
|
11,4 |
http://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.4/lib/libnccl.so.2 |
No contêiner da imagem personalizada, execute o comando abaixo para baixar a versão da ACCL correspondente à sua versão do CUDA. O exemplo a seguir refere-se ao CUDA 12.3:
wget http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2
Etapa 4: Instalar a biblioteca ACCL
Antes de instalar a biblioteca ACCL, verifique se a NCCL já está presente no sistema. Execute o comando a seguir para checar a existência do arquivo de biblioteca libnccl.so.2:
sudo find / -name "libnccl.so.2"
Dois resultados são possíveis. Siga as instruções correspondentes ao seu caso:
-
O arquivo
libnccl.so.2não foi encontrado ou está em um diretório do sistema, como/usr/lib64ou/lib64. Nesse cenário, use o comandocppara copiar o arquivolibnccl.so.2recém-baixado para um desses diretórios e torná-lo disponível para o sistema.sudo cp -f ./libnccl.so.2 /usr/lib64 -
O arquivo
libnccl.so.2foi localizado em outro diretório, como/opt/xxx/. Isso ocorre quando a NCCL foi instalada em um caminho não padrão. Nessa situação, use o comandocppara copiar o novo arquivolibnccl.so.2para esse diretório e substituir o arquivo existente.sudo cp -f libnccl.so.2 /opt/xxx/
Etapa 5: Atualizar o cache de bibliotecas dinâmicas
No contêiner da imagem personalizada, execute o comando abaixo para atualizar o cache de bibliotecas dinâmicas.
sudo ldconfig
Etapa 6: Confirmar o carregamento da biblioteca ACCL
Envie uma tarefa do DLC utilizando a imagem personalizada. Para mais informações, consulte Create a training task.
-
Verifique os logs da tarefa. Se os logs exibirem as informações de versão da ACCL conforme o exemplo abaixo, a biblioteca foi aplicada com sucesso à tarefa. Para saber mais sobre como visualizar logs de tarefas, consulte View training details.
NotaO log deve conter o identificador
accl-n. Caso esteja ausente, a biblioteca ACCL não foi carregada corretamente.NCCL version 2.20.5.7-accl-n+cuda12.4, COMMIT_ID Zeaa6674c2f1f896e3a6bbd77e85231e0700****, BUILD_TIME 2024-05-10 15:40:56
Configurações recomendadas de variáveis de ambiente
A equipe do PAI elaborou uma lista de variáveis de ambiente recomendadas para melhorar o throughput de comunicação. Use estas configurações como referência:
export NCCL_IB_TC=136
export NCCL_IB_SL=5
export NCCL_IB_GID_INDEX=3
export NCCL_SOCKET_IFNAME=eth
export NCCL_DEBUG=INFO
export NCCL_IB_HCA=mlx5
export NCCL_IB_TIMEOUT=22
export NCCL_IB_QPS_PER_CONNECTION=8
export NCCL_MIN_NCHANNELS=4
export NCCL_NET_PLUGIN=none
export ACCL_C4_STATS_MODE=CONN
export ACCL_IB_SPLIT_DATA_NUM=4
export ACCL_IB_QPS_LOAD_BALANCE=1
export ACCL_IB_GID_INDEX_FIX=1
export ACCL_LOG_TIME=1
A tabela a seguir detalha as principais variáveis de ambiente:
|
Variável de ambiente |
Descrição |
|
NCCL_IB_TC |
Corresponde às regras de mapeamento de rede da Alibaba Cloud. A ausência ou configuração incorreta desta variável pode degradar o desempenho. |
|
NCCL_IB_GID_INDEX |
Defina o GID utilizado pelo protocolo RDMA. Se não for configurada ou estiver incorreta, a NCCL apresentará erro. |
|
NCCL_SOCKET_IFNAME |
Permite que a NCCL selecione a porta correta ao estabelecer conexões. Diferentes tipos de instância exigem portas específicas; configurações ausentes ou erradas podem causar falha na conexão. |
|
NCCL_DEBUG |
Defina o nível de log como INFO para fornecer mais detalhes sobre a NCCL e facilitar a identificação e resolução de problemas potenciais. |
|
NCCL_IB_HCA |
Especifica o controlador de interface de rede (NIC) destinado à comunicação RDMA. Valores incorretos ou ausentes podem reduzir o desempenho. |
|
NCCL_IB_TIMEOUT |
Determina o tempo limite de conexão RDMA para aumentar a tolerância a falhas nas tarefas de treinamento. Configurações inadequadas podem interromper a tarefa. |
|
NCCL_IB_QPS_PER_CONNECTION |
Aumentar a quantidade de Queue Pairs (QPs) por conexão na NCCL melhora efetivamente o throughput da rede. |
|
NCCL_NET_PLUGIN |
Configura o plugin de rede da NCCL. Defina como none para evitar o carregamento acidental de outros plugins que possam comprometer o desempenho do sistema. |
|
ACCL_C4_STATS_MODE |
Controla a dimensão das informações estatísticas da ACCL. Configure como CONN para coletar estatísticas por conexão. |
|
ACCL_IB_SPLIT_DATA_NUM |
Distribui os dados entre múltiplos Queue Pairs (QPs) para transmissão. |
|
ACCL_IB_QPS_LOAD_BALANCE |
Ativa ou desativa o recurso de balanceamento de carga. |
|
ACCL_IB_GID_INDEX_FIX |
Quando definida como 1, verifica automaticamente anomalias de GID antes do início da tarefa e as contorna. |
|
ACCL_LOG_TIME |
Quando definida como 1, adiciona um carimbo de data/hora no início de cada entrada de log para facilitar a solução de problemas. |