Ich habe versucht, den Ipython-Cluster unter AWS auf das Minimum zu starten

Der ipython-Cluster wird lokal gestartet, sobald ipyparallel installiert ist. Dies ist jedoch nicht interessant. Daher habe ich das Verteilungsziel in AWS festgelegt. Memorandum.

Charakter

Schematische Darstellung

ipcluster_image.png

Die hier erklärte Geschichte ist eine solche Komposition. Da jeder Host über SSH verbunden ist, müssen alle Verbindungsinformationen im Voraus eingerichtet werden. Eigentlich wäre es einfacher, wenn Sie die Mühe hätten, ein AMI vorzubereiten, das als Knoten für Engine fungiert, indem Sie es einfach starten.

Erstellen Sie Hosts für Engine und Controller

Erstellen Sie gegebenenfalls eine Instanz unter Amazon Linux.

Hier habe ich "Amazon Linux AMI 2015.09 (HVM)" verwendet und es mit t2.micro in der Region Tokio erstellt.

Nach der Installation installieren Sie "ipython" und "ipyparallel".

sudo yum groupinstall -y 'Development Tools'
sudo pip install ipython ipyparallel

Hier wird die Engine über SSH gestartet. Stellen Sie daher sicher, dass Sie mit ec2-user ohne Kennwort vom Controller zum Engine-Server ssh können.

Erstellen Sie ein neues Ipython-Profil in Controller

ipython profile create --parallel --profile=myprofile

Dadurch wird eine Datei wie die folgende generiert.

tree .ipython/profile_myprofile/

~/.ipython/profile_myprofile/
├── ipcluster_config.py
├── ipcontroller_config.py
├── ipengine_config.py
├── ipython_config.py
├── ipython_kernel_config.py
├── log
├── pid
├── security
└── startup
    └── README

Wir werden Einstellungen für den Clusterbetrieb vornehmen.

ipcluster_config.py

Fügen wir am Anfang den folgenden Code hinzu.

ipcluster_config.py


c = get_config()

c.IPClusterEngines.engine_launcher_class = 'SSHEngineSetLauncher'

c.SSHEngineSetLauncher.engines = {
    '<ENGINE_HOST1>' : 3,
    '<ENGINE_HOST2>' : 3
}

ipcontroller_config.py

Suchen Sie den auskommentierten Teil im Inneren und schreiben Sie den entsprechenden Teil neu.

ipcontroller_config.py



...Unterlassung...

c.IPControllerApp.reuse_files = True

...Unterlassung...

c.RegistrationFactory.ip = u'*'

...

Wenn reuse_files auf True gesetzt ist, werden die Dateien unter .ipython / profile_ <PROFILE_NANE> / security / wiederverwendet. Wenn es wiederverwendet wird, wird der Clusterschlüssel nicht neu generiert, sodass Sie die Konfigurationsdatei nicht jedes Mal aktualisieren müssen, wenn Sie den Controller neu starten.

Starten Sie den Controller

Führen Sie den folgenden Befehl auf dem Server des Controllers aus.

ipcluster start --profile=myprofile

Wenn Sie eine detailliertere Ausgabe wünschen, verwenden Sie die Option "--debug". Außerdem lautet die Protokolldatei ".ipython / profile_myprofile / log /".

Wenn alles gut geht, sehen Sie nach dem Start des Controllers ein Protokoll, das aussieht, als hätten Sie "ipcontroller-client.json" und "ipcontroller-engine.json" auf jeden Knoten übertragen. Wenn der Controller nicht gestartet werden kann, werden die "ipcontroller- *" -bezogenen Dateien nicht generiert. (Wenn der Controller nicht gestartet werden kann, wird eine Meldung ausgegeben, dass der Controller beiläufig gestoppt wurde, und es wird angezeigt, dass ipcontroller-client.json nicht auf jeden Engine-Knoten übertragen werden kann. Dies ist unfreundlich.)

2015-10-04 11:15:21.568 [IPClusterStart] Engines appear to have started successfully

Wenn ein solches Protokoll angezeigt wird, ist der Startvorgang abgeschlossen.

Wenn Sie es zu einem Daemon machen möchten, fügen Sie die Option "--daemonize" hinzu.

Verbindung vom Client herstellen

Von nun an werde ich es von der lokalen Maschine aus tun.

Holen Sie sich ipcontroller-client.json von Controller

Diese Datei wird beim Starten des Controllers erstellt.

Legen Sie diese Datei mit scp oder etwas lokal auf dem Client ab.

scp ec2-user@<CONTROLLER_HOST>:./.ipython/profile_myprofile/security/ipcontroller-client.json ./

Erstellen eines Verbindungsbestätigungsskripts

Hier habe ich das folgende Bestätigungsskript vorbereitet, während ich mich auf verschiedene Dinge bezog.

cluster_check.py


from ipyparallel import Client
rc = Client("ipcontroller-client.json", sshserver="ec2-user@<CONTROLLER_HOST>")
print rc.ids

dview = rc[:]
@dview.remote(block=True)
def gethostname():
    import socket
    return socket.getfqdn()

print gethostname()

Wenn Sie es damit ausführen, sollte es so aussehen.

