5

Das folgende (vereinfachte) Skript funktioniert einwandfrei auf dem Master-Knoten eines Unix-Clusters (4 virtuelle Kerne).R foreach: von Einzelmaschine zu Cluster

library(foreach) 
library(doParallel) 

nc = detectCores() 
cl = makeCluster(nc) 
registerDoParallel(cl) 

foreach(i = 1:nrow(data_frame_1), .packages = c("package_1","package_2"), .export = c("variable_1","variable_2")) %dopar% {  

    row_temp = data_frame_1[i,] 
    function(argument_1 = row_temp, argument_2 = variable_1, argument_3 = variable_2) 

} 

stopCluster(cl) 

Ich möchte die Vorteile der 16 Knoten im Cluster nehmen (16 * 4 virtuelle Kerne insgesamt).

Ich denke, alles, was ich tun muß, ist der parallel Backend von makeCluster angegeben ändern. Aber wie soll ich das machen? Die Dokumentation ist nicht sehr klar.

Basierend auf diese ziemlich alt (2013) veröffentlichen http://www.r-bloggers.com/the-wonders-of-foreach/ es scheint, dass ich den Standardtyp verändern soll (sock oder MPI - was würde ein-, dass die Arbeit auf Unix?)

EDIT

Aus diese vignette von den Autoren der foreach:

verwendet standardmäßig doParallel Multi-Core-Funktionalität auf Unix-ähnlichen Systemen und Schnee fu nktionalität unter Windows. Beachten Sie, dass die Multicore-Funktion nur Aufgaben auf einem einzelnen Computer ausführt, nicht auf einem Cluster von Computern. Sie können jedoch die Snow-Funktionalität verwenden, um unter einen Cluster unter Verwendung von Unix-ähnlichen Betriebssystemen, Windows oder sogar einer Kombination auszuführen.

Was bedeutet you can use the snow functionality? Wie soll ich das machen?

+1

Ich verwende keine For-Schleife ... – Antoine

+0

Ich würde empfehlen, Revolution R öffnen, die statistische Bibliotheken und Multi-Core-Unterstützung verbessert hat. [Überprüfen Sie meine Antwort auf diesen Beitrag für weitere Informationen über RRO] (http://stackoverflow.com/questions/31900708/how-can-i-get-r-to-use-more-cpu-usage/33996564#33996564) . Dies hängt nicht direkt mit Ihrer Frage zusammen, aber es beschleunigt alle mathematischen Berechnungen und Pakete, die Multi-Cores verwenden können. – Bas

Antwort

6

Das parallel Paket ist ein Zusammenschluss der multicore und snow Pakete, aber wenn Sie auf mehreren Knoten ausgeführt werden soll, müssen Sie die Nutzung der „Schnee-Funktionalität“ in parallel (das heißt, der Teil der parallel machen, dass wurde abgeleitet von snow). Praktisch gesprochen heißt das, dass Sie makeCluster mit dem Argument "type" aufrufen müssen, das auf "PSOCK", "SOCK", "MPI" oder "NWS" eingestellt ist, da dies die einzigen Clustertypen sind, die von der aktuellen Version parallel unterstützt werden Ausführung auf mehreren Knoten. Wenn Sie einen Cluster verwenden, der von sachkundigen HPC-Systemadministratoren verwaltet wird, sollten Sie "MPI" verwenden, andernfalls könnte es einfacher sein, "PSOCK" (oder "SOCK" zu verwenden, wenn Sie einen besonderen Grund haben, das "Schnee" -Paket zu verwenden)).

Wenn Sie eine „MPI“ Cluster zu erstellen, sollten Sie das Skript über R mit dem mpirun Befehl mit der „-n 1“ Option, und das erste Argument makeCluster Satz auf die Anzahl der Arbeiter auszuführen, sollte hervorgebracht. (Wenn Sie nicht wissen, was das bedeutet, können Sie diesen Ansatz nicht verwenden.)

Wenn Sie einen "PSOCK" - oder "SOCK" -Cluster erstellen, muss das erste Argument für makeCluster ein Vektor sein Hostnamen, und makeCluster startet Arbeiter auf diesen Knoten über den Befehl "ssh", wenn makeCluster ausgeführt wird. Das bedeutet, dass auf allen angegebenen Hosts ssh-Daemons ausgeführt werden müssen.

Ich habe viel mehr zu diesem Thema an anderer Stelle geschrieben, aber hoffentlich wird dies Ihnen helfen, anzufangen.

+0

es war ein Schmerz, das 'Rmpi'-Paket zu installieren, aber es ist mir endlich gelungen. Wenn ich die Empfehlung aus der Antwort unten befolge und das parallele Backend mit 'makeCluster (16, type =" MPI ") erstelle, wird die R-Session beendet und ich bekomme einen seg Fehler Fehler (auf der Linux Shell). So scheint es, dass der einzige Weg, es zum Laufen zu bringen, 'mpirun' ist, wie Sie sagten, aber das scheint kompliziert – Antoine

+0

@Antoine Wenn R seg Fehler, würde ich vermuten, dass Rmpi ​​nicht richtig installiert ist. Haben Sie versucht, einen PSOCK-Cluster mit einem Vektor von Hostnamen zu verwenden, oder sind Sie auf ssh-Probleme gestoßen? –

+1

@Antoine Sie * müssen * Ihr R-Skript über mpirun ausführen, wenn Sie mehrere Knoten mit Rmpi ​​verwenden möchten. Wenn Sie 'makeCluster (16, type =" MPI ")' aus Ihrem R-Skript ausführen, ohne mpirun zu verwenden, werden alle 16 Worker auf dem lokalen Rechner gestartet. Ich nehme an, dass das sogar die Ursache für den seg-Fehler sein könnte. –

2

Hier ist eine teilweise Antwort, die Sie in der richtigen Richtung auf diese ziemlich alt

Basierend senden kann (2013) veröffentlichen http://www.r-bloggers.com/the-wonders-of-foreach/ es scheint, dass ich soll den Standardtyp (Gabel MPI ändern, aber warum? würde das funktionieren auf Unix?)

fork ist eine Möglichkeit, Prozesse Hintergrund Laich auf POSIX-System. Auf einem einzigen Knoten mit n Kernen können Sie n Prozesse parallel erzeugen und funktionieren. Dies funktioniert nicht auf mehreren Computern, da sie keinen gemeinsamen Speicher haben. Sie benötigen eine Möglichkeit, Daten zwischen ihnen zu erhalten.

MPI ist eine tragbare Möglichkeit zur Kommunikation zwischen Cluster von Knoten. Ein MPI-Cluster kann über Knoten hinweg arbeiten.

Was können Sie die Schnee Funktionalität bedeuten? Wie soll ich das machen?

snow ist ein separates Paket. Um einen 16-Knoten MPI Cluster mit Schnee zu machen, tun Sie cl <- makeCluster(16, type = "MPI"), aber Sie müssen R in der richtigen Umgebung ausgeführt werden, wie beschrieben Steve Weston die Antwort und in his answer to a similar question here. (Sobald Sie es in Betrieb genommen haben, müssen Sie möglicherweise Ihre Schleife ändern, um 4 Kerne auf jedem Knoten zu verwenden.)

+0

Wenn ich den Befehl 'makeCluster (16, type =" MPI ") ausfühle, wird die R Sitzung beendet und ich bekomme einen seg Fehler Fehler (auf der Linux Shell). Weißt du, wie das zu beheben ist? – Antoine