NVIDIA

GPGPU

  • NVIDIA Quadro cards are designed for accelerating CAD.
  • NVIDIA Tesla cards are designed for scientific computations.
  • NVIDIA RTX is a graphics rendering development platform.

NVIDIA Tesla

Nvidia retired the Tesla brand in May 2020, reportedly because of potential confusion with the brand of cars. Its new GPUs are branded Nvidia Data Center GPUs, as in the A100 GPU.

  • H100 / 80G, Mar 2022
  • A100 / 40G or 80G, May 2020
  • T4 / 16G, Sep 2018 - Inferences
  • V100 / 16G or 32G, Jun 2017
  • P100 / 16G, Apr 2016
  • P40 / 24G, P4 / 8G, Sep 2016 - Inferences
  • M60 / 2x8G, M6 / 8G, Aug 2015
  • K80 / 2x12G, Nov 2014
  • K40 / 12G, Oct 2013

SuperPOD

Compute Nodes: 40ea DGX A100 system(8x A100)

A100 80GB부터는 VRAM이 80GB. V100까지는 16/32GB까지만 제공되어 insufficient memory error가 잦았다.

$ nvidia-smi topo --matrix
	GPU0	GPU1	GPU2	GPU3	GPU4	GPU5	GPU6	GPU7	CPU Affinity	NUMA Affinity
GPU0	 X 	NV1	NV1	NV2	NV2	PHB	PHB	PHB	0-63	0-1
GPU1	NV1	 X 	NV2	NV1	PHB	NV2	PHB	PHB	0-63	0-1
GPU2	NV1	NV2	 X 	NV2	PHB	PHB	NV1	PHB	0-63	0-1
GPU3	NV2	NV1	NV2	 X 	PHB	PHB	PHB	NV1	0-63	0-1
GPU4	NV2	PHB	PHB	PHB	 X 	NV1	NV1	NV2	0-63	0-1
GPU5	PHB	NV2	PHB	PHB	NV1	 X 	NV2	NV1	0-63	0-1
GPU6	PHB	PHB	NV1	PHB	NV1	NV2	 X 	NV2	0-63	0-1
GPU7	PHB	PHB	PHB	NV1	NV2	NV1	NV2	 X 	0-63	0-1

Legend:

  X    = Self
  SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
  PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
  PIX  = Connection traversing at most a single PCIe bridge
  NV#  = Connection traversing a bonded set of # NVLinks

DeepOps

DevOps, MLOps와 함께 딥러닝을 중심으로 한 DeepOps, 그리고 NVIDIA가 공개한 자사 DGX 서버에 Slurm clusters를 구성하는 툴의 이름이기도 하다. aws에 Ubuntu 환경(공식 Deep Learning AMI 18.04)에서도 설치를 지원한다.

그러나 ansible로 설치하는 스크립트의 특성상 많은 시행착오가 뒤따르며, 한 번에 제대로 설치되지 않는다.

  • slurm: 각 노드에 배치작업을 실행하는 스케줄러, 노드에는 작업을 관리하는 데몬이 떠 있다.
  • enroot: 도커 이미지를 sqsh(squashfs) 파일로 관리
  • pyxis: slurm의 컨테이너 플러그인으로, srun에서 sqsh 컨테이너 파일을 주고 받을 수 있다.

slurm

srun 실행 후 pyxis 플러그인으로 컨테이너 이미지(sqsh)를 얹어 실행해보면 각 노드에 네트워크로 전송하는 것을 확인할 수 있다. nload 에서 볼 수 있다. nvcr.io/nvidia/pytorch:22.03-py3는 10GB 이므로 전송에 aws g4dn에서 1:40 이상 소요된다.

$ srun -N2 --container-image=alpine grep PRETTY /etc/os-release # import 후 OS 출력
$ srun -N2 --container-image=./alpine.sqsh grep PRETTY /etc/os-release # sqsh 전달하여 OS 출력

# NVIDIA GPU 이미지를 전달하여 `nvidia-smi` 실행
$ srun --gres=gpu:1 \
-N2 \
-l \
--container-image=./pytorch-slurm.sqsh \
nvidia-smi

# NCCL Tests
$ export NCCL_DEBUG=INFO
$ export NCCL_SOCKET_IFNAME=ens3
$ export NCCL_IB_DISABLE=1
$ export UCX_MAX_RNDV_RAILS=1
$ srun --gres=gpu:1 \
-N2 \
-l \
--container-image=./pytorch-slurm.sqsh \
all_reduce_perf -b 1M -e 1G -c 0 -n 1

NCCL Tests1를 위한 dockerfile은 다음과 같다.

FROM nvcr.io/nvidia/pytorch:22.03-py3

RUN apt-get update
RUN apt install net-tools

ENV NCCL_SOCKET_IFNAME=en
ENV NCCL_TESTS_COMMITISH=f773748b46

WORKDIR /opt/nccl_tests
RUN wget -q -O - https://github.com/NVIDIA/nccl-tests/archive/${NCCL_TESTS_COMMITISH}.tar.gz | \
        tar --strip-components=1 -xzf - \
        && CC=mpicc CXX=mpicxx make MPI=1
RUN cp -R /opt/nccl_tests/build/* /usr/local/bin/

GPU 2장을 사용하고 [3-4]번 서버에 nvidia-smi를 실행하는 명령:

$ srun --gres=gpu:2 \
--nodelist=gpu03,gpu04 \
-l \
--container-image=./pytorch-slurm.sqsh \
nvidia-smi

노드가 drain 상태일때 다음과 같이 복구한다.

$ sudo scontrol update nodename=gpu[01-02] state=resume
# 상태 조회
$ sinfo -N -l
# Tasks 조회
$ watch -n 1 squeue -l

전체 노드 설정은 slurm.conf에 저장되어 있다.

# /etc/slurm/slurm.conf
...
# COMPUTE NODES
GresTypes=gpu
NodeName=gpu01  Gres=gpu:8     CPUs=64 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 Procs=32 RealMemory=467190 State=UNKNOWN
NodeName=gpu02  Gres=gpu:8     CPUs=64 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 Procs=32 RealMemory=467190 State=UNKNOWN
NodeName=gpu03  Gres=gpu:8     CPUs=64 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 Procs=32 RealMemory=467190 State=UNKNOWN
NodeName=gpu04  Gres=gpu:8     CPUs=64 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 Procs=32 RealMemory=467190 State=UNKNOWN

pyxis

이미지 배포에 오랜 시간이 걸리는데, 각 노드에 $ enroot list로 이미지가 존재하면 container-name 지정으로 호출할 수 있다. 이 경우 이미지 전송을 하지 않으므로 매우 빠르게 실행 가능하다.

$ srun --gres=gpu:1 -N2 -l --container-name=pytorch-slurm nvidia-smi

pyxis 플러그인은 pyxis_pytorch-slurm를 찾는다. 따라서 enroot로 미리 생성할때는 접두어 pyxis_를 붙여야 한다. 그러나 slurm을 실행할 때 pyxis가 각 노드의 enroot 이미지를 날려버리는 이슈가 있다.

Last Modified: 2022/05/20 09:56:13

is a collection of Papers I have written.
© 2000 - Sang-Kil Park Except where otherwise noted, content on this site is licensed under a CC BY 4.0.
This site design was brought from Distill.