Cluster con MPI ,como no lo habías visto antes

Para simplificar las cosas, consideremos sólo dos computadoras por ahora. Si logra completar este tutorial con éxito es fácil implementarlo con muchos más nodos.

El clúster fue probado con una distribución gnu/linux Debian versión 12, pero debería ser igual con cualquier otra distribución. 

Pre requisitos :

Instalar la misma versión de MPI en esclavos y maestro

sudo apt-get install libopenmpi-dev openmpi-bin openmpi-doc

Paso1 :Configura el archivo host

Necesitaremos que haya comunicación entre las computadoras y no queremos escribir las direcciones IP muy seguido . Entonces,podemos dar un nombre a los distintos nodos de la red con los que deseamos comunicarnos, utilizando un archivo llamado hosts.

Lo que hará esto es que el sistema operativo utilizara el archivo para asignar nombres de host a las direcciones IP.

Manager:

$ sudo nano /etc/hosts
127.0.0.1 localhost
#configuración
100.96.100.1 managerangel
100.96.100.2 esclavo

Cliente:

$ sudo nano /etc/hosts
127.0.0.1 localhost
#configuración
100.96.100.1 managerangel
100.96.100.2 esclavo

Paso 2: Crear usuarios

Se suele crear un nuevo usuario con el mismo nombre en todos los dispositivos así que haremos eso.

$ sudo adduser mpiuser

Establezca una contraseña para cada usuario en cada máquina.

Paso 3: configurar SSH

Los sistemas se comunicarán a través de ssh y compartirán datos a través de nfs. Instale el openssh en todo el sistema(maestro y esclavo)

$ sudo apt install openssh-server

Cambiar usuario:

$ su -mpiuser

#generación de claves

$ ssh-keygen -t rsa

#crear directorio .ssh en el cliente

$ ssh mpiuser@esclavo mkdir -p .ssh

Escriba la contraseña del cliente cuando se le solicite

esclavo pude variar en su caso ,debe ser igual al que asigno en el hostfile

#Subir claves públicas generadas al cliente

$ cat .ssh/id_rsa.pub | ssh mpiuser@esclavo ‘cat >> .ssh/authorized_keys’

donde cliente se reemplaza por el nombre que le asigno ,en el nuestro ejemplo seria salvadorserver

Seguidamente Ingrese la contraseña del cliente cuando se le solicite

#Establecer permiso en el cliente

$  ssh mpiuser@esclavo «chmod 700 .ssh; chmod 640 .ssh/authorized_keys»

#Iniciar sesión en el cliente sin contraseña

$ ssh mpiuser@esclavo

O también : $ ssh esclavo

Nota: Haga todo el paso anterior con los clientes del maestro (manager)

Paso 4: configurar NFS

NFS se utiliza para compartir el archivo objeto y datos entre todos los nodos del sistema.

4.1 Para el Manager o nodo maestro:

Instale el servidor nfs en el maestro para montar la carpeta compartida.

#nfs para instalación del servidor

$ sudo apt-get install nfs-kernel-server

# Crea una carpeta para compartir

Necesitamos crear una carpeta que compartiremos en la red. En nuestro caso, «storage«. 

Importante : estando con la sesión iniciada en mpiuser, ruta /home/mpiuser

$ mkdir storage

Para exportarlo , creamos un entry en /etc/exports

$sudo nano /etc/exports

Ojo:Para cualquier paso, Si obtenemos el mensaje como » mpiuser no esta en el archivo sudoers » lo podemos agregar al archivo /etc sudoers como se muestra en la imagen

Agregamos en la partefinal del archivo exports lo siguiente :

/home/mpiuser/storage *(rw,sync,no_root_squash,no_subtree_check)


# ejecuta el comando después de cualquier cambio en /etc/exports

$ exportfs -a

Si lo anterior no funciona usar sudo

# Reiniciar el servidor nfs

$ sudo service nfs-kernel-server restart

4.2 Para el Cliente o nodo esclavo:

# Instalar nfs para el cliente

$ sudo apt-get install nfs-common

#nos logeamos con mpiuser y creamos una carpeta con el mismo nombre con el que se creo en el Maestro para compartir

$ sudo mkdir storage

#montar la carpeta maestra en el cliente

Situados y como usuario mpiuser en /home/mpiuser donde esta la carpeta storage :

$ sudo mount -t nfs managerangel:/home/mpiuser/storage ~/storage

#verificar si el montaje fue exitoso

Puede que con el reinicio de la PC storage se haya desmontado con este paso nos aseguramos ,para luego volver a montarlo

$ df-h

Importante : aquí las rutas managerangel:/home/mpiuser/storage .. /home/mpiuser/storage deben coincidir

# Agregar la entrada a la tabla del sistema de archivos.

Para que el montaje sea permanente y 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, es decir, un archivo /etc/fstab como se muestra a continuación

$ nano /etc/fstab

Agregar:

managerangel:/home/mpiuser/storage /home/mpiuser/storage nfs

Paso 5:Correr el programa en el cluster con mpi

Navegue hasta el directorio compartido de NFS en el maestro («storage» en nuestro caso) y cree los archivos allí codigo fuente hello.c [o podemos pegar solo los archivos .aout). Para compilar el código, y generar un ejecutable.

$ cd storage/
$ pwd
/home/mpiuser/storage

Cree un programa MPI en C con el nombre hello.c

Aqui esta el que se utilizo:https://github.com/ubuangel/Weblatex4/blob/main/Lab_ComputacionParalela/mpi/mpi_hello_world.c

#compila el código

$ mpicc mpi_hello_world.c

#ejecutar

$ mpirun -np 4 –oversubscribe -host managerangel,esclavo ./mpi_hello_world

Exitos!!

Referencias

https://www.geeksforgeeks.org/creating-an-mpi-cluster/

https://mpitutorial.com/tutorials/running-an-mpi-cluster-within-a-lan/

https://medium.com/mpi-cluster-setup/mpi-clusters-within-a-lan-77168e0191b1