Singularity 컨테이너
싱귤레러티(Singularity)는 도커(Docker)와 같이 OS 가상화를 구현하기 위한 HPC 환경에 적합한 컨테이너 플랫폼입니다. 사용자 작업 환경에 적합한 리눅스 배포판, 컴파일러, 라이브러리, 애플리케이션 등을 포함하는 컨테이너 이미지를 빌드하고 빌드된 컨테이너 이미지를 구동하여 사용자 프로그램을 실행할 수 있습니다.
Tensorflow, Caffe, Pytorch와 같은 딥러닝 프레임워크와 Quantum Espresso, Lammps, Gromacs, Paraview 등을 지원하는 빌드된 컨테이너 이미지는 /apps/applications/singularity_images/ngc 디렉터리에서 액세스 할 수 있습니다.

< 가상머신과 컨테이너 아키텍처 비교> <Singularity 컨테이너 아키텍처>
※ 가상머신은 애플리케이션이 하이퍼바이저와 게스트 OS를 거쳐 올라가는 구조이나, 컨테이너는 물리적인 하드웨어에 더 가까우며 별도의 게스트 OS가 아닌 호스트 OS를 공유하기 때문에 오버헤드가 더 적습니다. 최근 클라우드 서비스에서 컨테이너의 활용이 증가하고 있습니다.
(동영상가이드) 싱귤레러티 컨테이너 이미지 빌드 및 실행 방법
가. 컨테이너 이미지 빌드하기
1. 싱귤레러티 모듈 적재 혹은 경로 설정
2. 로컬 빌드
뉴론 시스템의 로그인 노드에서 컨테이너 이미지를 로컬 빌드하기 위해서는, 먼저 KISTI 홈페이지 > 기술지원 > 상담신청을 통해 아래와 같은 내용으로 fakeroot 사용 신청을 해야합니다.
시스템명 : 뉴론
사용자 ID : a000bcd
요청사항 : 싱귤레러티 fakeroot 사용 설정
NGC(Nvidia GPU Cloud)에서 배포하는 도커 컨테이너로 부터 뉴론 시스템의 Nvidia GPU에 최적화된 딥러닝 프레임워크 및 HPC 애플리케이션 관련 싱규레러티 컨테이너 이미지를 빌드할 수 있습니다.
3.cotainr 사용하여 빌드
cotainr은 사용자가 뉴론 및 자신의 시스템에서 사용중인 conda 패키지를 포함하는 싱귤레러티 컨테이너 이미지를 좀 더 쉽게 빌드할 수 있게 지원하는 도구입니다.
사용자 conda environment를 yml 파일로 export하여 사용자 conda 패키지를 포함하는 뉴론 시스템을 위한 사용자 싱귤레러티 컨테이너 이미지를 빌드할 수 있습니다.
뉴론 및 자신의 시스템에서 기존 conda environment를 yml 파일로 export 하는 방법은 아래와 같습니다.
cotainr을 사용하기 위해서는 module 명령을 사용하여 singularity 및cotainr 모듈을 먼저 로드해야 합니다.
cotainr build를 사용하여 컨테이너 이미지를 빌드할 때 컨테이너에 대한 기본 이미지를 직접 지정하거나(-base-image 옵션 사용) --system 옵션을 사용하여 뉴론 시스템에 권장되는 기본 이미지를 사용할 수 있습니다.
singularity exec 명령어로 빌드한 컨테이너 이미지를 실행하여 아래 예제와 같이 컨테이너에 생성된 conda environment 리스트를 확인할 수 있습니다.
4. 원격빌드
※ Sylabs Cloud(https://cloud.sylabs.io)에서 제공하는 원격빌드 서비스를 이용하려면 액세스 토큰을 생성하여 뉴론 시스템에 등록해야 합니다. [참조 1] ※ 또한, Sylabs Cloud에 웹 브라우저 접속을 통해서 싱귤레러티 컨테이너 이미지의 생성∙관리가 가능합니다. [참조 2]
5. 컨테이너 이미지 가져오기/내보내기
※ Sylabs Cloud 라이브러리에 컨테이너 이미지를 내보내기(업로드) 위해서는 먼저 액세스 토큰을 생성하여 뉴론 시스템에 등록해야 합니다. [참조 1]
6. 컨테이너 이미지에서 제공되지 않는 파이썬 패키지 등을 사용자 홈 디렉터리에 설치하는 방법
※ 단, 여러 가지 컨테이너 이미지를 사용하는 경우 사용자 프로그램 실행 시 사용자 홈 디렉터리에 추가로 설치한 패키지를 먼저 찾기 때문에 다른 컨테이너 이미지에서 요구하는 패키지와 충돌이 발생하여 정상적으로 동작하지 않을 수 있습니다.
나. 싱귤레러티 컨테이너에서 사용자 프로그램 실행
1. 싱귤레러티 모듈 적재 혹은 경로 설정
2. 싱귤레러티 컨테이너에서 프로그램 실행 명령어
※ 싱귤레러티의 명령어[shell | exec | run | pull ...] 별 도움말을 보려면 “singularity help [command]”를 실행합니다.
※ 계산/로그인 노드에서 Nvidia GPU를 사용하기 위해서는 --nv 옵션을 사용해야 합니다.
3. NGC 컨테이너 모듈을 사용하여 사용자 프로그램 실행
모듈 명령어를 사용하여 NGC 싱규레러티 컨테이너 이미지와 관련된 모듈을 로드하면 싱귤레러티 명령어를 입력하지 않아도 자동으로 컨테이너 이미지가 구동되어 좀 더 쉽게 싱귤레러티 컨테이너에서 사용자 프로그램을 실행할 수 있습니다.
NGC 컨테이너 모듈을 로드하여 컨테이너에서 사용자 프로그램 실행하기
※ 컨네이너 이미지 모듈 로드 후 실행명령어 입력만으로 “singularity run --nv <컨테이너> [실행명령어]”가 자동 실행됩니다.
NGC 컨테이너 모듈 리스트
※ NGC(https://ngc.nvidia.com)에서 Nvidia GPU에 최적화하여 빌드 배포한 도커 컨테이너 이미지를 싱귤레러티로 변환합니다. ※ 컨테이너 이미지 파일 경로 : /apps/applications/singularity_images/ngc
-- [중략] --

4. 스케줄러(SLURM)를 통한 컨테이너 실행 방법
GPU 싱귤레러티 컨테이너 작업 실행
1) 작업 스크립트를 작성하여 배치 형태 작업 실행
실행 명령어 : sbatch<작업 스크립트 파일>
※ 자세한 스케줄러(SLURM) 사용 방법은 "뉴론 지침서-스케줄러(SLURM)를 통한 작업실행" 참조 바랍니다.
※ [참조 3]를 통해 병렬 학습 실행 예제 프로그램을 따라해 볼 수 있습니다.
2) 스케줄러가 할당한 계산 노드에서 인터랙티브 작업 실행
스케줄러를 통해 계산노드를 할당받아 첫번째 계산노드에 쉘 접속 후 인터렉티브 모드로 사용자 프로그램 실행합니다.
※ 1노드 점유, 노드 당 2 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용 예제
GPU 싱귤레러티 컨테이너 작업 스크립트 예시
1) 단일 노드
실행 명령어 : singularity run --nv <컨테이너> [사용자 프로그램 실행 명령어]
※ 1노드 점유, 노드 당 2 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용 예제
2) 멀티 노드-1
실행 명령어 : srun singularity run --nv <컨테이너> [사용자 프로그램 실행 명령어]
※ 2노드 점유, 노드 당 2 타스크(총 4개 MPI 프로세스-horovod 사용), 타스크 당 10CPUs, 노드 당 2GPU 사용 예제
3) 멀티 노드-2
NGC 컨테이너 모듈을 로드하면 사용자 프로그램 실행 시 지정된 싱귤레러티 컨테이너를 자동으로 구동합니다.
실행 명령어 : mpirun_wrapper [사용자 프로그램 실행 명령어]
※ 2노드 점유, 노드 당 2 타스크(총 4개 MPI 프로세스-horovod 사용), 타스크 당 10CPUs, 노드 당 2GPU 사용 예제
다. 참조
[참조1] Sylabs Cloud 액세스 토큰 생성 및 뉴론 시스템에 토큰 등록하기




