Minicluster:Mpich

De WikiLICC
Revisão de 13h44min de 6 de julho de 2010 por Dago (Discussão | contribs) (Rodando em uma máquina)
Ir para: navegação, pesquisa

Parece que na distribuição padrão não está presente.

Configuração

Para instalação veja Minicluster:Linux#Update

MPICH sem funcionalidade Torque

Neste paradigma, usuários (e sysadmins) são responsáveis por mais overhead e mais possibilidade de erros de configuração. É recomendado usar um scheduler and queue com Torque.

Criar arquivos mpd.conf

Mpd significa "multi-purpose daemon." MPICH2 separa comunicação de processos de gerenciamento de processo usando o programa mpd para gerenciar qualquer processo usando MPI. Mpd necessita uma pequena configuração que não era necessário com MPICH1.

Contas de Usuário

Cada usuário tem um arquivo .mpd.conf no seu diretório home e deve permitir acesso e leitura somente por este usuário.

[usuario]$ cd
[usuario]$ vi .mpd.conf
MPD_SECRET_WORD=yours3cr3tw0rd
MPD_USE_ROOT_MPD=yes

onde

  • MPD_SECRET_WORD pode ser única para cada usuário.
  • MPD_USE_ROOT_MPD especifica que usuários não irão iniciar se próprio mpd daemons, mas irão usar um já rodando iniciado pelo root.

Para criar um script para todos os usuários

  • Crie o arquivo acima em
[root]$ cd
[root]$ vi .mpd.conf
[root]$ chmod 600 /root/.mpd.conf
  • Faça uma cópia para cada usuário:
for x in `ls /shared/home/`; do rsync -plarv /root/.mpd.conf /shared/home/$x/; chown $x:users /shared/home/$x/.mpd.conf; done

Troque /shared/home/ com o diretório home dos usuários e troque users com o grupo que os usuários estão.

Usuários futuros

Para usuários futuros terem automaticamente o arquivo criado, crie .mpd.conf em /etc/skel/ na máquina que os usuários são criados. Tenha certeza que as flags estejam setadas corretamente. Então rode

chmod 600 /etc/skel/.mpd.conf

para ter certeze que o arquivo tenha permissão de escrita e leitura para o usuário somente.

Root's .mpd.conf

Similar to the users, root needs to have a mpd.conf file on each one of the worker nodes. For root, rather than being stored in a home directory, this file is located at /etc/mpd.conf. This file only needs one line:

MPD_SECRETWORD=yours3cr3tw0rd

You can replace yours3cr3tw0rd with whatever you'd like. Then, make sure it's only readable/writable by root:

chmod 600 /etc/mpd.conf

Once you've created this file on one of your nodes, you can manually create it on each of the other nodes, or see the Cluster Time-saving Tricks page for tips on how to script this process. Make sure that the secret word matches on all of the worker nodes.

Rodando em uma máquina

Para rodar um programa MPI em uma máquina.

Inicie um Daemon

Escolha uma da máquinas escravo. SSH nesta máquina, como root, inicie mpd (multi-purpose daemon) para rodar em background com

[usuario@cell100]$ mpd --daemon

Verifique que o mpd foi iniciado nesta máquina:

[usuario@cell100]$ mpdtrace -l

Deveria aparecer algo como o Nome.da.maquina_PID (endereco.ip)

cell100.matrix_54419 (192.168.0.100)

Rodando um programa MPI

Conecte-se a uma máquina escravo usando ssh

ssh usuario@cell100

Abra o editor de texto e digite o programa "hello world" Creating and Compiling an MPI Program.

vi hellompi.f90

Rode o programa com um processo

mpiexec ./hellompi

Rode novamente usando mais processos (e um processador - talvez 2 se for dual-core ?)

mpiexec -np 5 ./hellompi

Deveria aparecer

[dago@cell100]$ mpiexec -np 4 ./hellompi
Sou o processo            0  de um total de            4  rodando em cell100.matrix
Sou o processo            2  de um total de            4  rodando em cell100.matrix
Sou o processo            1  de um total de            4  rodando em cell100.matrix
Sou o processo            3  de um total de            4  rodando em cell100.matrix

onde cell100.matrix é o nome da máquina (todas no mesmo nó ainda). Para rodar em mais máquinas, primeiro desligue o mpd

[usuario]$ mpdallexit

Configuring Worker Nodes to use Root's MPD Daemon

