사용자 도구

사이트 도구


mpi

MPI

Docker에서 MPI 실행

MS-MPI

  • worker
activate <env>
smpd -d
  • master
mpiexec -host <ip> -dir <working dir> -n <n processes> python helloworld.py
mpiexec -machinefile hosts.txt -dir <working dir> -n <n processes> python helloworld.py
  • hosts.txt
127.0.0.1 1
192.168.0.1 2

mpi4py

mpi4py는 C MPI 라이브러리를 python에서 사용할 수 있도록 모듈로 만든 라이브러리 중의 하나입니다. 여기서는 라이브러리를 윈도우즈, 리눅스 환경에서 설치하는 방법을 알아보고 간단하게 실행을 테스트 해보겠습니다.

설치

Window에서 설치 방법

윈도우즈에서 mpi4py를 설치하게 위해서는 Visual Studio와 MPI라이브러리가 설치되어 있어야 합니다. 윈도우즈에서 사용가능한 MPI 라이브러리는 OpenMPI와 MPICH2가 있고, 마이크로 소프트에서 제공하는 MPICH2인 Microsoft HPC SDK 2008이 있습니다. 몇 가지 경우를 테스트해본 결과 Visual Studio 2008과 HPC SDK 2008을 사용하는 것이 가장 쉽다고 판다한여 이 것을 기준으로 진행 하겠습니다. 물론 python 모듈이므로 python 2.6은 필수적으로 설치되어 있어야 합니다.

  1. Visual Studio 2008 설치
  2. HPC SDK 2008 설치
  3. mpi4py의 소스를 다운받아 압축 해제 (mpi4py-1.2.2.tar.gz)
  4. 압축 해제된 폴더로 이동하여 다음 명령 입력 (모듈 빌드 및 설치)
    1. R:/mpi4py-1.2.2/python setup.py build --mpi=msmpi install
    2. 여기서 msmpi는 HPC SDK 2008을 사용한 다는 뜻이며, 다른 라이브러리를 사용할 때는 다른 지시어를 사용합니다.
    3. mpi.cfg는 ini파일 형식으로 구성되어 있으며, 이곳의 [msmpi] 부분에 빌드를 위한 설정이 있습니다.
    4. :!:만약 HPC SDK 2008을 기본 설치 폴더가 아닌 다른 곳에 설치 했다면 여기서 수정해주어야 합니다.
  5. 마지막에 error 메시지 없이 종료 된다면 설치 완료!

mpich2를 사용할 때는

  1. visual studio 2008 설치
    1. 2010이 설치되어 있다고 해도 필요하다!
  2. mpich2 다운로드 및 설치
  3. mpi4py 설치
    1. mpi.cfg 파일 수정한다.
    2. setup.py build –mpi=mpich2-win install
  4. 사용자 등록
    1. mpiexec -register

python을 32비트 버전으로 설치해서인지, mpich2도 32bit로 설치해야 했다.

실행

hosts 파일 설정, “host이름:core개수” 형식으로 입력

cilab00:6
cilab01:2
cilab02:2
cilab03:2

실행 명령 및 결과

mpiexec -machinefile e:\hosts -n 20 python.exe c:\mpi\helloworld.py
mpiexec -hosts 2 192.168.123.100  192.168.123.110 10 python.exe c:\mpi\helloworld.py
E:\>mpiexec -hosts 2 192.168.123.100  192.168.123.110 10 python.exe c:\mpi\helloworld.py

M:\>mpiexec -n 20 -machinefile e:\hosts python \\192.168.123.100\mirror\helloworld.py
Hello, World! I am process 19 of 20 on rex8312-PC.
Hello, World! I am process 0 of 20 on rex8312-PC.
Hello, World! I am process 16 of 20 on rex8312-PC.
Hello, World! I am process 8 of 20 on rex8312-PC.
Hello, World! I am process 18 of 20 on rex8312-PC.
Hello, World! I am process 11 of 20 on rex8312-PC.
Hello, World! I am process 1 of 20 on rex8312-PC.
Hello, World! I am process 10 of 20 on rex8312-PC.
Hello, World! I am process 2 of 20 on rex8312-PC.
Hello, World! I am process 17 of 20 on rex8312-PC.
Hello, World! I am process 9 of 20 on rex8312-PC.
Hello, World! I am process 3 of 20 on rex8312-PC.
Hello, World! I am process 4 of 20 on rex8312-test.
Hello, World! I am process 13 of 20 on rex8312-test.
Hello, World! I am process 15 of 20 on rex8312-test.
Hello, World! I am process 6 of 20 on rex8312-test.
Hello, World! I am process 12 of 20 on rex8312-test.
Hello, World! I am process 5 of 20 on rex8312-test.
Hello, World! I am process 14 of 20 on rex8312-test.
Hello, World! I am process 7 of 20 on rex8312-test.

설정이 제대로 되었는지 확일 하려면

smpd -status
mpiexec -validate

passphrase 인증을 요구할 때

다시 mpich2를 설치하거나, 다음 명령을 입력한다

smpd -install
smpd -install -phrase MYMPICH2PASSPHRASE  # passphrase가 생각나지 않을 때, 관리자 권한으로 cmd 창을 열고 입력해야 함

사용자 등록 하는 방법

mpiexec -remove
mpiexec -register

Linux (Ubuntu 8.x 이상) 에서 설치 방법

우분투에서는 다음 명령을 차례대로 입력하면 간단히 설치 가능합니다.

>sudo su
#apt-get install openmpi-bin // openmpi 설치
#apt-get install python2.6-dev  // python header 파일 설치
#easy_install mpi4py  // mpi4py 설치

또는

