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

De WikiLICC
Ir para: navegação, pesquisa
m
m (Para o usuário comum)
 
(79 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
Parece que na distribuição padrão não está presente.
+
== MPICH sem funcionalidade Torque  ==
 +
Parece que na distribuição padrão não está presente. Para instalação veja [http://www3.mat.ufrgs.br/mediawiki/index.php/Minicluster:Linux#Update  Minicluster:Linux#Update]
  
=Instalação==
+
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.
==Máquina mestre==
 
Como possui acesso a internet via segunda placa de rede, basta usar  
 
yum install mpich2
 
  
==Máquina escravo==
+
= Configurações =
Não possui acesso a internet. Existem várias possibilidades, porém estou tentando o seguinte:
+
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.
  
* Baixar os pacotes .rpm necessários na máquina mestre e copiá-los para a máquina escravo. [ok]
+
== Para o usuário comum ==
tcl-8.5.7-5.fc13.x86_64.rpm
+
Cada usuário deve ter um arquivo <code>.mpd.conf</code> no seu diretório <code>/home/usuario/</code> e deve permitir acesso e leitura somente a este usuário.
environment-modules-3.2.7b-7.fc13.x86_64.rpm
 
mpich2-1.2.1p1-2.fc13.x86_64.rpm
 
mpich2-devel-1.2.1p1-2.fc13.x86_64.rpm
 
* Importar as [http://www.linuxquestions.org/questions/fedora-35/public-key-not-installed-468615/ keys] necessárias para instalar os pacotes (não instalou direito usando apenas rpm):
 
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64
 
ou melhor ainda, editar /etc/yum.conf para não reclamar sobre signature files
 
vi /etc/yum.conf
 
..
 
gpgcheck=0
 
..
 
  
* Instalar usando yum
+
[usuario@one]$ cd
  yum localinstall tcl-8.5.7-5.fc13.x86_64.rpm --disablerepo=fedora --disablerepo=updates
+
  [usuario@one]$ vi .mpd.conf
 +
MPD_SECRET_WORD=yours3cr3tw0rd
 +
MPD_USE_ROOT_MPD=yes
 +
[usuario@one]$ chmod 600 .mpd.conf
 +
 +
onde
 +
*<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.
  
=Configuração=
+
== Para o usuário root ==
This is part three of a multi-part tutorial on installing and configuring [[MPICH: Parallel Programming | MPICH2]]. The full tutorial includes
+
Similar aos usuários, o root precisa ter um arquivo <code>mpd.conf</code> 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
  
* [[Installing MPICH]]
+
=== Para criar um script para todos os usuários===
* [[MPICH: Pick Your Paradigm]]
+
* Crie o arquivo acima em
* [[MPICH without Torque Functionality]]
+
[root]$ cd
** [[MPICH: Starting a Global MPD Ring]]
+
[root]$ vi .mpd.conf
** [[MPICH: Troubleshooting the MPD]]
+
[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
  
== MPICH without Torque Functionality ==
+
Troque <code>/shared/home/</code> com o diretório home dos usuários e troque <code>users</code> com o grupo que os usuários estão.
In this paradigm, users (and sysadmins) are responsible for much more overhead, and many more possibilities for misconfiguration occur.  Unless you are planning not to have a [[Using a Scheduler and Queue | scheduler and queue]], I highly recommend setting up [[MPICH with Torque Functionality]] instead.
 
  
== Creating Mpd.conf Files ==
+
=== Usuários futuros ===
Mpd stands for "multi-purpose daemon."  MPICH2 separates process communication from process management by having an mpd process manage any MPI processes. The mpd's need a little extra customization that wasn't necessary in MPICH1To begin with, each user that will (potentially) use MPICH needs to have a mpd.conf file.
+
Para usuários futuros terem automaticamente o arquivo criado, crie <code>.mpd.conf</code> em <code>/etc/skel/</code> na máquina que os usuários são criadosTenha certeza que as flags estejam setadas corretamente. Então rode
  
=== User Accounts ===
+
chmod 600 /etc/skel/.mpd.conf
Each user needs a <code>.mpd.conf</code> file in his/her home directory, and must only be readable and writable by that user.  The file should look like this:
 
  
<pre>
+
para ter certeze que o arquivo tenha permissão de escrita e leitura para o usuário somente.
MPD_SECRET_WORD=yours3cr3tw0rd
 
MPD_USE_ROOT_MPD=yes
 
</pre>
 
  
*<code>MPD_SECRET_WORD</code> can be unique to each user, but doesn't have to be
+
= Testes =
*<code>MPD_USE_ROOT_MPD</code> specifies that users will not start up their own mpd daemons, but will rely upon attaching to one already running under the root account
+
==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'').
  
You can run a simple script to create this file for all of your users.  First, create the file as shown above in root's home directory (<code>/root</code>).  Make it only readable/writable by it's owner, root, by running <code>chmod 600 /root/.mpd.conf</code>Then to make a copy for each of the user accounts, run
+
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 daemonContinue on to [[MPICH: Starting a Global MPD Ring]] to implement this.
 
 
:<code>for x in `ls /shared/home/`; do rsync -plarv /root/.mpd.conf /shared/home/$x/; chown $x:users /shared/home/$x/.mpd.conf; done</code>
 
 
 
Of course, replace all instances of <code>/shared/home/</code> with the location where your users' home directories are stored, and replace <code>users</code> with whatever group your users are in.
 
  
=== Future Users ===
+
IMPORTANTE: A maioria dos testes deve ser feito tanto na máquina '''one''' quanto na máquina '''cell100'''
In order to make sure new users automatically have this file created for them, create a <code>.mpd.conf</code> file in <code>/etc/skel/</code> on the machine you create user accounts from.  Make sure it has a secret word and root mpd flag as shown above.  Then, run
 
  
:<code>chmod 600 /etc/skel/.mpd.conf</code>
+
== 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
  
This will make sure the file is created with only the user having read/write permissions.
+
* 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)
  
=== Root's .mpd.conf ===
+
* Teste também em '''cell100'''
Similar to the users, root needs to have a <code>mpd.conf</code> file on each one of the worker nodes.  For root, rather than being stored in a home directory, this file is located at <code>/etc/mpd.conf</code>.  This file only needs one line:
 
  
<pre>MPD_SECRETWORD=yours3cr3tw0rd</pre>
+
== Testar o mpdcheck em um nó ==
 +
Seguindo o manual do [mpich2] e os testes do apêndice A.
  
You can replace <code>yours3cr3tw0rd</code> with whatever you'd likeThen, make sure it's only readable/writable by root:
+
* 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
  
:<code>chmod 600 /etc/mpd.conf</code>
+
* Testar também em '''cell100'''
  
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 processMake sure that the secret word matches on all of the worker nodes.
+
== 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
  
== Running on One Machine ==
+
* Testar em '''cell100'''
It's wise to do a test MPI run on one machine before setting it up to run on multiple machines.
 
  
=== Starting a Daemon ===
+
== Testar o mpdcheck em um anel com dois nós ==
Choose one of your worker nodes to test onSSH into that machine and, as root, start up an mpd (multi-purpose daemon) to run in the background with
+
* 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
  
:<code>mpd --daemon</code>
+
No outro nó, cell100
 +
[cell100]$ mpdcheck -c one 60582
 +
client successfully recvd ack from server: ack_from_server_to_client
  
Next, type <code>mpdtrace -l</code> to verify that mpd has been starting on this host. You should see your host name with an underscore with a number (this is the MPD id) and host IP address returned to you.
+
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
  
=== Running an MPI Program ===
+
* Fazer o teste ao contrário também, iniciando de cell100.
Once you've got the mpd daemon up and running, it's time to open your favorite text editor and type up an MPI program.  A "hello world" type program is ideal for this, and I'll be borrowing one from the [http://bccd.cs.uni.edu Bootable Cluster CD project].  For this, you'll want to be on a user account, not root.  Follow the instructions on [[Creating and Compiling an MPI Program]].
 
  
Once you've successfully compiled it, you're ready to run it. Still as the user account (not as root), first run
+
== Rodar no anel de máquinas ==
 +
No nó mestre
 +
[one]$ mpd --daemon
 +
[one]$ mpdtrace -l
 +
one.matrix_44333 (192.168.0.99)
  
:<code>mpiexec ./hello.out</code>
+
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]$
  
You should see a message printed out from the server process, but that's itWithout specifying a number of processes, MPICH automatically only uses one processRun it again and specify multiple processes:
+
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]$
  