Starting up an mpd daemon for each user each time they log in is doable, but that requires an extra step of complexity for your users to understand. Plus, they'll need to remember to start up daemons on multiple machines when they run programs that require multiple processors (not just multiple processes).

An easier paradigm to follow is to start a single mpd daemon on each of the worker nodes and have users' programs attach to that daemon. Continue on to MPICH: Starting a Global MPD Ring to implement this.


Testes para o mpdcheck

Seguindo o manual do [mpich2] e os testes do apêndice A.

  • Testar em um nó (duas janelas diferentes então)
[dago@um ~] $ mpdcheck -s
server listening at INADDR_ANY on: um.phantom 60582

Em outra janela

[dago@um ~] $ mpdcheck -c um 60582
client successfully recvd ack from server: ack_from_server_to_client

Que dará resposta na primeira janela

server has conn on <socket._socketobject object at 0x7fa130646980> from ('192.168.0.99', 54005)
server successfully recvd msg from client: hello_from_client_to_server
  • Testa no outro nó a mesma coisa
[dago@cell100 ~]$ mpdcheck -s
server listening at INADDR_ANY on: cell100.matrix 36013
server has conn on <socket._socketobject object at 0x7f493dd20a60> from ('192.168.0.100', 60409)
server successfully recvd msg from client: hello_from_client_to_server
[dago@cell100 ~]$ mpdcheck -c cell100 36013
client successfully recvd ack from server: ack_from_server_to_client
  • Rodar nos dois nós a sequência
[dago@cell100 ~]$ mpd &
[dago@cell100 ~]$ mpiexec -n 1 /bin/hostname
[dago@cell100 ~]$ mpiexec -l -n 4 /bin/hostname
[dago@cell100 ~]$ mpiexec -l -n 4 ./hellompi


  • Testar um anel com dois nós (ver [1]):
[dago@um ~] $ mpdcheck -s
server listening at INADDR_ANY on: um.phantom 60582

No outro nó

[dago@cell100 ~] $ mpdcheck -c um 60582
client successfully recvd ack from server: ack_from_server_to_client

Que dará resposta na primeira janela

server has conn on <socket._socketobject object at 0x7fa130646980> from ('192.168.0.99', 54005)
server successfully recvd msg from client: hello_from_client_to_server

Testando o anel de máquinas

  • ALELUIA. Funcionou!

No nó mestre

dago@um ~ $ mpd --daemon
dago@um ~ $ mpdtrace -l
um.phantom_44333 (192.168.0.99)

No nó escravo

[dago@cell100 ~]$ mpd -h um -p 44333 --daemon
[dago@cell100 ~]$ mpdtrace -l
cell100.matrix_58296 (192.168.0.100)
um.phantom_44333 (192.168.0.99)
[dago@cell100 ~]$

No nó mestre

dago@um ~ $ mpdtrace -l
um.phantom_44333 (192.168.0.99)
cell100.matrix_58296 (192.168.0.100)
dago@um ~ $ mpiexec -n 2 /bin/hostname
um.phantom
cell100.matrix
dago@um ~ $ mpiexec -n 4 /bin/hostname
cell100.matrix
um.phantom
cell100.matrix
um.phantom
dago@um ~ $ mpiexec -l -n 4 /bin/hostname
1: cell100.matrix
2: um.phantom
0: um.phantom
3: cell100.matrix
dago@um ~ $

Um programa hellompi em paralelo

dago@um fortran $ mpiexec -l -n 4 ./hellompi
0:  Sou o processo 0  de um total de            4  rodando em um.phantom
1:  Sou o processo 1  de um total de            4  rodando em cell100.matrix
2:  Sou o processo 2  de um total de            4  rodando em um.phantom
3:  Sou o processo 3  de um total de            4  rodando em cell100.matrix

Teste final

No mestre

dago@um ~ $ mpdboot -n 2
dago@um ~ $ mpdtrace -l
um.phantom_40584 (192.168.0.99)
cell100.matrix_59410 (192.168.0.100)
dago@um ~ $ cd fortran/
dago@um fortran $ mpiexec -l -n 2 ./hellompi
1:  Sou o processo            1  de um total de            2  rodando em  cell100.matrix
0:  Sou o processo            0  de um total de            2  rodando em um.phantom

Em cell100

[dago@cell100 fortran]$ mpdtrace -l
cell100.matrix_59410 (192.168.0.100)
um.phantom_40584 (192.168.0.99)