Mudanças entre as edições de "Minicluster:Mpich"

De WikiLICC
Ir para: navegação, pesquisa
m (Iniciar um Daemon)
m (Para o usuário comum)
 
(43 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 14: Linha 14:
 
  MPD_SECRET_WORD=yours3cr3tw0rd
 
  MPD_SECRET_WORD=yours3cr3tw0rd
 
  MPD_USE_ROOT_MPD=yes
 
  MPD_USE_ROOT_MPD=yes
 
+
[usuario@one]$ chmod 600 .mpd.conf
 +
 
onde
 
onde
 
*<code>MPD_SECRET_WORD</code> pode ser única para cada usuário.
 
*<code>MPD_SECRET_WORD</code> pode ser única para cada usuário.
 
*<code>MPD_USE_ROOT_MPD</code> especifica que usuários não irão iniciar se próprio mpd daemons, mas irão usar um já rodando iniciado pelo root.
 
*<code>MPD_USE_ROOT_MPD</code> 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 o usuário root ==
 
== Para o usuário root ==
Linha 46: Linha 46:
  
 
= Testes =
 
= Testes =
== Iniciar um Daemon ==
+
==Configuring Worker Nodes to use Root's MPD Daemon ==
Conecte-se a máquina one ou a uma cell1XX (como root) e inicie mpd (multi-purpose daemon) para rodar em background
+
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'').
[usuario@one]$ mpd --daemon
 
  
Verifique se o mpd foi iniciado nesta máquina:
+
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.
  [usuario@one]$ mpdtrace -l
 
cell100.matrix_54419 (192.168.0.100)
 
  
Deveria aparecer algo como o Nome.da.maquina_PID (endereco.ip)
+
IMPORTANTE: A maioria dos testes deve ser feito tanto na máquina '''one''' quanto na máquina '''cell100'''
  
== Rodar em uma máquina ==
+
== Iniciar um Daemon ==
É possível rodar um programa que não use MPICH com o mpd. Testar tanto na máquina one quanto cell100:
+
* Conecte-se a máquina  (como root) e inicie mpd (multi-purpose daemon) para rodar em background
  [dago@one ~]$ mpd --daemon
+
  [hunter]$ ssh usuario@one
  [dago@one ~]$ mpiexec -n 1 /bin/hostname
+
  [one]$ mpd --daemon
one.matrix
 
  [dago@one ~]$ mpiexec -l -n 4 /bin/hostname
 
1: one.matrix
 
2: one.matrix
 
0: one.matrix
 
3: one.matrix
 
  
 +
* Verifique se o mpd foi iniciado nesta máquina [deveria aparecer algo como o Nome.da.maquina_PID (endereco.ip)]:
 +
[one]$ mpdtrace -l
 +
one.matrix_54419 (192.168.0.99)
  
== Rodar um programa MPI ==
+
* Teste também em '''cell100'''
Abra o editor de texto e digite o programa "hello world" [[Creating and Compiling an MPI Program]].
 
[usuario@one]$ vi hellompi.f90
 
  
 
+
== Testar o mpdcheck em um nó ==
Para rodar um programa MPI em uma máquina. Conecte-se a uma máquina escravo usando ssh
 
[usuario@one]$ ssh usuario@cell100
 
 
 
 
 
[dago@cell100 ~]$ mpiexec -l -n 4 ./hellompi
 
 
 
 
 
Rode o programa com um processo
 
[usuario@one]$ mpiexec ./hellompi
 
Rode novamente usando mais processos (e um processador - talvez 2 se for dual-core ?)
 
[usuario@one]$ mpiexec -np 5 ./hellompi
 
Deveria aparecer
 
