Computing

[MPI] OpenMPI 설치 (Ubuntu 18.04) 본문

Parallel | Distributed Computing/개념

[MPI] OpenMPI 설치 (Ubuntu 18.04)

jhson989 2022. 7. 20. 22:29

MPI, OpenMPI

MPI(Message Passing Interface, 메세지 전달 인터페이스)는 여러 컴퓨터 간의 정보 교환을 기술하는 표준[1]이다. 여러 컴퓨터를 이용한 분산 및 병렬 처리 시, 컴퓨터간의 데이터 전송의 표준(message-passing library interface specification)이다. 즉 구체적인 프로토콜, 구현이 아닌 어떤 기능들이 제공되어야 하는 지를 나타내는 기술서 정도의 개념이다.

 

Fig 1. MPI 예제 [2]

 

MPI는 여러 컴퓨터에서 프로세스(process)들이 실행될 때, 그 프로세스들간의 통신을 위해 사용된다. Fig 1.은 4개의 컴퓨터(노드, node)에서 실행되는 MPI 프로그램 예제를 보여준다. mpirun을 통해 ./myapp 프로그램을 실행하는 4개의 프로세스가 생성되어 각각 4대의 컴퓨터에서 병렬로 실행된다. 각자의 독립된 컴퓨터에서 실행되는 프로세스간의 정보 교환(데이터 전송)이 필요할 경우, MPI 통신 라이브러리를 이용하여 정보 교환을 진행한다. 전송되는 데이터를 message라고 한다.

 

MPI는 이미 대부분의 multi-node 시스템(분산시스템, 슈퍼컴퓨터, 클라우드 컴퓨터 등등)에서 가장 많이 사용되는 정보 교환 라이브러리이다. 여러 구현체가 있는데 OpenMPI, MPICH 등이 가장 많이 사용되는 구현체이다. 이번 포스터에서는 OpenMPI를 어떻게 설치하는 지를 [3]를 바탕으로 정리해 보고자 한다.

 

 

 

설치 환경

설치 테스트를 위해 가상화를 이용하여 Virtual machine(VM)를 생성하고, host system과 VM들을 이용하여 MPI 통신을 테스트하였다. 가상화 솔루션으로 qemu-kvm을 이용하였으며, qemu-kvm을 통해 2개의 VM을 생성하였다. Host system과 2개의 VMs 모두 ubuntu 18.04가 설치되었다. 테스트 환경을 도표로 나타내면 다음 Fig 2.와 같다.

 

Fig 2. OpenMPI 설치환경

 

소프트웨어 버전은 다음과 같다. 3개의 node 모두 동일한 소프트웨어 버전을 가진다.

- OS : ubuntu 18.04

- gcc : 7.4

