사용자 도구

사이트 도구


mpi

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
mpi [2018/03/16 04:12] – 만듦 rex8312mpi [2024/03/23 02:38] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 ====== MPI ====== ====== MPI ======
  
-===== Windows =====+===== Docker에서 MPI 실행 =====
  
-  * https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx+  * https://siddharths2710.wordpress.com/2017/03/06/working-with-mpi-in-docker/ 
 + 
 +===== MS-MPI ===== 
 + 
 +  * https://msdn.microsoft.com/en-us/library/bb524831 
 + 
 +  * worker 
 +<code> 
 +activate <env> 
 +smpd -d 
 +</code> 
 + 
 +  * master 
 +<code> 
 +mpiexec -host <ip> -dir <working dir> -n <n processes> python helloworld.py 
 +</code> 
 + 
 + 
 +<code> 
 +mpiexec -machinefile hosts.txt -dir <working dir> -n <n processes> python helloworld.py 
 +</code> 
 + 
 +  * hosts.txt 
 +<code> 
 +127.0.0.1 1 
 +192.168.0.1 2 
 +</code> 
 + 
 +====== 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) 
 +  - 압축 해제된 폴더로 이동하여 다음 명령 입력 (모듈 빌드 및 설치) 
 +    - <nowiki>R:/mpi4py-1.2.2/python setup.py build --mpi=msmpi install</nowiki> 
 +    - 여기서 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 
 +   
 + 
 +===== 테스트 ===== 
 + 
 +<code c> 
 +#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; 
 +
 +</code> 
 + 
 +  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
mpi.1521173531.txt.gz · 마지막으로 수정됨: (바깥 편집)