2010-06-29 8 views
8

Je cours R sur un cluster Linux à nœuds multiples. Je voudrais exécuter mon analyse sur R en utilisant des scripts ou en mode batch sans utiliser de logiciel de calcul parallèle tel que MPI ou snow. Je sais que cela peut être fait en divisant les données d'entrée de telle sorte que chaque nœud exécute différentes parties des données.Programmation R - soumission de travaux sur un cluster Linux à nœuds multiples à l'aide de PBS

Ma question est comment puis-je faire exactement cela? Je ne suis pas sûr de savoir comment je devrais coder mes scripts. Un exemple serait très utile!

J'ai exécuté mes scripts jusqu'à présent en utilisant PBS, mais il ne semble fonctionner que sur un nœud car R est un programme à un seul thread. Par conséquent, j'ai besoin de comprendre comment ajuster mon code afin qu'il distribue du travail à tous les nœuds.

Voici ce que je fais jusqu'à présent:

1) ligne de commande:

> 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) myscript .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) 

Toute suggestion sera appréciée! Je vous remercie!

-CC

+0

Êtes-vous sûr que pbs lance plusieurs instances? essayez d'ajouter 'echo $ (hostname)' dans le fichier batch du travail – Anycorn

Répondre

2

Ceci est plutôt une question de PBS; Je fais généralement un script R (avec le chemin Rscript après #!) Et le fais rassembler un paramètre (en utilisant la fonction commandArgs) qui contrôle quelle "partie du travail" cette instance courante devrait faire. Comme j'utilise beaucoup multicore, je n'ai généralement besoin que de 3-4 nœuds, donc je soumets juste quelques tâches appelant ce script R avec chacune des valeurs possibles d'un argument de contrôle.
D'autre part, votre utilisation de pbsdsh devrait faire son travail ... Ensuite, la valeur de PBS_TASKNUM peut être utilisée comme paramètre de contrôle.

+2

C'est une suggestion intéressante. Pourriez-vous s'il vous plaît partager avec nous votre script en utilisant "commandArgs" et "PBS" script? Ce n'est pas évident sur la façon dont on s'y prendrait. Merci – Tony

1

Ceci était une réponse à une question connexe - mais c'est une réponse au commentaire ci-dessus (ainsi).

Pour la plupart de notre travail, nous exécutons plusieurs sessions R en parallèle en utilisant qsub (à la place).

S'il est plusieurs fichiers que je fais normalement:

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="")... 

Puis-je combiner toutes les sorties après ...

1

Ceci problème semble très bien adapté à l'utilisation de GNU parallèle. GNU parallèle a un excellent tutoriel here.Je ne suis pas familier avec pbsdsh, et je suis nouveau à HPC, mais pour moi, il semble que pbsdsh sert un but similaire à GNU parallel. Je suis aussi pas familier avec le lancement de R à partir de la ligne de commande avec des arguments, mais voici ma conjecture comment votre fichier PBS regarderait:

#!/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 

infilelist.txt répertorie les fichiers de données que vous souhaitez traiter, par exemple:

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

Votre myscript.R accède à l'argument de ligne de commande pour charger et traiter le fichier d'entrée spécifié.

Mon objectif principal avec cette réponse est de souligner la disponibilité du parallèle GNU, qui est apparu après la publication de la question originale. J'espère que quelqu'un d'autre peut donner un exemple plus tangible. En outre, je suis toujours bancale avec mon utilisation de parallel, par exemple, je ne suis pas sûr de l'option -j2. (Voir mon related question.)

Questions connexes