En este artículo vamos a explicar como montar un
sistema HPC (High Performance Computing). El campo de
computación de alto rendimiento (High performance o HPC en inglés) es una herramienta muy importante en el desarrollo de simulaciones computacionales a problemas complejos. Para lograr este objetivo, la
computación de alto rendimiento se apoya en tecnologías computacionales como los
clusters,
supercomputadores o mediante el uso de la
computación paralela. La mayoría de las ideas actuales de la
computación distribuida se han basado en la computación de alto rendimiento. La
computación paralela es una técnica de
programación en la que muchas
instrucciones se ejecutan simultáneamente.
Se basa en el principio de que los problemas grandes se pueden dividir en partes más pequeñas que pueden resolverse de forma
concurrente ("en paralelo").
(Fuente Wikipedia)

Hasta llegar a poder hacer este artículo, y con el objetivo que el lector pudiera tener una explicación detallada de todas las partes, realicé artículos anteriores en donde se explican detalladamente dichas partes y hacer que éste fuera menos complejo. Así pues, para montar un sistema MPI seria conveniente saber:
Como podréis comprobar, para hacer un Ubuntu Diskless se han de dominar también estos dos artículos:
Con todo esto, e instalando los paquetes de Open MPI 1.3.3 y openmpi_ext, podremos obtener un sistema de Alto Rendimiento de Computación para cálculos realizados con Octave3.2.x
Hola Eduardo,
openmpi_ext no funciona con Octave < 3.2.x, y MPITB no funciona con
Octave > 3.0.x El problema ès que los tipos internos de Octave
cambien con las versiones. En este momento, yo recomano utilizar
openmpi_ext y Octave 3.2.x (o version de desarollo) ya que Octave
3.2.x tiene muchas mejoras respecto Octave 3.0.x. La desavantaja és
que openmpi_ext no és completo. Pero si tiene las funciones que
necesitas, el rendemiento és muy bueno.
Michael
Pues ya sabiendo todo esto, pongámonos manos a la obra. En nueve sencillos pasos podremos tener instalado todo el sistema.
PASO 1: Instalar Octave3.2 desde el repositorio
En este punto os aconsejo seguir el artículo ya publicado en este blog que se indica más arriba.
PASO 2: Crear carpeta para las fuentes en ~/fuentes
Crearemos una carpeta de fuentes en $HOME en donde bajaremos todo lo necesario para compilar nuestras aplicaciones.
PASO 3: Descargar Open MPI 1.3.3 de la página oficial
Como existen diversas versiones de Open MPI, nos aseguraremos de descargar aquella que funciona correctamente según las especificaciones para openmpi_ext.
cd fuentes
wget http://www.open-mpi.org/software/ompi/v1.3/downloads/openmpi-1.3.3.tar.bz2
PASO 4: Descomprimir Open MPI 1.3.3
Descomprimimos el archivo tar.bz2 del siguiente modo:
tar xfjv openmpi-1.3.3.tar.bz2
PASO 5: Descargar openmpi_ext de SourceForge
Ahora podemos pasar a descargar la extensión de octave openmpi_ext :
wget "http://octave.svn.sourceforge.net/viewvc/octave/trunk/octave-forge/extra/openmpi_ext.tar.gz?view=tar" -O openmpi_ext.tar.gz
Necesitamos estas fuentes ya que son las que hacen que Octave funcione con MPI. Es una toolbox de Octave basada en
MPITB desarrollada por Javier Fernández Baldomero.
PASO 6: Descomprimir openmpi_ext
Descomprimimos el archivo tar.gz del siguiente modo:
tar xfzv openmpi_ext.tar.gz
PASO 7: Compilar Open MPI 1.3.3
Llegados a este punto nos ponemos a compilar:
cd openmpi-1.3.3 ; echo "Ahora estamos en : "$(pwd)
make clean
./configure --enable-mpirun-prefix-by-default --prefix=$HOME/openmpi-1.3.3/ --enable-static --enable-orterun-prefix-by-default
make install all
PASO 8: Modificar .bashrc con rutas necesarias
Es necesario que los binarios del Open MPI 1.3.3 que se acaban de compilar estén incluidas en la ruta (PATH) ya que sino no compilará correctamente el openmpi_ext.Esto lo podreis ver en el archivo ~/fuentes/openmpi_ext/doc/README.Modifica el .bashrc de tu $HOME:
OMPIBIN=`$ompi_info -path bindir -parsable | cut -d: -f3`
OMPILIB=`$ompi_info -path libdir -parsable | cut -d: -f3`
OMPISCD=`$ompi_info -path sysconfdir -parsable | cut -d: -f3`
export PATH=$OMPIBIN:$PATH
export LD_LIBRARY_PATH=:$OMPILIB:$LD_LIBRARY_PATH
unset ompi_info OMPIBIN OMPILIB OMPISCD
Antes de compilar openmpi_ext deberás salir de la shell y volver a entrar para que tomen efecto los cambios (al más estilo MS Windows) o usar el siguiente comando:
source .bashrc
y no hará falta que salgas de tu sesión (al más estilo GNU/Linux)
PASO 9: Compilar openmpi_ext
Antes de continuar con este paso, quiero aprovechar para dar las gracias a Michael Creel y Riccardo Corradini por su ayuda en este paso. Entre los tres encontramos el porque inicialmente no me compilaba correctamente el openmpi_ext dándome este error cuando queria usar el MPI_Init:
octave:1> MPI_Init
error: /home/csi/ompi_ext/MPI_Init.oct: undefined symbol: _ZN3MPI3Win4FreeEv
El error lo encontramos en el Makefile del openmpi_ext usaba mpicc en vez de mpiCC, y por tanto, la libreria -lmpi_cxx no se incluía correctamente, faltándole el símbolo_ZN3MPI3Win4FreeEv de arriba. Puedo decir que me siento satisfecho de haber podido ayudar a mejorar el código para su compilación.
Para compilar openmpi_ext haremos:
cd $HOME/fuentes/openmpi_ext/src
make clean
make
Ahora podemos probar si funciona entrado en la carpeta en donde se ha compilado el openmpi_ext y ejecutando el octave. Una vez arrancado hacemos MPI_Init y veremos que nos devuelve 0, es decir, que todo ha ido bien.
ans = 0
Todos estos pasos se pueden automatizar perfectamente. He realizado un script que puede ayudaros. Funciona perfectamente en Ubuntu 9.10, si bien no deberia haber ningún problema para cualquier otra distribución.
Para ejecutar el archivo, descomprimirlo y usad:
source ./instala_hpc.sh.
El programa os descargará todos los paquetes necesarios, los descomprimirá, compilará y añadirá en los PATHs necesarios. Simplemente hará que todo el proceso sea más fácil. La última prueba realizada realizó exitosamente todos los pasos en 20 minutos.
ans = 0
Se ha tardado en instalar el sistema HPC 1215 segundos.
Para especificar los nodos que deberá usar el master, deberemos editar un archivo de nodos y decirle al entorno (environment) que ese archivo es el que queremos usar por defecto. Sino creamos ningún archivo de nodos deberemos especificar los nodos en cada comando que ejecutemos, ya que sino no sabrá cuales son los nodos de nuestro sistema. Sería una opción, pero vamos a crear el archivo y luego cada cual es libre de usarlo o no. El archivo de configuración de nodos suele ser openmpi-default-hostfile y siguiente el ejemplo de nuestra instalación lo encontraremos en $HOME/openmpi-1.3.3/etc/openmpi-default-hostfile. Este archivo tiene su interior comentado por defecto y seremos nosotros los que añadamos los nodos manualmente, dejándolo en cada caso como corresponda. Por ejemplo:
hpcmaster
hpcnode1
hpcnode2 slots=2
hpcnode3
En el ejemplo vemos que tenemos el master y 3 nodos. El nodo hpcnode2 tiene dos cores, y por ello podremos contar con los dos.
Una vez editado nuestro archivo de nodos le diremos al entorno dónde se ubica dicho archivo:
export OMPI_MCA_orte_default_hostfile=$HOME/openmpi-1.3.3/etc/openmpi-default-hostfile
Para comprobar que lo hemos realizado correctamente podemos hacer:
ompi_info --param all all | grep hostfile
Perfecto. Ahora que ya tenemos el hpcmaster preparado, deberemos instalar los n nodos. Para ello necesitamos instalar exactamente las mismas versiones de Octave, Open MPI y openmpi_ext que en hpcmaster, así que o repetimos la operación anterior (recordad que mediante el script son sólo 20 minutos) o bien lo hacemos a mano o bien copiamos las carpetas ya compiladas en los nodos, ya que las versiones serán las mismas no habrá ningún problema. Lo único que no hará falta es especificar el archivo de nodos en los nodos, ya que los procesos se arrancarán desde el hpcmaster.
Una vez configurados los nodos, podremos hacer pruebas:
mpirun -np 8 uptime
En próximos artículos explicaré como hacer pruebas en donde podremos comprobar como el rendimiento de nuestros cálculos se mejora considerablemente.
La imagen de un
rack de nodos podría ser como esta:
En la imagen se ven los 25 nodos que yo usé para realizar este artículo. Existen algunos conceptos extra como los Power Switch, refrigeración, etc que se pueden tener en cuenta, pero dichos conceptos extra serán explicados en próximos artículos.
Espero que os haya servido de ayuda.