System Compleat.

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 는 동작하지 않았던 것 같으므로 인스턴스 켜기전에 확인이 필요함. 


전체 구성의 순서는 다음과 같다. 지금도 그렇게 동작하는지는 확인이 필요. 

  1. STAR: Cluster 에서 제공하는 AMI 의 버전을 확인한다. 사용하려는 인스턴스의 타입에 따라 HVM 기반의 AMI 인지 확인이 필요. 
  2. 마스터 노드를 먼저 켜고 설정을 한 뒤에 마스터 노드에서 컴퓨트 클러스터를 켜는 과정을 가진다. 
  3. 경우에 따라서 사전에 설치된 OpenMPI 도구를 제거할 필요가 있다. 
  4. 필요한 패키지를 다운로드 받아 설치한다. 
  5. 추가적으로 소스를 받아 컴파일해야 하는 도구를 준비한다. 
  6. OpenBLAS 나 LAPACK, ScaLAPACK 과 같은 도구가 필요하다면 역시 준비한다. 
  7. VASP 라이브러리를 준비한다.
진행하다 보면 Makefile 의 수정, 컴파일 테스트 다시 수정 이런 과정이 지속적으로 반복될 것임을 믿어 의심치 않는다. 

아래는 당시에 진행했던 과정이다. 



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. 



모든 구성이 준비 되었으면, VASP Sample 파일로 정상 동작하는지 확인한다. 

mkdir -p /home/vasp-sample 
cd /home/vasp-sample && unzip ../vasp_sample.zip 
/opt/mpich2/bin/mpirun -np 16 /usr/bin/vasp 

문제 없이 동작한다면 이제 작업한 EC2 를 기반으로 AMI 를 만든다. 


다 준비 되었으면, STAR: Cluster 를 설정한다. 설정 예제는 아래와 같은 형태였다. 아마 지금은 좀 바뀌었겠... 

[global] 
DEFAULT_TEMPLATE=vasp 

[aws_info] 
AWS_ACCESS_KEY_ID= 
AWS_SECRET_ACCESS_KEY=
AWS_USER_ID= 

[key vasp] 
KEY_LOCATION=~/.ssh/vasp.rsa

[cluster vasp] 
KEYNAME=vasp 
CLUSTER_SIZE=4
CLUSTER_USER=sgeadmin
CLUSTER_SHELL=bash
NODE_IMAGE_ID= [준비된 AMI ID] 
NODE_INSTANCE_TYPE=cc2.8xlarge
SPOT_BID=0.210 

starcluster createkey vasp -o ~/.ssh/vasp.rsa

다 준비 되었다. 이제 클러스터를 켜고 잘 동작하는지 보자. 



워크로드를 관리하기 위해 Sun Grid Engine queue 를 사용하였다. 




 

정상적으로 동작한다면 아래와 같은 아웃풋을 볼 수 있다. 





이후 각 구성 부분에 대해 조율하면서 성능을 개선하면 되겠다. 


이렇게 시간도 지나고 구성해 본지도 오래된 내용을 굳이 포스팅하는 이유는, 여기에 쏟은 시간이 그래도 적지 않았고 다양한 HPC 의 부분 중 클라우드의 사용이 매우 용이한 도구들이 있다는 점을 알리기 위해서이다. 물론 많은 대학에서는 하드웨어 기반의 클러스터를 운용하고 있지만, 해외의 예일이나 하버드와 같은 학교에서는 유전체 연구라던가 물리, 수학등 자연과학 분야등 다양한 곳에서 클라우드를 사용중이다. 학교뿐 아니라 이런 내용은 기업의 연구소에도 필요할 것이며, 그 사용이 매우 편리하고 쉽다는 점에서 원하는 성능이 나온다면 매우 유용하겠다. 



이전에 서울대학교 의대에 예일에서 교환 교수님으로 오셨던 분의 말씀이 생각난다. 

"이게 돈이 문제가 아니라 물리적으로 설치할 공간이 없어서 클라우드를 생각중입니다. 예일에서는 써 봐서 S3랑 EC2는 다룰줄 알아요." 



즐거운 주말~ 

(younjin.jeong@gmail.com, 정윤진)