구성 검토 및 검증

구성, GPU 및 네트워크 성능을 검토하고,

구성 검토

Bastion에 로그인하고 구성을 검토합니다.

  1. IP 주소 및 전용 키를 사용하여 ssh를 사용자 opc(Oracle Linux 인스턴스의 경우 기본값)로 배스천에 연결합니다.
    akua$ ssh -i ~/.ssh/cluster.key opc@139.87.214.247
    [opc@epsilon-bastion ~]$
  2. df 명령은 마운트된 파일 시스템 및 용량을 보여줍니다.
    [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. Slurm 구성을 편집합니다.

    기본적으로 Slurm은 작업 종료 시 컨테이너를 자동으로 제거합니다. 컨테이너를 다시 사용할 가능성이 높으므로 container_scope 인수를 사용하여 작업 간에 컨테이너를 지속시키는 것이 훨씬 효율적입니다. 그러면 동일한 컨테이너를 사용하여 후속 재시작이 크게 가속화됩니다.

    /etc/slurm/plugstack.conf 파일에서 다음과 같이 나타나도록 container_scope=global를 추가합니다.

    [opc@epsilon-bastion ~]$ cat /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global
  4. 각 GPU 노드 및 배스천에서 Slurm을 중지하고 다시 시작합니다.
    GPU 노드 호스트 이름 목록은 sinfo의 출력에 표시됩니다. 이 명령을 pdsh 명령과 함께 사용하여 모든 노드에서 systemctl를 실행합니다. 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. OS 업데이트를 적용합니다.

    OS를 최신 패키지로 업데이트하는 것이 좋습니다. 이전 단계에서와 같이 pdsh를 사용하여 모든 노드를 효율적으로 업데이트합니다.

    # 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

Slurm 구성 편집

기본적으로 Slurm은 작업 종료 시 컨테이너를 자동으로 제거합니다. 컨테이너를 다시 사용할 가능성이 높으므로 container_scope 인수를 사용하여 작업 간에 컨테이너를 지속시키는 것이 훨씬 효율적입니다. 그러면 동일한 컨테이너를 사용하여 후속 재시작이 크게 가속화됩니다.

  1. /etc/slurm/plugstack.conf 파일에서 다음과 같이 나타나도록 container_scope=global를 추가합니다.
    [opc@epsilon-bastion ~]$ cat /etc/slurm/plugstack.conf
    required /usr/local/lib/slurm/spank_pyxis.so container_scope=global
  2. 각 GPU 노드 및 배스천에서 Slurm을 중지하고 다시 시작합니다.
    GPU 노드 호스트 이름 목록은 sinfo의 출력에 표시됩니다. 이 명령을 pdsh 명령과 함께 사용하여 모든 노드에서 systemctl를 실행합니다. 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

OS 업데이트 적용

OS를 최신 패키지로 업데이트하는 것이 좋습니다.

  • 이전 단계에서와 같이 pdsh를 사용하여 모든 노드를 효율적으로 업데이트합니다.
    # 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

컨테이너 가져오기 또는 업로드

엔루트 컨테이너 유틸리티를 사용하는 Slurm용 NVIDIA Pyxis 플러그인은 Slurm 워크로드 관리자와 통합된 클러스터 컨테이너 실행 환경을 제공합니다. 이러한 구성 요소는 소프트웨어 구성 중에 Pyxis 및 Enroot 상자를 선택할 때 설치되었습니다.

Pyxis에서 제공하는 srun --container 옵션에 대한 자세한 내용은 https://github.com/NVIDIA/pyxis/ 또는 srun --help을 참조하십시오.

  1. 컨테이너 실행 환경이 클러스터에서 예상대로 작동하는지 확인합니다.
    이 예에서는 Nvidia의 nvcr.io 저장소에서 TensorFlow 컨테이너를 가져와서 간단한 명령을 실행합니다. 컨테이너 실행 환경이 클러스터에서 예상대로 작동하는지 확인합니다. 처음으로 실행하면 원격 위치에서 큰 컨테이너를 다운로드하고 로드하고 실행을 시작하는 데 25분 이상이 걸릴 수 있습니다.
    $ 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

    명명된 컨테이너를 사용하는 후속 작업은 다운로드가 필요하지 않으며 즉시 실행을 시작합니다.

    $ 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. 컨테이너를 사용할 작업에 앞서 추가 컨테이너를 로드하도록 선택할 수 있습니다.
    여기서 NVIDIA NeMo Framework 컨테이너를 로드하여 LLM 작업을 준비할 수 있습니다. GA 또는 EA 컨테이너에 액세스하려면 ~/.config/enroot/.credentials의 NVIDIA 인증 정보가 필요할 수 있습니다.
    $ 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

    이 큰 컨테이너는 수입하는 데 거의 47 분이 걸렸습니다.

GPU 및 네트워크 성능 검증

NVIDIA NCCL은 GPU용 표준 통신 루틴의 독립형 라이브러리입니다. Nccl-tests는 평균 NCCL 작업 시간(밀리초)과 알고리즘 대역폭 및 버스 대역폭(GB/초)을 보고합니다. 이 테스트는 GPU 및 네트워크의 성능을 측정하고 작업의 정확성을 검증합니다.

자세한 내용은 https://github.com/NVIDIA/nccl-tests/blob/master/doc/PERFORMANCE.md을 참조하십시오.

  1. GitHub에서 NVIDIA nccl-tests를 가져오고 다음 명령을 실행하여 Bastion에서 실행 파일을 작성합니다.
    $ 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. nccl-test를 실행합니다.

    다음은 8개의 GPU를 사용하여 한 클러스터 노드에서 NCCL AllReduce 작업을 실행합니다.

    $ 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. GPU가 16개인 클러스터 노드 2개에서 NCCL AllReduce를 실행합니다.

    이 테스트는 노드 간 클러스터 네트워크를 사용합니다.

    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
    #

    성공적인 결과는 클러스터가 생성형 AI 워크로드를 실행할 준비가 되었음을 나타냅니다.