- Estréllate y Arde - https://www.estrellateyarde.org -

Clusters Beowulf/PVM 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.

La máquina virtual paralela PVM (Parallel Virtual Machine, csm.ornl.gov/pvm/pvm_home.html) permite realizar computación paralela y estará formada por todos los nodos en los que esté activo el demonio pvmd. Consta de los siguientes componentes:

  • el demonio pvmd.
  • el archivo de configuración ~/pvm.hosts.
  • la consola interactiva de PVM (pvm) y su frontal gráfico XPVM (xpvm).
  • las librerías PVM.
  • las herramientas de desarrollo (aimk...).
  1. Instalar PVM: instalaremos los paquetes pvm pvm-dev:
    # apt-get install pvm pvm-dev
  2. Ajustar las variables de entorno: debemos establecer dos variables de entorno, la ruta donde se instala PVM (PVM_ROOT) y la arquitectura de la máquina (PVM_ARCH). Para ello editaremos .bashrc y añadiremos las siguientes líneas:
    export PVM_ROOT=/usr/lib/pvm3
    export PVM_ARCH=LINUX
    export PATH=$PATH:/usr/lib/pvm3/bin:$HOME/pvm3/bin/LINUX

    Cargamos .bashrc de nuevo y comprobamos:

    $ source ~/.bashrc
    $ echo $PVM_ROOT
    /usr/lib/pvm3
  3. Directorio compartido ~/pvm3: aunque no es indispensable, es conveniente que el master exporte vía NFS el directorio ~/pvm3 y los esclavos lo monten en ~/pvm3.
  4. Habilitar SSH sin password: para que el master pueda ejecutar comandos remotos en los esclavos, PVM 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 PVM 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:~$
  5. Manejar PVM desde la consola interactiva: entraremos en la consola PVM con el comando pvm y obtendremos el prompt (si el demonio pvmd no estaba corriendo lo lanzará):
    $ pvm
    pvm>

    Para ver la lista de nodos del cluster usaremos el comando conf:

    pvm> conf
    conf
    1 host, 1 data format
        HOST     DTID   ARCH    SPEED       DSIG
        master  40000  LINUX     1000 0x00408841

    Podemos añadir un nodo (y lanzar el demonio pvmd en ese nodo) con el comando add:

    pvm> add slave1

    Y eliminar un nodo con el comando delete (mataremos el demonio pvmd en ese nodo):

    pvm> delete slave1

    Para arrancar el demonio pvmd en el master y en todos los nodos listados en pvm.hosts ejecutaremos:

    $ pvm pvm.hosts
    pvm>

    Siendo pvm.hosts un archivo que contiene la lista de nodos del cluster, por ejemplo:

    # Master PVM
    master
    # Slaves
    slave1
    slave2
    slave3

    Los nombres de los nodos utilizados en pvm.hosts 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

    Comprobamos la lista de nodos del cluster:

    pvm> conf
    conf
    4 hosts, 1 data format
        HOST     DTID   ARCH    SPEED       DSIG
        master  40000  LINUX     1000 0x00408841
        slave1 100000  LINUX     1000 0x00408841
        slave2 140000  LINUX     1000 0x00408841
        slave3  c0000  LINUX     1000 0x00408841

    Para ver una relación de los comandos de la consola:

    pvm> help
    help        Print helpful information about a command
    Syntax:  help [ command ]
    Commands are:
      add         Add hosts to virtual machine
      alias       Define/list command aliases
      conf        List virtual machine configuration
      delete      Delete hosts from virtual machine
      ...

    Podemos salir de la consola PVM sin parar los demonios pvmd con el comando quit:

    pvm> quit
    quit
    pvmd still running.

    Para volver a entrar en la consola PVM:

    $ pvm
    pvmd already running.
    pvm>

    Para salir de la consola PVM matando todos los demonios pvmd el comando es halt:

    pvm> halt
    halt
    Terminado
  6. Manejar PVM desde el entorno gráfico: en el entorno gráfico disponemos de XPVM (paquete xpvm), un frontal para la consola PVM que nos permite administrar y monitorizar el cluster. Para arrancar XPVM ejecutaremos (lanzará el demonio pvmd si no estaba corriendo):
    $ xpvm

    XPVM

    Para arrancar XPVM arrancando el demonio pvmd en el master y en todos los nodos listados en pvm.hosts ejecutaremos:

    $ xpvm pvm.hosts

    Si cerramos la ventana de XPVM sin ejecutar File / Halt PVM el demonio pvmd seguirá activo:

    Quitting xpvm - pvmd still running.
  7. Ejecutar un programa paralelizado con PVM: veamos hello/hello_other, uno de los ejemplos que trae PVM (paquete pvm-examples). Este ejemplo usa el modelo master/esclavo, el más habitual en los programas paralelizados con PVM: dos programas que colaboran, uno se ejecuta en el master (hello) y otro se ejecuta en los esclavos (hello_other). Otra posibilidad es el modelo padre/hijo, un único programa padre que se ejecuta en el master y se forkea en procesos hijos que envía a los esclavos.

    Ubicaremos los archivos fuente (hello.c y hello_other.c) en ~/pvm3/examples y los compilaremos con aimk, un wrapper para make de PVM (se generarán los ejecutables hello y hello_other en ~/pvm3/bin/LINUX):

    $ cd ~/pvm3/examples
    $ aimk hello hello_other

    Copiamos hello_other en los esclavos:

    francis@master:~$ scp hello_other francis@slave1:~/pvm3/bin/LINUX/hello_other

    Ejecutaremos hello desde la consola PVM:

    pvm> spawn -> hello
    [1:t40014] i'm t40014
    [1:t40014] from t100006: hello, world from pc266

    Si sólo tenemos activo el master el programa se ejecutará sólo en ese nodo:

    pvm>$ spawn -> hello
    [1:t40036] i'm t40036
    [1:t40036] from t40037: hello, world from master

    También podemos ejecutar hello desde el shell:

    $ hello
  8. Ejemplo con PVM-POV: PVM-POV (pvmpov.sourceforge.net) es la versión paralelizada del renderizador POV-Ray. PVMPOV divide la imagen a renderizar en pequeños bloques que asigna a los esclavos. Cuando estos terminan su trabajo envían los resultados al master que los combina para generar la imagen final.

    PVM-POV es un parche para POV-Ray por lo que para instalarlo tenemos que descargarnos el parche, aplicarlo a las fuentes de POV-Ray y compilar. Encontraremos instrucciones detalladas en PVMPOV HOWTO.

    Usaremos como ejemplo la escena skyvase.pov que podemos descargar de PovBench (haveland.com). Primero la copiaremos en los esclavos:

    francis@master:~$ scp skyvase.pov francis@slave1:~/pvm3/skyvase.pov

    Para ejecutar el renderizado el comando es:

    $ pvmpov +Iskyvase.pov +Oskyvase.tga +Linclude pvm_hosts=slave1,slave2
      +NT3 +NW64 +NH64 +v -w1024 -h768
    • +Iskyvase.pov: la entrada es skyvase.pov.
    • +Oskyvase.tga: la salida es skyvase.tga.
    • +Linclude: el directorio para includes es ./include.
    • pvm_hosts=slave1,slave2: esclavos.
    • +NT3: divide el renderizado en 3 tareas PVM (una para cada esclavo).
    • +NW64: ancho de los bloques 64 pixels.
    • +NH64: alto de los bloques 64 pixels.
    • +v: verbose.
    • -w1024: ancho de la imagen 1024 pixels.
    • -h768: alto de la imagen 768 pixels.

    Se generará ~/pvm3/skyvase.tga que contiene la imagen generada. Para convertirla a .jpg:

    $ tgatoppm skyvase.tga > skyvase.ppm
    $ ppmtojpeg skyvase.ppm > skyvase.jpg

Article printed from Estréllate y Arde: https://www.estrellateyarde.org

URL to article: https://www.estrellateyarde.org/discover/cluster-beowulf-pvm-en-linux

Copyright © 2010 Estrellate y Arde