OpenMPI y clusters Beowulf en Ubuntu
Esta es mi primera experiencia con OpenMPI y debido a la escasa documentación de como implementar un pequeño cluster Beowulf. He utilizado Ubuntu para la implantación, ya que es el sistema que suelo utilizar, aunque el manual es extensible a distros basadas en Debian.
Ahora voy a tratar de relatar un poco mi experiencia. Decidí montar un cluster con tres equipos (¡en buena hora se me ocurrió!) para realizar la práctica de paralelización de algoritmos de la asignatura de Algorítmica. Aquí está el resultado.
Antes de comenzar voy a realizar una pequeña introducción. Beowulf fue un proyecto realizado por la NASA allá por 1994 con el objetivo de crear un cluster de coste reducido. Hoy en día se conoce a un sistema Beowulf a una arquitecutra multi-computadora que suele ser utilizada para computación paralela. Ésta sigue un modelo master/slave, es decir, un nodo que hace de servidor y un conjunto de nodos que se conectan mediante Ethernet (normalmente).
Y también me gustaría hacer una pequeña aclaración antes de continuar. MPI es un estándar que proporciona una API para realizar el paso de mensajes. De hecho, MPI significa Message Passing Interface, Interfaz de Paso de Mensajes. Yo he decidido utilizar una de las implementaciones que hay disponibles: OpenMPI, aunque existen otras.
Dentro de MPI podemos disntiguir dos tipos de entornos distintos: el entorno de desarrollo y el entorno de ejecución. No es necesario que el entorno de desarrollo esté instalado en cada nodo del cluster, pero en cambio si que es necesario que todos los nodos tengan instalado el entorno de ejecución.
Yo he trabajado directamente con el master, aunque se puede utilizar cualquier nodo para trabajar. En mi caso, también he trabajado sentado delante del master, pero tampoco hay ningún problema en trabajar mediante SSH.
Los requisitos iniciales para poder montar el cluster son los siguientes:
- Todos los nodos (tanto el master como los slaves) deben estar interconectados entre sí. Se pueden utilizar independientemente cualquier topología de red, ya que el modelo en estrella lo estableceremos en la lógica de la aplicación.
- Todos los nodos deben de tener instalado el entorno de ejecución de MPI.
- Cada slave debe de tener su propio servidor SSH instalado.
No hes obligatorio, pero si lo recomiendo que todos los nodos tengan la misma versión de MPI y de ser posible, también la misma versión del sistema operativo. Tuve grandes dolores de cabeza por tratar de utilizar Ubuntu 9.04, Ubuntu 9.10 y Ubuntu 10.04 (aún en desarrollo).
Ahora bien, ¿cómo funciona OpenMPI? Cuando nosotros ejecutamos una aplicación a través del entorno de ejecución de MPI, en función de la configuración indicada (hosts, slots, número de procesos, ...), éste realiza una conexión a través de SSH a cada uno de los nodos que vayan a ejecutar uno o varios procesos y los lanza remotamente. A partir de aquí empieza el paso de mensaje entre los distintos nodos.
Pero, ¿qué problemas aparecen? Cuando realizamos una conexión a través de SSH el servidor nos pide usuario y contraseña, los cuales son desconocidos para OpenMPI. Para evitar este problema debemos configurar cada servidor SSH para que permita al usuario actual loguearse sin contraseña.
Pero, ¿para qué usamos SSH? SSH nos permite ejecutar comandos remotos, es decir, ejecutar comandos que estén alojados en el servidor. Como es lógico, la aplicación alojada en el master no está en los slaves, así que para poder ejecutarla, primero es necesario llevarla hasta allí.
Esto lo podemos solucionar de tres formas distintas. La primera, la más simple, consiste en copiar el código fuente en cada nodo y conectarnos por SSH para compilarlo; la segunda consiste en copiar el ejecutable en cada nodo (con scp por ejemplo) y en la misma ubicación en todos los nodos; y la tercera es algo más compleja y consiste en montar un servidor NFS.
Montar un servidor NFS nos permite más versatilidad. La idea es la siguiente, lo instalamos en el master y en cada slave modificamos el fichero /etc/fstab para que que se conecte automáticamente al iniciar. Así, cada vez que compilemos en el master no será necesario volver a copiar el ejecutable en cada slave. Esta opción es más interesante cuantos más nodos hay, ya que la labor se puede hacer tediosa.
Esto nos vuelve a plantear otro problema en el caso de tener una red heterogénea, es decir, que no todos los nodos tengan la misma arquitectura. Habrá que tener cuidado con estos temas.
Estas son las conclusiones a las que he llegado. A lo largo de estos días intentaré ir concretando algunos de estos puntos y trataré de poner disponibles algunos ejemplos.
Tags
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.
