Vérifier et valider la configuration

Examiner et évaluer la configuration, le GPU et les performances du réseau.

Réviser la configuration

Connectez-vous à l'hôte bastion et vérifiez la configuration.

  1. Connectez-vous à l'hôte bastion avec ssh en tant qu'utilisateur opc (par défaut pour les instances Oracle Linux) à l'aide de l'adresse IP et de votre clé privée.
    akua$ ssh -i ~/.ssh/cluster.key opc@139.87.214.247
    [opc@epsilon-bastion ~]$
  2. La commande df affiche les systèmes de fichiers et les capacités montés :
    [opc@epsilon-bastion ~]$ df -h | grep -v tmp
    Filesystem                     Size  Used Avail Use% Mounted on
    /dev/sda3                       92G   14G   79G  15% /                <- boot (home) volume
    /dev/sda1                      200M  7.4M  193M   4% /boot/efi
    /dev/sdb                        20T   58M   20T   1% /export/cluster  <- Additional volume
    172.16.0.75:/export/cluster     20T   57M   20T   1% /nfs/cluster
    172.16.6.4:/mnt/localdisk/nfs   13T   39G   13T   1% /nfs/scratch     <- worker node NVMe
  3. Modifiez la configuration de Slurm.

    Par défaut, Slurm supprime automatiquement les conteneurs à la fin d'un travail. Comme vous voudrez probablement réutiliser le conteneur, il est beaucoup plus efficace de rendre les conteneurs persistants entre les tâches avec l'argument container_scope. Cela accélérera considérablement les redémarrages ultérieurs en utilisant le même conteneur.

    Dans le fichier /etc/slurm/plugstack.conf, ajoutez container_scope=global pour qu'il ressemble à ce qui suit :

    [opc@epsilon-bastion ~]$ cat /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global
  4. Arrêtez et redémarrez Slurm sur chacun des noeuds GPU et sur l'hôte bastion.
    Une liste des noms d'hôte de noeud GPU est affichée dans la sortie de sinfo. Utilisez cette option avec la commande pdsh pour exécuter systemctl sur tous les noeuds : export PS1="$ ".
    [opc@epsilon-bastion ~]$ export PS1="\n$ "
    
    $ sinfo
    PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
    gpu*         up   infinite      2   idle gpu-permanent-node-[517,878]
    
    $ pdsh -w gpu-permanent-node-[517,878] sudo systemctl stop slurmd
    $ sudo systemctl restart slurmctld slurmdbd
    $ pdsh -w gpu-permanent-node-[517,878] sudo systemctl start slurmd
    
    $ /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global[opc@epsilon-bastion ~]$ export PS1="\n$ "
    
    $ sinfo
    PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
    gpu*         up   infinite      2   idle gpu-permanent-node-[517,878]
    
    $ pdsh -w gpu-permanent-node-[517,878] sudo systemctl stop slurmd
    $ sudo systemctl restart slurmctld slurmdbd
    $ pdsh -w gpu-permanent-node-[517,878] sudo systemctl start slurmd
    
    $ /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global
  5. Appliquez les mises à jour du système d'exploitation.

    Envisagez de mettre à jour le système d'exploitation vers les derniers packages. Utilisez pdsh comme à l'étape précédente pour mettre à jour efficacement tous les noeuds :

    # Oracle Linux 7:
    $ pdsh -w localhost, gpu-permanent-node-[517,878]  sudo yum upgrade
    
    # Oracle Linux 8:
    $ pdsh -w localhost, gpu-permanent-node-[517,878]  sudo dnf upgrade

Modifier la configuration du slurm

Par défaut, Slurm supprime automatiquement les conteneurs à la fin d'un travail. Comme vous voudrez probablement réutiliser le conteneur, il est beaucoup plus efficace de rendre les conteneurs persistants entre les tâches avec l'argument container_scope. Cela accélérera considérablement les redémarrages ultérieurs en utilisant le même conteneur.

  1. Dans le fichier /etc/slurm/plugstack.conf, ajoutez container_scope=global pour qu'il ressemble à ce qui suit :
    [opc@epsilon-bastion ~]$ cat /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global
  2. Arrêtez et redémarrez Slurm sur chacun des noeuds GPU et sur l'hôte bastion.
    Une liste des noms d'hôte de noeud GPU est affichée dans la sortie de sinfo. Utilisez cette option avec la commande pdsh pour exécuter systemctl sur tous les noeuds : export PS1="$ "
    [opc@epsilon-bastion ~]$ export PS1="\n$ "
    
    $ sinfo
    PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
    gpu*         up   infinite      2   idle gpu-permanent-node-[517,878]
    
    $ pdsh -w gpu-permanent-node-[517,878] sudo systemctl stop slurmd
    $ sudo systemctl restart slurmctld slurmdbd
    $ pdsh -w gpu-permanent-node-[517,878] sudo systemctl start slurmd
    
    $ /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global

Appliquer les mises à jour du système d'exploitation

