2010-06-29 12 views
8

Estoy ejecutando R en un clúster Linux de varios nodos. Me gustaría ejecutar mi análisis en R usando scripts o modo por lotes sin usar software de cómputo paralelo como MPI o nieve.Programación R: envío de trabajos en un clúster de Linux de varios nodos utilizando PBS

Sé que esto se puede hacer dividiendo los datos de entrada de modo que cada nodo ejecute diferentes partes de los datos.

Mi pregunta es ¿cómo hago esto exactamente? No estoy seguro de cómo debería codificar mis scripts. ¡Un ejemplo sería muy útil!

He estado ejecutando mis scripts hasta ahora usando PBS pero parece que solo se ejecuta en un nodo ya que R es un programa de un solo hilo. Por lo tanto, necesito descubrir cómo ajustar mi código para que distribuya la mano de obra a todos los nodos.

Esto es lo que he estado haciendo hasta ahora:

1) línea de comandos:

> qsub myjobs.pbs 

2) myjobs.pbs:

> #!/bin/sh 
> #PBS -l nodes=6:ppn=2 
> #PBS -l walltime=00:05:00 
> #PBS -l arch=x86_64 
> 
> pbsdsh -v $PBS_O_WORKDIR/myscript.sh 

3) miscript .sh:

#!/bin/sh 
cd $PBS_O_WORKDIR 
R CMD BATCH --no-save my_script.R 

4) my_script.R:

> library(survival) 
> ... 
> write.table(test,"TESTER.csv", 
> sep=",", row.names=F, quote=F) 

Cualquier sugerencia será apreciada! ¡Gracias!

-CC

+0

¿está seguro de que pbs inicia varias instancias? intente agregar 'echo $ (nombre de host)' en el archivo de trabajo por lotes – Anycorn

Respuesta

2

Esto es más bien una pregunta de PBS; Normalmente hago una secuencia de comandos R (con la ruta Rscript después de #!) Y hago que reúna un parámetro (usando la función commandArgs) que controla qué "parte del trabajo" debe realizar esta instancia actual. Debido a que uso multicore mucho, generalmente tengo que usar solo 3-4 nodos, por lo que solo presento algunos trabajos que llaman a este script R con cada uno de los posibles valores de un argumento de control.
Por otro lado, su uso de pbsdsh debe hacer su trabajo ... Entonces el valor de PBS_TASKNUM se puede utilizar como parámetro de control.

+2

Es una sugerencia interesante. ¿Podría compartir amablemente con nosotros su Rscript usando el script "commandArgs" y "PBS"? No es obvio cómo uno lo haría. Gracias – Tony

1

Esta fue una respuesta a una pregunta relacionada, pero es una respuesta al comentario anterior (también).

Para la mayoría de nuestro trabajo, ejecutamos múltiples sesiones R en paralelo usando qsub (en su lugar).

Si se trata de varios archivos que normalmente hago:

while read infile rest 
do 
qsub -v infile=$infile call_r.pbs 
done < list_of_infiles.txt 

call_r.pbs:

... 
R --vanilla -f analyse_file.R $infile 
... 

analyse_file.R:

args <- commandArgs() 
infile=args[5] 
outfile=paste(infile,".out",sep="")... 

Entonces se combinan toda la salida tarde ...

1

Esto problema parece muy adecuado para el uso de GNU paralelo. GNU parallel tiene un excelente tutorial here.No estoy familiarizado con pbsdsh, y soy nuevo en HPC, pero a mí me parece que pbsdsh tiene un propósito similar al de GNU parallel. Tampoco estoy familiarizado con el lanzamiento de R de la línea de comandos con argumentos, pero aquí es mi conjetura en cómo se vería su archivo de PBS:

#!/bin/sh 
#PBS -l nodes=6:ppn=2 
#PBS -l walltime=00:05:00 
#PBS -l arch=x86_64 
... 
parallel -j2 --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \ 
    Rscript myscript.R {} :::: infilelist.txt 

donde infilelist.txt listas de los archivos de datos que desea procesar, por ejemplo:

inputdata01.dat 
inputdata02.dat 
... 
inputdata12.dat 

Su myscript.R accedería al argumento de línea de comando para cargar y procesar el archivo de entrada especificado.

Mi objetivo principal con esta respuesta es señalar la disponibilidad de GNU paralelo, que surgió después de la publicación de la pregunta original. Con suerte, alguien más puede brindar un ejemplo más tangible. Además, todavía estoy tambaleante con mi uso de parallel, por ejemplo, no estoy seguro de la opción -j2. (Consulte mi related question.)

Cuestiones relacionadas