[usuario@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 <code>cell100.matrix</code> é o nome da máquina (todas no mesmo ainda). Para rodar em mais máquinas, primeiro desligue o mpd
 
[usuario@one]$ 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.
 
Seguindo o manual do [mpich2] e os testes do apêndice A.
  
 
* Testar em um nó (duas janelas diferentes então)
 
* Testar em um nó (duas janelas diferentes então)
  [dago@um ~] $ mpdcheck -s
+
  [one] $ mpdcheck -s
  server listening at INADDR_ANY on: um.phantom 60582
+
  server listening at INADDR_ANY on: one.matrix 60582
Em outra janela
+
Em outra janela, no mesmo nó
  [dago@um ~] $ mpdcheck -c um 60582
+
  [one] $ mpdcheck -c one 60582
 
  client successfully recvd ack from server: ack_from_server_to_client
 
  client successfully recvd ack from server: ack_from_server_to_client
 
Que dará resposta na primeira janela
 
Que dará resposta na primeira janela
Linha 112: Linha 77:
 
  server successfully recvd msg from client: hello_from_client_to_server
 
  server successfully recvd msg from client: hello_from_client_to_server
  
* Testa no outro nó a mesma coisa
+
* Testar também em '''cell100'''
[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
+
== Rodar em uma máquina ==
  client successfully recvd ack from server: ack_from_server_to_client
+
É possível rodar um programa que não use MPICH com o mpd:
 +
[one]$ mpd --daemon
 +
 +
[one]$ mpiexec -n 1 /bin/hostname
 +
one.matrix
 +
 +
  [one]$ mpiexec -l -n 4 /bin/hostname
 +
1: one.matrix
 +
2: one.matrix
 +
0: one.matrix
 +
  3: one.matrix
  
* Rodar nos dois nós a sequência
+
* Testar em '''cell100'''
[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 o mpdcheck em um anel com dois nós ==
 +
* Iniciar em '''one''' o processo mpdcheck (ver [http://lists.mcs.anl.gov/pipermail/mpich-discuss/2006-August/001521.html]):
 +
[one]$ mpdcheck -s
 +
server listening at INADDR_ANY on: one.matrix 60582
  
* Testar um anel com dois nós (ver [http://lists.mcs.anl.gov/pipermail/mpich-discuss/2006-August/001521.html]):
+
No outro nó, cell100
[dago@um ~] $ mpdcheck -s
+
  [cell100]$ mpdcheck -c one 60582
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
 
  client successfully recvd ack from server: ack_from_server_to_client
 +
 
Que dará resposta na primeira janela
 
Que dará resposta na primeira janela
 
  server has conn on <socket._socketobject object at 0x7fa130646980> from ('192.168.0.99', 54005)
 
  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
 
  server successfully recvd msg from client: hello_from_client_to_server
  
== Testando o anel de máquinas ==
+
* Fazer o teste ao contrário também, iniciando de cell100.
* ALELUIA. Funcionou!
+
 
 +
== Rodar no anel de máquinas ==
 
No nó mestre
 
No nó mestre
  dago@um ~ $ mpd --daemon
+
  [one]$ mpd --daemon
  dago@um ~ $ mpdtrace -l
+
  [one]$ mpdtrace -l
  um.phantom_44333 (192.168.0.99)
+
  one.matrix_44333 (192.168.0.99)
 +
 
 
No nó escravo
 
No nó escravo
  [dago@cell100 ~]$ mpd -h um -p 44333 --daemon
+
  [cell100]$ mpd -h one -p 44333 --daemon
  [dago@cell100 ~]$ mpdtrace -l
+
  [cell100]$ mpdtrace -l
 
  cell100.matrix_58296 (192.168.0.100)
 
  cell100.matrix_58296 (192.168.0.100)
  um.phantom_44333 (192.168.0.99)
+
  one.matrix_44333 (192.168.0.99)
  [dago@cell100 ~]$
+
  [cell100]$
 +
 
 
No nó mestre
 
No nó mestre
  dago@um ~ $ mpdtrace -l
+
  [one]$ mpdtrace -l
  um.phantom_44333 (192.168.0.99)
+
  one.matrix_44333 (192.168.0.99)
 
  cell100.matrix_58296 (192.168.0.100)
 
  cell100.matrix_58296 (192.168.0.100)
  dago@um ~ $ mpiexec -n 2 /bin/hostname
+
  [one]$ mpiexec -n 2 /bin/hostname
  um.phantom
+
  one.matrix
cell100.matrix
 
dago@um ~ $ mpiexec -n 4 /bin/hostname
 
cell100.matrix
 
um.phantom
 
 
  cell100.matrix
 
  cell100.matrix
  um.phantom
+
  [one]$ mpiexec -l -n 4 /bin/hostname
dago@um ~ $ mpiexec -l -n 4 /bin/hostname
 
 
  1: cell100.matrix
 
  1: cell100.matrix
  2: um.phantom
+
  2: one.matrix
  0: um.phantom
+
  0: one.matrix
 
  3: cell100.matrix
 
  3: cell100.matrix
  dago@um ~ $
+
  [one]$
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 ===
+
== Teste final ==
 
No mestre
 
No mestre
  dago@um ~ $ mpdboot -n 2
+
  [one]$ mpdboot -n 2
  dago@um ~ $ mpdtrace -l
+
  [one]$ mpdtrace -l
  um.phantom_40584 (192.168.0.99)
+
  one.matrix_40584 (192.168.0.99)
 
  cell100.matrix_59410 (192.168.0.100)
 
  cell100.matrix_59410 (192.168.0.100)
  dago@um ~ $ cd fortran/
+
  [one]$ mpiexec -l -n 2 ./hellompi
dago@um fortran $ mpiexec -l -n 2 ./hellompi
+
  1:  Sou o processo            1  de um total de            2  rodando em cell100.matrix
  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 one.matrix
  0:  Sou o processo            0  de um total de            2  rodando em um.phantom
+
Em cell100 (não necessário)
Em cell100
+
  [cell100]$ mpdtrace -l
  [dago@cell100 fortran]$ mpdtrace -l
 
 
  cell100.matrix_59410 (192.168.0.100)
 
  cell100.matrix_59410 (192.168.0.100)
  um.phantom_40584 (192.168.0.99)
+
  one.matrix_40584 (192.168.0.99)
 +
 
 +
 
 +
== Teste ==
 +
dago@cell112 ~/Testes $ mpdboot -n 2 --chkup -v -d -f mpd.hosts.on               
 +
debug: starting                                                                   
 +
checking cell113                                                                 
 +
there are 2 hosts up (counting local)                                             
 +
running mpdallexit on cell112                                                     
 +
LAUNCHED mpd on cell112  via                                                     
 +
debug: launch cmd= /usr/lib64/mpich2/bin/mpd.py  --ncpus=1 -e -d                 
 +
debug: mpd on cell112  on port 49581                                             
 +
RUNNING: mpd on cell112                                                           
 +
debug: info for running mpd: {'ncpus': 1, 'list_port': 49581, 'entry_port': '', 'host':  'cell112', 'entry_host': '', 'ifhn': ''}                                     
 +
LAUNCHED mpd on cell113  via  cell112                                             
 +
debug: launch cmd= ssh -x -n -q cell113 '/usr/lib64/mpich2/bin/mpd.py  -h cell112 -p 49581  --ncpus=1 -e -d'                                                         
 +
debug: mpd on cell113  on port 44388                                             
 +
RUNNING: mpd on cell113                                                           
 +
debug: info for running mpd: {'entry_port': 49581, 'ncpus': 1, 'list_port': 44388, 'pid': 3077,  'host': 'cell113', 'entry_host': 'cell112', 'ifhn': ''}             
 +
 
 +
dago@cell112 ~/Testes $ mpdtrace -l                                               
 +
cell112_49581 (192.168.0.112)                                                     
 +
cell113_44388 (192.168.0.113)                                                     
 +
 
 +
= Erros =
 +
 
 +
Não era possível formar o anel. Foi necessário eliminar no arquivo /etc/hosts a linha
 +
::1 one.matrix  one localhost6.localdomain6  localhost6
 +
pois o cliente se confundica achando que se chamava one.matrix.

Edição atual tal como às 15h19min de 11 de abril de 2012

MPICH sem funcionalidade Torque

Parece que na distribuição padrão não está presente. Para instalação veja Minicluster:Linux#Update

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.

Configurações

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.

Para o usuário comum

Cada usuário deve ter um arquivo .mpd.conf no seu diretório /home/usuario/ e deve permitir acesso e leitura somente a este usuário.

[usuario@one]$ cd
[usuario@one]$ vi .mpd.conf
MPD_SECRET_WORD=yours3cr3tw0rd
MPD_USE_ROOT_MPD=yes
[usuario@one]$ chmod 600 .mpd.conf

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 o usuário root

Similar aos usuários, o root precisa ter um arquivo mpd.conf em todos os nós localizado em

[root@one]$ cd /etc
[root@one]$ vi /etc/mpd.conf
MPD_SECRET_WORD=yours3cr3tw0rd

e permitir acesso leitura e escrita somente ao root

[root@one]$ chmod 600 /etc/mpd.conf

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.

Testes

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.

IMPORTANTE: A maioria dos testes deve ser feito tanto na máquina one quanto na máquina cell100

Iniciar um Daemon

  • Conecte-se a máquina (como root) e inicie mpd (multi-purpose daemon) para rodar em background
[hunter]$ ssh usuario@one
[one]$ mpd --daemon 
  • Verifique se o mpd foi iniciado nesta máquina [deveria aparecer algo como o Nome.da.maquina_PID (endereco.ip)]:
[one]$ mpdtrace -l
one.matrix_54419 (192.168.0.99)
  • Teste também em cell100

Testar o mpdcheck em um nó

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

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

Em outra janela, no mesmo nó

[one] $ mpdcheck -c one 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
  • Testar também em cell100

Rodar em uma máquina

É possível rodar um programa que não use MPICH com o mpd:

[one]$ mpd --daemon

[one]$ mpiexec -n 1 /bin/hostname
one.matrix

[one]$ mpiexec -l -n 4 /bin/hostname
1: one.matrix
2: one.matrix
0: one.matrix
3: one.matrix
  • Testar em cell100

Testar o mpdcheck em um anel com dois nós

  • Iniciar em one o processo mpdcheck (ver [1]):
[one]$ mpdcheck -s
server listening at INADDR_ANY on: one.matrix 60582

No outro nó, cell100

[cell100]$ mpdcheck -c one 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
  • Fazer o teste ao contrário também, iniciando de cell100.

Rodar no anel de máquinas

No nó mestre

[one]$ mpd --daemon
[one]$ mpdtrace -l
one.matrix_44333 (192.168.0.99)

No nó escravo

[cell100]$ mpd -h one -p 44333 --daemon
[cell100]$ mpdtrace -l
cell100.matrix_58296 (192.168.0.100)
one.matrix_44333 (192.168.0.99)
[cell100]$

No nó mestre

[one]$ mpdtrace -l
one.matrix_44333 (192.168.0.99)
cell100.matrix_58296 (192.168.0.100)
[one]$ mpiexec -n 2 /bin/hostname
one.matrix
cell100.matrix
[one]$ mpiexec -l -n 4 /bin/hostname
1: cell100.matrix
2: one.matrix
0: one.matrix
3: cell100.matrix
[one]$

Teste final

No mestre

[one]$ mpdboot -n 2
[one]$ mpdtrace -l
one.matrix_40584 (192.168.0.99)
cell100.matrix_59410 (192.168.0.100)
[one]$ 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 one.matrix

Em cell100 (não necessário)

[cell100]$ mpdtrace -l
cell100.matrix_59410 (192.168.0.100)
one.matrix_40584 (192.168.0.99)


Teste

dago@cell112 ~/Testes $ mpdboot -n 2 --chkup -v -d -f mpd.hosts.on                
debug: starting                                                                    
checking cell113                                                                   
there are 2 hosts up (counting local)                                              
running mpdallexit on cell112                                                      
LAUNCHED mpd on cell112  via                                                       
debug: launch cmd= /usr/lib64/mpich2/bin/mpd.py   --ncpus=1 -e -d                  
debug: mpd on cell112  on port 49581                                               
RUNNING: mpd on cell112                                                            
debug: info for running mpd: {'ncpus': 1, 'list_port': 49581, 'entry_port': , 'host':   'cell112', 'entry_host': , 'ifhn': }                                      
LAUNCHED mpd on cell113  via  cell112                                              
debug: launch cmd= ssh -x -n -q cell113 '/usr/lib64/mpich2/bin/mpd.py  -h cell112 -p 49581   --ncpus=1 -e -d'                                                          
debug: mpd on cell113  on port 44388                                               
RUNNING: mpd on cell113                                                            
debug: info for running mpd: {'entry_port': 49581, 'ncpus': 1, 'list_port': 44388, 'pid': 3077,  'host': 'cell113', 'entry_host': 'cell112', 'ifhn': }               
dago@cell112 ~/Testes $ mpdtrace -l                                                
cell112_49581 (192.168.0.112)                                                      
cell113_44388 (192.168.0.113)                                                      

Erros

Não era possível formar o anel. Foi necessário eliminar no arquivo /etc/hosts a linha

::1 one.matrix  one localhost6.localdomain6  localhost6

pois o cliente se confundica achando que se chamava one.matrix.