Envisagez de mettre à jour le système d'exploitation vers les derniers packages.

  • Utilisez pdsh comme à l'étape précédente pour mettre à jour efficacement tous les noeuds :
    # Oracle Linux 7:
    $ pdsh -w localhost, gpu-permanent-node-[517,878]  sudo yum upgrade
    
    # Oracle Linux 8:
    $ pdsh -w localhost, gpu-permanent-node-[517,878]  sudo dnf upgrade

Extraire ou charger les conteneurs

Le plugin NVIDIA Pyxis pour Slurm avec l'utilitaire de conteneur Enroot fournit un environnement d'exécution de conteneur de cluster intégré au gestionnaire de charge de travail Slurm. Ces composants ont été installés lorsque vous avez coché les cases Pyxis et Enroot pendant la configuration du logiciel.

Voir https://github.com/NVIDIA/pyxis/ ou srun --help pour plus de détails sur les options srun --container fournies par Pyxis.

  1. Vérifiez que l'environnement d'exécution du conteneur fonctionne comme prévu dans votre grappe.
    Cet exemple extrait le conteneur TensorFlow du référentiel nvcr.io de Nvidia et exécute une commande simple. Cela permet de vérifier que l'environnement d'exécution de conteneur fonctionne comme prévu dans votre grappe. Lors de sa première exécution, un conteneur volumineux est téléchargé à partir d'un emplacement distant et son chargement et son exécution peuvent prendre au moins 25 minutes.
    $ srun -N 2 --ntasks-per-node 1 \
      --container-image=nvcr.io#nvidia/tensorflow:22.11-tf2-py3 \
      --container-name=tensorflow bash -c "hostname; grep PRETTY /etc/os-release"
    pyxis: imported docker image: nvcr.io#nvidia/pytorch:21.09-py3
    pyxis: imported docker image: nvcr.io#nvidia/pytorch:21.09-py3
    gpu-permanent-node-517
    PRETTY_NAME="Ubuntu 20.04.3 LTS"
    gpu-permanent-node-878

    Les travaux suivants utilisant le conteneur nommé ne nécessitent pas de téléchargement et commenceront l'exécution immédiatement.

    $ time srun -N 2 --ntasks-per-node 1 --container-name=tensorflow bash -c "hostname"
    gpu-permanent-node-878
    gpu-permanent-node-517
    
    real	0m0.394s
    user	0m0.006s
    sys	0m0.009s
  2. Vous pouvez choisir de charger d'autres conteneurs avant les tâches qui les utiliseront.
    Ici, vous pouvez charger le conteneur NVIDIA NeMo Framework en préparation d'un travail LLM. Les informations d'authentification NVIDIA dans ~/.config/enroot/.credentials peuvent être nécessaires pour accéder aux conteneurs GA ou EA.
    $ cat .config/enroot/.credentials
    machine nvcr.io login $oauthtoken password vbmVtc2<snip>zU6YTFjNm
    $ time srun -N 2 --ntasks-per-node 1 \
      --container-image="nvcr.io/ea-bignlp/ga-participants/nemofw-training:23.08.03" \
      --container-name=nemo bash -c "hostname"
    pyxis: imported docker image: nvcr.io/ea-bignlp/ga-participants/nemofw-training:23.08.03
    pyxis: imported docker image: nvcr.io/ea-bignlp/ga-participants/nemofw-training:23.08.03
    gpu-permanent-node-878
    gpu-permanent-node-517
    
    real	46m27.272s

    L'importation de ce plus grand conteneur a pris près de 47 minutes.

Valider la performance du GPU et du réseau

