web-dev-qa-db-fra.com

Exécuter plusieurs scripts R simultanément

Dans ma thèse, je dois effectuer de nombreuses études de simulation, ce qui prend un certain temps. Mon ordinateur a 4 cœurs, je me suis donc demandé s'il était possible d'exécuter simultanément deux scripts R dans Rstudio, en les laissant utiliser deux cœurs différents. Si cela pouvait être fait, je pourrais gagner beaucoup de temps en laissant simplement l'ordinateur toute la nuit exécuter tous ces scripts.

13
Acarbalacar

En supposant que les résultats ne doivent pas nécessairement se retrouver dans le même environnement, vous pouvez y parvenir à l'aide de projets RStudio: https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects

Commencez par créer deux projets distincts. Vous pouvez ouvrir les deux simultanément, ce qui donnera deux sessions. Vous pouvez ensuite ouvrir chaque script de chaque projet et les exécuter séparément. C'est ensuite à votre système d'exploitation de gérer l'allocation principale.

15
Chris

En RStudio

Si vous faites un clic droit sur RStudio, vous devriez pouvoir ouvrir plusieurs "sessions" distinctes de RStudio (que vous utilisiez ou non des projets). Par défaut, ils utiliseront 1 noyau chacun. 

Mise à jour (juillet 2018): RStudio v1.2.830-1, disponible sous la forme d'une version Preview Release prend en charge un volet "travaux". Ceci est dédié à l'exécution de scripts R en arrière-plan, indépendamment de la session R interactive:

  • Exécuter n'importe quel script R en tant que tâche en arrière-plan dans une session R vierge

  • Surveiller les progrès et voir la sortie du script en temps réel

  • Donnez éventuellement des emplois à votre environnement global au démarrage et exportez les valeurs à la fin

Ce sera disponible dans RStudio version 1.2.

Exécution de scripts dans le terminal

Si vous avez plusieurs scripts que vous savez exécuter sans erreurs, je vous recommande de les exécuter sur différents paramètres via la ligne de commande:

RCMD script.R
RScript script.R
R --Vanilla < script.R

Courir en arrière-plan:

Nohup Rscript script.R &

Ici "&" exécute le script en arrière-plan (il peut être récupéré avec fg, surveillé avec htop et tué avec kill <pid> ou pkill rsession) et Nohup enregistre la sortie dans un fichier et continue à s'exécuter si le terminal est fermé.

Passer des arguments à un script:

Rscript script.R 1 2 3

Ceci transmettra c(1, 2, 3) à R comme sortie de commandArgs() afin qu'une boucle dans bash puisse exécuter plusieurs instances de Rscript avec une boucle bash:

for ii in 1 2 3
  do
  Nohup Rscript script.R $ii &
  done

Exécuter du code parallèle dans R

Vous constaterez souvent qu'une étape particulière de votre script R ralentit les calculs. Puis-je suggérer d'exécuter du code parallèle dans votre code R plutôt que de les exécuter séparément? Je recommanderais le paquet snow pour l'exécution de boucles en parallèle dans R. Généralement, au lieu d'utiliser:

cl <- makeCluster(n)
# n = number of cores (I'd recommend one less than machine capacity)
clusterExport(list=ls()) #export input data to all cores
output_list <- parLapply(cl, input_list, function(x) ... )
stopCluster() # close cluster when complete (particularly on shared machines)

Utilisez ceci partout où vous utiliseriez normalement une fonction lapply dans R pour l'exécuter en parallèle.

11
Tom Kelly

Vous pouvez réaliser un parallélisme multicœur (comme expliqué ici https://cran.r-project.org/web/packages/doMC/vignettes/gettingstartedMC.pdf ) dans la même session avec le code suivant

if(Sys.info()["sysname"]=="Windows"){
  library(doParallel)
  cl<-makeCluster(numberOfCores)
  registerDoParallel(cl)
}else{
  library(doMC)
  registerDoMC(numberOfCores)
}
library(foreach)

someList<-list("file1","file2")
returnComputation <-
  foreach(x=someList) %dopar%{
    source(x)
  }


if(Sys.info()["sysname"]=="Windows") stopCluster(cl)

Vous devrez encore adapter votre sortie.

4
Paulo

Si vous voulez faire un parallèle embarrassant, vous pouvez ouvrir autant de terminaux que vous le souhaitez dans l'onglet Terminal (situé juste après l'onglet Console) et exécuter votre code à l'aide de Rscript yourcode.R. Chaque code sera exécuté sur un noyau séparé par défaut. Vous pouvez également utiliser un argument de ligne de commande (comme mentionné par @Tom Kelly) si nécessaire.

1
Amir Aghamousa

Tout ce que vous devez faire (si vous utilisez Unix/Linux) est d’exécuter une commande R batch et de la placer en arrière-plan. Cela l’allouera automatiquement à une CPU.

À la coquille, faites:

/your/path/$ Nohup R CMD BATCH --no-restore my_model1.R &
/your/path/$ Nohup R CMD BATCH --no-restore my_model2.R &
/your/path/$ Nohup R CMD BATCH --no-restore my_model3.R &
/your/path/$ Nohup R CMD BATCH --no-restore my_model4.R &

exécute les commandes, enregistre l'impression dans le fichier my_model1.Rout et enregistre tous les objets R créés dans le fichier.RData. Cela exécutera chaque modèle sur un processeur différent. L'exécution de la session et la sortie seront placées dans les fichiers de sortie. 

Si vous le faites sur Internet, via un terminal, vous devrez utiliser la commande Nohup. Sinon, à la sortie de la session, les processus se termineront. 

/your/path/$ Nohup R CMD BATCH --no-restore my_model1.R &

Si vous souhaitez attribuer une priorité faible aux processus, procédez comme suit: 

/your/path/$ Nohup Nice -n 19 R CMD BATCH --no-restore my_model.R &

Vous feriez mieux d'inclure du code au début du script pour charger et attacher le fichier de données approprié. 

Ne fais jamais simplement

/your/path/$ Nohup R CMD BATCH my_model1.R &

Cela masquera le fichier .RData (tous les objets amusants là aussi) et compromettra sérieusement la reproductibilité. C'est-à-dire, 

--no-restore

ou

--Vanilla

sont vos chers amis. 

Si vous avez trop de modèles, je suggère de faire le calcul sur un compte cloud, car vous pouvez avoir plus de CPU et de RAM. Selon ce que vous faites et le package R, les modèles peuvent prendre des heures avec le matériel actuel. 

J'ai appris cela à la dure, mais il y a un beau document ici: 

http://users.stat.umn.edu/~geyer/parallel/parallel.pdf

HTH. 

0
user1973308