Ich hatte auch einige Probleme mit der parallelen EC2-Konfiguration, wenn ich versuche, den Master-Knoten lokal zu halten. Die Verwendung von StarCluster zur Einrichtung des Pools half sehr, aber die wirkliche Verbesserung kam mit der Verwendung von StarCluster und mit dem Master-Knoten innerhalb des privaten IP-Pools von EC2.
StarCluster richtet die gesamte Schlüsselhandhabung für alle Knoten sowie alle verwendeten Mounts ein. Die dynamische Knotenzuordnung war nicht möglich. Wenn Spot-Instanzen jedoch nicht langfristig verwendet werden und Ihre Gebotsstrategie Ihre Instanzen nicht "behält", sollte die dynamische Zuordnung ein Problem darstellen.
Einige andere Lektionen gelernt:
- Erstellen Sie eine Variable, die privaten IP-Adressen enthält, zu createCluster passieren und exportieren, so dass, wenn Sie brauchen, haben mit den gleichen Knoten neu zu starten, ist es einfacher.
- Lassen Sie den Master-Knoten byobu laufen und richten Sie ihn für die R-Sitzungsprotokollierung ein.
- Das Ausführen von RStudio-Server auf dem Master kann manchmal sehr hilfreich sein, sollte aber ein anderes AMI als die Slave-Knoten sein. :)
- Lassen Sie das Kontrollskript Daten-RDA-Dateien in einen Pfad verschieben, der remote auf neue Dateien überwacht und automatisch heruntergeladen wird.
- Verwenden Sie htop, um die Slaves zu überwachen, damit Sie die Instanzen leicht sehen und Skriptanforderungen (Speicher/CPU/Skalierbarkeit) ermitteln können.
- Verwenden Sie Prozessor-Hyper-Threading aktivieren/deaktivieren Sie Skripts.
Ich hatte ein ziemlich großes Problem mit den Slave-Verbindungen und serialisieren/unserialisieren und festgestellt, dass eines der Dinge war die Verbindungsgrenze, und dass die Verbindungsgrenze um die Anzahl der Knoten reduziert werden musste; und wenn das Kontrollskript gestoppt wurde, war die einfachste Reinigungsmethode das Neustarten der Master-R-Sitzung und das Verwenden eines Skripts, um die Slave-Prozesse zu beenden, anstatt auf Timeout zu warten.
Es hat ein bisschen Arbeit zu Setup nehmen, aber hoffentlich diese Gedanken Hilfe ...
Obwohl es vor 8 Monaten und beide Starcluster und R haben Setup einige davon, wie es war hier geändert. .. Sie finden 90% davon in den StarCluster-Dokumenten.
- Einrichtung .starcluster/config AWS und Schlüsselpaar-Abschnitte basierend auf den Sicherheitsinformationen der AWS-Konsole.
- definieren den [smallcluster]
- Schlüsselnamen
- Verfügbarkeits-Zone
- eine Cluster Vorlage definiert verlauf [smallcluster]. Verwenden von AMIs basierend auf dem StarCluster 64bit HVM AMI. Anstatt neue öffentliche AMI-Instanzen zu erstellen, habe ich gerade eine konfigurierte Instanz (mit allen benötigten Tools) gespeichert und diese als AMI verwendet.
Hier ist ein Beispiel für eine ...
[cluster Rnodes2]
EXTENDS=smallcluster
MASTER_INSTANCE_TYPE = cc1.4xlarge
MASTER_IMAGE_ID= ami-7621f91f
NODE_INSTANCE_TYPE = cc2.8xlarge
NODE_IMAGE_ID= ami-7621f91f
CLUSTER_SIZE= 8
VOLUMES= rdata
PLUGINS= pkginstaller
SPOT_BID= 1.00
- -Setup das Volumen geteilt, das ist, wo der Bildschirm/byoubu Protokolle, die Haupt .R Skript Checkpoint Ausgabe, gemeinsame R-Daten, und die Quelle für das Produktionspaket live. Es wurde auf neue Dateien in einem untergeordneten Pfad mit dem Namen export überwacht. Wenn also das Cluster- oder Kontrollskript starb/abbrach, würde eine maximale Anzahl von Datensätzen verloren gehen und neu berechnet werden müssen.
Nach dem gemeinsamen Volumen zu schaffen, war die Definition einfach:
[volume rdata]
VOLUME_ID = vol-1145497c
MOUNT_PATH = /rdata
Die Paket-Installer, die auf allen Knoten die neuesten (und gleich) R-Versionen gewährleistet.
[plugin pkginstaller]
setup_class = starcluster.plugins.pkginstaller.PackageInstaller
packages = r-base, r-base-dev, r-recommended
Schließlich Zugriffsberechtigungen für ssh und RStudio-Server. Https über Proxy wäre sicherer, aber da RStudio wurde nur für das Steuerskript-Setup verwendet ...
[permission ssh]
# protocol can be: tcp, udp, or icmp
protocol = tcp
from_port = 22
to_port = 22
# [permission http]
protocol = tcp
from_port = 8787
to_port = 8787
Dann einen Cluster beim Start der Starcluster-Schnittstelle. Es behandelt alle Zugriffskontrollen, Systemnamen, Aktien, etc ... Sobald der Cluster lief ich eine SSH-Sitzung in jedem von meinem lokalen System lief, und lief ein Skript Hyper-Threading zu stoppen:
#!/bin/sh
# disable hyperthreading
for cpunum in $(
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list |
cut -s -d, -f2- | tr ',' '\n' | sort -un); do
echo 0 > /sys/devices/system/cpu/cpu$cpunum/online
done
startete dann jeweils eine HTOP-Sitzung zur Überwachung der Skalierbarkeit gegenüber den exportierten Prüfpunktprotokollen.
Dann in den Master eingeloggt, startete eine Bildschirmsitzung (ich habe seit byobu bevorzugt) und feuerte R von innerhalb der StarCluster eingehängten Datenträger. Auf diese Weise, wenn der Cluster aus irgendeinem Grund angehalten konnte ich leicht Setup erneut nur durch R. beginnend Einmal in R das erste, was eine workers.list
Variable mit den nodeXXX
Namen zu schaffen war, die einfach etwas entlang der Linien von war:
cluster.nodes <- c("localhost", paste("node00", 1:7, sep=''))
workers.list <- rep(cluster.nodes, 8)
Dann habe ich das Kontrollskript geladen, beendet und den Arbeitsbereich gespeichert. Das Steuerskript hat die gesamte Tabellenausgabe für Export- und Prüfpunkte und parallele Aufrufe an das Produktionspaket verarbeitet. Die Hauptfunktion des Skripts nahm auch ein cpus
Argument, wo die Worker-Liste platziert wurde, die dann als cores
an den Cluster-Initialisierer übergeben wurde.
initialize.cluster <- function(cores)
{
if(exists('cl')) stopCluster(cl)
print("Creating Cluster")
cl <- makePSOCKcluster(cores)
print("Cluster created.")
assign('cl', cl, envir=.GlobalEnv)
print(cl)
# All workers need to have the bounds generator functions...
clusterEvalQ(cl, require('scoreTarget'))
# All workers need to have the production script and package.
clusterExport(cl, varlist=list('RScoreTarget', 'scoreTarget'))
return (cl)
}
Sobald die R-Sitzung (nach zunächst die Erstellung der worker.list) das Steuerskript wurde neu gestartet wurde bezogen, und die Haupt func aufgerufen. Das war's. Wenn der Cluster jemals gestoppt wurde, habe ich einfach die Sitzung auf dem Haupthost beendet. Stoppen Sie die Slave-Prozesse über Htop auf jedem der Slaves und starten Sie erneut.
Hier ist ein Beispiel davon in Aktion ::
R
R version 2.15.0 (2012-03-30)
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
[Previously saved workspace restored]
> source('/rdata/buildSatisfactionRangeTable.R')
Loading required package: data.table
data.table 1.7.7 For help type: help("data.table")
Loading required package: parallel
Loading required package: scoreTarget
Loading required package: Rcpp
> ls()
[1] "build.satisfaction.range.table" "initialize.cluster"
[3] "initialize.table" "parallel.choices.threshold"
[5] "rolled.lower" "rolled.upper"
[7] "RScoreTarget" "satisfaction.range.table"
[9] "satisfaction.search.targets" "search.range.bound.offsets"
[11] "search.range.bounds" "search.range.center"
[13] "Search.Satisfaction.Range" "update.bound.offset"
[15] "workers.list"
> workers.list
[1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"
[7] "localhost" "localhost" "node001" "node002" "node003" "node004"
[13] "node005" "node006" "node007" "node001" "node002" "node003"
[19] "node004" "node005" "node006" "node007" "node001" "node002"
[25] "node003" "node004" "node005" "node006" "node007" "node001"
[31] "node002" "node003" "node004" "node005" "node006" "node007"
[37] "node001" "node002" "node003" "node004" "node005" "node006"
[43] "node007" "node001" "node002" "node003" "node004" "node005"
[49] "node006" "node007" "node001" "node002" "node003" "node004"
[55] "node005" "node006" "node007" "node001" "node002" "node003"
[61] "node004" "node005" "node006" "node007" "node001" "node002"
[67] "node003" "node004" "node005" "node006" "node007" "node001"
[73] "node002" "node003" "node004" "node005" "node006" "node007"
[79] "node001" "node002" "node003" "node004" "node005" "node006"
[85] "node007" "node001" "node002" "node003" "node004" "node005"
[91] "node006" "node007" "node001" "node002" "node003" "node004"
[97] "node005" "node006" "node007" "node001" "node002" "node003"
[103] "node004" "node005" "node006" "node007" "node001" "node002"
[109] "node003" "node004" "node005" "node006" "node007" "node001"
[115] "node002" "node003" "node004" "node005" "node006" "node007"
> build.satisfaction.range.table(500000, FALSE, workers.list)
[1] "Creating Cluster"
[1] "Cluster created."
socket cluster with 120 nodes on hosts ‘localhost’, ‘node001’, ‘node002’, ‘node003’, ‘node004’, ‘node005’, ‘node006’, ‘node007’
Parallel threshold set to: 11000
Starting at: 2 running to: 5e+05 :: Sat Apr 14 22:21:05 2012
Wenn Sie hier unten gelesen haben, dann können Sie daran interessiert zu wissen, dass ich jeden Cluster-Setup getestet I (einschließlich openmpi) könnte und festgestellt, dass es keine Geschwindigkeitsdifferenz gab, vielleicht ist das, weil meine Berechnungen wo CPU gebunden sind, vielleicht nicht.
Geben Sie auch nicht auf, obwohl es ein Problem sein kann, mit HPC loszulegen. Es kann sich total lohnen. Ich würde immer noch auf die ersten 100.000 Iterationen der Berechnungen warten, die ich ausgeführt habe, wenn ich mit einer naiven Implementierung in Base-R auf einer Commodity-Workstation stecken geblieben wäre (naja, nicht wirklich, da ich nie bei R: D geblieben wäre). Mit dem Cluster wurden 384.000 Iterationen in weniger als einer Woche abgeschlossen. Die Zeit hat sich total gelohnt (und es hat eine Menge davon gebraucht).
Sound wie Sie nicht geben Sie Ihre Maschinen SSH-Berechtigungen. Sehen Sie sich http://www.youtube.com/watch?v=YfCgK1bmCjw (00:06:43) an. – JohnRos