NVIDIA NCCL est une bibliothèque autonome de routines de communication standard pour les GPU. Nccl-tests indique le temps d'opération NCCL moyen en ms, ainsi que la bande passante de l'algorithme et la bande passante du bus en Go/s. Ces tests mesurent les performances des GPU et du réseau, et valident également l'exactitude des opérations.

  1. Obtenez NVIDIA nccl-tests à partir de GitHub et créez les exécutables sur l'hôte bastion en exécutant la commande suivante :
    $ srun --container-name=tensorflow --container-mounts "/home/opc:/home/opc" \
      bash -c "cd /home/opc; git clone https://github.com/NVIDIA/nccl-tests.git; cd nccl-tests; make MPI=1 MPI_HOME=/usr/local/mpi CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/lib/x86_64-linux-gnu"
  2. Exécutez nccl-test.

    L'opération NCCL AllReduce est exécutée sur un noeud de grappe à l'aide de huit processeurs graphiques :

    $ srun --container-name=tensorflow --container-mounts "/home/opc:/home/opc" \
      --mpi pmi2 --gpus-per-node=8 bash -c "cd /home/opc/nccl-tests; \
      ./build/all_reduce_perf -b 10G -e 10G -t 1 -g 8"
    # nThread 1 nGpus 8 minBytes 10737418240 maxBytes 10737418240 step: 1048576(bytes) warmup iters: 5 iters: 20 agg iters: 1 validation: 1 graph: 0
    #
    # Using devices
    #  Rank  0 Group  0 Pid 226178 on gpu-permanent-node-517 device  0 [0x0f] NVIDIA A100-SXM4-40GB
    #  Rank  1 Group  0 Pid 226178 on gpu-permanent-node-517 device  1 [0x15] NVIDIA A100-SXM4-40GB
    #  Rank  2 Group  0 Pid 226178 on gpu-permanent-node-517 device  2 [0x50] NVIDIA A100-SXM4-40GB
    #  Rank  3 Group  0 Pid 226178 on gpu-permanent-node-517 device  3 [0x53] NVIDIA A100-SXM4-40GB
    #  Rank  4 Group  0 Pid 226178 on gpu-permanent-node-517 device  4 [0x8c] NVIDIA A100-SXM4-40GB
    #  Rank  5 Group  0 Pid 226178 on gpu-permanent-node-517 device  5 [0x91] NVIDIA A100-SXM4-40GB
    #  Rank  6 Group  0 Pid 226178 on gpu-permanent-node-517 device  6 [0xd6] NVIDIA A100-SXM4-40GB
    #  Rank  7 Group  0 Pid 226178 on gpu-permanent-node-517 device  7 [0xda] NVIDIA A100-SXM4-40GB
    #
    #                                                              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)
     10737418240    2684354560     float     sum      -1    80130  134.00  234.50      0    80171  133.93  234.38      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : 234.439
    #
  3. Exécutez NCCL AllReduce sur deux noeuds de grappe avec 16 processeurs graphiques.

    Ce test utilise le réseau en grappe inter-noeuds.

    bastion$ srun --container-name=tensorflow --container-mounts "/home/opc:/home/opc" --mpi pmi2 --gpus-per-node=8 bash -c "cd /home/opc/nccl-tests; ./build/all_reduce_perf -b 10G -e 10G -t 1 -g 8"
    srun -N 2 --ntasks-per-node 1 --container-name=tensorflow --container-mounts "/home/opc:/home/opc" --mpi pmi2 --gpus-per-node=8 bash -c "cd /home/opc/nccl-tests; export NCCL_IB_QPS_PER_CONNECTION=4; export NCCL_IB_GID_INDEX=3; ./build/all_reduce_perf -b 10G -e 10G -t 1 -g 8"
    # nThread 1 nGpus 8 minBytes 10737418240 maxBytes 10737418240 step: 1048576(bytes) warmup iters: 5 iters: 20 agg iters: 1 validation: 1 graph: 0
    #
    # Using devices
    #  Rank  0 Group  0 Pid 231185 on gpu-permanent-node-517 device  0 [0x0f] NVIDIA A100-SXM4-40GB
    #  Rank  1 Group  0 Pid 231185 on gpu-permanent-node-517 device  1 [0x15] NVIDIA A100-SXM4-40GB
    #  Rank  2 Group  0 Pid 231185 on gpu-permanent-node-517 device  2 [0x50] NVIDIA A100-SXM4-40GB
    #  Rank  3 Group  0 Pid 231185 on gpu-permanent-node-517 device  3 [0x53] NVIDIA A100-SXM4-40GB
    #  Rank  4 Group  0 Pid 231185 on gpu-permanent-node-517 device  4 [0x8c] NVIDIA A100-SXM4-40GB
    #  Rank  5 Group  0 Pid 231185 on gpu-permanent-node-517 device  5 [0x91] NVIDIA A100-SXM4-40GB
    #  Rank  6 Group  0 Pid 231185 on gpu-permanent-node-517 device  6 [0xd6] NVIDIA A100-SXM4-40GB
    #  Rank  7 Group  0 Pid 231185 on gpu-permanent-node-517 device  7 [0xda] NVIDIA A100-SXM4-40GB
    #  Rank  8 Group  0 Pid 221811 on gpu-permanent-node-878 device  0 [0x0f] NVIDIA A100-SXM4-40GB
    #  Rank  9 Group  0 Pid 221811 on gpu-permanent-node-878 device  1 [0x15] NVIDIA A100-SXM4-40GB
    #  Rank 10 Group  0 Pid 221811 on gpu-permanent-node-878 device  2 [0x50] NVIDIA A100-SXM4-40GB
    #  Rank 11 Group  0 Pid 221811 on gpu-permanent-node-878 device  3 [0x53] NVIDIA A100-SXM4-40GB
    #  Rank 12 Group  0 Pid 221811 on gpu-permanent-node-878 device  4 [0x8c] NVIDIA A100-SXM4-40GB
    #  Rank 13 Group  0 Pid 221811 on gpu-permanent-node-878 device  5 [0x91] NVIDIA A100-SXM4-40GB
    #  Rank 14 Group  0 Pid 221811 on gpu-permanent-node-878 device  6 [0xd6] NVIDIA A100-SXM4-40GB
    #  Rank 15 Group  0 Pid 221811 on gpu-permanent-node-878 device  7 [0xda] NVIDIA A100-SXM4-40GB
    #
    #                                                              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)
     10737418240    2684354560     float     sum      -1    90752  118.32  221.84      0    90977  118.02  221.29      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : 221.568
    #

    Les résultats positifs indiquent que la grappe est prête à exécuter vos charges de travail d'IA générative.