Cargando...
 

Tutoriales

Tutorial TorquePBS

TORQUE Resource manager es un software que permite «agendar» tareas computacionales,i.e.
«tareas batch». Provee control sobre estas tareas y los recursos computacinoales de sistemas distribuidos. Posee los siguientes componentes:
Servidor: En este caso se llama pbs_server. Permite operaciones básicas como crear, modificar, borrar y ejecutar un trabajo.
Ejecutor: Es un demonio, llamado en nuestro caso pbs_mom, que pone el comando en ejecución cuando recibe una copia del trabajo de el server.
Agendador: Otro demonio que tiene las políticas para decidir que trabajo se ejecuta, donde y cuando. Usamos el agendador MAUI el cual se puede comunicar con varios MOMs para comunicar al servidor el estado de los recursos y para conocer del servidor el estado de los trabajos a ejecutar.

Hola Torque


Usted puede solicitar a TORQUE el estado de un nodo con el comando pbsnodes o de todos los nodos con pbsnodes -a, con los cuales debe obtener una salida como esta para cada nodo en el sistema:

wn1
                 state = free
                 np = 32
                 ntype = cluster
                 status = rectime=1376977699,varattr=,jobs=,state=free,netload=28936987148,gres=,
                                    loadave=1.04,ncpus=32,physmem=57801956kb,availmem=100795756kb,
                                    totmem=106629856kb,idletime=1149356,nusers=1,nsessions=2,sessions=2996358788,
                                    uname=Linux gfif-wn1 3.2.0-4-amd64  # 1  SMP Debian 3.2.41-2 x86_64,opsys=linux


«free» significa que el nodo está en capacidad de correr tareas, «np» es el número de procesadores.

Enviar un trabajo

Para enviar un trabajo o tarea al sistema TORQUE es necesario crear un script de shell (puede ser bash, sh, ksh, etc) con directivas especiales a modo de comentario...

 #/bin/sh
 #PBS -N prueba
 #PBS -o prueba.out
 #PBS -e prueba.err
 #PBS -l walltime=00:01:00

 date
 hostname
 sleep 20
 date


El script anterior se nombro como prueba.sh para correrlo así:

$ qsub prueba.sh


¿Cómo espera usted que sea la salida de este trabajo?. Si está corriendo en múltiples máquinas ¿Dónde se espera encontrar el stdout?

Monitorear el trabajo

El comando qstat -a nos muestra el estado de los trabajos de todas las colas, obtenemos una salida como esta

Job ID          Username Queue           Jobname                 SessID NDS   TSK Memory Time  S Time

1171.cluster     omar          batch       prueba                     21476    2   2            00:01 R   --


El comando

$ pbsnodes -a

Muesta una sálida del tipo

wn4
                state = free
                np = 72
                ntype = cluster
                jobs = 0/8530.cluster, 1/8530.cluster, 2/8530.cluster
          status = ...

Que quiere decir que el nodo wn4 tiene procesadores disponible ( status=free ) pues de los 72 se están usando 3 (`jobs = 0/8530.gfifmaster, 1/8530.gfifmaster, 2/8530.gfifmaster`)

Algunos comandos de pbs para monitoreo y control son

qstat -aVerifica el estado de los trabajos, las colas y el servidor PBS.
qstat -fObtiene toda la información del trabajo lanzado, como: Recursos pedidos, cola, fuente, destino, propietario, recursos límite, etc.
qdel job.IDBorra un trabajo.
qhold job.IDPone un trabajo en estado de espera si se encuentra en cola.
qrls job.IDSaca a un trabajo del estado de espera.


Algunos comandos útiles de maui

showqMuestra una lista detallada de los trabajos lanzados.
showbfuestra los recursos libres.
checkjob job.IDmuestra una descripción detallada del trabajo.
showstart job.IDMuestra el tiempo estimado de comienzo del trabajo.

El script de PBS

Algunas opciones de PBS para el script son

OpciónDescripción
#PBS -N myJobAsigna el nombre a un trabajo
#PBS -l nodes=4:ppn=2El número de nodos y procesos por nodo
#PBS -q queuenameAsigna la cola en al que su trabajo va a estar.
#PBS -l walltime=01:00:00El tiempo de reloj «de pared» durante el cual su trabajo puede correr.
#PBS -o mypath/my.outLa dirección y el nombre del archivo para guardar el stdout.
#PBS -e mypath/my.errLa dirección y el nombre del archivo para guardar el stderr.
#PBS -j oeUne el stdout con el stderr.
#PBS -M user@mailemail del usuario al cual enviar reportes.
#PBS -m bEnvia un email cuando el trabajo comienza.
#PBS -m eEnvia un email cuando el trabajo termina.
#PBS -m aEnvia un email cuando el trabajo aborta por un error.
#PBS -VExporta todas las variables de entorno al trabajo.

Algunas variables de entorno de PBS son

PBS_O_HOMELa ruta al home de el que se corrió qsub.
PBS_O_WORKDIREl directorio en el que se corrió qsub.
PBS_O_LOGNAMEEl nombre de usuario que corrió qsub.
PBS_O_HOSTEl nombre de la máquina en la que se corrió qsub.
PBS_O_QUEUELa cola a la que el trabajo fue enviado.
PBS_JOBIDEl identificador que asigna PBS al trabajo.
PBS_JOBNAMEEl nombre del trabajo.
PBS_NODEFILEEl archivo que contiene la lista de nodos para tareas en paralelo.