[참조2] 웹 브라우저에서 리모트 빌더에 의한 싱귤레러티 컨테이너 빌드하기


[참조3] 병렬 학습 프로그램 실행 예제
아래 예제는 싱귤레러티 컨테이너에서 pytorch 혹은 keras(tensorflow)로 작성된 resnet50 모델을 사용하여 imagenet 이미지 분류를 위한 병렬 학습 실행을 사용자가 직접 따라해 볼 수 있도록 구성됩니다.
1) /apps/applications/singularity_images/examples 디렉터리에서 아래 작업 스크립트 파일을 사용자 작업 디렉터리로 복사합니다.
2) STATE가 idle 상태인 계산 노드가 있는 파티션을 확인합니다. 아래 예제에서는 cas_v100nv_8, cas_v100nv_4, cas_v100_4, cas_v100_2 등의 파티션에 가용 계산노드가 존재합니다.

3) 작업 스크립트 파일에서 작업명(-J), wall_time(--time), 작업 큐(-p), Application이름(--comment), 계산노드 자원 요구량(--nodes, --ntasks-per-node, --gres) 등의 스케줄러 옵션과 학습 프로그램의 파라미터를 변경합니다.
4) 스케줄러에 작업을 제출합니다.
5) 스케줄러에 의해 할당된 계산 노드를 확인합니다.
6) 스케줄러에 의해 생성되는 로그 파일을 모니터링 합니다.

7) 스케줄러에 의해 할당된 계산 노드에서 학습 프로세스 및 GPU 활용 현황을 모니터링 합니다.

작업 스크립트
1) pytorch 단일 노드 병렬 학습(01.pytorch.sh)
※ 1노드 점유, 노드 당 2 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용
2) pytorch_horovod 멀티 노드 병렬 학습(02.pytorch_horovod.sh)
※ 2노드 점유, 노드 당 2 MPI 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용
3) keras(tensorflow)_horovod 멀티 노드 병렬 학습(03.keras_horovod.sh)
※ 2노드 점유, 노드 당 2 MPI 타스크, 타스크 당 10 CPUs, 노드 당 2GPU 사용
Last updated