본문 바로가기

Study/linux

도커에서 HPL 이용하기

도커에서 HPL 컨테이너 사용하기

도커에서 HPL (High-Performance Linpack) 컨테# 도커에서 HPL 컨테이너 사용하기

도커에서 HPL (High-Performance Linpack) 컨테이너를 사용하는 방법을 알아보자.

아직 도커에 HPL이나 linpack의 공식 이미지가 없다. (2019.09.24. 기준)

그래서 그냥 내가 만들어 쓰기로 했다.

목차:
0. HPL과 준비물

  1. 컨테이너에서 직접 실행시켜보기
  2. Dockerfile 작성하기
  3. 컨테이너 실행 확인하기

HPL이 뭔가?

우선 HPL이 무엇인지 감부터 잡아보자.

HPL은 "High-Performance Linpack"의 약자인데, 여기서 Linpack은 벤치마크 프로그램 이름이다.

즉, HPL은 "High-Performace Computer의 Benchmark Tool"이다. HPL벤치마크는 MPI를 사용하여 LINPACK 프로그램을 병렬화한것으로, 프로세서-메모리가 물리적으로 떨어진 클러스터 시스템에서도 LINPACK을 수행할 수 있게 해준다.

HPL을 실행하려면 MPI와 BLAS 혹은 VSPL이 필요하다.

 

 

MPI

MPI : "Message Passing Interface."

MPI는 규격(인터페이스), OpenMPI나 MPICH는 MPI를 구현한 프로그램.

이 포스팅에서는 OpenMPI를 이용한다.

참고로 OpenMP와 OpenMPI는 다르다. 괜히 헷갈려서 고생하지 말자.

 

 

BLAS

BLAS: "Basic Linear Algebra Subprograms."

BLAS는 LINPACK 벤치마크에 필요한 라이브러리다. 기본적인 연산들을 구현해놨다.

 

 

VSIPL

VSIPL: "Vector Signal Image Processing Library." 이미지 프로세싱 API.

VSIPL대신에 BLAS를 사용하면 되므로 다루지 않는다.

 

 

MPI, BLAS, VSIPL에 대해 더 자세히 알아보고 싶다면 이 링크 참고.

 

 

 

 

도커 컨테이너에 실행시키기

1. 빌드에 필요한 준비물 다운받기

$ apt-get -y update
$ apt install -y build-essential 
$ apt-get install -y gcc make 
$ apt-get install -y gfortran 

2. OpenMPI다운받기

openmpi여기서 파일을 다운로드 받아 도커 컨테이너 안으로 넣어준다. 압축해제도 해준다.

$ docker cp [다운받은 파일] [컨테이너에 옮길 위치]

 

컨테이너의 openmpi-4.0.1폴더로 이동해서 환경설정을 수정한다.

$ cd [복사한 openmpi-4.0.1폴더]
$ mkdir "openmpi설치할 폴더" 
$ ./configure --prefix="openmpi설치할 폴더"

 

설치한다.

$ make install

 

PATH 설정

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openmpi/lib
$ export PATH=$PATH:/usr/local/openmpi/bin

 

만약 mpirun을 실행할 때 plm_rsh_agent에러가 뜨면 openssh를 설치해주자. segment fault (11) 에러인가 그렇다.

$ apt-get install -y openssh-client

 

 

3. LAPACK 다운받기

BLAS가 LAPACK패키지 안에 있다. 다운받자.

$ apt install -y liblapack3
$ apt install -y libopenblas-base
$ apt install -y libopenblas-dev
$ apt install -y liblapacke-dev
$ apt install -y liblapack-dev

그리고 사용할 땐 컴파일러 링크 옵션에 -lm -lblas -llapack -llapacke를 주면 된다.

 

4. HPL 다운받기

HPL 홈페이지 여기서 파일을 다운받자. OpenMPI처럼 컨테이너 안에 압축을 풀어 넣어준다.

$ docker cp [다운받은 파일 위치] [컨테이너에 붙여넣을 위치]

 

이 컨테어네에 붙여넣은 위치를 top folder라고 부르겠다.
top folder로 이동해서 Make.파일을 수정한다. $[top folder]/setup/에 아키텍쳐별 기본 make파일이 있다. 없으면 하나를 골라서 내부를 수정하자. 내 아키텍쳐는 arch명령어로 확인할 수 있다.

 

직접 Make.를 수정하기

잘 읽어보고 디렉토리와 링크해주는 옵션만 수정해주면 되는데

일일히 설명하기 힘들어서 그냥 내 파일을 올린다.

나는 x86_64다. 글이 길어 따로 링크한다. 여기

 

Make.파일을 make한다.

 $ make arch=<arch>

