====== MPI ======
===== Docker에서 MPI 실행 =====
* https://siddharths2710.wordpress.com/2017/03/06/working-with-mpi-in-docker/
===== MS-MPI =====
* https://msdn.microsoft.com/en-us/library/bb524831
* worker
activate
smpd -d
* master
mpiexec -host -dir -n python helloworld.py
mpiexec -machinefile hosts.txt -dir -n 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과 [[http://www.microsoft.com/downloads/en/details.aspx?FamilyID=12887DA1-9410-4A59-B903-693116BFD30E|HPC SDK 2008]]을 사용하는 것이 가장 쉽다고 판다한여 이 것을 기준으로 진행 하겠습니다.
물론 python 모듈이므로 python 2.6은 필수적으로 설치되어 있어야 합니다.
- Visual Studio 2008 설치
- HPC SDK 2008 설치
- [[http://code.google.com/p/mpi4py/|mpi4py]]의 소스를 다운받아 압축 해제 (mpi4py-1.2.2.tar.gz)
- 압축 해제된 폴더로 이동하여 다음 명령 입력 (모듈 빌드 및 설치)
- R:/mpi4py-1.2.2/python setup.py build --mpi=msmpi install
- 여기서 msmpi는 HPC SDK 2008을 사용한 다는 뜻이며, 다른 라이브러리를 사용할 때는 다른 지시어를 사용합니다.
- mpi.cfg는 ini파일 형식으로 구성되어 있으며, 이곳의 [msmpi] 부분에 빌드를 위한 설정이 있습니다.
- :!:만약 HPC SDK 2008을 기본 설치 폴더가 아닌 다른 곳에 설치 했다면 여기서 수정해주어야 합니다.
- 마지막에 error 메시지 없이 종료 된다면 설치 완료!
==== mpich2를 사용할 때는 ====
- visual studio 2008 설치
- 2010이 설치되어 있다고 해도 필요하다!
- mpich2 다운로드 및 설치
- http://www.mcs.anl.gov/research/projects/mpich2/downloads/index.php?s=downloads
- mpi4py 설치
- mpi.cfg 파일 수정한다.
- setup.py build --mpi=mpich2-win install
- 사용자 등록
- 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 옵션은 이 프로그램을 몇 개의 프로세스로 실행할 것인지를 지정해 주는 것입니다.
성공적으로 실행되면 다음과 같은 결과를 얻을 수 있습니다.
{{mpi4py-capture-20110518180048-430-0.gif|}}
총 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
#include
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 코드 링크
* http://rex8312.iptime.org/webhard/public/11e5aada35a4d6f432611da980817e0e.php
포트란 컴파일
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
===== Link =====
* https://help.ubuntu.com/community/MpichCluster
* https://help.ubuntu.com/community/NFSv4Howto
* http://iserlohn-opensource.blogspot.com/2011/02/ganglia-slackware-131.html
* http://wiki.mcs.anl.gov/mpich2/index.php/Using_the_Hydra_Process_Manager
===== Hydra Process Manager =====
* https://wiki.mpich.org/mpich/index.php/Using_the_Hydra_Process_Manager