2017-12-11 1 views
1

Ich möchte CPU-Kerne von mehreren Knoten verwenden, um ein einzelnes R-Skript auszuführen. Jeder Knoten enthält 16 Kerne und wird mir über ein Slurm-Tool zugewiesen.Einzelnes R-Skript auf mehreren Knoten

Bisher sieht mein Code wie folgt aus:

ncores <- 16 

List_1 <- list(...) 
List_2 <- list(...) 

cl <- makeCluster(ncores) 
registerDoParallel(cl) 
getDoParWorkers() 

foreach(L_1=List_1) %:% 
foreach(L_2=List_2) %dopar% { 
... 
} 

stopCluster(cl) 

ich es über den folgenden Befehl in einem UNIX-Shell ausführen:

mpirun -np 1 R --no-save <file_path_R_script.R> another_file_path.Rout 

, die auf einem einzelnen Knoten gut funktioniert. Allerdings habe ich nicht herausgefunden, ob es ausreicht, ncores auf 32 zu erhöhen, sobald ich Zugriff auf einen zweiten Knoten habe. Beinhaltet R automatisch die zusätzlichen 16 Kerne auf dem anderen Knoten? Oder muss ich ein anderes R-Paket nutzen?

+1

Sie können 'mpirun' sagen, andere Hosts zu berücksichtigen. Es ist Teil Ihrer lokalen MPI-Einrichtung. –

Antwort

1

Die Verwendung von mpirun zum Starten eines R-Skripts ist ohne die Verwendung von Rmpi nicht sinnvoll.

Wenn Sie Ihren Code betrachten, möchten Sie vielleicht, dass Sie auf MPI verzichten möchten. Das Rezept wäre wie folgt, um 2x16 Kerne zu verwenden.

für 2 Aufgaben stellen und 16 CPUs pro Aufgabe

#SBATCH --nodes 2 
#SBATCH --ntasks 2 
#SBATCH --cpus-per-task 16 

Ihr Programm mit srun Befehl des Slurm starten

srun R --no-save <file_path_R_script.R> another_file_path.Rout 

Der srun Befehl 2 Instanzen des R-Skript auf zwei verschiedenen Knoten starten und wird eine Umgebungsvariable SLURM_PROCID zu 0 auf einem Knoten und 1 auf dem anderen

einrichten Verwenden Sie den Wert e von SLURM_PROCID in Ihrem Rscript die Arbeit unter den beiden Prozessen von srun

ncores <- 16 

taskID <- as.numeric(Sys.getenv('SLURM_PROCID')) 

List_1 <- list(...) 
List_2 <- list(...) 

cl <- makeCluster(ncores) 
registerDoParallel(cl) 
getDoParWorkers() 

Lits_1 <- split(List_1, 1:2)[[taskID+1]] # Split work based on value of SLURM_PROCID 

foreach(L_1=List_1) %:% 
foreach(L_2=List_2) %dopar% { 
... 
} 

stopCluster(cl) 

Sie müssen das Ergebnis auf der Festplatte speichern und dann verschmelzen die Teilergebnisse zu einem einzigen Voll Ergebnis begannen zu spalten.

+0

Vielen Dank für Ihren Rat. Ich modifizierte die Srun-Zeile ein bisschen, d. H. Zu "srun --nodes = 2 --ntasks = 2 --cpus-per-task = 16 R - nicht speichern another_file_path.Rout". Andernfalls hat das System nur einen einzelnen Knoten angefordert. Wenn ich die Anzahl der Knoten auf 5 erhöhen, muss ich '[[TaskID + 1]]' 'nicht ändern, oder? Ändere einfach '--node = 2' zu' --nodes = 5', 'ntasks = 2' zu' ntasks = 5' und 'split (List_1, 1: 2)' zu 'split (List_1, 1: 5) '? – Christian

+0

Ich habe nicht getestet, aber ja, das ist die Idee. – damienfrancois

Verwandte Themen