Multiples trabajos

En este ejemplo vamos a ver como podemos acondicionar nuestros programas o nuestro codigo para que trabaje en simultaneo de acuerdo a los argumentos. Creamos una carpeta para hacer el siguente ejercicio.
 
Se crea un archivo integral.cpp

include<stdio.h>
include<stdlib.h>
include<math.h>

double integral(double (*fun)(double),double min,double max, double delta=0.1)
{
double sum=0;
double i;
for(i=min;i<max;i+=delta) sum+=fun(i)*delta;
return sum;
}

int main(int argc,char *argv[])
{
        if(argc!=3)
        {
                printf("Error: requiere 2 argumentos, 1=total procesos 2=proceso actual.\n");
                return -1;
        }
int  total_procs=atoi(argv1);
int  actual_proc=atoi(argv2);

double min=0;
double max=2*M_PI;

double parte=(max-min)/total_procs;

double pmin=min+(actual_proc)*parte;
double pmax=pmin+parte;
printf("int(sin,No value assignedlf)=%lf\n",pmin,pmax,integral(sin,pmin,pmax));
return 0;

}


Se compila con:

g++ -o integral integral.cc


Se crea el archivo job.sh que contiene las indicaciones para qsub

 #!/bin/bash
 #
 #
 #PBS -N JODID
 #PBS -M omazapa en gfif.udea.edu.co
 #PBS -t 0-4
 #echo jobid=$PBS_ARRAYID
 $PBS_O_WORKDIR/integral 5 $PBS_ARRAYID 


Corremos el script, el status E(Exit) indica que finaliza inmediatamente.

[omazapa] [gfif] [~/pbs/jobid]$ qsub job.sh
1189.gfif.udea.edu.co
[omazapa] [gfif] [~/pbs/jobid]$ qstat
Job id                    Name             User            Time Use S Queue

1189-0.cluster               JODID-0          omazapa         00:00:00 E batch
1189-1.cluster               JODID-1          omazapa         00:00:00 E batch
1189-2.cluster               JODID-2          omazapa         00:00:00 E batch
1189-3.cluster               JODID-3          omazapa         00:00:00 E batch
1189-4.cluster               JODID-4          omazapa         00:00:00 E batch


El resultado de nuestro problema esta en los archivos que genera y tenemos que obtenerlo.

[omazapa] [gfif] [~/pbs/jobid]$ cat JODID.o1189-*
int(sin,0.000000,1.256637)=0.683713
int(sin,1.256637,2.513274)=1.161746
int(sin,2.513274,3.769911)=0.034286
int(sin,3.769911,5.026548)=-1.140556
int(sin,5.026548,6.283185)=-0.739188


Para obtenerlo corremos el siguiente comando:

cat JODID.o* | gawk -F"=" '{sum+=$2} END {printf("%f\n" ,sum)}'

[omazapa] [gfif] [~/pbs/jobid]$ cat JODID.o* | gawk -F"=" '{sum+=$2} END {printf("%f\n" ,sum)}'
0.000001

Message Passing Interface (MPI)


En esta parte vamos a ver como correr programar paralelizados con mpi, para nuetro caso compilaremos con openmpi.

 #include <stdio.h>
 #include <mpi.h>
 int main (int argc, char *argv[]){
  int rank, size;
  char hostname256;
  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */
  gethostname(hostname,255);
  printf( "Hello world from %s process %d of %d\n", hostname,rank, size );
  MPI_Finalize();
  return 0;
}


El codigo se va a compilar con:

CC=mpicc make hello


El script para el job se va a nombrar como mpi.sh

 #!/bin/sh
 ### Job name
 #PBS -N hellompi
 ### Output files
 #PBS -e hellompi.err
 #PBS -o hellompi.log
 ### Mail to user
 #PBS -M omazapa en gfif.udea.edu.co
 ### Queue name (small, medium, long, verylong) batch is default queue
 #PBS -q batch
 ### Number of nodes and ppn (proc per node)
 #PBS -l nodes=2:ppn=5
 #This job's working directory

mpirun -machinefile $PBS_NODEFILE -np 10 $PBS_O_WORKDIR/hello

Mpi python

Para python tenemos lo siguiente hello.py

from mpi4py import MPI
import sys

size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

sys.stdout.write("Helloworld! I am process %d of %d on %s.\n" % (rank, size, name))


Por lo tanto el scrib para el job seria el siguiente:

 #!/bin/sh
 ### Job name
 #PBS -N hellompi
 ### Output files
 #PBS -e hellompi.err
 #PBS -o hellompi.log
 ### Mail to user
 #PBS -M omazapa en clusteri.itm.edu.co
 ### Queue name (small, medium, long, verylong) batch is default queue
 #PBS -q batch
 ### Number of nodes and ppn (proc per node)
 #PBS -l nodes=2:ppn=5
 # This job's working directory
 mpirun -machinefile $PBS_NODEFILE -np 10 python $PBS_O_WORKDIR/hello.py

Ejercicios

En el archivo busqueda.tgz hay 2 programas(uno en C y otro en python) y 3 archivos con números del 0 al 9. La idea detrás de cada programa es contar las ocurrencias de alguno de estos números en los 3 archivos. Se debe realizar en primera instancia el script de PBS que envie este solo proceso donde hayan recursos disponibles.

busqueda.tar.gz

Luego se debe modificar el programa y el script de tal manera que haga la búsqueda en 3 procesos diferentes.

Referencias

torque jobs