Cargando...
 

TorquePBS TUTOTIAL

TORQUE Resource manager is a software that allows to «schedule» computational taks,i.e.
«batch tasks». It provides control over these taks and the computational resources on distributed systems. It has the following components:
Server: In this case we calle it pbs_server. It allows basic operations such as create, modify, delete and execute a job or task.
Executor: It is a daemon called in this case pbs_mom. It places the command in execution when it receives a copy of the job from the server.
Scheduler: Another deamon that contains the policies to decide which , when an where a task is executed. We use the scheduler MAUI which can communicate with various MOMs to communicate to the server the status of the computational resources available and to ask the server for the tasks to be executed.

Hello Torque


You can ask TORQUE for the state of a node with the command pbsnodes or from all nodes with pbsnodes -a, with which you will have an output for anode on the distributed system like this:

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» menas that the node is availabe to run tasks, «np» is the number of cores of that node.

Send a job

To send a job to the TORQUE system we need to create a shell script (could be bash, sh, ksh, etc) with special instructions in a systax similar to a commentary:

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

date
hostname
sleep 20
date


This file we calle ittest.sh and we run it with

$ qsub test.sh


What is the output expected from this job?
if the job is running in several nodes, where do you expect to find the stdout?

Monitor the job

The command qstat -a shows the state of the jobs running in all the queues. Executing it we obtain the following output

Job ID               Username Queue    Jobname          SessID NDS   TSK Memory Time  S Time
-------------------- -------- -------- ---------------- ------ ----- --- ------ ----- - -----
1171.cluster     omar  batch    prueba            21476     2   2    --  00:01 R   --


Other PBS commands to monitor and control are:

qstat -a Verifies the state of the jobs, queues and the server.
qstat -f Obtains all the information od the executed job such as: asked resources, queue, source, destiny, owner, etc.
qdel job.ID deletes a job.
qhold job.ID Puts a job in a hold state if it is queued.
qrls job.ID takes a job out of the hold state..


Some maui commands

showq Shows a detailed list of executed jobs.
showbf Shows the available resources.
checkjob job.ID Shows a detailed description of the job.
showstart job.ID Shows the estimated time of start from the specified job.



PBS Script

Algunas opciones de PBS para el script son

OpciónDescripción
#PBS -N myJob Asigna el nombre a un trabajo
#PBS -l nodes=4:ppn=2 El número de nodos y procesos por nodo
#PBS -q queuename Asigna la cola en al que su trabajo va a estar.
#PBS -l walltime=01:00:00 El tiempo de reloj «de pared» durante el cual su trabajo puede correr.
#PBS -o mypath/my.out La dirección y el nombre del archivo para guardar el stdout.
#PBS -e mypath/my.err La dirección y el nombre del archivo para guardar el stderr.
#PBS -j oe Une el stdout con el stderr.
#PBS -M user@mail email del usuario al cual enviar reportes.
#PBS -m b Envia un email cuando el trabajo comienza.
#PBS -m e Envia un email cuando el trabajo termina.
#PBS -m a Envia un email cuando el trabajo aborta por un error.
#PBS -V Exporta todas las variables de entorno al trabajo.

Algunas variables de entorno de PBS son

PBS_O_HOME La ruta al home de el que se corrió qsub.
PBS_O_WORKDIR El directorio en el que se corrió qsub.
PBS_O_LOGNAME El nombre de usuario que corrió qsub.
PBS_O_HOST El nombre de la máquina en la que se corrió qsub.
PBS_O_QUEUE La cola a la que el trabajo fue enviado.
PBS_JOBID El identificador que asigna PBS al trabajo.
PBS_JOBNAME El nombre del trabajo.
PBS_NODEFILE El archivo que contiene la lista de nodos para tareas en paralelo.

El proceso de los procesos.

Esquema Procesos Pbs

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.
creemos una carpeta para hacer el siguente ejercicio.

Creemos un arhcivos 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(argv[1]);
int  actual_proc=atoi(argv[2]);

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,%lf,%lf)=%lf\n",pmin,pmax,integral(sin,pmin,pmax));
return 0;
}

Compilar con:
g++ -o integral integral.cc


creamos el archivo job.sh que contiene las indicaciones para qsub

#!/bin/bash
#
#
#PBS -N JODID
#PBS -M omazapa@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 acrhivos 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 hostname[256];
  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;
}

Bueno el código lo compilamos con

CC=mpicc make hello


el script para el job llamemolo 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@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))


y el script para el job seria

#!/bin/sh
### Job name
#PBS -N hellompi
### Output files
#PBS -e hellompi.err
#PBS -o hellompi.log
### Mail to user
#PBS -M omazapa@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


busqueda.tar.gz

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.

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

Referencias


torque jobs

Ejemplos

Random output

[+]

Traducir actualizaciones

Up-to-date-ness: 100%
 
 100.00