HPC on AWS
Techs(younjin.jeong@gmail.com, 정윤진)
이전에 아마존 웹 서비스에 취직하고 나서 아주 잠깐! 아아아아주 잠깐! 남는 시간이 약 일주일 정도 있어서 재미로 시작했던 개인 프로젝트 중 위의 제목과 같은 것이 있었다. 스스로도 2013년 요맘때였던 당시에는 뭔가 서비스에 대해 배워야 할 것도 많았고 또 그걸 어디다가 생산적으로 써먹지 하는 생각에 진행했었던, 그런 재미 위주의 개인 프로젝트였다. 결과적으로는 이것이 특정 파트너가 이 아이디어를 차용하여 서비스로까지 만들어서 서비스를 진행 했으며 그쪽 엔지니어에 의해 성능이 몇군데 더 가다듬어졌던 것으로 알고 있다. 지금 쓰면서 찾아보니 아마존 웹 서비스의 파트너인 이안시스 라는 회사에서 아직 서비스를 진행하고 있다. 자세한 정보는 다음의 링크에서 얻으시면 되겠다. http://iaansys.com/hpc-high-performance-computing/ 본 문서의 내용을 서비스로 사용하고 싶으신 경우라면 위의 링크에서. 아울러 여기서 소개되는 VASP 과정의 경우 인텔의 상용 컴파일러를 사용해 구현하였으므로 만약 상용 컴파일러가 없는 경우라면 대체할 수 있는 오픈소스 컴파일러를 찾아보거나, 아니면 위의 아마존 파트너에서 제공하는 솔루션을 사용하면 편리하겠다.
이제 소개될 내용에서는 MIT 에서 개발한 STAR: Cluster 라는 도구를 사용한다. 라이센스는 LGPL 이며 클러스터 구성을 매우 쉽게 할 수 있는 도구로서 비단 VASP 와 같은 DFT 뿐만 아니라 렌더팜, 수학 및 기타 '베오울프' 스러운 클러스터 구성에는 모두 사용이 가능하겠다. 뭐 이따위 것을 EC2 를 배우는데 썼나 하는 분들도 계시겠지만 어린시절 클라우드가 아직 세상에 없거나 알려지지 않았던 2006년 쯤에 PC GAMESS 와 용산발 PC 기반 리눅스 박스 300 대를 공장 창고에서 엮어 구성했던 아련한 기억이 떠올라서 덜컥 일을 저질렀지 싶다.
위의 다이어그램은 당시에 그렸던 STAR:Cluster 의 동작에 대한 것이다. 구성은 매우 간략한데, 별도의 HPC 솔루션이 설치된 AMI 를 지정한 Placement Group 에 10G 인스턴스를 사용하여 배포한다. 엊그제 한국 리전에서도 Spot 인스턴스 사용이 가능해졌으므로 필요하다면 구성해서 사용하면 되겠다. 단, 이것이 2013년도의 내용이기 때문에 스타클러스터가 현재도 최신의 AMI 를 지원하는지의 여부 등은 현재로서는 잘 모르겠다. 아울러 당시 이 구성을 시험할 때에는 VPC 가 아직 정식 서비스로 나오기 전이었다. 따라서 이제는 없어진 EC2 Classic 의 기반이었고 현재는 아마도 VPC 구성하는 부분까지 포함이 되었지 않았나 싶다.
지금은 EFS 라는 서비스가 있지만, 당시에는 역시 없었으므로 원본 파일의 공유를 위해 NFS 볼륨을 구성했었나 보다. HPC 의 경우 그 동작의 방식에서 아주 크게 보면 하둡과 유사한 Map Reduce 방식으로 일을 쪼개서 각 클러스터의 노드에서 동작하게 하지만 궁극적으로 노드간 통신은 발생하지 않는 경우가 있다. 또 다른 방식은 일을 처리하는데 있어 각 노드간 매우 고속으로 통신해야 하는 경우가 있을 수 있는데, 이는 보통 MPI 라고 불리는 인터페이스를 사용한다. MPI 에 대한 자세한 설명은 위키피디아가 대신한다. (https://en.wikipedia.org/wiki/Message_Passing_Interface) 이 노드간 성능을 매우 고속으로 구성하기 위해 실 하드웨어 기반 구성에서는 아주 오래전 부터 10G 이상의 별도 프로토콜을 사용하는 네트워크를 사용하곤 하는데, 어쨌든 AWS 에서는 이 속도가 10G 로 제한되겠다. 일반적으로 노드의 숫자가 늘어날 수록 성능은 노드의 숫자에 비례해 증가해야 하지만, 노드의 숫자가 너무 많은데 통신 속도나 프로세스 속도가 받쳐주질 못하면 어떤 지점에서 성능 저하가 발생한다. HPC만을 전문으로 하시는 분들께서는 그래서 클라우드의 HPC 사용에 있어 부정적인 견해를 가지는 경우가 많기도 하다.
뭐 요새는 GPGPU 가 달린 인스턴스도 있으므로 다양한 인스턴스를 입맛에 맞게 사용하면 되겠다. 기억에는 10G 를 지원하는 인스턴스의 경우에 Para-vitual 기반의 AMI 는 동작하지 않았던 것 같으므로 인스턴스 켜기전에 확인이 필요함.
전체 구성의 순서는 다음과 같다. 지금도 그렇게 동작하는지는 확인이 필요.
- STAR: Cluster 에서 제공하는 AMI 의 버전을 확인한다. 사용하려는 인스턴스의 타입에 따라 HVM 기반의 AMI 인지 확인이 필요.
- 마스터 노드를 먼저 켜고 설정을 한 뒤에 마스터 노드에서 컴퓨트 클러스터를 켜는 과정을 가진다.
- 경우에 따라서 사전에 설치된 OpenMPI 도구를 제거할 필요가 있다.
- 필요한 패키지를 다운로드 받아 설치한다.
- 추가적으로 소스를 받아 컴파일해야 하는 도구를 준비한다.
- OpenBLAS 나 LAPACK, ScaLAPACK 과 같은 도구가 필요하다면 역시 준비한다.
- VASP 라이브러리를 준비한다.
1. Start a Star: Cluster EC2 for VASP compute node Setup
a. Check latest version of StarCluster AMI http://star.mit.edu/cluster/
b. Use HVM to use cc level instances for compute node, In my case, ami-4583572c, us-east-1
c. Launch cc2.8xlarge instance by Spot request
d. Change root volume size to 12G
2. Delete pre-installed OpenMPI tool
apt-get pruge libmpich2-3 libmpich2-dev mpich2
rm -f /usr/bin/mpi*
3. Download packages
Download files shown as below:
- Intel Fortran Compiler ( l_fcompxe_2013.5192.tgz )
- VASP 4.lib tarball ( vasp.4.lib.tar.gz )
- VASP 4.6 tarball ( vasp.4.6.tar.gz )
- OpenMPI 1.6.5 / MPICH2
4. Package setup
Here’s a list of packages.
- build-essential
- gfortran
- libblas-dev
- libblas3gf
- liblapack3gf
- liblapack-dev
- libblas-dev
- tmux
- default-jre
- gcc-multilib
- libstdc++6-4.6-dev
- libstdc++6
- lib32stdc++6-4.6-dbg
- libgcc1
- libgcc1-dbg
- unzip
apt-get update && apt-get install build-essential gfortran libblas-dev libblas3gf liblapack3gf liblapack-dev libblas-dev tmux unzip default-jre gcc-multilib libstdc++6-4.6-dev libstdc++6 lib32stdc++6-4.6-dbg libgcc1 libgcc1-dgb -y
5. Install Intel Fortran Compiler
Untar l_fcompxe_2013.5192.tgz
mkdir -p /root/tmp && cd /root/tmp
./install.sh
You will complete the steps below during this installation:
Step 1 : Welcome
Step 2 : License
Step 3 : Activation
Step 4 : Intel(R) Software Improvement Program
Step 5 : Options
Step 6 : Installation
Step 7 : Complete
Follow the instructions.
I installed IFC at /opt/intel. Don’t forget to add PATH environment and library path to /etc/ld.so.conf
export PATH=$PATH:/opt/intel/bin
cat >>/etc/ld.so.conf<<EOF
/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64
EOF
6. Install MPI tools
You can choose MPI library by your performance needs, or any other packages currently use. In this document, OpenMPI and MPICH2 will be introduced.
6.1 Compile and install OpenMPI 1.6.5 (Option #1)
Untar openmpi-1.6.5.tar.gz
tar xvzf openmpi-1.6.5.tar.gz && cd openmpi-1.6.5
export OMPI_MPIF90=ifort
./configure --prefix=/opt/openmpi --with-sge F77=/opt/intel/bin/ifort MPIF90=mpif90 F90=/opt/intel/bin/ifort FC=/opt/intel/bin/ifort
This command will compile mpif77 and mpif90 with IFC, and OpenMPI will support SGE.
make && make install
Check mpif77, mpif90
Don’t forget to add OpenMPI bin path to PATH, and library path to /etc/ld.so.conf as usual.
/opt/openmpi/bin/mpif77 -v
ifort version 13.1.3
/opt/openmpi/bin/mpif90 -v
ifort version 13.1.3
6.2 Compile and install MPICH2 (Option #2)
Untar mpich-2-1.5.tar.gz & configure
tar xvzf mpich-2.1.5.tar.gz
./configure --prefix=/opt/mpich2/ FC=ifort F77=ifort
make && make install
Setup PATH environment and library path.
export PATH=$PATH:/opt/mpich2/bin/
cat >>/etc/ld.so.conf<<EOF
/opt/mpich2/lib/
EOF
ldconfig -f /etc/ld.so.conf
7. Compile and install performance packs
7.1 Compile OpenBLAS
# Compile OpenBLAS on same type of instance. If you want to run the cluster with cc2, then compile OpenBLAS on cc2 instance.
git clone git://github.com/xianyi/OpenBLAS
make FC=ifort
make PREFIX=/opt/openblas install
7.2 Compile LAPACK
wget http://www.netlib.org/lapack/lapack-3.4.2.tgz
tar xvzf lapack-3.4.2.tgz && cd lapack-3.4.2
cp make.inc_sample make.inc
cat >>make.inc<<EOF
SHELL = /bin/bash
FORTRAN = ifort
OPTS = -O3
DRVOPTS = $(OPTS)
NOOPT = -O3 -fltconsistency -fp_port
LOADER = -O3
TIMER = INT_CPU_TIME
CC = gcc
CFLAGS = -O3
ARCH = ar
ARCHFLAGS = cr
RANLIB = ranlib
XBLASLIB =
BLASLIB = /opt/openblas/lib/libopenblas.a
LAPACKLIB = liblapack.a
TMGLIB = libtmglib.a
LAPACKELIB = liblapacke.a
7.3 Compile ScaLAPACK
wget http://www.netlib.org/scalapack/scalapack-2.0.2.tgz
tar xvzf scalapack-2.0.2.tgz && cd scalapacke-2.0.2
cp SLMake.inc_sample SLMake.inc
cat >>SLmake.inc<<EOF
CDEFS = -DAdd_
FC = mpif90
CC = mpicc
NOOPT = -O0
FCFLAGS = -O3 -xAVX
CCFLAGS = -O3
FCLOADER = $(FC)
CCLOADER = $(CC)
FCLOADERFLAGS = $(FCFLAGS)
CCLOADERFLAGS = $(CCFLAGS)
ARCH = ar
ARCHFLAGS = cr
RANLIB = ranlib
BLASLIB = -L/opt/openblas/lib/ -lopenblas
LAPACKLIB = -L/opt/lapack/ -llapack
LIBS = $(LAPACKLIB) $(BLASLIB)
8. Compile VASP 4 library
Untar vasp.4.lib.tar.gz
tar xvzf vasp.4.lib.tar.gz && cd vasp.4.lib
cp makefile.linux_ifc_P4 Makefile
diff makefile.linux_ifc_P4 Makefile
19c19
< FC=ifc
---
> FC=mpif77
make
Any errors should not be happened.
9. Compile VASP 4.6
Download VTST (Vasp TST tools) from http://theory.cm.utexas.edu/vasp/downloads/
prompt> wget http://theory.cm.utexas.edu/vasp/downloads/vtstcode.tar.gz
Visit the site for latest version of VTST.
Untar vasp.4.6.tar.gz
tar xvzf vasp.4.6.tar.gz && cd vasp.4.6
cp makefile.linux_ifc_P4 Makefile
Untar VTST tarball
tar xvzf vtstcode.tar.gz
Changes for vtst extension
diff vasp.4.6-vtst/main.F vasp.4.6-normal/main.F
vi Makefile
Follow the instructions at http://theory.cm.utexas.edu/vasp/downloads/
2 additional changed needed.
#1. Remove “bbm.o” from Makefile. This will generate “no rule for make target” error.
#2. Remove below section from “dimer.F”.
Summary about major changes to make it work.
For OpenMPI setup.
a. Compiler changes
- FC=/opt/intel/bin/ifort # first section
- FC=/opt/openmpi/bin/mpif77 # MPI section
b. Compile flag changes by version specific compiler options
- FFLAGS = -FR -names lowercase -assume byterecl
- OFLAG=-O1 -names lowercase -msse2
- BLAS=-L/opt/intel/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_scalapack_lp64 -lmkl_blacs_openmpi_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
- etc.
For MPICH2 setup
a. Compiler changes
- FC=/opt/intel/bin/ifort # first section
- FC=/opt/mpich2/bin/mpif77 # MPI section
b. Compile flag changes by version specific compiler options
- FFLAGS = -FR -names lowercase -assume byterecl
- OFLAG=-O1 -names lowercase -msse2
- BLAS=-L/opt/intel/mkl/lib/intel64/ -lmkl_intel_lp64 -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
- etc.
정상적으로 동작한다면 아래와 같은 아웃풋을 볼 수 있다.
이후 각 구성 부분에 대해 조율하면서 성능을 개선하면 되겠다.
이렇게 시간도 지나고 구성해 본지도 오래된 내용을 굳이 포스팅하는 이유는, 여기에 쏟은 시간이 그래도 적지 않았고 다양한 HPC 의 부분 중 클라우드의 사용이 매우 용이한 도구들이 있다는 점을 알리기 위해서이다. 물론 많은 대학에서는 하드웨어 기반의 클러스터를 운용하고 있지만, 해외의 예일이나 하버드와 같은 학교에서는 유전체 연구라던가 물리, 수학등 자연과학 분야등 다양한 곳에서 클라우드를 사용중이다. 학교뿐 아니라 이런 내용은 기업의 연구소에도 필요할 것이며, 그 사용이 매우 편리하고 쉽다는 점에서 원하는 성능이 나온다면 매우 유용하겠다.
이전에 서울대학교 의대에 예일에서 교환 교수님으로 오셨던 분의 말씀이 생각난다.
"이게 돈이 문제가 아니라 물리적으로 설치할 공간이 없어서 클라우드를 생각중입니다. 예일에서는 써 봐서 S3랑 EC2는 다룰줄 알아요."
즐거운 주말~
(younjin.jeong@gmail.com, 정윤진)