Imprimir

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

  1. 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
  2. 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:~$
  3. 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
  4. 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:

pyMPI

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

    XMPI

12 Comentarios en “Clusters Beowulf/MPI en Linux”

  • BGT dice:

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

  • crash-n-burn dice:

    BGT, para ver el valor de P4_RSHCOMMAND:
    # echo $P4_RSHCOMMAND

  • BGT dice:

    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

  • Peru dice:

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

  • crash-n-burn dice:

    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

  • Peru dice:

    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.

  • crash-n-burn dice:

    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

  • Peru dice:

    OK, gracias de todas formas !
    Aun asi he disfrutado mucho con vuestros documentos, a seguir asi !
    Saludos ;)

  • kathe dice:

    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

  • kathe dice:

    tengo un problema, para apagar los nodos del cluster, lo hago uno por uno…como hago para apagarlos desde el servidor.

  • clusty dice:

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

  • carlos dice:

    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.

Deja un comentario