Clusters Beowulf/MPI en Linux
En 1994 la NASA construyó un cluster bajo Linux con hardware barato, con 16 procesadores 486 conectados mediante una red local Ethernet, con el objetivo de conseguir alto rendimiento. Para ello se utilizó computación paralela por lo que los programas (escritos en C y Fortran) estaban paralelizados, es decir, utilizaban librerías de Message Passing (PVM y MPI) para que los procesos se ejecutasen en múltiples procesadores siguiendo el paradigma master/esclavo. El proyecto se llamó Beowulf y fue un gran éxito, por lo que actualmente cualquier sistema similar se denomina cluster tipo Beowulf.
MPI (Message Passing Interface, mpi-forum.org) es la especificación de un protocolo de comunicación entre ordenadores para computación paralela, existiendo varias implementaciones del mismo, como MPICH, OpenMPI o LAM/MPI.
MPICH
MPICH (MPI Chameleon, mcs.anl.gov/mpi/mpich/) funciona sobre una capa de abstracción del hardware que le permite ser independiente de la arquitectura y fácilmente portable. Esta capa, llamada ADI (Abstract Device Interface, Interfaz de Dispositivo Abstracto) se encarga de facilitar el acceso al hardware mientras que el resto de MPICH por encima de la ADI se encarga de la sintaxis y la semántica MPI.
Algunos ADIs (también llamados dispositivos) disponibles en MPICH son:
- Clusters Beowulf y workstations:
- dispositivo ch_p4: es el más general y soporta nodos SMP y sistemas heterogéneos.
- dispositivo ch_p4mpd: más rápido pero sólo soporta clusters homogéneos monoprocesadores. - Clusters tipo Grid:
- dispositivo globus2: soporta sistemas en los que está instalado Globus. - Multiprocesadores Simétricos:
- dispositivo ch_shmem: apropiado para sistemas basados en memoria compartida.
- dispositivo ch_lfshmem: versión de ch_shmem que no utiliza bloqueos. - Procesadores Paralelos Masivos (MPPs):
- existen dispositivos para la mayoría de los MPPs existentes, como ch_meiko, ch_nx y ch_mpl.
Instalar MPICH
En Debian disponemos de varias versiones de MPICH:
- mpich-bin: versión con soporte para ch_p4, sólo requiere instalarlo en el master.
- mpich-mpd-bin: versión para ch_p4mpd, requiere el daemon mpd activo en todos los nodos.
- mpich-shmem-bin: versión con soporte para ch_shmem (sistemas con memoria compartida).
Nosotros instalaremos mpich-bin (paquete mpich-bin), la versión para ch_p4.
Configurar MPICH
- Configurar los nodos: para indicarle a mpirun cuáles son las
máquinas disponibles para ejecutar programas MPICH usaremos el archivo
/etc/mpich/machines.LINUX, llamado fichero de máquinas (en los nodos con
múltiples procesadores indicaremos el número, por ejemplo el nodo slave2
tiene dos procesadores):
master slave1 slave2:2 slave3
Los nombres utilizados en /etc/mpich/machines.LINUX deben estar en /etc/hosts:
127.0.0.1 localhost 192.168.0.200 master 192.168.0.201 slave1 192.168.0.202 slave2 192.168.0.203 slave3
- Habilitar SSH sin password: para que el master pueda ejecutar
comandos remotos en los esclavos, MPICH utiliza
rsh (Remote Shell) o
ssh (Secure Shell).
En Debian el comando rsh es un enlace del sistema de alternativas que
apunta a /usr/bin/ssh, por lo que MPICH utiliza por defecto conexiones seguras.
Para disponer de SSH instalaremos en los esclavos el servidor SSH (paquete openssh-server) y los configuraremos para que acepten conexiones desde el master sin pedir password ni pass-phrase (utilizaremos el mismo usuario en todas las máquinas). Para ello:
- crearemos una clave RSA en el master:
francis@master:~$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
- activaremos ssh-agent en el master para que no nos pida la pass-phrase:
francis@master:~$ eval `ssh-agent -s` Agent pid 12297 francis@master:~$ ssh-add Enter passphrase for /home/francis/.ssh/id_rsa: Identity added: /home/francis/.ssh/id_rsa (/home/francis/.ssh/id_rsa)
- copiaremos la clave pública (~/.ssh/id_rsa.pub) en todos los esclavos:
francis@master:~$ scp ~/.ssh/id_rsa.pub francis@slave1:~/.ssh/id_rsa.pub
- la añadiremos al final del fichero ~/.ssh/authorized_keys en cada esclavo:
francis@slave1:~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- y comprobaremos que podemos iniciar sesión SSH en los esclavos sin que nos pida password:
francis@master:~$ ssh slave1 francis@slave1:~$
- Ajustar las variables de entorno: para decirle a MPICH que use SSH debemos establecer
la variable de entorno P4_RSHCOMMAND, editando .bashrc y añadiendo la línea:
export P4_RSHCOMMAND=ssh
Cargamos .bashrc de nuevo y comprobamos:
$ source ~/.bashrc $ echo $P4_RSHCOMMAND ssh
- Directorio compartido ~/: MPICH, para ejecutar mpirun, requiere que todas las máquinas listadas en /etc/mpich/machines.LINUX tengan un filesystem compartido, para lo cual el master exportará vía NFS el directorio ~/ y los esclavos lo montarán en ~/.
Probar MPICH
MPICH proporciona el comando tstmachines, que comprueba la disponibilidad de las máquinas listadas en /etc/mpich/machines.LINUX para ejecutar programas MPI.
$ tstmachines
These machines seem to be available
asterix
slave1
slave2
Ejecutar programas MPI
MPICH proporciona cuatro comandos para compilar programas MPI:
- mpicc: programas escritos en C.
- mpiCC: programas escritos en C++.
- mpif77: programas escritos en Fortran 77.
- mpif90: programas escritos en Fortran 90.
Por ejemplo, para compilar el programa cpi.c (que calcula PI usando MPI) haremos:
$ mpicc -o cpi cpi.c
Para ejecutar programas MPI utilizaremos el comando mpirun. Por ejemplo, para ejecutar el programa cpi en 2 procesadores haremos:
$ mpirun -np 3 cpi Process 0 on asterix Process 2 on slave1 Process 1 on slave2 pi is approximately 3.1416009869231245, Error is 0.0000083333333314 wall clock time = 0.001762
Ejemplo con Python en MPI
Veamos un ejemplo programado en Python para MPI (previamente instalaremos el soporte para Python pyMPI, pympi.sourceforge.net, paquete python-mpi):
$ mpirun -np 3 pyMPI fractal.py Starting computation process 1 done with computation!! process 2 done with computation!! process 0 done with computation!! Header length is 54 BMP size is (400, 400) Data length is 480000
Se generará el archivo output.bmp, una imagen fractal:
OpenMPI
El proyecto OpenMPI (open-mpi.org) es el resultado de la unión de varias implementaciones de MPI, como LAM/MPI, FT-MPI y LA-MPI.
Es muy similar en su manejo a MPICH, algunas diferencias son:
- instalar paquete openmpi-bin.
- el fichero de máquinas es /etc/openmpi/openmpi-default-hostfile y su sintaxis
cambia para nodos con múltiples procesadores:
master slave1 slave2 slots=2 slave3
LAM/MPI
LAM/MPI (lam-mpi.org) es una implementación de MPI que utiliza un demonio lamd activo en cada nodo.
- Instalar paquete lam-runtime.
- El fichero de máquinas es /etc/lam/bhost.conf y contiene los nombres
completos de las máquinas:
master.fransberns.com slave1.fransberns.com slave2.fransberns.com slave3.fransberns.com
- Para comprobar si el cluster LAM/MPI puede activarse:
$ recon
- Para activar el cluster (lamboot lanza el demonio lamd en cada
máquina listada en /etc/lam/bhost.conf):
$ lamboot
- Para ejecutar programas MPI haremos:
$ mpirun C hello
- Una vez activado el cluster, para comprobar el estado de los nodos:
$ tping N
- Para apagar el cluster:
$ lamhalt
- LAM/MPI proporciona la herramienta XMPI (paquete xmpi), que
permite ejecutar programas paralelos MPI y monitorizarlos. XMPI no puede activar el cluster,
éste tiene que haber sido activado con lamboot antes de lanzar XMPI. Para
arrancar XMPI ejecutaremos el comando:
$ xmpi
12 Comentarios en “Clusters Beowulf/MPI en Linux”
Deja un comentario
Al hacer en /root/.bashrc #export P4_RSHCOMMAND=ssh seguido de #source .bashrc
hago un echo RSHCOMMAND y me sale lo mismo RSHCOMMAND.
:( alguna sugerencia ??
BGT, para ver el valor de P4_RSHCOMMAND:
# echo $P4_RSHCOMMAND
OK, me da como resultado “ssh” perfecto. Siguiente duda:
Al hacer #tstmachines se konekta como al ssh del master estando yo en el master y meto la pass de root y no valida ni nada… y pruebo a konektarme del slave al master y entra perfectamnte. El ssh lo tengo bien configurado (kreo) me konekto del master al slave sin ke me pida la password. Pongo komo citas ai arriba #ssh slave y entra perfecto.
??? Gracias por vuestra ayuda
Muy buenas,
Tengo un problemilla y no se si podeis echarme una mano, no entiendo muy bien la parte del tutorial que dice “tengan un filesystem compartido, para lo cual el master exportará vía NFS el directorio ~/ y los esclavos lo montarán en ~/.” signifika k los slave’s montan el /home/user del master ?? o /root en mi caso ??
Peru, en un cluster MPI son los ‘usuarios normales’ los que ejecutan los programas, no root, de manera que el filesystem a exportar vía NFS en el master es el directorio personal /home/user y los esclavos lo montan en /home/user
OK , gracias por la informacion. Luego otra cosilla por favor:
El tema del ssh lo hice de la siguiente manera, la llave publica la cree con el usuario root, y al pasarle la llave publica al nodo slave1 (al usuario normal, no root). Deberia de crear la llave publica con el usuario normal del master (no root) y pasarle esa llave en vez de la de root? Y en ese caso, el usuario normal deberia de coincidir el nombre de usuario? Es que tengo un poco lio, de todas formas gracias por tu ayuda crash-n-burn.
Peru, montar un cluster no es precisamente lo más fácil del mundo y suele costar hacerlo funcionar, son muchas las cosas que pueden fallar y hay que probar y googlear mucho. Nosotros ayudamos en lo que podemos pero esto no es un foro y no nos da para más. Te ayudarán mejor en los foros de, por ejemplo, http://www.hispacluster.org
El tema del SSH tendrás que investigarlo más. Más info en nuestro artículo:
Conexión remota segura con SSH
OK, gracias de todas formas !
Aun asi he disfrutado mucho con vuestros documentos, a seguir asi !
Saludos ;)
el cluster me funciona con el programa del hola undo pero no me funciona ninguna otra aplicacion… a que se deberá no me muesra ningun resultado
tengo un problema, para apagar los nodos del cluster, lo hago uno por uno…como hago para apagarlos desde el servidor.
tengo un problema, al compilar con el flag -fopenmp y poner la variable de entorno OMP_NUM_THREADS en todos los nodos
solo el nodo maestro hace threads openmp, los demas solo tienen un hilo
como puedo hacer que los esclavos tambien tengan threads openmp??
Buenas soy nuevo en MPI, si me pueden ayudar quiero saber, cual es la instrucción para conocer el nombre de una máquina que está ejecutando un proceso.
quiero introducir dicho comando en un programa, si me pueden indicar un sencillo programa de hola mundo que lo haga se lo agradeceria. No conozco la instrccuión en MPI que lo hace. Graccias.