Esta página mostra como maximizar a largura de banda e o débito da rede para cargas de trabalho de GPU de alto desempenho em clusters do Google Kubernetes Engine (GKE) Autopilot usando GPUDirect-TCPXO, GPUDirect-TCPX, gVNIC e várias redes. Se usar clusters padrão, consulte o artigo Maximize a largura de banda da rede da GPU em clusters no modo padrão.
Esta página destina-se a engenheiros de aprendizagem automática (ML) e administradores de plataformas que facilitam as cargas de trabalho de ML. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud
As aplicações de inteligência artificial (IA), AA e computação de alto desempenho (HPC) requerem uma aceleração potente para otimizar o desempenho, reduzindo os tempos de conclusão das tarefas. Por exemplo, os modelos de ML que se focam na IA de conversação e na geração de imagens requerem uma elevada escalabilidade e capacidade de computação.
Antes de ler esta página, certifique-se de que conhece as tecnologias de rede, como as placas de interface de rede (NICs) e o TCP, e as tecnologias de acelerador, como a NVIDIA Collective Communications Library (NCCL).
Acerca dos Google Cloud supercomputadores com GPU
Google Cloud tem supercomputadores otimizados pelo acelerador criados para modelos escaláveis e massivos. Estas máquinas têm as seguintes vantagens:
- Oito GPUs NVIDIA B200, H200 ou H100 por máquina.
- Largura de banda até 200 Gbps na NIC principal.
- NICs secundárias (até oito em tipos de máquinas A3 Mega e até quatro em tipos de máquinas A3 High), cada uma a suportar uma largura de banda de até 200 Gbps para transferência de dados da GPU.
A carga de trabalho do GKE tem de usar todas as GPUs disponíveis e todas as NICs secundárias disponíveis num único nó, bem como usar uma parte significativa da largura de banda disponível. A solução descrita neste documento é ideal para cargas de trabalho que requerem elevado desempenho, elevado débito e baixa latência.
Funcionalidades e capacidades necessárias para maximizar a largura de banda
Para maximizar a largura de banda da rede nos nós de supercomputadores com GPU, use todas as seguintes funcionalidades:
- Stack de rede GPUDirect: a série de máquinas A3 suporta
três stacks de rede para acesso direto à memória (RDMA) remoto e personalizado:
- Nos tipos de máquinas A3 High e nas GPUs NVIDIA H100, use o GPUDirect-TCPX para reduzir a sobrecarga necessária para transferir payloads de pacotes para e das GPUs, o que melhora significativamente o débito em grande escala em comparação com as GPUs que não usam o GPUDirect.
- Nos tipos de máquinas A3 Mega e nas GPUs NVIDIA H100 Mega, use o GPUDirect-TCPXO, que melhora ainda mais a comunicação entre a GPU e a VM.
- Nos tipos de máquinas A3 Ultra e GPUs NVIDIA H200, e nos tipos de máquinas A4 e GPUs NVIDIA B200, use o GPUDirect RDMA para executar cargas de trabalho de IA distribuídas com melhorias adicionais no débito. Para começar, crie um cluster GKE personalizado otimizado pela IA.
- gVNIC: ative as capacidades do GPUDirect, como a divisão do cabeçalho de pacotes, a orientação de fluxo e a gestão de buffers. O gVNIC é necessário para usar o GPUDirect-TCPX ou o GPUDirect-TCPXO. Para ver detalhes sobre o gVNIC, consulte o artigo Aumente a velocidade do tráfego de rede para nós de GPU.
- Várias redes: adicione NICs secundárias à máquina otimizada pelo acelerador. Cada NIC está associada a uma sub-rede separada na sua própria VPC para evitar conflitos. Para ver detalhes sobre a compatibilidade com várias redes, consulte o artigo Configure a compatibilidade com várias redes para os Pods.
- Políticas de posicionamento: use uma política de posicionamento de recursos para posicionar todos os nós da GPU para uma carga de trabalho específica em servidores fisicamente próximos para minimizar a latência. Para ver detalhes, consulte o artigo Defina o posicionamento compacto para nós do GKE.
Resumo do procedimento
Para usar todas estas capacidades em conjunto, faça o seguinte:
- Crie nuvens virtuais privadas (VPCs) e sub-redes
- Crie o ambiente do GKE.
- Instale o ficheiro binário GPUDirect e o plug-in NCCL
- Implemente o plug-in do injetor de dispositivos NRI
- Implemente uma carga de trabalho de teste para validar a configuração do GPUDirect
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
- Certifique-se de que tem quota suficiente para GPUs H100. Para pedir mais quota, consulte o artigo Quotas de GPUs.
Requisitos
Os seguintes requisitos aplicam-se ao GPUDirect-TCPX e ao GPUDirect-TCPXO, salvo indicação em contrário.
- O cluster tem de usar a versão 1.31.1-gke.1621000 ou posterior do GKE.
- Os nós de GPU têm de usar a versão 535 ou posterior do controlador da NVIDIA.
- Tem de usar o GKE Dataplane V2.
- Para cargas de trabalho GPUDirect-TCPX ou GPUDirect-TCPXO executadas em vários conjuntos de nós, todos os conjuntos de nós têm de estar nas mesmas zonas do Compute Engine e têm de usar os mesmos conjuntos de rede, como VPCs e sub-redes.
Limitações
Aplicam-se as seguintes limitações:
- O GPUDirect-TCPX e o GPUDirect-TCPXO não são suportados com GPUs de várias instâncias, partilha de tempo da GPU ou NVIDIA MPS.
- Não pode usar o NCCL FastSocket com o GPUDirect-TCPX ou o GPUDirect-TCPXO .
- A carga de trabalho do GKE tem de usar todas as GPUs disponíveis e todas as NICs secundárias disponíveis num único nó. Vários pods não podem usar GPUDirect-TCPX nem GPUDirect-TCPXO num único nó.
- Só pode usar os tipos de máquinas
a3-highgpu-8g
ea3-megagpu-8g
. Outros tipos de máquinas A3 não são suportados.
Crie VPCs e sub-redes
Crie redes VPC separadas no seu projeto para cada NIC virtual que adicionar aos seus nós. Cada rede da VPC tem de ter uma sub-rede e uma regra de firewall que permita o tráfego de rede interno.
Crie as redes VPC para o GPUDirect no seu projeto, cada uma com uma sub-rede e uma regra de firewall. Escolha o separador GPUDirect-TCPX para tipos de máquinas A3 High ou escolha o separador GPUDirect-TCPXO para tipos de máquinas A3 Mega e, de seguida, conclua as seguintes instruções:
GPUDirect-TCPXO
Para maximizar a largura de banda, recomendamos que crie oito novas redes.
for N in $(seq 1 8); do gcloud compute networks create PREFIX-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PREFIX-sub-$N \ --network=PREFIX-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PREFIX-internal-$N \ --network=PREFIX-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
Substitua o seguinte:
PROJECT_ID
: o ID do seu Google Cloud projeto.REGION
: a região do Compute Engine para cada sub-rede.SUBNET_RANGE
: o intervalo de endereços IP de cada sub-rede na notação CIDR. Este comando de exemplo itera oito sub-redes, pelo que deve usar uma variável para alterar o endereço IP de cada sub-rede. Por exemplo, especifique192.168.$N.0/24
para que a primeira sub-rede use192.168.1.0/24
, a segunda sub-rede use192.168.2.0/24
e assim sucessivamente.SOURCE_RANGE
: o intervalo de endereços IP de origem para a regra de firewall para permitir tráfego de entrada, na notação CIDR. Por exemplo,192.168.0.0/16
.
GPUDirect-TCPX
Para maximizar a largura de banda, recomendamos que crie quatro novas redes.
for N in $(seq 1 4); do gcloud compute networks create PREFIX-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PREFIX-sub-$N \ --network=PREFIX-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PREFIX-internal-$N \ --network=PREFIX-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
Substitua o seguinte:
PROJECT_ID
: o ID do seu Google Cloud projeto.REGION
: a região do Compute Engine para cada sub-rede.SUBNET_RANGE
: o intervalo de endereços IP de cada sub-rede na notação CIDR. Este comando de exemplo itera para quatro sub-redes, pelo que deve usar uma variável para alterar o endereço IP de cada sub-rede. Por exemplo, especifique192.168.$N.0/24
para que a primeira sub-rede use192.168.1.0/24
, a segunda sub-rede use192.168.2.0/24
, etc.SOURCE_RANGE
: o intervalo de endereços IP de origem para a regra de firewall para permitir tráfego de entrada, na notação CIDR. Por exemplo,192.168.0.0/16
.
Verifique se as redes foram criadas:
gcloud compute networks list
Crie o ambiente do GKE
Crie um novo cluster do GKE que use várias redes (pré-visualização). Não pode atualizar um cluster existente para usar várias redes.GPUDirect-TCPXO
Escolha uma versão do GKE disponível que suporte o GPUDirect-TCPXO. Para apresentar uma lista das versões, execute este comando:
gcloud container get-server-config \ --format="yaml(validMasterVersions)" \ --region=REGION \ --project=PROJECT_ID
Substitua o seguinte:
REGION
: a região de computação para o plano de controlo do cluster.PROJECT_ID
: o ID do seu Google Cloud projeto.
Crie um cluster:
gcloud beta container clusters create-auto CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=VERSION \ --enable-multi-networking \ --workload-policies=allow-net-admin
Substitua o seguinte:
CLUSTER_NAME
: o nome do novo cluster.CONTROL_PLANE_LOCATION
: a região do Compute Engine do plano de controlo do seu cluster.VERSION
: uma versão do GKE que suporta o GPUDirect-TCPXO, conforme descrito nos requisitos.
Crie recursos Network e GKENetworkParamSet no cluster que correspondem às redes VPC e sub-redes que criou:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc5 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc5 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc6 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc6 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc7 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc7 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc8 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc8 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc5 spec: vpc: PREFIX-net-5 vpcSubnet: PREFIX-sub-5 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc6 spec: vpc: PREFIX-net-6 vpcSubnet: PREFIX-sub-6 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc7 spec: vpc: PREFIX-net-7 vpcSubnet: PREFIX-sub-7 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc8 spec: vpc: PREFIX-net-8 vpcSubnet: PREFIX-sub-8 deviceMode: NetDevice EOF
Estes recursos indicam ao GKE para configurar as NICs para o tráfego de GPU no modo de passagem. O GKE não aplica a programação de rede incorporada através do eBPF a este tráfego.
GPUDirect-TCPX
Crie um cluster:
gcloud beta container clusters create-auto CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=VERSION \ --enable-multi-networking \ --workload-policies=allow-net-admin
Substitua o seguinte:
CLUSTER_NAME
: o nome do novo cluster.CONTROL_PLANE_LOCATION
: a região do Compute Engine do plano de controlo do seu cluster.VERSION
: uma versão do GKE que suporta o GPUDirect-TCPX, conforme descrito nos requisitos.
Crie recursos Network e GKENetworkParamSet no cluster que correspondem às redes VPC e sub-redes que criou:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice EOF
Estes recursos indicam ao GKE para configurar as NICs para o tráfego de GPU no modo de passagem. O GKE não aplica a programação de rede incorporada através do eBPF a este tráfego.
Instale o ficheiro binário GPUDirect e configure a NCCL
Esta secção mostra como instalar o ficheiro binário GPUDirect, com base no seu tipo de máquina A3 (GPUDirect-TCPX para A3 High, GPUDirect-TCPXO para A3 Mega) e numa versão específica da biblioteca NCCL através de um DaemonSet.
GPUDirect-TCPXO
Este DaemonSet faz o seguinte:
- Pré-instalação para configurar as configurações relacionadas com o GPUDirect-TCPXO.
- Instala a biblioteca NCCL e o binário GPUDirect-TCPXO no nó.
- Armazena a biblioteca e o ficheiro binário no diretório
/home/kubernetes/bin/nvidia/lib64
na VM. Por predefinição, o GKE monta este diretório no caminho/usr/local/nvidia/lib64
em contentores de GPU que precisam de usar o NCCL e o GPUDirect-TCPXO.
Para instalar o ficheiro binário e configurar a NCCL, siga estes passos:
Reveja o
nccl-tcpxo-installer-autopilot.yaml
manifesto Daemonset no GitHub.Crie um espaço de nomes dedicado:
kubectl create ns gpudirect-system
Implemente o DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-tcpxo-installer-autopilot.yaml
O plug-in NCCL demora aproximadamente dois minutos a começar a ser executado.
GPUDirect-TCPX
Este DaemonSet faz o seguinte:
- Instala a biblioteca NCCL e o ficheiro binário GPUDirect-TCPX no nó.
- Armazena a biblioteca e o ficheiro binário no diretório
/home/kubernetes/bin/nvidia/lib64
na VM. Por predefinição, o GKE monta este diretório no caminho/usr/local/nvidia/lib64
em contentores de GPU que precisam de usar o NCCL e o GPUDirect-TCPX.
Para instalar o ficheiro binário e configurar a NCCL, faça o seguinte:
Reveja o
nccl-tcpx-installer-autopilot.yaml
manifesto Daemonset no GitHub.Crie um espaço de nomes dedicado:
kubectl create ns gpudirect-system
Implemente o DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer-autopilot.yaml
O plug-in NCCL demora aproximadamente dois minutos a começar a ser executado.
Implemente o plugin do injetor de dispositivos NRI
Esta secção mostra como instalar o injetor de dispositivos NRI através de um DaemonSet. Ambos os tipos de máquinas com GPU H100 instalam o mesmo plug-in do injetor de dispositivos NRI. Este plugin faz o seguinte:
- Ativa a interface de recursos de nós (NRI) no nó que tem GPUs H100. A NRI está ativada por predefinição na versão 1.29 e posteriores do GKE.
- Implementa um contentor de plug-in do injetor de dispositivos NRI que injeta dispositivos de GPU em contentores especificados por anotações de pods.
Para instalar o plug-in, faça o seguinte:
Reveja o
nri-device-injector-autopilot.yaml
manifesto de implementação no GitHub.Implemente o DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector-autopilot.yaml
O plug-in NCCL demora aproximadamente dois minutos a começar a ser executado.
Implemente uma carga de trabalho de teste
Nesta secção, implementa uma carga de trabalho de exemplo para verificar se o NCCL e o GPUDirect-TCPX ou o GPUDirect-TCPXO funcionam conforme esperado. Esta carga de trabalho de exemplo faz o seguinte:
- Implementa dois pods, cada um dos quais é executado num nó com GPUs H100.
- Implementa um contentor sidecar em cada pod para permitir que esses pods usem o GPUDirect-TCPXO ou o GPUDirect-TCPX.
Para implementar esta carga de trabalho de exemplo, faça o seguinte:
GPUDirect-TCPXO
Esta carga de trabalho inclui um contentor sidecar denominado tcpxo-daemon, que executa um serviço que permite ao pod usar GPUDirect-TCPXO. Tem de adicionar este contentor sidecar a todos os pods no seu próprio ambiente que precisem de usar o GPUDirect-TCPXO. Para ver um fragmento dos campos necessários a adicionar aos seus manifestos, consulte o artigo Adicione o GPUDirect ao seu manifesto.
Reveja o
nccl-test-latest-autopilot.yaml
manifesto no GitHub.Implemente dois pods com a carga de trabalho de teste:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest-autopilot.yaml
Após a implementação dos pods, acione um teste de recolha total:
kubectl exec --stdin --tty --container=nccl-test nccl-test-host-1 -- /scripts/allgather.sh nccl-host-1 nccl-host-2
O resultado é semelhante ao seguinte:
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 0 0 float none -1 0.24 0.00 0.00 0 0.18 0.00 0.00 0 0 0 float none -1 0.19 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 256 4 float none -1 235.2 0.00 0.00 0 235.1 0.00 0.00 0 512 8 float none -1 241.0 0.00 0.00 0 236.1 0.00 0.00 0 1024 16 float none -1 236.3 0.00 0.00 0 233.3 0.00 0.00 0 2048 32 float none -1 234.1 0.01 0.01 0 233.4 0.01 0.01 0 4096 64 float none -1 237.1 0.02 0.02 0 235.3 0.02 0.02 0 8192 128 float none -1 236.2 0.03 0.03 0 235.2 0.03 0.03 0 16384 256 float none -1 236.6 0.07 0.06 0 238.5 0.07 0.06 0 32768 512 float none -1 237.9 0.14 0.13 0 238.8 0.14 0.13 0 65536 1024 float none -1 242.3 0.27 0.25 0 239.4 0.27 0.26 0 131072 2048 float none -1 263.0 0.50 0.47 0 275.1 0.48 0.45 0 262144 4096 float none -1 279.2 0.94 0.88 0 269.9 0.97 0.91 0 524288 8192 float none -1 273.5 1.92 1.80 0 273.5 1.92 1.80 0 1048576 16384 float none -1 315.1 3.33 3.12 0 314.1 3.34 3.13 0 2097152 32768 float none -1 319.2 6.57 6.16 0 311.5 6.73 6.31 0 4194304 65536 float none -1 331.8 12.64 11.85 0 331.3 12.66 11.87 0 8388608 131072 float none -1 356.3 23.54 22.07 0 353.8 23.71 22.23 0 16777216 262144 float none -1 409.1 41.01 38.45 0 405.2 41.40 38.81 0 33554432 524288 float none -1 451.4 74.34 69.69 0 447.7 74.94 70.26 0 67108864 1048576 float none -1 713.4 94.07 88.19 0 713.8 94.01 88.13 0 134217728 2097152 float none -1 1122.1 119.62 112.14 0 1116.3 120.23 112.72 0 268435456 4194304 float none -1 1785.8 150.32 140.92 0 1769.2 151.72 142.24 0 536870912 8388608 float none -1 2859.7 187.74 176.00 0 2852.6 188.20 176.44 0 1073741824 16777216 float none -1 5494.1 195.44 183.22 0 5568.2 192.83 180.78 0 2147483648 33554432 float none -1 10841 198.09 185.71 0 10798 198.88 186.45 0 4294967296 67108864 float none -1 21453 200.21 187.70 0 21490 199.86 187.37 0 8589934592 134217728 float none -1 42603 201.63 189.03 0 42670 201.31 188.73 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 45.7587 #
GPUDirect-TCPX
Esta carga de trabalho inclui um contentor sidecar com o nome tcpx-daemon, que executa um serviço que permite ao pod usar o GPUDirect-TCPX. Tem de adicionar este contentor auxiliar a todos os pods no seu próprio ambiente que precisem de usar o GPUDirect-TCPX. Para ver um fragmento dos campos necessários a adicionar aos seus manifestos, consulte o artigo Adicione o GPUDirect ao seu manifesto.
Reveja o
nccl-config.yaml
manifesto ConfigMap no GitHub. Este manifesto implementa scripts que inicializam um teste de recolha total da NCCL e define definições de configuração específicas da NCCL.Reveja o
nccl-test-latest-autopilot.yaml
manifesto de implementação no GitHub.Implemente o ConfigMap e a carga de trabalho de teste:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest-autopilot.yaml
Execute os seguintes comandos para acionar um teste de recolha total da NCCL para os nós:
kubectl exec \ --stdin --tty --container=nccl-test nccl-test-host-1 \ -- /configs/allgather.sh nccl-host-1 nccl-host-2
O resultado é semelhante ao seguinte:
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 1048576 16384 float none -1 696.8 1.50 1.41 0 729.0 1.44 1.35 0 2097152 32768 float none -1 776.4 2.70 2.53 0 726.7 2.89 2.71 0 4194304 65536 float none -1 774.3 5.42 5.08 0 805.1 5.21 4.88 0 8388608 131072 float none -1 812.1 10.33 9.68 0 817.6 10.26 9.62 0 16777216 262144 float none -1 1035.2 16.21 15.19 0 1067.8 15.71 14.73 0 33554432 524288 float none -1 1183.3 28.36 26.59 0 1211.8 27.69 25.96 0 67108864 1048576 float none -1 1593.4 42.12 39.49 0 1510.5 44.43 41.65 0 134217728 2097152 float none -1 2127.8 63.08 59.13 0 2312.7 58.03 54.41 0 268435456 4194304 float none -1 3603.0 74.50 69.85 0 3586.2 74.85 70.17 0 536870912 8388608 float none -1 7101.7 75.60 70.87 0 7060.9 76.03 71.28 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 29.8293
Use as definições de configuração da NCCL necessárias para melhorar o desempenho
Os seguintes pares de chave-valor são as definições de configuração da NCCL necessárias para o GPUDirect-TCPX e o GPUDirect-TCPXO. Quando implementar as suas cargas de trabalho que usam a NCCL, defina-as como variáveis de ambiente para otimizar o desempenho.
GPUDirect-TCPXO
"NCCL_FASTRAK_CTRL_DEV=eth0",
"NCCL_FASTRAK_IFNAME=eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8",
"NCCL_SOCKET_IFNAME=eth0",
"NCCL_CROSS_NIC=0",
"NCCL_ALGO=Ring,Tree",
"NCCL_PROTO=Simple,LL128",
"NCCL_MIN_NCHANNELS=4",
"NCCL_TUNER_PLUGIN=libnccl-tuner.so",
"NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config.textproto",
"NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config.textproto",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_FASTRAK_NUM_FLOWS=2",
"NCCL_FASTRAK_USE_SNAP=1",
"NCCL_FASTRAK_PLUGIN_ACCEPT_TIMEOUT_MS=600000",
"NCCL_FASTRAK_ENABLE_CONTROL_CHANNEL=0",
"NCCL_BUFFSIZE=8388608",
"CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_FASTRAK_ENABLE_HOTPATH_LOGGING=0",
"NCCL_FASTRAK_USE_LLCM=1",
"NCCL_NVLS_ENABLE=0"
Opcionalmente, pode definir todas as configurações de uma só vez seguindo estes passos:
No manifesto do contentor de carga de trabalho, adicione o seguinte par de chave-valor como uma variável de ambiente:
NCCL_LIB_DIR="/usr/local/nvidia/lib64"
Certifique-se de que o script
nccl-env-profile.sh
é executado quando o contentor da carga de trabalho é iniciado. Por exemplo, pode fazê-lo na especificação do pod substituindo o comando do contentor para incluir o seguinte:source ${NCCL_LIB_DIR}/nccl-env-profile.sh
Compatibilidade com LL128
O protocolo de comunicação NVIDIA LL128 (baixa latência 128) NCCL pode melhorar significativamente o desempenho para conjuntos de dados de tamanho pequeno a médio. O GPUDirect-TCPXO suporta o protocolo LL128.
Para usar o LL128, certifique-se de que o ficheiro nccl-tcpxo-installer.yaml
na
secção Instale o binário GPUDirect e configure o NCCL
usa a seguinte versão da imagem do contentor ou posterior:
us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-
dev:v1.0.8-1
Para configurar o LL128, faça o seguinte:
Para a
us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx- dev:v1.0.8-1
versão do plug-in NCCL, siga estes passos:No manifesto da carga de trabalho, defina a seguinte variável de ambiente:
NCCL_LIB_DIR="/usr/local/nvidia/lib64
Configure a carga de trabalho para executar o script
nccl-env-profile-ll128.sh
quando o contentor for iniciado. No manifesto da carga de trabalho, defina o seguinte comando:source ${NCCL_LIB_DIR}/nccl-env-profile-ll128.sh
O script
nccl-env-profile-ll128.sh
tem as seguintes variáveis de ambiente:NCCL_PROTO=Simple,LL128 NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config_ll128.textproto NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config_ll128.textproto
Para a versão do plug-in NCCL e posteriores, o LL128 torna-se um parâmetro predefinido. Por isso, a utilização do script
nccl-env-profile.sh
ou do scriptnccl-env-profile-ll128.sh
ativa o LL128.us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.9-1
Para desativar o LL128:No manifesto da carga de trabalho, defina a seguinte variável de ambiente:
NCCL_LIB_DIR="/usr/local/nvidia/lib64
Configure a carga de trabalho para executar o script
nccl-env-profile-ll128.sh
quando o contentor for iniciado. No manifesto da carga de trabalho, defina o seguinte comando:source ${NCCL_LIB_DIR}/nccl-env-profile-simple.sh
O script
nccl-env-profile-simple.sh
tem as seguintes variáveis de ambiente:NCCL_PROTO=Simple NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config_simple.textproto NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_tuner_config_simple.textproto
GPUDirect-TCPX
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"
Recolha registos de depuração da NCCL
Para registar erros da NCCL, recomendamos que adicione a seguinte configuração da NCCL:
NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH
NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
NCCL_DEBUG=INFO
: imprime informações de depuração.- Para cargas de trabalho de grande escala (64 nós ou mais), pode ocorrer um registo extenso. Para evitar este cenário e, a menos que tenha especificado
NCCL_DEBUG_FILE
, recomendamos que definaNCCL_DEBUG=WARN
para limitar os registos apenas a erros.
- Para cargas de trabalho de grande escala (64 nós ou mais), pode ocorrer um registo extenso. Para evitar este cenário e, a menos que tenha especificado
NCCL_DEBUG_SUBSYS
: filtra os subsistemas para os quais o NCCL recolhe informações de depuração. Recomendamos que recolha registos para os seguintes subsistemas:INIT
: a fase de inicialização do NCCL.NET
: a rede NCCL.ENV
: as variáveis de ambiente que o NCCL usa.COLL
: operações coletivas.GRAPH
: deteção de topologia e pesquisa de gráficos.
Se quiser recolher registos para diferentes subsistemas, consulte
NCCL_DEBUG_SUBSYS
na documentação da NCCL para ver uma lista de valores aceites.NCCL_DEBUG_FILE
(Opcional): direciona a saída do registo de depuração do NCCL para um ficheiro que especificar. Esta variável escreve registos da NCCL em ficheiros padrão, o que impede que a saída do registo se misture com a saída da aplicação. Esta variável também escreve registos de diferentes classificações da NCCL em ficheiros diferentes, o que impede a mistura dos registos.Use o seguinte formato de nome de ficheiro:
/DIRECTORY/FILE_NAME.%h.%p
Substitua o seguinte:
DIRECTORY
: o diretório onde quer armazenar os ficheiros de registo.FILE_NAME
: o nome dos ficheiros de registo.
O marcador de posição
%h
é resolvido para o nome do anfitrião do nó, enquanto%p
é resolvido para o ID do processo (PID) do processo que está a gerar o registo.
Para mais informações sobre a depuração de registos da NCCL, consulte o artigo Resolva problemas de GPUs no GKE.
Adicione o GPUDirect aos seus manifestos
Esta secção mostra os campos obrigatórios que tem de adicionar aos seus manifestos do Kubernetes para que os seus pods usem o GPUDirect.
Para o modo de piloto automático, também tem de selecionar as GPUs adequadas nos manifestos do pod para que o GKE aprovisione o hardware. Para GPUs H100 Mega, use GPUDirect-TCPXO. Para GPUs H100, use o GPUDirect-TCPX.Adicione os seguintes seletores de nós ao seu pod:
nodeSelector:
cloud.google.com/gke-accelerator: GPU_NAME
cloud.google.com/gke-gpu-driver-version: latest
Substitua GPU_NAME
pelo nome da GPU. Os valores
suportados são os seguintes:
nvidia-h100-mega-80gb
nvidia-h100-80gb
Consoante o tipo de GPUDirect, faça o seguinte:
GPUDirect-TCPXO
Adicione as seguintes anotações aos metadados do pod.
metadata: annotations: devices.gke.io/container.tcpxo-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm - path: /dev/dmabuf_import_helper networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, {"interfaceName":"eth5","network":"vpc5"}, {"interfaceName":"eth6","network":"vpc6"}, {"interfaceName":"eth7","network":"vpc7"}, {"interfaceName":"eth8","network":"vpc8"} ]
Adicione os seguintes campos à especificação do pod:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys - name: aperture-devices hostPath: path: /dev/aperture_devices
Adicione o seguinte contentor ao manifesto para executar o serviço
tcpxo-daemon
. Substituir (TCPXO_DAEMON_IMAGE
) pela imagem mais recente,us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.17
:- name: tcpxo-daemon image: TCPXO_DAEMON_IMAGE imagePullPolicy: Always command: ["/bin/sh", "-c"] args: - | set -ex chmod 755 /fts/entrypoint_rxdm_container.sh /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr securityContext: capabilities: add: - NET_ADMIN - NET_BIND_SERVICE volumeMounts: - name: libraries mountPath: /usr/local/nvidia - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs
Adicione a seguinte variável de ambiente a todos os contentores de GPU:
env: - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY value: /dev/aperture_devices
Adicione os seguintes volumeMounts a todos os contentores de GPU. Sem
aperture_devices
configurações,privileged:true
é necessário para contentores de GPU:volumeMounts: - name: aperture-devices mountPath: /dev/aperture_devices
Adicione variáveis de ambiente para configurar as opções da NCCL. Para ver detalhes, consulte o artigo Use as definições de configuração da NCCL recomendadas para melhorar o desempenho.
Uma especificação de pod concluída tem o seguinte aspeto:
apiVersion: v1
kind: Pod
metadata:
name: a3plus-workloads
annotations:
devices.gke.io/container.tcpxo-daemon: |+
- path: /dev/nvidia0
- path: /dev/nvidia1
- path: /dev/nvidia2
- path: /dev/nvidia3
- path: /dev/nvidia4
- path: /dev/nvidia5
- path: /dev/nvidia6
- path: /dev/nvidia7
- path: /dev/nvidiactl
- path: /dev/nvidia-uvm
- path: /dev/dmabuf_import_helper
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"vpc1"},
{"interfaceName":"eth2","network":"vpc2"},
{"interfaceName":"eth3","network":"vpc3"},
{"interfaceName":"eth4","network":"vpc4"},
{"interfaceName":"eth5","network":"vpc5"},
{"interfaceName":"eth6","network":"vpc6"},
{"interfaceName":"eth7","network":"vpc7"},
{"interfaceName":"eth8","network":"vpc8"}
]
...
containers:
- name: tcpxo-daemon
image: TCPXO_DAEMON_IMAGE
imagePullPolicy: Always
command: ["/bin/sh", "-c"]
args:
- |
set -ex
chmod 755 /fts/entrypoint_rxdm_container.sh
/fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_BIND_SERVICE
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
- name: main-application-container
...
- name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
value: /dev/aperture_devices
securityContext:
volumeMounts:
- name: aperture-devices
mountPath: /dev/aperture_devices
resources:
limits:
nvidia.com/gpu: 8
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia
- name: sys
hostPath:
path: /sys
- name: proc-sys
hostPath:
path: /proc/sys
- name: aperture-devices
hostPath:
path: /dev/aperture_devices
GPUDirect-TCPX
Adicione as seguintes anotações aos metadados do pod.
metadata: annotations: devices.gke.io/container.tcpx-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, ]
Adicione os seguintes campos à especificação do pod:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys
Adicione o seguinte contentor ao manifesto para executar o serviço tcpx-daemon:
- name: tcpx-daemon image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9 command: - /tcpgpudmarxd/build/app/tcpgpudmarxd - --gpu_nic_preset - a3vm - --gpu_shmem_type - fd - --uds_path - /run/tcpx - --setup_param - \"--verbose 128 2 0 \" securityContext: capabilities: add: - NET_ADMIN volumeMounts: - name: libraries mountPath: /usr/local/nvidia/lib64 - name: tcpx-socket mountPath: /run/tcpx - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs
Adicione as seguintes montagens de volumes a quaisquer contentores que solicitem GPUs:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64
Adicione variáveis de ambiente para configurar as opções da NCCL. Para mais detalhes, consulte a secção Use as definições de configuração da NCCL recomendadas para melhorar o desempenho neste documento.
Uma especificação de pod concluída tem o seguinte aspeto:
apiVersion: v1
kind: Pod
metadata:
name: a3-gpu-workloads-example
labels:
name: a3-gpu-workloads-example
annotations:
devices.gke.io/container.tcpx-daemon: |+
- path: /dev/nvidia0
- path: /dev/nvidia1
- path: /dev/nvidia2
- path: /dev/nvidia3
- path: /dev/nvidia4
- path: /dev/nvidia5
- path: /dev/nvidia6
- path: /dev/nvidia7
- path: /dev/nvidiactl
- path: /dev/nvidia-uvm
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"vpc1"},
{"interfaceName":"eth2","network":"vpc2"},
{"interfaceName":"eth3","network":"vpc3"},
{"interfaceName":"eth4","network":"vpc4"}
]
spec:
containers:
- name: tcpx-daemon
image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.11
imagePullPolicy: Always
command:
- /tcpgpudmarxd/build/app/tcpgpudmarxd
- --gpu_nic_preset
- a3vm
- --gpu_shmem_type
- fd
- --uds_path
- /run/tcpx
- --setup_param
- \"--verbose 128 2 0 \"
securityContext:
capabilities:
add:
- NET_ADMIN
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia/lib64
readOnly: true
- name: tcpx-socket
mountPath: /run/tcpx
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
- name: a3-gpu-workloads-example
...
volumeMounts:
- name: tcpx-socket
mountPath: /tmp
- name: libraries
mountPath: /usr/local/nvidia/lib64
readOnly: true
resources:
limits:
nvidia.com/gpu: 8
...
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia/lib64
- name: tcpx-socket
emptyDir:
- name: sys
hostPath:
path: /sys
- name: proc-sys
hostPath:
path: /proc/sys
O que se segue?
- Leia as notas de lançamento do GPUDirect-TCPXO
- Saiba mais sobre a prática recomendada para executar cargas de trabalho com GPUDirect-TCPX(O)
- Saiba mais acerca das práticas recomendadas para a rede do GKE.
- Saiba mais acerca da família de tecnologias Nvidia GPUDirect para a movimentação e o acesso a dados em GPUs Nvidia.
- Saiba mais sobre a disponibilidade da versão atual da GPU e o pedido de GPUs no GKE.