:<code>mpiexec -np 5 ./hello.out</code>
+
== 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)
  
This time you should see something like this:
 
  
<pre>kwanous@eagle:~/mpi$ mpiexec -np 5 ./hello.out
+
== Teste ==
Hello MPI from the server process!
+
dago@cell112 ~/Testes $ mpdboot -n 2 --chkup -v -d -f mpd.hosts.on               
Hello MPI!
+
debug: starting                                                                   
  mesg from 1 of 5 on eagle
+
checking cell113                                                                 
Hello MPI!
+
there are 2 hosts up (counting local)                                             
  mesg from 2 of 5 on eagle
+
running mpdallexit on cell112                                                     
Hello MPI!
+
LAUNCHED mpd on cell112  via                                                     
  mesg from 3 of 5 on eagle
+
  debug: launch cmd= /usr/lib64/mpich2/bin/mpd.py  --ncpus=1 -e -d                 
Hello MPI!
+
debug: mpd on cell112  on port 49581                                             
  mesg from 4 of 5 on eagle</pre>
+
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': ''}             
  
Notice by the host name (in my case, <code>eagle</code>, that all of these processes are still running on the same nodeTo set this up across multiple nodes, first kill the mpd daemon with <code>mpdallexit</code>, then continue on to
+
dago@cell112 ~/Testes $ mpdtrace -l                                               
 +
cell112_49581 (192.168.0.112)                                                     
 +
  cell113_44388 (192.168.0.113)                                                     
  
== Configuring Worker Nodes to use Root's MPD Daemon ==
+
= Erros =
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 daemonContinue on to [[MPICH: Starting a Global MPD Ring]] to implement this.
+
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.