it-swarm.com.de

Mehrere R-Skripte gleichzeitig ausführen

In meiner Doktorarbeit muss ich viele Simulationsstudien durchführen, was alles eine ganze Weile dauert. Mein Computer hat 4 Kerne, also habe ich mich gefragt, ob es möglich ist, beispielsweise zwei R-Skripte gleichzeitig in Rstudio auszuführen, indem sie zwei verschiedene Kerne verwenden lassen. Wenn dies möglich wäre, könnte ich viel Zeit sparen, wenn ich den Computer einfach über Nacht laufen lasse und all diese Skripts laufen lasse.

13
Acarbalacar

Unter der Annahme, dass die Ergebnisse nicht in derselben Umgebung enden müssen, können Sie dies mit RStudio-Projekten erreichen: https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects

Erstellen Sie zuerst zwei separate Projekte. Sie können beide gleichzeitig öffnen, was zu zwei Sitzungen führt. Sie können dann jedes Skript in jedem Projekt öffnen und einzeln ausführen. Es ist dann auf Ihrem Betriebssystem, die Kernzuordnung zu verwalten.

15
Chris

In RStudio

Wenn Sie mit der rechten Maustaste auf RStudio klicken, sollten Sie mehrere separate "Sitzungen" von RStudio öffnen können (unabhängig davon, ob Sie Projekte verwenden oder nicht). Standardmäßig wird für diese ein Kern verwendet. 

Update (Juli 2018): RStudio v1.2.830-1, das als Preview-Release verfügbar ist unterstützt einen Bereich "Jobs". Dies ist für die Ausführung von R-Skripts unabhängig von der interaktiven R-Sitzung im Hintergrund vorgesehen:

  • Führen Sie ein beliebiges R-Skript als Hintergrundjob in einer sauberen R-Sitzung aus

  • Überwachen Sie den Fortschritt und sehen Sie die Skriptausgabe in Echtzeit

  • Geben Sie den Jobs optional Ihre globale Umgebung an, und exportieren Sie die Werte zurück, wenn Sie fertig sind

Dies wird in RStudio Version 1.2 verfügbar sein.

Skripts im Terminal ausführen

Wenn Sie mehrere Skripts haben, von denen Sie wissen, dass sie fehlerfrei laufen, würde ich empfehlen, diese über die Befehlszeile mit anderen Parametern auszuführen:

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

Im Hintergrund laufen:

Nohup Rscript script.R &

Hier führt "&" das Skript im Hintergrund aus (es kann mit fg abgerufen, mit htop überwacht und mit kill <pid> oder pkill rsession beendet werden) und Nohup speichert die Ausgabe in einer Datei und läuft weiter, wenn das Terminal geschlossen wird.

Argumente an ein Skript übergeben:

Rscript script.R 1 2 3

Dadurch wird c(1, 2, 3) an R als Ausgabe von commandArgs() übergeben, sodass eine Schleife in bash mehrere Instanzen von Rscript mit einer bash-Schleife ausführen kann:

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

Paralleler Code innerhalb von R ausgeführt

Sie werden oft feststellen, dass ein bestimmter Schritt in Ihrem R-Skript die Berechnungen verlangsamt. Kann ich vorschlagen, parallelen Code in Ihrem R-Code auszuführen, anstatt sie separat auszuführen? Ich würde das Schneepaket für das parallele Laufen von Schleifen in R empfehlen. Im Allgemeinen anstelle von:

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)

Verwenden Sie dies überall, wo Sie normalerweise eine lapply-Funktion in R verwenden würden, um es parallel auszuführen.

11
Tom Kelly

Sie können Multicore-Parallelität (wie hier erklärt https://cran.r-project.org/web/packages/doMC/vignettes/gettingstartedMC.pdf ) in derselben Sitzung mit dem folgenden Code erreichen

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)

Sie müssen Ihre Ausgabe noch anpassen.

4
Paulo

Wenn Sie eine peinliche Parallele ausführen möchten, können Sie auf der Registerkarte "Terminal" (direkt hinter der Registerkarte "Console") beliebig viele Terminals öffnen und den Code über Rscript yourcode.R ausführen. Jeder Code wird standardmäßig auf einem separaten Kern ausgeführt. Bei Bedarf können Sie auch ein Befehlszeilenargument (wie von @Tom Kelly erwähnt) verwenden.

1
Amir Aghamousa

Alles, was Sie tun müssen (vorausgesetzt, Sie verwenden Unix/Linux), ist, einen R-Stapelbefehl auszuführen und in den Hintergrund zu stellen. Dadurch wird es automatisch einer CPU zugeordnet.

In der Shell:

/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 &

führt die Befehle aus, speichert den Ausdruck in der Datei my_model1.Rout und speichert alle erstellten R-Objekte in der Datei file.RData. Dadurch wird jedes Modell auf einer anderen CPU ausgeführt. Der Lauf der Sitzung und der Ausgabe wird in die Ausgabedateien eingefügt. 

Wenn Sie dies über das Internet über ein Terminal tun, müssen Sie den Befehl Nohup verwenden. Andernfalls werden die Prozesse beim Beenden der Sitzung beendet. 

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

Wenn Sie Prozessen eine niedrige Priorität zuweisen möchten, tun Sie Folgendes: 

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

Am besten fügen Sie am Anfang des Skripts etwas Code zum Laden und Anhängen der entsprechenden Datendatei ein. 

NIEMALS einfach tun

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

Dadurch wird die .RData-Datei (auch dort alle lustigen Objekte) verschlissen und die Reproduzierbarkeit ernsthaft beeinträchtigt. Das heißt, 

--no-restore

oder

--Vanilla

sind deine lieben Freunde. 

Wenn Sie zu viele Modelle haben, empfehle ich die Berechnung auf einem Cloud-Konto, da Sie mehr CPU und RAM haben können. Abhängig von Ihrer Tätigkeit und dem R-Paket können Modelle mit aktueller Hardware Stunden dauern. 

Ich habe es auf die harte Tour gelernt, aber hier gibt es ein schönes Dokument: 

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

HTH. 

0
user1973308