- OpenMPI : 4.1.1 (설치링크 : https://www.open-mpi.org/software/ompi/v4.1/downloads/openmpi-4.1.1.tar.gz

(여기서 사용자가 mpirun 명령어를 실제 실행하는 노드를 master로 구분해둔 것으로 master와 worker 노드의 구분에는 큰 의미는 없다.)

 

 

OpenMPI 설치 방법

OpenMPI 설치 방법을 요약하자면 다음과 같다.

 

0. 모든 노드에 OpenMPI용 사용자 계정을 만들기

1. 모든 노드의 /etc/hosts 업데이트하기

2. 모든 노드에 SSH 설치 및 master의 공개키를 worker 노드들에게 복사

3. 모든 노드간의 NFS 생성

4. 모든 노드에 OpenMPI 설치

5. 설치 테스트

 

 

0. 모든 노드에 OpenMPI용 사용자 계정 만들기

이 단계는 필수 단계는 아니다. 다만 OpenMPI 사용시 모든 노드의 사용자계정의 이름이 동일하여야 한다. (동일하지 않아도 되는 지는 확인해야겠지만, 동일할 경우 좀 더 편하게 작업할 수 있다.)

 

OpenMPI에 참여하는 모든 노드들(1 master, 2 workers)에 mpiuser라는 아이디를 만든다.

sudo adduser mpiuser
sudo usermod -aG sudo mpiuser
su mpiuser

// 추가사항
// Group의 gid, User의 uid가 모두 일치하면 좋음 -> NFS에서 파일 권한 문제 발생
// 따라서 유저와 유저그룹의 uid, gid를 통일시켜줄 수 있음
// root 계정에서 실행함
usermod -u [어떤숫자] mpisuer // ex) usermod -u 1001 mpiuser
groupmod -g [어떤숫자] mpiuser // ex) groupmod -g 1001 mpiuser

 

 

1. 모든 노드의 /etc/hosts 업데이트하기

/etc/hosts 파일은 컴퓨터의 로컬 DNS 역할을 하는 파일로, 여기에 각 노드의 도메인 이름과 IP 주소를 등록한다. 도메인 이름은 원하는 이름으로 설정해도 된다. [3]에서는 master의 /etc/hosts만 업데이트해도 된다고 하였으나, 나는 일단 모든 노드의 /etc/hosts를 업데이트하였다. 

# sudo vim /etc/hosts
192.168.128.20   master
192.168.128.21   worker1
192.168.128.22   worker2

 

 

2. 모든 노드에 SSH 설치 및 master의 공개키를 worker 노드들에게 복사

MPI는 SSH를 이용해 각 노드에 접근하기 모든 노드에 SSH를 설치하여야 한다. 

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install net-tools
sudo apt-get install openssh-server openssh-client
sudo service ssh restart

 

SSH는 공개키 암호방식을 사용하는데, master 노드의 공개키를 모든 worker 노드에 복사해두면 master 노드에서 worker 노드로의 접근은 암호를 입력하지 않아도 가능해진다. [3]에서는 master 노드의 공개키만 worker 노드들에 복사하면 된다고 하였지만, 나는 모든 노드의 공개키를 all-to-all로 다 복사해놓았다. (Worker에서 다른 worker로 로그인할 경우도 있지 않을까 싶어서)

# 공개키 생성
ssh-keygen -t rsa
# 공개키 복사
ssh-copy-id mpiuser@worker1
ssh-copy-id mpiuser@worker2
sudo service ssh restart
# 비밀번호 없이 로그인되는 지 확인하기
ssh mpiuser@worker1

 

 

3 모든 노드간의 NFS 생성

OpenMPI는 같은 프로그램(exe, binary, executable)을 여러 노드에서 실행시키는 방식으로 작동한다. 또한 실행시킬 프로그램은 모든 노드에서 같은 경로에 존재해야 한다. 프로그램 및 데이터 공유를 편하게 하기 위해서 모든 노드간에 공유되는 NFS(Network File System)를 생성한다.

 

Master 노드를 NFS server로 한다.

# Master 노드에서 실행
sudo apt-get install nfs-kernel-server
# NFS가 마운트될 폴더 만들기
sudo mkdir /mpi-nfs
sudo chmod 777 /mpi-nfs

 

Master 노드의 /etc/exports를 업데이트한다. /etc/exports는 NFS에서 서버가 다른 노드(클라이언트)와 공유할 폴더를 명시해두는 파일이다. Master 노드에서 /etc/exports를 업데이트한다.

# 파일 열기
sudo vim /etc/exports

# 파일안에 작성
/mpi-nfs worker1(rw,sync,no_subtree_check)
/mpi-nfs worker2(rw,sync,no_subtree_check)

# 파일 적용
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

# 방화벽 확인. 1 or 2 중 선택
# 1. inactivate
sudo ufw status
# 2. nfs 추가
sudo ufw allow nfs

 

이제 worker 노드들에 nfs client를 설치한다.

sudo apt-get install nfs-common
sudo mkdir -p /mpi-nfs
sudo chmod 777 /mpi-nfs

# 임시 마운트
sudo mount master:/mpi-nfs /mpi-nfs 

# 영구적 마운트
sudo vim /etc/fstab

# 파일안에 작성
master:/mpi-nfs   /mpi-nfs   nfs   defaults   0   0

# reboot
sudo reboot

 

4. 모든 노드에 OpenMPI 설치

이제 OpenMPI를 설치할 차례이다. OpenMPI는 공식홈페이지에서 다운로드 받을 수 있다. 이번 포스터에서는 4.1.1 버전의 OpenMPI를 다운받아 설치할 것이다.

 

# 다운로드
sudo wget https://www.open-mpi.org/software/ompi/v4.1/downloads/openmpi-4.1.1.tar.gz
# 압축풀기
tar  -xvzf openmpi-4.1.1.tar.gz
# build
cd openmpi-4.1.1/
sudo ./configure --prefix="/home/mpiuser/.openmpi"
sudo make
sudo make install

# 환경변수 설정
export PATH=”$PATH:/path-to-home/.openmpi/bin”
export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:/path-to-home/.openmpi/lib”

 

모든 노드에 OpenMPI가 설치되면 설치완료이다.

 

 

 

Reference

[1] https://en.wikipedia.org/wiki/Message_Passing_Interface

[2] https://developer.nvidia.com/blog/introduction-cuda-aware-mpi/

[3] https://feyziyev007.medium.com/how-to-install-openmpi-on-ubuntu-18-04-cluster-2fb3f03bdf61