Questa pagina mostra come massimizzare la larghezza di banda e la velocità effettiva di rete per carichi di lavoro GPU ad alte prestazioni in Google Kubernetes Engine (GKE) utilizzando Cluster standard con GPUDirect-TCPX, GPUDirect-TCPXO, gVNIC e il networking multiplo.
Questa pagina è Destinato agli ingegneri del machine learning (ML) e amministratori di piattaforme che facilitano i carichi di lavoro ML. Dovresti avere già familiarità con le tecnologie di networking come le schede di interfaccia di rete (NIC) e TCP e con tecnologie di acceleratore come NVIDIA Collective Communications Library (NCCL).
Intelligenza artificiale (AI), ML e prestazioni elevate di computing (HPC) richiedono una potente accelerazione per ottimizzare delle attività riducendo i tempi di completamento dei job. Ad esempio, i modelli ML che si concentrano dell'AI conversazionale e la generazione di immagini richiedono scalabilità e computing corrente.
Informazioni sui supercomputer GPU di Google Cloud
Google Cloud dispone di supercomputer ottimizzati per l'acceleratore creati per scalabili e scalabili. Queste macchine offrono i seguenti vantaggi:
- Otto GPU NVIDIA H100 per macchina.
- Larghezza di banda fino a 200 Gbit/s sul NIC principale.
- NIC secondarie (fino a otto sui tipi di macchine A3 Mega e fino a quattro tipi di macchine standard A3), ognuno dei quali supporta una larghezza di banda fino a 200 Gbit/s per Trasferimento dei dati GPU.
Per un elenco completo dei vantaggi, vedi Serie di macchine A3 nella documentazione di Compute Engine.
Il carico di lavoro GKE deve utilizzare tutte le GPU e tutte le GPU disponibili NIC secondarie su un singolo nodo e utilizzano una parte significativa larghezza di banda disponibile. La soluzione descritta in questo documento è ideale per carichi di lavoro che richiedono prestazioni elevate, velocità effettiva elevata e bassa latenza.
Funzionalità e capacità richieste per ottimizzare la larghezza di banda
Per massimizzare la larghezza di banda della rete nei nodi del supercomputer GPU, utilizza tutti le seguenti funzionalità:
- Stack di rete GPUDirect: la serie di macchine A3 supporta
due stack di rete per l'accesso remoto diretto alla memoria (RDMA) personalizzato:
- .
- Sui tipi di macchine standard A3, utilizza GPUDirect-TCPX per ridurre l’overhead richiesto per trasferire i payload di pacchetti e dalle GPU, che migliorano significativamente la velocità effettiva su larga scala rispetto GPU che non utilizzano GPUDirect.
- Sui tipi di macchine A3 Mega, utilizza GPUDirect-TCPXO, che migliora ulteriormente la comunicazione da GPU a VM.
- gVNIC: abilita funzionalità GPUDirect come la suddivisione delle intestazioni dei pacchetti, flow steering e gestione del buffer. Per l'utilizzo è necessario gVNIC GPUDirect-TCPX o GPUDirect-TCPXO. Per maggiori dettagli su gVNIC, consulta Aumenta la velocità del traffico di rete per i nodi GPU.
- Networking multiplo: aggiungi NIC secondarie a la macchina ottimizzata per l'acceleratore. Ogni NIC è associato a un nel proprio VPC per evitare conflitti. Per maggiori dettagli sul supporto di più reti, vedi Configura il supporto di più reti per i pod.
- Criteri di posizionamento: utilizza un criterio di posizionamento delle risorse per posizionare tutti i nodi GPU. per un carico di lavoro specifico su server fisicamente vicini, in modo da ridurre al minimo la latenza. Per maggiori dettagli, consulta Definire il posizionamento compatto per i nodi GKE.
Struttura della procedura
Per utilizzare insieme tutte queste funzionalità, devi:
- Crea virtual private cloud (VPC) e subnet
- Crea l'ambiente GKE:
- .
- Crea un cluster con più reti abilitate
- Crea un pool di nodi con le caratteristiche seguenti:
- gVNIC attivato
- Subnet a più reti specificate per ogni NIC secondario
- Serie di macchine A3 con GPU H100 che supportano i nodi
- Ultimi driver NVIDIA installati
- Installa il programma binario GPUDirect e il plug-in NCCL
- Implementa il plug-in di injector dei dispositivi NRI
- Esegui il deployment di un carico di lavoro di test per verificare la configurazione di GPUDirect
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Attiva l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
install e poi
inizializzare
con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente
eseguendo
gcloud components update
.
- Assicurati di avere una quota sufficiente per le GPU H100. Per richiedere una quota maggiore, consulta le quote delle GPU.
Requisiti
I seguenti requisiti si applicano sia a GPUDirect-TCPX che GPUDirect-TCPXO salvo diversa indicazione.
- GPUDirect-TCPX è supportato su GKE versione 1.27 o successive e richiede:
- Tipo di macchina standard A3 (ad es.
a3-highgpu-8g
). - Per GKE versione 1.27, utilizza GKE patch versione 1.27.7-gke.1121000 o successiva.
- Per GKE versione 1.28, usa GKE patch versione 1.28.8-gke.1095000 o successiva.
- Per GKE versione 1.29, usa GKE patch versione 1.29.3-gke.1093000 o successiva.
- Tipo di macchina standard A3 (ad es.
- GPUDirect-TCPXO è supportato su GKE versione 1.28 o successive e richiede:
- Tipo di macchina A3 Mega (ad esempio,
a3-megagpu-8g
). - Per GKE versione 1.28, usa GKE patch versione 1.28.9-gke.1250000 o successiva.
- Per GKE versione 1.29, usa GKE patch versione 1.29.4-gke.1542000 o successiva.
- Tipo di macchina A3 Mega (ad esempio,
- I nodi GPU devono utilizzare il driver NVIDIA 535 o versioni successive.
- Devi utilizzare GKE Dataplane V2.
- Il nodo GKE deve utilizzare un nodo Container-Optimized OS (COS) dell'immagine. Le immagini dei nodi Ubuntu e Windows non sono supportate.
Limitazioni
Si applicano le seguenti limitazioni:
- GPUDirect-TCPX e GPUDirect-TCPXO non sono supportati nei cluster Autopilot
- GPUDirect-TCPX e GPUDirect-TCPXO non sono supportati con GPU multi-istanza, Condivisione del tempo delle GPU, oppure NVIDIA MPS
- Non puoi utilizzare FastSocket NCCL
- Il carico di lavoro GKE deve utilizzare tutte le GPU disponibili le NIC secondarie disponibili su un singolo nodo. Più pod non possono utilizzare GPUDirect-TCPX o GPUDirect-TCPXO su un singolo nodo.
crea VPC e subnet
Crea reti VPC separate nel progetto per ogni NIC che aggiungerai ai nodi. Ogni rete VPC deve avere una subnet e una regola firewall che consenta il traffico di rete interno.
Crea le reti VPC per GPUDirect nel tuo progetto, ciascuna con una subnet e una regola firewall. Scegli la scheda GPUDirect-TCPX per A3 standard o la scheda GPUDirect-TCPXO per la macchina A3 Mega i tipi di conversione, segui queste istruzioni:
GPUDirect-TCPX
Per ottimizzare la larghezza di banda, ti consigliamo di creare quattro nuove reti.
for N in $(seq 1 4); do gcloud compute networks create PROJECT_ID-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PROJECT_ID-sub-$N \ --network=PROJECT_ID-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PROJECT_ID-internal-$N \ --network=PROJECT_ID-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
Sostituisci quanto segue:
PROJECT_ID
: l'ID del tuo progetto Google Cloud.REGION
: la regione di Compute Engine per ogni una subnet.SUBNET_RANGE
: l'intervallo di indirizzi IP di ogni subnet in notazione CIDR. Questo esempio esegue l'iterazione per quattro subnet, devi usare una variabile per modificare l'indirizzo IP per ogni subnet. Ad esempio, specifica192.168.$N.0/24
in modo che la prima subnet utilizzi192.168.1.0/24
, la seconda subnet utilizza192.168.2.0/24
e così via.SOURCE_RANGE
: l'intervallo di indirizzi IP di origine per il regola firewall per consentire il traffico in entrata, in notazione CIDR. Ad esempio:192.168.0.0/16
.
GPUDirect-TCPXO
Per massimizzare la larghezza di banda, ti consigliamo di creare otto nuove reti.
for N in $(seq 1 8); do gcloud compute networks create PROJECT_ID-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PROJECT_ID-sub-$N \ --network=PROJECT_ID-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PROJECT_ID-internal-$N \ --network=PROJECT_ID-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
Sostituisci quanto segue:
PROJECT_ID
: l'ID del tuo progetto Google Cloud.REGION
: la regione di Compute Engine per ogni una subnet.SUBNET_RANGE
: l'intervallo di indirizzi IP di ogni subnet in notazione CIDR. Questo esempio esegue l'iterazione per otto subnet, devi usare una variabile per modificare l'indirizzo IP per ogni subnet. Ad esempio, specifica192.168.$N.0/24
in modo che la prima subnet utilizzi192.168.1.0/24
, la seconda subnet utilizza192.168.2.0/24
e così via.SOURCE_RANGE
: l'intervallo di indirizzi IP di origine per il regola firewall per consentire il traffico in entrata, in notazione CIDR. Ad esempio:192.168.0.0/16
.
Verifica che le reti siano state create:
gcloud compute networks list
crea l'ambiente GKE
Creare un nuovo cluster GKE che utilizza il networking multiplo (anteprima) e crea un pool di nodi GPU che utilizza macchine A3 con GPU H100 altre NIC. Non puoi aggiornare un cluster esistente per utilizzare il networking multiplo.
GPUDirect-TCPX
Crea un cluster Standard:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-dataplane-v2 --enable-ip-alias \ --enable-multi-networking \ --no-enable-autoupgrade \
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del nuovo cluster.LOCATION
: la regione di Compute Engine. per il clusterVERSION
: la versione GKE dell'agente in un cluster Kubernetes. Utilizza una versione supportata come descritto nella Sezione Requisiti.
Creare risorse Network e GKENetworkParamSet nel cluster che corrispondono alle reti e alle subnet VPC creato:
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: PROJECT_ID-net-1 vpcSubnet: PROJECT_ID-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PROJECT_ID-net-2 vpcSubnet: PROJECT_ID-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PROJECT_ID-net-3 vpcSubnet: PROJECT_ID-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PROJECT_ID-net-4 vpcSubnet: PROJECT_ID-sub-4 deviceMode: NetDevice EOF
Queste risorse indicano a GKE di configurare le NIC per la GPU traffico in modalità passthrough. GKE non applica i programmazione di networking utilizzando eBPF per questo traffico.
Crea un pool di nodi per le GPU H100:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --machine-type=a3-highgpu-8g \ --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \ --additional-node-network=network=PROJECT_ID-net-1,subnetwork=PROJECT_ID-sub-1 \ --additional-node-network=network=PROJECT_ID-net-2,subnetwork=PROJECT_ID-sub-2 \ --additional-node-network=network=PROJECT_ID-net-3,subnetwork=PROJECT_ID-sub-3 \ --additional-node-network=network=PROJECT_ID-net-4,subnetwork=PROJECT_ID-sub-4 \ --enable-gvnic \ --no-enable-autoupgrade
Sostituisci
NODE_POOL_NAME
con il nome del pool di nodi.Se questo comando non va a buon fine, la quota GPU H100 potrebbe non essere sufficiente nel tuo progetto. Assicurati che sia disponibile una quota e riprova a eseguire il comando.
Ottieni un elenco di nodi nel cluster:
kubectl get nodes
Verifica che ogni nodo GPU abbia otto GPU:
kubectl describe node NODE_NAME
L'output è simile al seguente:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
GPUDirect-TCPXO
Scegli una versione GKE disponibile che supporti GPUDirect-TCPXO. Per elencare le versioni, esegui questo comando:
gcloud container get-server-config \ --format="yaml(validMasterVersions)" \ --zone=ZONE \ --project=PROJECT_ID
Sostituisci quanto segue:
ZONE
: la zona di computing per il piano di controllo del cluster.PROJECT_ID
: l'ID del tuo progetto Google Cloud.
Crea un cluster:
gcloud --project ${PROJECT} beta container clusters create CLUSTER_NAME \ --enable-dataplane-v2 --enable-ip-alias --zone=ZONE \ --enable-multi-networking --cluster-version=VERSION --no-enable-autoupgrade
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del nuovo cluster.VERSION
: una versione GKE supporta GPUDirect-TCPXO, come descritto in Requisiti.REGION
: la regione di Compute Engine per il cluster.ZONE
: la zona di computing per il cluster.
Creare risorse Network e GKENetworkParamSet nel cluster che corrispondono alle reti e alle subnet VPC creato:
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: PROJECT_ID-net-1 vpcSubnet: PROJECT_ID-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PROJECT_ID-net-2 vpcSubnet: PROJECT_ID-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PROJECT_ID-net-3 vpcSubnet: PROJECT_ID-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PROJECT_ID-net-4 vpcSubnet: PROJECT_ID-sub-4 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc5 spec: vpc: PROJECT_ID-net-5 vpcSubnet: PROJECT_ID-sub-5 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc6 spec: vpc: PROJECT_ID-net-6 vpcSubnet: PROJECT_ID-sub-6 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc7 spec: vpc: PROJECT_ID-net-7 vpcSubnet: PROJECT_ID-sub-7 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc8 spec: vpc: PROJECT_ID-net-8 vpcSubnet: PROJECT_ID-sub-8 deviceMode: NetDevice EOF
Queste risorse indicano a GKE di configurare le NIC per la GPU traffico in modalità passthrough. GKE non applica i programmazione di networking utilizzando eBPF per questo traffico.
Crea un pool di nodi per le GPU H100:
gcloud beta container node-pools create NODE_POOL_NAME \ --zone=ZONE \ --cluster=CLUSTER_NAME \ --project=PROJECT_ID \ --accelerator=type=nvidia-h100-mega-80gb,count=8,gpu-driver-version=LATEST \ --machine-type=a3-megagpu-8g \ --num-nodes=2 \ --additional-node-network network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \ --additional-node-network network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \ --additional-node-network network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \ --additional-node-network network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \ --additional-node-network network=PREFIX-net-5,subnetwork=PREFIX-sub-5 \ --additional-node-network network=PREFIX-net-6,subnetwork=PREFIX-sub-6 \ --additional-node-network network=PREFIX-net-7,subnetwork=PREFIX-sub-7 \ --additional-node-network network=PREFIX-net-8,subnetwork=PREFIX-sub-8 \ --enable-gvnic \ --no-enable-autoupgrade \ --scopes "https://www.googleapis.com/auth/cloud-platform" \ [--placement-policy=POLICY_NAME \ --reservation-affinity=specific \ --reservation=RESERVATION_NAME \ --host-maintenance-interval=PERIODIC]
Sostituisci
NODE_POOL_NAME
con il nome del pool di nodi.Nell'esempio,
--scopes
"https://www.googleapis.com/auth/cloud-platform" imposta l'ambito dell'istanza del nodo sucloud-platform
per praticità dei test. Per la produzione, ti consigliamo di limitare l'ambito e configurare credenziali più granulari.Usa
--placement-policy
,--reservation-affinity
e--reservation
se utilizzi una prenotazione. Specifica questi flag da configurare il nome del criterio e la prenotazione nel pool di nodi.Se questo comando non va a buon fine, la quota GPU H100 potrebbe non essere sufficiente nel tuo progetto. Assicurati di disporre di una quota sufficiente e riprova a eseguire il comando.
Ottieni un elenco di nodi nel cluster:
kubectl get nodes
Verifica che ogni nodo GPU abbia otto GPU:
kubectl describe node NODE_NAME
L'output è simile al seguente:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
Installare il file binario GPUDirect e configurare NCCL
Questa sezione mostra come installare il programma binario GPUDirect, in base alle tipo di macchina A3 (GPUDirect-TCPX per A3 standard, GPUDirect-TCPXO per A3 Mega) e di una specifica versione della libreria NCCL utilizzando un oggetto DaemonSet.
GPUDirect-TCPX
Esamina il manifest del Daemonset
nccl-tcpx-installer.yaml
in GitHub. Questo DaemonSet esegue le seguenti operazioni:- Installa la libreria NCCL e il programma binario GPUDirect-TCPX sul nodo.
- Archivia la libreria e il programma binario
/home/kubernetes/bin/nvidia/lib64
sulla VM. Per impostazione predefinita, GKE monta questa directory Percorso/usr/local/nvidia/lib64
nei container GPU che devono essere utilizzati NCCL e GPUDirect-TCPX.
Esegui il deployment del DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer.yaml
L'esecuzione del plug-in NCCL richiede circa due minuti.
Verifica lo stato dei pod DaemonSet:
kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer
L'output è simile al seguente:
nccl-tcpx-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpx-installer-qgg82 1/1 Running 0 2m11s
GPUDirect-TCPXO
Esamina il manifest del Daemonset
nccl-tcpxo-installer.yaml
in GitHub. Questo DaemonSet esegue le seguenti operazioni:- Preinstallazione per configurare le configurazioni correlate a GPUDirect-TCPXO.
- Installa la libreria NCCL e il programma binario GPUDirect-TCPXO sul nodo.
- Archivia la libreria e il programma binario
/home/kubernetes/bin/nvidia/lib64
sulla VM. Per impostazione predefinita, GKE monta questa directory Percorso/usr/local/nvidia/lib64
nei container GPU che devono essere utilizzati NCCL e GPUDirect-TCPXO.
Esegui il deployment del DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpxo-installer.yaml
L'esecuzione del plug-in NCCL richiede circa due minuti.
Verifica lo stato dei pod DaemonSet:
kubectl get pods -n=kube-system -l=name=nccl-tcpxo-installer
L'output è simile al seguente:
# Output nccl-tcpxo-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpxo-installer-qgg82 1/1 Running 0 2m11s
Esegui il deployment del plug-in di iniettore di dispositivi NRI
Questa sezione mostra come installare l'iniettore di dispositivo NRI utilizzando un DaemonSet. Entrambi i tipi di macchina H100(GPUDirect-TCPX per lo standard A3, GPUDirect-TCPXO per A3 Mega) installano lo stesso plug-in iniettore di dispositivi NRI.
Esamina il manifest del deployment di
nri-device-injector.yaml
in GitHub. Questo DaemonSet esegue le seguenti operazioni:- Abilita l'interfaccia delle risorse del nodo (NRI) sul nodo con GPU H100.
- Esegue il deployment di un container di plug-in di iniettori di dispositivi NRI che inserisce i dispositivi GPU nei container specificati dalle annotazioni dei pod.
Esegui il deployment del DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector.yaml
L'esecuzione del plug-in NCCL richiede circa due minuti.
Verifica lo stato dei pod DaemonSet:
kubectl get pods -n=kube-system -l=name=device-injector
L'output è simile al seguente:
# Output device-injector-md6hb 1/1 Running 0 4h54m device-injector-vh9bm 1/1 Running 0 4h54m
esegui il deployment di un carico di lavoro di test
In questa sezione eseguirai il deployment di un carico di lavoro di esempio per verificare che NCCL e GPUDirect-TCPX o GPUDirect-TCPXO funzionano come previsto.
GPUDirect-TCPX
Questo carico di lavoro include un container collaterale denominato tcpx-daemon, che esegue un servizio che consente al pod di utilizzare GPUDirect-TCPX. Devi aggiungere questo container collaterale a qualsiasi pod nel tuo che deve usare GPUDirect-TCPX. Per uno snippet del modulo campi da aggiungere ai manifest, consulta Aggiungi GPUDirect al manifest.
- Esamina il file manifest ConfigMap di
nccl-config.yaml
in GitHub. Questo manifest esegue il deployment di script che inizializzano un test NCCL all-gather e consente di configurare impostazioni di configurazione specifiche per NCCL. Esamina il manifest del deployment di
nccl-test-latest.yaml
in GitHub. Questo file manifest esegue le seguenti operazioni:- Esegue il deployment di due pod, ognuno dei quali viene eseguito in un nodo con GPU H100.
- Esegue il deployment di un container collaterale denominato
tcpx-daemon
in ogni pod per consentire I pod usano GPUDirect-TCPX.
Esegui il deployment del ConfigMap e del carico di lavoro di test:
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.yaml
Esegui questi comandi per attivare un test NCCL "all-gather" per il nodi:
kubectl exec \ --stdin --tty --container=nccl-test nccl-test-host-1 \ -- /configs/allgather.sh nccl-host-1 nccl-host-2
L'output è simile al seguente:
# 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
GPUDirect-TCPXO
Questo carico di lavoro include un container collaterale denominato tcpxo-daemon, che esegue un servizio che consente al pod di utilizzare GPUDirect-TCPXO. Devi aggiungere questo container collaterale a qualsiasi pod nel tuo che deve usare GPUDirect-TCPXO. Per uno snippet del modulo campi da aggiungere ai manifest, consulta Aggiungi GPUDirect al manifest.
Esamina il manifest di
nccl-test-latest.yaml
in GitHub. Questo file manifest esegue le seguenti operazioni:- Esegue il deployment di due pod, ognuno dei quali viene eseguito in un nodo con GPU H100.
- Esegue il deployment di un container collaterale denominato
tcpxo-daemon
in ogni pod per consentire I pod usano GPUDirect-TCPXO.
Esegui il deployment di due pod con il carico di lavoro di test:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest.yaml
Esegui questi comandi per attivare un test NCCL "all-gather" per i due nodi:
kubectl exec --stdin --tty --container=nccl-test nccl-test-host-1 -- /scripts/allgather.sh nccl-host-1 nccl-host-2
L'output è simile al seguente:
# 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 4654.5 0.23 0.21 0 3890.9 0.27 0.25 0 2097152 32768 float none -1 4117.2 0.51 0.48 0 5153.5 0.41 0.38 0 4194304 65536 float none -1 6417.4 0.65 0.61 0 7295.5 0.57 0.54 0 8388608 131072 float none -1 7872.1 1.07 1.00 0 6451.4 1.30 1.22 0 16777216 262144 float none -1 6990.7 2.40 2.25 0 5609.3 2.99 2.80 0 33554432 524288 float none -1 8254.0 4.07 3.81 0 7415.1 4.53 4.24 0 67108864 1048576 float none -1 5546.3 12.10 11.34 0 6484.0 10.35 9.70 0 134217728 2097152 float none -1 6507.3 20.63 19.34 0 6015.4 22.31 20.92 0 268435456 4194304 float none -1 6744.1 39.80 37.32 0 7023.1 38.22 35.83 0 536870912 8388608 float none -1 8939.8 60.05 56.30 0 11706 45.86 43.00 0 1073741824 16777216 float none -1 8241.7 130.28 122.14 0 8375.2 128.20 120.19 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 22.449
Utilizza le impostazioni di configurazione NCCL consigliate per migliorare le prestazioni
Le seguenti coppie chiave-valore sono la configurazione NCCL consigliata le impostazioni per GPUDirect-TCPX e GPUDirect-TCPXO. Durante il deployment dei carichi di lavoro che utilizzano l'NCCL, impostale come variabili di ambiente per ottimizzare le prestazioni.
GPUDirect-TCPX
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/tcpx/lib64\"",
"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"
GPUDirect-TCPXO
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"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",
"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"
Aggiungere GPUDirect ai manifest
Questa sezione mostra i campi obbligatori che devi aggiungere a Kubernetes per l'uso di GPUDirect da parte dei tuoi pod.
GPUDirect-TCPX
Aggiungi le seguenti annotazioni ai metadati dei pod. Senza queste annotazioni, sarà necessario
hostNetwork:true
per il pod eprivileged:true
per il containertcpx-daemon
.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 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"}, ]
Aggiungi i seguenti campi alla specifica del pod:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: tcpx-socket hostPath: path: /run/tcpx - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys
Aggiungi il seguente container al manifest per eseguire Servizio 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 env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Aggiungi i seguenti montaggi di volumi a tutti i container che richiedono GPU:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64
Aggiungi la seguente variabile di ambiente a ogni container GPU:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Aggiungi variabili di ambiente per configurare le opzioni NCCL. Per maggiori dettagli, consulta Utilizza le impostazioni di configurazione NCCL consigliate per migliorare le prestazioni in questo documento.
Una specifica del pod completata ha il seguente aspetto:
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
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- 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
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
...
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
GPUDirect-TCPXO
Aggiungi le seguenti annotazioni ai metadati dei pod. Senza queste annotazioni, sarà necessario
hostNetwork:true
per il pod eprivileged:true
per il containertcpxo-daemon
.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"} ]
Aggiungi i seguenti campi alla specifica del 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
Aggiungi il seguente container al manifest per eseguire il servizio
tcpxo-daemon
con l'immagineus-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.9
:- 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: nvidia-install-dir-host mountPath: /usr/local/nvidia - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Aggiungi la seguente variabile di ambiente a ogni container GPU:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY value: /dev/aperture_devices
Aggiungi i seguenti volumiMount a ogni container GPU. Senza configurazioni di
aperture_devices
, è richiestoprivileged:true
per i container GPU:volumeMounts: - name: aperture-devices mountPath: /dev/aperture_devices
Aggiungi variabili di ambiente per configurare le opzioni NCCL. Per maggiori dettagli, vedi Utilizzare le impostazioni di configurazione NCCL consigliate per migliorare le prestazioni.
Una specifica del pod completata ha il seguente aspetto:
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: nvidia-install-dir-host
mountPath: /usr/local/nvidia
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: main-application-container
...
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- 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: nvidia-install-dir-host
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
Passaggi successivi
- Scopri le best practice per il networking di GKE.
- Scopri di più sulla famiglia di tecnologie Nvidia GPUDirect per lo spostamento dei dati e l'accesso alle GPU Nvidia.
- Scopri di più sulla disponibilità attuale della versione GPU e sulla richiesta di GPU in GKE.