====== 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