Imprimir

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

17 Comentarios en “Clusters Beowulf/PVM en Linux”

  • Darius dice:

    Demasiado bueno gracias!!, hacia falta una explicacion como esta en la web….
    Pero no me sirvio el comando para agregar slave1, me dice que no existe el fichero :s.

  • crash-n-burn dice:

    Darius, comprueba la configuración del archivo pvm.hosts y que los nombres de los nodos utilizados en pvm.hosts están en /etc/hosts.

  • Salomón Rincón dice:

    Soy muy nuevo usando pvm, sólo tengo una máquina (el master) sin esclavos y estoy intentando ejecutar los ejemplos pero al ejecutar hello me da esta salida
    pvm> spawn -> hello
    spawn -> hello
    [1]
    0 successful
    No such file
    pvm>
    Tengo algo mal configurado? que debo verificar?
    Saludos y gracias

  • crash-n-burn dice:

    Salomón, si no te funciona es que tienes algo mal configurado, tendrás que verificarlo todo. Comprueba la configuración, verifica el código fuente de hello y hello_other, prueba con los ejecutables ya compilados, prueba con otros ejemplos, googlea… Ánimo.

  • Salomón Rincón dice:

    He encontrado cual era mi problema. La carpeta examples la descomprimi en mi home, de ahi compile los ejemplos y generé los ejecutables. Esto creó la carpeta LINUX (y dentro de ella los ejecutables). El problema es que esa carpeta fue creada al mismo nivel de la carpta examples y debe estar dentro de /usr/lib/pvm3/bin ya que aparentemente ahi es en donde busca los ejecutables la consola pvm. En resúmen, el problema se soluciona teniendo los ejecutables en la ruta /usr/lib/pvm3/bin/LINUX
    Por si a alguien mas le sirve.
    Saludos

  • Roberto dice:

    Bueno, pues yo tengo un problema, para empezar soy nuevo en esto. Ya instalé PVM y PVM DEV a lo mismo XPVM, todo esta en Ubuntu 7.10 pero al momento de ejucutar PVM me marca un error que dice:
    libpvm [pid13828] /tmp/pvmd.0: No such file or directory
    libpvm [pid13828]: Console: Can’t start pvmd

    no sé como arreglar esto, me podrían ayudar por favor GRACIAS!!!

  • QuarK dice:

    Muy buenas, he seguido los pasos, en su día me funcionó a la primera, pero ahora no sé por qué pero no se comunicaban las dos máquinas que uso, me he instalado y configurado el ssh server, pero cuando hago: ssh host, me pide la contraseña igualmente.. al igual que cuando hago add host…
    ¿te ha pasado algo parecido? ¿tienes alguna idea de lo que pueda ser?
    Muchas gracias por tu tiempo.

  • crash-n-burn dice:

    QuarK, tienes que configurar el servidor SSH en los esclavos para que acepten conexiones desde el master sin pedir password ni pass-phrase. Y recuerda que para que no te pida password debes ejecutar los comandos en el master en la misma terminal en la que has activado ssh-agent. Más info en conexión remota segura con SSH.

  • Giover dice:

    libpvm [pid13828] /tmp/pvmd.0: No such file or directory
    libpvm [pid13828]: Console: Can’t start pvmd

    Tambien me aparece el mismo error luego de instalar el pvm.
    Estoy haciendolo el Debian, alguien tiene alguna idea? porfavor.

  • xavi dice:

    He seguido tu guía, para la configuración del pvm, pero me quedo estancado al añadir los esclavos, esto es lo que obtengo al intentar añadir-lo. El el esclavo el pvmd esta funcionando y la variables de entorno, están correctamente cargadas; además el ssh está correctamente configurado

    pvm> add node1
    add node1
    0 successful
    HOST DTID
    node1 No such host

  • Juan CLaudio dice:

    Muy buena es decir excelente guia
    Tuve que realizar lo mismo para la Universidad el año pasado pero no habia tanta info, asi que con mis compañeros de clases sufrimos harto xDDd
    Con esta guia esta todo claro y paso a paso to perfect te felicito.
    Para los que no hayan realizado esto, es bastante entretenido realizarlo y se aprende harto
    saludos

  • PAco dice:

    Hola, tengo problemas al aniadir un nodo.
    Al poner add slave1 me regresa:
    add slave1
    terminado
    y sale de pvm y no lo agrega
    que hago???

  • mvr1981 dice:

    Muchas gracias, aunque no tengo los conocimientos necesarios de Linux, voy a intentar crear un cluster, me gusta la idea, y será la oportunidad para aprender algo mas.

  • Tamara dice:

    Hola, tengo el mismo problema que tenía PAco:

    Al poner add host me devuelve:
    Terminado y sale del pvm.
    ¿Qué puedo hacer? PAco, ¿lo pusiste soluccionar al final? ¿Cómo?
    Muchas gracias,

  • alguien a quien le funciono (loretito) dice:

    errno=10 => tienes que llamar el pvm como sudo [=B]
    errno=22 => me parce que se me fue cuando cambie el localhost por el nombre del maestro y (importante) reinicie

    fe de erratas: primero hacer el paso de de “/etc/hosts” y luego el “add slave”y antes de usar scp usuario @ esclavo, es decir primero

    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

    i despues pvm> add slavel

    Suerte a todos

    —————-

    static char rcsid[] =
    “$Id: hello.c,v 1.2 1997/07/09 13:24:44 pvmsrc Exp $”;

    /*
    * PVM version 3.4: Parallel Virtual Machine System
    * University of Tennessee, Knoxville TN.
    * Oak Ridge National Laboratory, Oak Ridge TN.
    * Emory University, Atlanta GA.
    * Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
    * G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
    * P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
    * (C) 1997 All Rights Reserved
    *
    * NOTICE
    *
    * Permission to use, copy, modify, and distribute this software and
    * its documentation for any purpose and without fee is hereby granted
    * provided that the above copyright notice appear in all copies and
    * that both the copyright notice and this permission notice appear in
    * supporting documentation.
    *
    * Neither the Institutions (Emory University, Oak Ridge National
    * Laboratory, and University of Tennessee) nor the Authors make any
    * representations about the suitability of this software for any
    * purpose. This software is provided “as is” without express or
    * implied warranty.
    *
    * PVM version 3 was funded in part by the U.S. Department of Energy,
    * the National Science Foundation and the State of Tennessee.
    */

    #include
    #include “pvm3.h”

    main()
    {
    int cc, tid;
    char buf[100];

    printf(”Soy la tarea t%x\n”, pvm_mytid());

    cc = pvm_spawn(”hello_other”, (char**)0, 0, “”, 1, &tid);

    if (cc == 1) {
    cc = pvm_recv(-1, -1);
    pvm_bufinfo(cc, (int*)0, (int*)0, &tid);
    pvm_upkstr(buf);
    printf(” respuesta de la tarea t%x: %s\n”, tid, buf);

    } else
    printf(”No se ha podido lanzar hello_other\n”);

    pvm_exit();
    }

    —————-

    y esta sería la equivalente versión “ligeramente traducida” de hello_other.c:

    —————-

    static char rcsid[] =
    “$Id: hello_other.c,v 1.2 1997/07/09 13:24:45 pvmsrc Exp $”;

    /*
    * PVM version 3.4: Parallel Virtual Machine System
    * University of Tennessee, Knoxville TN.
    * Oak Ridge National Laboratory, Oak Ridge TN.
    * Emory University, Atlanta GA.
    * Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
    * G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
    * P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
    * (C) 1997 All Rights Reserved
    *
    * NOTICE
    *
    * Permission to use, copy, modify, and distribute this software and
    * its documentation for any purpose and without fee is hereby granted
    * provided that the above copyright notice appear in all copies and
    * that both the copyright notice and this permission notice appear in
    * supporting documentation.
    *
    * Neither the Institutions (Emory University, Oak Ridge National
    * Laboratory, and University of Tennessee) nor the Authors make any
    * representations about the suitability of this software for any
    * purpose. This software is provided “as is” without express or
    * implied warranty.
    *
    * PVM version 3 was funded in part by the U.S. Department of Energy,
    * the National Science Foundation and the State of Tennessee.
    */

    #include “pvm3.h”
    #include
    #include

    main()
    {
    int ptid;
    char buf[100];

    ptid = pvm_parent();

    strcpy(buf, “hello, world from “);
    gethostname(buf + strlen(buf), 64);

    pvm_initsend(PvmDataDefault);
    pvm_pkstr(buf);
    pvm_send(ptid, 1);

    pvm_exit();
    exit(0);
    }

    —————-

    Para compilar cada uno de ellos podríamos usar “aimk” o simplemente una línea de comandos como ésta:

    cc hello.c -o hello -lpvm3

    y lo mismo para el otro fuente:

    cc hello_other.c -o hello_other -lpvm3

  • Guille dice:

    Buenas
    Ya se que es muy tarde para hacer este comentario pero ayer encontré esta página navegando…
    Está genial el tutorial. Para PAco y Tamara (aunque ya sea tarde) pero en general para los que tengan el problema con el mensaje “Terminado” al añadir un host los pasos a seguir (por lo menos los que a mi me sirvieron) son los siguientes:
    – En el fichero /etc/hosts en vez de dejar la direccion de la máquina por defecto (127.0.0.1) cambiadla por la IP que tiene la máquina en la red
    – Si con este paso sigue sin funcionar puede ser un problema con rsh.

  • Qver dice:

    SOLUCION DE ALGUNOS ERRORES

    Error cuando:
    libpvm [pid13828] /tmp/pvmd.0: No such file or directory
    libpvm [pid13828]: Console: Can’t start pvmd

    Solucion:
    Verificar el archivo /etc/hosts en cada nodo
    o si lo editaste regresalo a como estaba con anterioridad

    Error cuando:
    pvm> spawn -> hello
    spawn -> hello
    [1]
    0 successful
    No such file

    Solucion: Verificar que esten los ejecutables y que esten bien definidas las variables de entorno en el archivo .bashrc
    Solucion2: intenta nuevamente el spawn, suele pasar que aveces no los ejecuta

    Error cuando:

    “Master Host IP Address is Loopback!”

    Solucion: Verifica nuevamente el archivo /etc/hosts que el nombre del host no apunte a 127.0.0.1 unicamente algo como “127.0.0.1 localhost.localdomain localhost”

    Solucion 2: usa el comando #:pvm -n(ip del master)
    ej: #pvm -n192.168.1.1

    Podran ahora agregar hosts con el comando “add slave” y ya no dira que es loopback

Deja un comentario