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…).
Instalar PVM
- Instalar PVM: instalaremos los paquetes pvm pvm-dev:
# apt-get install pvm pvm-dev
- 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
- 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.
- 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:~$
Manejar PVM desde la consola interactiva
Para 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 |
Manejar PVM desde el entorno gráfico
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 |
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. |
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 |
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 |
Recursos
- skyvase.pov
- PVMPOV HOWTO: pvmpov.sourceforge.net/PVMPOV-HOWTO.html
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.
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.
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
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.
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
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!!!
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.
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.
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.
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
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
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???
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.
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,
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%xn”, 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: %sn”, tid, buf);
} else
printf(“No se ha podido lanzar hello_othern”);
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
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.
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
libpvm [pid2608] /tmp/pvmd.1000: No such file or directory
libpvm [pid2608]: Console: Can’t start pvmd
Me sale este error, verifique mi archivo hosts y esta el nombre de la computadora bien, que mas podria ser?