#apt-get install mpich-bin libmpich1.0gf libmpich1.0-dev
#pip install mpi4py

예제 실행

mpi로 작성된 프로그램을 실행하기 위해서는 OpenMPI에서는 mpirun을, MPICH2에서는 mpiexec를 사용합니다. 사용한 예제는 mpiexec를 기준으로 할 것입니다. mpi4py가 모듈이 설치된 폴더에 demo라는 폴더에 예제 프로그램이 있으니 그것을 실행 시켜 보죠. 모듈의 소스가 있는 폴더에도 같은 내용으 demo 폴더가 있습니다.

mpiexec -np 4 python demo/helloworld.py

위 명령은 demo폴더의 helloworld.py를 실행하는 명령입니다. 파일이나 경로를 찾지 못하면 helloworld.py가 있는 경로에서 실행하면 실행 될 것니다. -np 옵션은 이 프로그램을 몇 개의 프로세스로 실행할 것인지를 지정해 주는 것입니다. 성공적으로 실행되면 다음과 같은 결과를 얻을 수 있습니다.

총 4개의 프로세스를 실행하여 각각의 프로세스가 Hello, World!를 출력했습니다.

몇 가지 예제가 더 있으며, demo 폴더의 compute-pi는 $\pi$값을 구하는 3가지 예제가 있습니다.

Ubuntu에 MPI 설치하기

4개의 노드(ub0, ub1, ub2, ub3)를 사용

/etc/hosts 에 노드를 정의

127.0.0.1     localhost
192.168.0.200   cilab00
192.168.0.201   cilab01
192.168.0.202   cilab02
192.168.0.203   cilab03
192.168.0.204   cilab04
192.168.0.205   cilab05
192.168.0.206   cilab06
192.168.0.207   cilab07
192.168.0.208   cilab08
192.168.0.209   cilab09

아래와 같이 절대로 하지 말 것

127.0.0.1     localhost
127.0.1.1     cilab00
192.168.133.100 cilab00
192.168.133.101 cilab01
192.168.133.102 cilab02
192.168.133.103 cilab03

또는,

127.0.0.1     localhost
127.0.1.1     cilab00
192.168.133.101 cilab01
192.168.133.102 cilab02
192.168.133.103 cilab03

NFS 서버 설치(마스터)

$ sudo apt-get install nfs-kernel-server
$ sudo /etc/init.d/nfs-kernel-server start

마스터 노드 공유

모든 노드에 mirror 디렉토리 생성, user는 사용자 이름

$ sudo mkdir -p /mirror/user

마스터에 있는 home 디렉토리를 모든 노드가 공유하도록 한다.

$ sudo echo  /mirror/user *(rw,sync) >> /etc/exports
$ ln -s /mirror/user /home/user/mirror

마스터의 /home을 모든 노드에 마운트 한다.

수작업으로 마운드 할때는

sudo apt-get install nfs-common
omid@ub1:~$sudo mount.nfs ub0:/home /home
omid@ub2:~$sudo mount.nfs ub0:/home /home
omid@ub3:~$sudo mount.nfs ub0:/home /home

부팅할 때마다 자동으로 마운트하도록 모든 노드의 /etc/fstab에 추가, 사용자의 uid:gid가 같아야 쓰기/지우기가 되더라

# cilab00:/home /home nfs4 _netdev,auto 0 0
cilab00:/mirror/user /home/user/mirror nfs _netdev,auto 0 0

ssh-server 설치 (서버)

서버에 ssh 서버 설치

$ sudo apt­-get install openssh-server

SSH 사용자 설정 (서버)

암호입력 없이 ssh 로그인 가능하도록 설정

$ su - user #user 로 로그인

$ ssh­-keygen ­-t dsa

$ cd .ssh

user@cilab00:~/.ssh$ cat id_dsa.pub >> authorized_keys

# $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub hduser@slave # 원격으로 보낼때는 다음 명령 사용

로그인 확인, 암호없이 로그인이 가능해야 함

$ ssh user@cilab00  

GCC 설치

mpiu@ub0:~$ sudo apt-get install build-essential

다른 컴파일러 설치

MPICH를 설치하기 전에 미리 설치

sudo apt-get install gfortran

MPICH2 설치

sudo apt-get install mpich2

테스트

#include <stdio.h>
#include <mpi.h>
 
int main(int argc, char** argv)
{
    int myrank, nprocs;
 
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
 
    printf("Hello from processor %d of %d\n", myrank, nprocs);
 
    MPI_Finalize();
    return 0;
}
mpicc test.c -o test
mpiexec -n 10 ./test

만약 -lcr을 못찾을 때는

sudo apt-get install libcr-dev
mpiu@ub0:~$ mpiexec -n 4 cpi

flops 코드 링크

포트란 컴파일

mpif90 flops.f -o flops

실행

mpirun -hosts rex831200,rex831201 -n 10 ./flops

mpiexec -f ./hosts -n 10 ./flops

hosts 파일 설정, “host이름:core개수” 형식으로 입력

cilab00:6
cilab01:2
cilab02:2
cilab03:2

모니터링 도구

htop

sudo apt-get install htop

어짜피 몇대 안되니까 htop 여러개 실행해놓고 실행 확인하자..

Cluster에 mpi4py 설치

numpy, scipy 설치하기

sudo apt-get install python-numpy python-scipy

python mpi4py 설치

sudo apt-get install python-mpi4py

또는,

apt-get install python-pip python-dev

nfs로 마운트된 home에 로그쓰기를 못해서 에러가 발생할 수 있으므로 ..

sudo su
pip install mpi4py 

Hydra Process Manager

mpi.txt · 마지막으로 수정됨: 2024/03/23 02:38 저자 127.0.0.1