싱귤레러티(Singularity)는 도커(Docker)와 같이 OS 가상화를 구현하기 위한 HPC 환경에 적합한 컨테이너 플랫폼이다. 사용자 작업 환경에 적합한 리눅스 배포판, 컴파일러, 라이브러리, 애플리케이션 등을 포함하는 컨테이너 이미지를 빌드하고 빌드된 컨테이너 이미지를 구동하여 사용자 프로그램을 실행할 수 있다.
Tensorflow, Caffe, Pytorch와 같은 딥러닝 프레임워크와 Quantum Espresso, Lammps, Gromacs, Paraview 등을 지원하는 빌드된 컨테이너 이미지는/apps/applications/singularity_images/ngc 디렉터리에서 액세스 할 수 있다.
< 가상머신과 컨테이너 아키텍처 비교> <Singularity 컨테이너 아키텍처>
※ 가상머신은 애플리케이션이 하이퍼바이저와 게스트 OS를 거쳐 올라가는 구조이나, 컨테이너는 물리적인 하드웨어에 더 가까우며 별도의 게스트 OS가 아닌 호스트 OS를 공유하기 때문에 오버헤드가 더 작음. 최근 클라우드 서비스에서 컨테이너의 활용이 증가하고 있음
(동영상가이드) 싱귤레러티 컨테이너 이미지 빌드 및 실행 방법
가. 컨테이너 이미지 빌드하기
1. 싱귤레러티 모듈 적재 혹은 경로 설정
$ module load singularity/3.11.0
or
$ $HOME/.bash_profile
export PATH=$PATH:/apps/applications/singularity/3.11.0/bin/
2. 로컬 빌드
뉴론 시스템의 로그인 노드에서 컨테이너 이미지를 로컬 빌드하기 위해서는, 먼저 KISTI 홈페이지 > 기술지원 > 상담신청을 통해 아래와 같은 내용으로 fakeroot 사용 신청을 해야함
$ singularity [global options...] build [local options...] <IMAGE PATH> <BUILD SPEC>
[주요 global options]
-d : 디버깅 정보를 출력함
-v : 추가 정보를 출력함
--version : 싱귤레러티 버전 정보를 출력함
[관련 주요 local options]
--fakeroot : roor 권한 없이 일반사용자가 가짜 root 사용자로 이미지 빌드
--remote : 외부 싱귤레러티 클라우드(Sylabs Cloud)를 통한 원격 빌드(root 권한 필요 없음)
--sandbox : 샌드박스 형태의 쓰기 가능한 이미지 디렉터리 빌드
<IMAGE PATH>
default : 읽기만 가능한 기본 이미지 파일(예시 : ubuntu1.sif)
sandbox : 읽기 및 쓰기 가능한 디렉터리 구조의 컨테이너(예시 : ubuntu4)
<BUILD SPEC>
definition file : 컨테이너를 빌드하기 위해 recipe를 정의한 파일(예시 : ubuntu.def)
local image : 싱귤레러티 이미지 파일 혹은 샌드박스 디렉터리(IMAGE PATH 참조)
URI
library:// 컨테이너 라이브러리 (default https://cloud.sylabs.io/library)
docker:// 도커 레지스트리 (default 도커 허브)
shub:// 싱규레러티 레지스트리 (default 싱귤레러티 허브)
oras:// OCI 레지스트리
[예시]
① Definition 파일로부터 ubuntu1.sif 이미지 빌드하기
$ singularity build --fakeroot ubuntu1.sif ubuntu.def*
② 싱규레러티 라이브러리로부터 ubuntu2.sif 이미지 빌드하기
$ singularity build --fakeroot ubuntu2.sif library://ubuntu:18.04
③ 도커 허브로부터 ubuntu3.sif 이미지 빌드하기
$ singularity build --fakeroot ubuntu3.sif docker://ubuntu:18.04
④ NGC(Nvidia GPU Cloud) 도커 레지스트리로부터 '22년 03월 배포 pytorch 이미지 빌드하기
$ singularity build --fakeroot pytorch1.sif docker://nvcr.io/nvidia/pytorch:22.03-py3
⑤ Definition 파일로부터 pytorch.sif 이미지 빌드하기
$ singularity build --fakeroot pytorch2.sif pytorch.def**
⑥ fakeroot 사용하지 않고 Definition 파일로부터 ubuntu4.sif 이미지 빌드하기
# singularity 3.11.0 버전 이상에서 지원
# Definition 파일에서 기존 컨테이너 이미지 기반 패키지 설치에 적합하며,
apt-get과 같은 시스템패키지 관리자를 사용하는 경우 일부 패키지(git 등) 설치 과정에서
에러가 발생할 수 있음
$ singularity build ubuntu4.sif ubuntu.def*
* ) ubuntu.def 예시
bootstrap: docker
from: ubuntu:18.04
%post
apt-get update
apt-get install -y wget bash gcc gfortran g++ make file
%runscript
echo "hello world from ubuntu container!"
** ) pytorch.def 예시
# 로컬 이미지 파일로부터 콘다를 사용하여 새로운 패키지 설치를 포함한 이미지 빌드
bootstrap: localimage
from: /apps/applications/singularity_images/ngc/pytorch:22.03-py3.sif
%post
pip install jupyter
# 외부 NGC 도커 이미지로부터 콘다를 사용하여 새로운 패키지 설치를 포함한 이미지 빌드
bootstrap: docker
from: nvcr.io/nvidia/pytorch:22.03-py3
%post
pip install jupyter
3.cotainr 사용하여 빌드
cotainr은 사용자가 뉴론 및 자신의 시스템에서 사용중인 conda 패키지를 포함하는 싱귤레러티 컨테이너 이미지를 좀 더 쉽게 빌드할 수 있게 지원하는 도구임
사용자 conda environment를 yml 파일로 export하여 사용자 conda 패키지를 포함하는 뉴론 시스템을 위한 사용자 싱귤레러티 컨테이너 이미지를 빌드할 수 있음
뉴론 및 자신의 시스템에서 기존 conda environment를 yml 파일로 export 하는 방법은 아래와 같음
① Nvidia GPU 장착 계산 노드의 싱귤레러티 컨테이너에서 쉘 실행 후 사용자 프로그램 실행
$ singularity shell --nv* tensorflow_22.03-tf1-keras-py3.sif
Singularity> python test.py
② Nvidia GPU 장착 계산 노드의 싱귤레러티 컨테이너에서 사용자 프로그램 실행
$ singularity exec --nv tensorflow_22.03-tf1-keras-py3.sif python test.py
$ singularity exec --nv docker://tensorflow/tensorflow:latest python test.py
$ singularity exec --nv library://dxtr/default/hpc-tensorflow:0.1 python test.py
③ Nvidia GPU 장착 계산 노드의 싱귤레러티 컨테이너에서 runscript(이미지 빌드 시 생성)가 존재하면 이 스크립트를 먼저 실행한 후,
사용자 명령어(아래 예제에서 python --version)가 존재하면 이어서 실행됨
$ singularity run --nv /apps/applications/singularity_images/ngc/tensorflow_22.03-tf1-keras-py3.sif \
python --version
================
== TensorFlow ==
================
NVIDIA Release 22.03-tf1 (build 33659237)
TensorFlow Version 1.15.5
Container image Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
Copyright 2017-2022 The TensorFlow Authors. All rights reserved.
Various files include modifications (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved.
This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license
NOTE: CUDA Forward Compatibility mode ENABLED.
Using CUDA 11.6 driver version 510.47.03 with kernel driver version 460.32.03.
See https://docs.nvidia.com/deploy/cuda-compatibility/ for details.
NOTE: Mellanox network driver detected, but NVIDIA peer memory driver not
detected. Multi-node communication performance may be reduced.
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
※ 싱귤레러티의 명령어[shell | exec | run | pull ...] 별 도움말을 보려면 “singularity help [command]”를 실행함
※ 계산/로그인 노드에서 Nvidia GPU를 사용하기 위해서는 --nv 옵션을 사용해야 함
3. NGC 컨테이너 모듈을 사용하여 사용자 프로그램 실행
모듈 명령어를 사용하여 NGC 싱규레러티 컨테이너 이미지와 관련된 모듈을 로드하면 싱귤레러티 명령어를 입력하지 않아도 자동으로 컨테이너 이미지가 구동되어 좀 더 쉽게 싱귤레러티 컨테이너에서 사용자 프로그램을 실행할 수 있음
NGC 컨테이너 모듈을 로드하여 컨테이너에서 사용자 프로그램 실행하기
① tensorflow 1.15.5 지원 싱규레러티 컨테이너 이미지(tensorflow_22.03-tf1-keras-py3.sif)를 자동으로 구동하여 사용자 프로그램 실행
$ module load singularity/3.9.7 ngc/tensorflow:22.03-tf1-py3
$ mpirun -H gpu39:2,gpu44:2 –n 4 python keras_imagenet_resnet50.py
② lammps 지원 싱규레러티 컨테이너 이미지(lammps:15Jun2020-x86_64.sif)를 자동으로 구동하여 lammps 실행
$ module load singularity/3.6.4 ngc/lammps:15Jun2020
$ mpirun –H gpu39:2,gpu44:2 -n 4 lmp -in in.lj.txt -var x 8 -var y 8 -var z 8 -k on g 2 \
-sf kk -pk kokkos cuda/aware on neigh full comm device binsize 2.8
③ gromacs 지원 싱규레러티 컨테이너 이미지(gromacs:2020.2-x86_64.sif)를 자동으로 구동하여 gromacs 실행
$ module load singularity/3.6.4 ngc/gromacs:2020.2
$ gmx mdrun -ntmpi 2 -nb gpu -ntomp 1 -pin on -v -noconfout –nsteps 5000 \
–s topol.tpr singularity shell --nv* tensorflow:20.09-tf1-py3.sif
※ 컨네이너 이미지 모듈 로드 후 실행명령어 입력만으로 “singularity run --nv <컨테이너> [실행명령어]”가 자동 실행됨
NGC 컨테이너 모듈 리스트
※ NGC(https://ngc.nvidia.com)에서 Nvidia GPU에 최적화하여 빌드 배포한 도커 컨테이너 이미지를 싱귤레러티로 변환함
※ 컨테이너 이미지 파일 경로 : /apps/applications/singularity_images/ngc
아래 예제는 싱귤레러티 컨테이너에서 pytorch 혹은 keras(tensorflow)로 작성된 resnet50 모델을 사용하여 imagenet 이미지 분류를 위한 병렬 학습 실행을 사용자가 직접 따라해 볼 수 있도록 구성됨
▪ 병렬 학습 작업 스크립트 경로 : /apps/applications/singularity_images/examples
▪ 컨테이너 이미지 디렉터리 경로 : /apps/applications/singularity_images/ngc
▪ 병렬 학습 예제 프로그램 경로
- pytorch 프로그램
(단일노드) /apps/applications/singularity_images/examples/pytorch/resnet50v1.5
(멀티노드-horovod) /apps/applications/singularity_images/examples/horovod/examples/pytorch
- keras(Tensorflow) 프로그램
(멀티노드-horovod) /apps/applications/singularity_images/examples/horovod/examples/keras
▪ imagent 이미지 데이터 경로
- (학습 데이터) /apps/applications/singularity_images/imagenet/train
- (검증 데이터) /apps/applications/singularity_images/imagenet/val
1) /apps/applications/singularity_images/examples 디렉터리에서 아래 작업 스크립트 파일을 사용자 작업 디렉터리로 복사함
2) STATE가 idle 상태인 계산 노드가 있는 파티션을 확인함
아래 예제에서는 cas_v100nv_8, cas_v100nv_4, cas_v100_4, cas_v100_2 등의 파티션에 가용 계산노드가 존재함
[a1234b5@glogin01]$ sinfo
3) 작업 스크립트 파일에서 작업명(-J), wall_time(--time), 작업 큐(-p), Application이름(--comment), 계산노드 자원 요구량(--nodes, --ntasks-per-node, --gres) 등의 스케줄러 옵션과 학습 프로그램의 파라미터를 변경함
[a1234b5@glogin01]$ vi 01.pytorch.sh#!/bin/sh#SBATCH -J pytorch #job name#SBATCH --time=24:00:00 # walltime#SBATCH --comment=pytorch # application name#SBATCH -p cas_v100_4 # partition name (queue or class)#SBATCH --nodes=1 # number of nodes#SBATCH --ntasks-per-node=2 # number of tasks per node#SBATCH --cpus-per-task=10 # number of cpus per task#SBATCH -o %x_%j.out#SBATCH -e %x_%j.err#SBATCH --gres=gpu:2 # number of GPUs per node## Training Resnet-50(Pytorch) for image classification on single node & multi GPUsBase=/apps/applications/singularity_imagesmoduleloadngc/pytorch:22.03-py3python $Base/examples/pytorch/resnet50v1.5/multiproc.py--nproc_per_node2 $Base/examples/pytorch/resnet50v1.5/main.py $Base/imagenet \--data-backend dali-gpu--raport-filereport.json-j2--archresnet50-cfanin--label-smoothing0.1-b128--epochs50
#!/bin/sh#SBATCH -J pytorch #job name#SBATCH --time=24:00:00 # walltime#SBATCH --comment=pytorch # application name#SBATCH -p cas_v100_4 # partition name (queue or class)#SBATCH --nodes=1 # number of nodes#SBATCH --ntasks-per-node=2 # number of tasks per node#SBATCH --cpus-per-task=10 # number of cpus per task#SBATCH -o %x_%j.out#SBATCH -e %x_%j.err#SBATCH --gres=gpu:2 # number of GPUs per node## Training Resnet-50(Pytorch) for image classification on single node & multi GPUsBase=/apps/applications/singularity_imagesmoduleloadngc/pytorch:22.03-py3python $Base/examples/pytorch/resnet50v1.5/multiproc.py--nproc_per_node2 $Base/examples/pytorch/resnet50v1.5/main.py $Base/imagenet \--data-backend dali-gpu--raport-filereport.json-j2--archresnet50-cfanin--label-smoothing0.1-b128--epochs50
※ 1노드 점유, 노드 당 2 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용
2) pytorch_horovod 멀티 노드 병렬 학습(02.pytorch_horovod.sh)
#!/bin/sh#SBATCH -J pytorch_horovod # job name#SBATCH --time=24:00:00 # walltime#SBATCH --comment=pytorch # application name#SBATCH -p cas_v100_4 # partition name (queue or class)#SBATCH --nodes=2 # the number of nodes#SBATCH --ntasks-per-node=2 # number of tasks per node#SBATCH --cpus-per-task=10 # number of cpus per task#SBATCH -o %x_%j.out#SBATCH -e %x_%j.err#SBATCH --gres=gpu:2 # number of GPUs per node## Training Resnet-50(Pytorch horovod) for image classification on multi nodes & multi GPUsBase=/apps/applications/singularity_imagesmoduleloadngc/pytorch:22.03-py3mpirun_wrapper \python $Base/examples/horovod/examples/pytorch/pytorch_imagenet_resnet50.py \--batch-size=128 --epochs=50
※ 2노드 점유, 노드 당 2 MPI 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용
3) keras(tensorflow)_horovod 멀티 노드 병렬 학습(03.keras_horovod.sh)
#!/bin/sh#SBATCH -J keras_horovod # job name#SBATCH --time=24:00:00 # walltime#SBATCH --comment=tensorflow # application name#SBATCH -p cas_v100_4 # partition name (queue or class)#SBATCH --nodes=2 # the number of nodes#SBATCH --ntasks-per-node=2 # number of tasks per node#SBATCH --cpus-per-task=10 # number of cpus per task#SBATCH -o %x_%j.out#SBATCH -e %x_%j.err#SBATCH --gres=gpu:2 # number of GPUs per node## Training Resnet-50(Keras horovod) for image classification on multi nodes & multi GPUSBase=/apps/applications/singularity_images/examplesmoduleloadngc/tensorflow:22.03-tf1-py3mpirun_wrapperpython $Base/horovod/examples/keras/keras_imagenet_resnet50.py \--batch-size=128 --epochs=50
※ 2노드 점유, 노드 당 2 MPI 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용