그러면 top folder/bin/안에 xhplhpl.dat이 생겼을것이다.

 

Dockerfile 작성하기

이미지를 만드는 방법은 2가지가 있다:

  1. 우분투 컨테이너에 어플리케이션을 돌린 그 상태를 이미지로 만든다. (commit)
  2. Dockerfile을 이용해서 이미지를 만든다.

지금은 2번 방법을 이용해서 만들어보자. 나중에 옵션을 변경하기 쉽도록.

[도커 컨테이너에 실행시키기](#도커 컨테이너에 실행시키기)에서 한 방법대로 Dockerfile을 만들어보자.

$ docker build -t [이미지이름] [Dockfile위치]

Dockerfile

# 1. install ubuntu & basic tools
FROM ubuntu:18.04
LABEL maintainer="blackmilk274@gmail.com"
RUN apt-get -y update
# RUN apt-get install -y apt-utils
RUN apt install -y build-essential 
RUN apt-get install -y gcc make 
# RUN DEBIAN_FRONTEND=noninteractive apt-get install -y gfortran
RUN apt-get install -y gfortran 
RUN apt-get update

# 2. Install MPI(OpenMPI)
ADD https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.1.tar.gz /AddedFiles/
RUN tar -xf /AddedFiles/openmpi-4.0.1.tar.gz -C /AddedFiles/
WORKDIR /AddedFiles/openmpi-4.0.1
RUN mkdir /usr/local/openmpi
RUN ./configure --prefix="/usr/local/openmpi"
RUN make install

# fortran compiler가 알수 있도록 mpi 라이브러리 위치 설정
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/openmpi/lib
ENV PATH $PATH:/usr/local/openmpi/bin
# plm_rsh_agent error 고치려고 openssh 설치
RUN apt-get install -y openssh-client
# RUN export MY_MPIRUN_CLI_ARGS="--allow-run-as-root"
# RUN source ~/.bashrc

# 3. Install BLAS (in the LAPACK.. https://www.assistedcoding.eu/2017/11/04/how-to-install-lapacke-ubuntu/)
RUN apt install -y liblapack3
RUN apt install -y libopenblas-base
RUN apt install -y libopenblas-dev
RUN apt install -y liblapacke-dev
RUN apt install -y liblapack-dev

# 4. Install HPL (http://www.netlib.org/benchmark/hpl/)
# http://www.netlib.org/benchmark/hpl/software.html 
ADD http://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz /AddedFiles/
RUN tar -xf /AddedFiles/hpl-2.3.tar.gz -C /AddedFiles/
WORKDIR /AddedFiles/hpl-2.3
COPY ./Make.x86_64_3 /AddedFiles/hpl-2.3/Make.x86_64
RUN make arch=x86_64

# fix errno=1
ENV OMPI_MCA_btl_vader_single_copy_mechanism none

 

 

HPL 실행방법

도커내부에서는 루트로 실행한다. 루트권한으로 mpirun을 실행하려면 옵션이 더 붙는다. --allow-run-as-root

xhpl이 있는 폴더로 이동해서 기본적인 벤치마킹을 해보자.

$ mpirun --allow-run-as-root -np 4 xhpl

 

참고

클러스터 시스템 성능 측정: https://cs.kaist.ac.kr/upload_files/report/1227159241.pdf

MPI가 뭔가: http://byh819.blogspot.com/2015/03/mpimessage-passing-interface-mpi-o.html

High-Performace Computing 문서: https://ulhpc-tutorials.readthedocs.io/en/latest/

Luxembourg university에서 만든 HPL 입문서: https://ulhpc-tutorials.readthedocs.io/en/latest/parallel/mpi/HPL/

HPL 문서: http://www.netlib.org/benchmark/hpl/

도커 이미지 만들기: https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html

도커 이미지 만들기: http://blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220974346757

openmpi 설치: https://github.com/firemodels/fds/wiki/Installing-Open-MPI-on-a-Linux-Cluster

openmpi 설치 pdf: http://lsi.ugr.es/jmantas/pdp/ayuda/datos/instalaciones/Install_OpenMPI_en.pdf

도커 이미지 ADD: http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter07/09

도커에서 mpirun : https://github.com/open-mpi/ompi/issues/4451

HPL 예제:https://www.netlib.org/benchmark/hpl/results.html

HPL 라즈베리파이: https://statkclee.github.io/hpc/rpi-benchmark-hpl.html

HPL, LINPACK 옵션 주기: https://wiki.kldp.org/KoreanDoc/html/HPC-KLDP/x225.html

HPL.dat 옵션 주기 : http://www.netlib.org/benchmark/hpl/faqs.html#blsize