El presente tutorial fue realizado en maquinas con Ubuntu, pero esta pensado para ejecutarce en cualquier ambiente Linux con ligeros cambios en los comandos
El tutorial se divide en 5 etapas
- Instalación y configuración de OpenMPI
- Instalación y configuración de StarPu
- Configuración de computadoras en red de area local
- Ejecución de programas con herramienta OpenMPI en cluster
- Ejecución de programas con herramienta StarPu en cluster
- Equipo
- FAQ
A continuación se explica como instalar OpenMPI desde un archivo fuente y con herramientas GNU.
Esta guía se instala y configura la version 4.0.1 de OpenMPI
- Es necesario tener instalado un compilador de C/C++ ANTES de realizar la instalación de OpenMPI.
- Es necesaria la herramienta Make.
OpenMPI (URL fuente)
Descargar OpenMPI
$ wget https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.1.tar.gzDescomprimir el archivo openmpi-x.x.x.tar.gz (Cambiar x.x.x por la versión descargada).
$ sudo tar -xvf openmpi-4.0.1.tar.gzAcceder a la carpeta que genera la descompresión. (Cambiar x.x.x por la versión descargada)
cd openmpi-4.0.1Configuramos el archivo de instalación (haciendo uso de los privilegios de superusuario correspondientes a su sistema operativo, no confundir con root), esto tarda entre 5 y 10 minutos (dependiendo del ordenador). Es necesario añadir en el prefijo el directorio de instalación que queremos para OpenMPI. Lo normal sería selecciónar de directorio de instalación "/home/$USER/.openmpi", aunque en esta guía lo instalaremos sobre /opt
$ sudo ./configure --prefix="/opt/openmpi"Se realiza la compilación, para ello es necesario la herramienta Make
$ sudo make $ sudo make installPara que la exportación de variables perdure para las siguientes sesiones y terminales, es necesario colocar las variables de entorno en el archivo .bashrc (para los usuarios de bash). Por defecto será "/home//.bashrc".
$ echo '# Variables OpenMPI' >> /home/$USER/.bashrc
$ echo 'export PATH="$PATH:/opt/openmpi/bin"' >> /home/$USER/.bashrc ;
$ echo 'export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/openmpi/lib/"' >> /home/$USER/.bashrc$ source ~/.bashrcSi todo ha ido bien, cuando ejecutemos mpirun nos desplegará la ayuda de uso, al igual que al hacer mpicc.
$ mpirun --version
mpirun (Open MPI) 4.0.1
Report bugs to http://www.open-mpi.org/community/help/A continuación se explica como instalar StarPu desde un archivo fuente y con herramientas GNU.
Esta guía se instala y configura la version 1.3.1 de StarPU
- Es necesario tener instalado un compilador de C/C++ ANTES de realizar la instalación de StarPu.
- Es necesaria la herramienta Make.
StarPu http://starpu.gforge.inria.fr/ Versiones de StarPu http://starpu.gforge.inria.fr/files/ Handbook: http://starpu.gforge.inria.fr/doc/html/index.html
La biblioteca de descubrimiento de topología hwloc (http://www.open-mpi.org/software/hwloc) no es obligatoria para usar StarPU, pero se recomienda encarecidamente. Permite la planificación consciente de la topología, lo que mejora el rendimiento. libhwloc está disponible en las principales distribuciones gratuitas de sistemas operativos y para la mayoría de los sistemas operativos.
Si libhwloc está instalado en una ubicación estándar, no se requiere ninguna opción, se detectará automáticamente, de lo contrario, se debe usar --with-hwloc= para especificar su ubicación.
Para instalar libhwloc ejecute el siguiente comando
$ sudo apt install libhwloc-devSi libhwloc no está disponible en su sistema, la opción --without-hwloc debe darse explícitamente al llamar al script de configuración.
En la práctica tambien se instaló libtool-bin, aunque no está especificada en el manual de instalación de StarPu.
$ sudo apt install libtool-binRecomendación: instalar como root
$ sudo su -Cambiar de directorio
$ cd /optLos archivos fuentes de StarPU se pueden obtener de la página de descarga del sitio web de StarPU (http://starpu.gforge.inria.fr/files/).
$ wget http://starpu.gforge.inria.fr/files/starpu-1.3.1/starpu-1.3.1.tar.gzDescomprimir
$ tar -xvf starpu-1.3.1Acceder al directorio generado por la descompresión del archivo descargado
$ cd starpu-1.3.1Se debe configurar StarPU. Los detalles sobre las opciones que son útiles para configurar se dan en Configuración de compilación. http://starpu.gforge.inria.fr/doc/html/CompilationConfiguration.htm, como por ejemplo, deshabilitar CUDA
$ ./configure
o
$ ./configure --disable-cuda$ makeUna vez que todo está compilado, es recomendable verificar el resultado. StarPU proporciona un amplio conjunto de pruebas de regresión. La ejecución de las pruebas se realiza llamando a make check. Estas pruebas se ejecutan todas las noches y el resultado del perfil principal está disponible públicamente (http://starpu.gforge.inria.fr/testing/).
$ make checkPara instalar StarPU en la ubicación que se especificó durante la configuración, ejecutar:
$ make installUna vez terminada la instalación, ya no es necesario continuar como root.
$ logoutPara que la exportación de variables perdure para las siguientes sesiones y terminales, es necesario colocar las variables de entorno en el archivo .bashrc (para los usuarios de bash). Por defecto será "/home//.bashrc".
$ echo '# Variables StarPu' >> /home/$USER/.bashrc
$ echo 'export PATH="$PATH:$STARPU_PATH/bin"' >> /home/$USER/.bashrc ;
$ echo 'export LD_LIBRARY_PATH="$STARPU_PATH/lib:$LD_LIBRARY_PATH"' >> /home/$USER/.bashrc ;Cargar el archivo .bashrc en la terminal actual, esto carga las variables que acabamos de escribir en el archivo .bashrc
$ source ~/.bashrc$ starpu_machine_display
$ STARPU_SCHED=dmdas ./examples/cholesky/cholesky_implicit -size$((960*40)) -nblocks 40Install fxt-tools deb package:
$ sudo apt install fxt-tools
$ sudo apt install ocl-icd-opencl-dev
$ sudo apt install libtool-bin
Para poder ejecutar StarPu y OpenMPI de forma distribuida, es necesario configurar las computadoras en una red de area local.
https://mpitutorial.com/tutorials/running-an-mpi-cluster-within-a-lan/
http://www.linuxproblem.org/art_9.html
Para comunicarse con otras computadoras, es necesario conocer la ip de cada nodo, sin embargo para para facilitar la tarea, vamos a asignar un alias a los distintos nodos de la red con los que deseamos comunicarnos. Esta información se introduce en el archivo '/etc/hosts' del sistema operativo de cada nodo.
Se puede obtener la ip de cada nodo, usar el comando 'ip addr show'. Es necesario hace lo mismo para cada nodo de la red.
$ ip addr showIp del nodo 192.168.0.15
Ahora se debe decidir cual será el nodo servidor o maestro, que es quien ejecutará el programa, los demás nodos, sólo realizarán las instrucciones que les manda ejecutar el nodo maestro.
Una vez obtenida la lista de todas las IP's de los nodos de la red y que además ya se decidió quien es el nodo maestro, es necesario agregar esta información en cada computadora dentro del archivo 'hosts'.
$ sudo nano /etc/hostsAgregar al final del archivo la lista de los nodos, indicando cual es el maestro y cuales son los nodos esclavos.
# información de nodos
192.168.0.10 master
192.168.0.21 slave1
192.168.0.22 slave2
192.168.0.23 slave3Aunque se puede operar el clúster con la cuenta de usuario actual, es recomendable crear una nueva cuenta de usuario que sea idéntica en todos los nodos de la red. Es muy importante que el nombre de la cuenta creada en cada nodo sea la misma.
En esta guía usaremos el nombre de usuario 'hpc'
$ sudo adduser hpcSiga las instrucciones de consola para crear el nuevo usuario.
Importante: No utilice el comando useradd para crear un nuevo usuario, ya que este comando no crea un directorio '/home' separado de los demás.
Para realizar configuraciones extra en cada usuario, es necesario agregarlo al grupo de usuarios 'sudoers', sin embargo una vez finalizadas las configuraciones, se recomienda eliminar al usuario del grupo de 'sudoers'
$ usermod -aG sudo hpcAhora es momento de cambiar a la cuenta del nuevo usuario para realizar las configuraciones correspondientes
$ su - hpcAl igual que en el momento de la instalación de OpenMPI, es necesario definir las variables de ambiente.
La configuracion de variables de ambiente se debe realizar dentro de la sesión del nuevo usuario creado 'hpc' y para cada nodo del cluster.
Para que la exportación de variables perdure para las siguientes sesiones y terminales, es necesario colocar las variables de entorno en el archivo .bashrc (para los usuarios de bash). Por defecto será "/home//.bashrc".
$ echo '# Variables OpenMPI' >> /home/$USER/.bashrc
$ echo 'export PATH="$PATH:/opt/openmpi/bin"' >> /home/$USER/.bashrc ;
$ echo 'export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/openmpi/lib/"' >> /home/$USER/.bashrcCargar el archivo .bashrc en la terminal actual, esto carga las variables que acabamos de escribir en el archivo .bashrc
$ source ~/.bashrcCada nodo se comunicará con el maestro y el maestro con sus esclavos a traves de SSH y compartirán datos a través de NFS, del cual hablaremos un poco más tarde.
La configuracion de SSH se debe realizar dentro de la sesión del nuevo usuario creado 'hpc' y para cada nodo del cluster.
Instalar 'openssh-server' en cada nodo.
$ sudo apt update
$ sudo apt install openssh-server La comunicación por omisión de ssh se realiza por el puerto 22, sin embargo si tiene algun problema de puerto, pude definir manualmente el puerto de comunicación de ssh 'sudo ufw allow 22'
Como el servidor ssh ya está instalado, ahora puede iniciar sesión los otros nodos, mediante el comando '$ ssh machineName' (sustituir machineName por master, slave1, ...), el cual le pedirá que ingrese la contraseña del usuario 'hpc'. Sin embargo para poder realizar la ejecución de OpenMPI y StarPu, es necesario permitir un inicio de sesión más fácil, esto se logra con las llaves publicas RSA
Generamos las claves RSA.
$ ssh-keygen -t rsaDar enter en todas las opciones para generar las llaves RSA.
Ahora se debe agregar la llave pública a los nodos de la red donde deseamos un inicio de sesión sin contraseña.
Este paso sólo lo realiza el nodo maestro.
El nodo maestro, debe poder acceder a todos los clientes o esclavos. se deben ejecutar los siguientes comandos con la información para cada nodo esclavo.
$ ssh slave1 mkdir -p .ssh;
$ cat .ssh/id_rsa.pub | ssh slave1 'cat >> .ssh/authorized_keys'$ ssh slave2 mkdir -p .ssh;
$ cat .ssh/id_rsa.pub | ssh slave2 'cat >> .ssh/authorized_keys'Este paso lo debe realizar cada nodo esclavo.
Los nodos esclavos, deben poder acceder al nodo maestro. Se deben ejecutar los siguientes comandos en cada nodo esclavo.
$ ssh master mkdir -p .ssh;
$ cat .ssh/id_rsa.pub | ssh master 'cat >> .ssh/authorized_keys'Ahora, suponiendo que haya agregado correctamente las llaves publicas en los otros nodos, el nodo maestro debe poder iniciar sesión en cualquier nodo esclavo sin solicitar una contraseña.
$ ssh slave1Y los nodos esclavos deben poder iniciar sesión sin contraseña en el nodo maestro.
$ ssh masterNota: Se supone que todas las cuentas creadas fueron realizadas con el mismo nombre de usuario, de lo contrario, la conexión sin contraseña no funcionará.
Los siguientes pasos solo se realizan en el nodo maestro
Para compartir archivos, el nodo maestro creará un servidor NFS. Primero es necesario instalarlo
$ sudo apt update
$ sudo apt install nfs-kernel-server Crear la carpeta común para intercambiar archivos
$ mkdir cloud Ahora, es necesario exportar el directorio 'cloud', para ello se debe crear una entrada en el archivo '/etc/exports'
$ echo '/home/hpc/cloud * (rw,sync,no_root_squash,no_subtree_check)' >> /etc/exportsEl * indica que esta carpeta puede ser compartida con cualquier computadora. Si desea limitar la compartición, es necesario agregar la direccion IP o una mascara IP.
Los permisos definidos:
- rw : Esto es para habilitar las opciónes de lectura y escritura. ro es para solo lectura.
- sincronización : aplica los cambios en el directorio compartido solo después de confirmar los cambios.
- no_subtree_check : esta opción impide la comprobación del subárbol. Cuando un directorio compartido es el subdirectorio de un sistema de archivos más grande, nfs realiza exploraciónes de cada directorio por encima de él, para verificar sus permisos y detalles. Deshabilitar la comprobación de subárbol puede aumentar la confiabilidad de NFS, pero reduce la seguridad.
- no_root_squash : esto permite que la cuenta raíz se conecte a la carpeta.
Después de haber agregado la carpeta a compartir en /etc/exports, es necesario ejecutar
$ exportfs -a Este comando se ejecutará cada vez que realice un cambio en '/etc/exports'
Se recomienda reiniciar el servidor NFS
$ sudo service nfs-kernel-server restart Los siguientes pasos sólo se realizan los nodos esclavos.
Instalar los paquetes requeridos.
$ sudo apt update
$ sudo apt install nfs-common Crear un directorio en el nodo esclavo
$ mkdir cloud Y ahora, se monta el directorio compartido 'cloud'
$ sudo mount -t nfs master:/home/hpc/cloud ~/cloud Para verificar que el directorio haya sido montado correctamente, ejecutar
$ df -hDebe haber una line al final parecida a
Mounted on master:/home/hpc/cloud /home/hpc/cloud Para hacer que el montaje sea permanente para que no tenga que montar manualmente el directorio compartido cada vez que reinicie el sistema, puede crear una entrada en la tabla de sistemas de archivos '/etc/fstab'.
$ sudo echo '#MPI CLUSTER SETUP' >> /etc/fstab
$ sudo echo 'master:/home/hpc/cloud /home/hpc/cloud nfs' >> /etc/fstabLa compilación y ejecución debe ser realizada por el usuario 'hpc'
Para probar la ejecución de MPI de forma distribuida en el cluster que configuramos, usaremos el siguiente ejemplo basico.
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);// Initialize the MPI environment
int world_size, world_rank;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);// Get the number of processes
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);// Get the rank of the process
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);// Get the name of the processor
// Print off a hello world message
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
MPI_Finalize();// Finalize the MPI environment.
}Se debe compilar con el siguiente comando para obtener un archivo ejecutable.
$ mpicc -o mpi_hello_world mpi_hello_world.cPara ejecutar el programa anterior en una sola computadora ejecutar
$ mpirun -np 2 ./mpi_hello_worldDonde se -np indica el numero de procesos a ejecutar, en este caso 2.
Ahora para ejecutar en red mover el archivo ejecutable a el directorio compartido cloud y usar
$ mpirun -np 2 --host master,slave1 ./mpi_hello_worldSe debe recibir una salida parecida a la siguiente
Hello world from processor usuario-ThinkPad-T430, rank 0 out of 2 processors
Hello world from processor usuario-K53E, rank 1 out of 2 processorsDonde master y slave1 corresponden a los alias asignados en el archivo /etc/hosts en el paso 3.
La compilación y ejecución debe ser realizada por el usuario 'hpc'
Para probar la ejecución de StarPu en un solo nodo usaremos el siguiente ejemplo basico que llamaremos 'starpu_hello.c'
#include <stdio.h>
/* Task declaration. */
static void my_task(int x) __attribute__ ((task));
/* Definition of the CPU implementation of ‘my_task’.*/
static void my_task(int x){
printf ("Hello, world! With x = %d\n", x);
}
int main (){
/* Initialize StarPU. */
#pragma starpu initialize
/* Do an asynchronous call to ‘my_task’. */
my_task (42);
/* Wait for the call to complete.*/
#pragma starpu wait
/* Terminate. */
#pragma starpu shutdown
return 0;
}Para compilar
$ gcc $(pkg-config --cflags starpu-1.3) starpu_hello.c -o starpu_hello $(pkg-config --libs starpu-1.3)Y para ejecutar usar
$ ./starpu_helloPara la ejecución de StarPu de forma distribuida en el cluster que configuramos se utilizará el programa 'mpi_cholesky_distributed' el cual se encuentra en la carpeta "$STARPU_PATH/mpi/examples/matrix_decomposition/", se recomienda copiar este directorio al directorio compartido configurado en el paso 3, llamado 'cloud'
$ cp -r $STARPU_PATH/mpi/examples/matrix_decomposition/ ~/cloudPara ejecutar moverse a la carpeta ~/cloud/matrix_decomposition/
$ cd ~/cloud/matrix_decomposition/Ejecutar el programa
$ STARPU_SCHED=dmdas mpirun -np 2 --host master,slave1 ./mpi_cholesky_distributed -size $((960*40*2)) -nblocks $((40*2))Este comanda significa que se está ejecutando el programa mpi_cholesky_distributed de forma distribuida en 2 nodos del cluster, con alias master y slave, utilizando las herramientas StarPu con MPI.
- Chávez Fragoso Gonzalo Adán, gchavez@computacion.cs.cinvestav.mx
- Leyva García Juan Antonio, jleyva@computacion.cs.cinvestav.mx
- Pacheco del Moral Oscar, opacheco@computacion.cs.cinvestav.mx
- Reyes Almanza Jesús Abraham, jreyes@computacion.cs.cinvestav.mx