$ python cluster_check.py

[0, 1, 2, 3, 4, 5]
[<HOSTNAME>, <HOSTNAME>, <HOSTNAME>, <HOSTNAME2>, <HOSTNAME2>, <HOSTNAME2>]

Wenn Sie die obigen Einstellungen befolgen, sollten Sie jeweils 3 Hosts booten.

Jetzt kann ipython cluster die Verarbeitung auf mehrere Knoten verteilen.

Programmierung

Der Import erfolgt in der Funktion

Wie der obige Code für die Operationsprüfung müssen Sie den erforderlichen Import usw. in den Code ausführen, der auf mehreren Knoten ausgeführt wird.

Verwenden Sie die Dekoratoren @ require und @ abhäng, um Code auszuführen, der auf diesem Knoten ordnungsgemäß ausgeführt werden kann. (Bitte beziehen Sie sich auf diesen Bereich)

Kann wie eine Aufgabenwarteschlange verwendet werden

Verwenden Sie LoadBalancedView, wenn Sie Aufgaben nacheinander auf mehreren Knoten verarbeiten möchten.

Holen Sie sich load_balanced_view und wenden Sie asynchrone Map mit map_async an

In [1]: from ipyparallel import Client
In [3]: a = Client("ipcontroller-client.json", sshserver="ec2-user@<CONTROLLER_HOST>")
In [4]: views = a.load_balanced_view()
In [5]: result = views.map_async(lambda x: x*x , (x for x in xrange(10000)))
In [6]: result
Out[6]: <AsyncMapResult: <lambda>>

Dieses Beispiel ist verschwenderisch, da es einen Wert an einen anderen Controller überträgt, den Lambda-Ausdruck überträgt, ihn jeder Engine separat zuordnet, das Ergebnis für alle Listenelemente berechnet und empfängt. Es ist ein guter Ort, aber es ist nur ein Beispiel.

Nach der Ausführung können Sie die Situation mit progress und ready () von AsyncMapResult sehen.

In [8]: result.progress
Out[8]: 8617
In [9]: result.progress
Out[9]: 9557

In [11]: result.progress
Out[11]: 10000

In [12]: result.ready()
Out[12]: True

In [13]: result
Out[13]: <AsyncMapResult: finished>

Das Ergebnis der Zuordnung wird im Ergebnis ".result" gespeichert.

In [14]: len(result.result)
Out[14]: 10000
In [15]: type(result.result)
Out[15]: list

Bitte beachten Sie, dass wenn Sie unachtsam auf ".result" zugreifen, es gesperrt wird, bis die verteilte Verarbeitung abgeschlossen ist.

Zusammenfassung

So ist es jetzt möglich, Cluster zu erstellen und eine verteilte Verarbeitung durchzuführen.

Ich dachte, Ipython sei nur eine "praktische Repl-Umgebung", aber das ist erstaunlich.

Es scheint schwierig zu sein, Knoten dynamisch zu sichern oder die Anzahl der Cluster entsprechend der Last zu erhöhen oder zu verringern, aber vor allem ist es ein Traum, dass der durch die Lokalisierung des Verteilungsziels erstellte Code auf eine groß angelegte Verteilung übertragen werden kann. Macht es im Gegenteil Spaß, Code ausführen zu können, der in einer umfangreichen Distribution wie im lokalen Modus funktioniert? Mit zunehmender Größe wird das Cluster-Management wahrscheinlich eine weitere Herausforderung darstellen.

Referenz

Ich habe es sehr oft als Referenz benutzt.

http://qiita.com/chokkan/items/750cc12fb19314636eb7

Recommended Posts

Ich habe versucht, den Ipython-Cluster unter AWS auf das Minimum zu starten
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, den auf Papier gestempelten Stempel mit OpenCV zu digitalisieren
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
Ich habe versucht, den Befehl umask zusammenzufassen
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Passende Karaoke-Tasten ~ Ich habe versucht, es auf Laravel zu setzen ~ <auf dem Weg>
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
Ich habe Web Scraping versucht, um die Texte zu analysieren.
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Starten und verwenden Sie das IPython-Notebook im Netzwerk
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Qiita Job Ich habe versucht, den Job zu analysieren
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, mit tkinter mit dem Taschenrechner zu spielen
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, Resultoon auf Mac + AVT-C875 zu verwenden, war aber unterwegs frustriert.
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Ich habe versucht, die Kosten zu senken, indem ich EC2 in einer Charge mit AWS Lambda gestartet / gestoppt habe
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Ich habe AWS CDK ausprobiert!
Ich habe versucht, Ipython zu verwenden
Ich habe versucht zu debuggen.
Ich habe AWS Iot ausprobiert
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, die App auf der IoT-Plattform "Rimotte" auszuführen.
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
[Python] Ich habe versucht, die Top 10 der Lidschatten grafisch darzustellen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich möchte Lambda mit Python auf Mac AWS!
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die Methode zur Mittelung der Dollarkosten zu simulieren
Ich habe versucht, die nicht negative Matrixfaktorisierung (NMF) zu wiederholen.
Ich habe versucht, den Linux-Kernel auf virtualbox + vagrant zu installieren
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren