Arbeiten mit HPC-Clustern


11

An meiner Universität haben wir einen HPC-Computercluster. Ich benutze den Cluster, um Klassifikatoren zu trainieren und so weiter. Um einen Job an den Cluster zu senden (z. B. Python-Scikit-Lernskript), muss ich normalerweise ein Bash-Skript schreiben, das (unter anderem) einen Befehl wie enthält qsub script.py.

Ich finde diesen Prozess jedoch sehr, sehr frustrierend. Normalerweise schreibe ich das Python-Skript auf meinen Laptop und melde mich dann beim Server an und aktualisiere das SVN-Repository, sodass ich dort das gleiche Python-Skript erhalte. Dann schreibe ich das Bash-Skript oder bearbeite es, damit ich das Bash-Skript ausführen kann.

Wie Sie sehen, ist dies sehr frustrierend, da ich für jedes kleine Update des Python-Skripts viele Schritte ausführen muss, damit es im Computercluster ausgeführt wird. Natürlich wird die Aufgabe noch komplizierter, wenn ich die Daten auf den Server stellen und den Pfad der Datensätze auf dem Server verwenden muss.

Ich bin sicher, dass viele Leute hier Computercluster für ihre datenwissenschaftlichen Aufgaben verwenden. Ich möchte nur wissen, wie ihr es schafft, die Jobs an die Cluster zu senden.


1
Ah, die Freuden der Bereitstellung ... verstärkt durch die Freuden verteilter Systeme :)
Logc

Antworten:


5

Bitten Sie Ihren Grid-Administrator, Ihren lokalen Computer als "Submit-Host" hinzuzufügen und SGE zu installieren (von dem wir annehmen, dass Sie es verwenden, sagen Sie nicht wirklich), damit Sie es qsubvon Ihrem Computer aus tun können .

ODER....

Verwenden Sie Emacs, dann können Sie auf Ihrem HPC über die "tramp" -Ssh-Verbindungsfunktionen von emacs bearbeiten und eine Shell in einem anderen Emacs-Fenster geöffnet lassen. Sie sagen nicht, welchen Editor / welches Betriebssystem Sie verwenden möchten. Sie können Emacs sogar so konfigurieren, dass eine Datei an zwei Orten gespeichert wird, sodass Sie sie für die Ausführung von Tests auf Ihrem lokalen Computer und für große Aufträge gleichzeitig im HPC-Dateisystem speichern können.


4

Es gibt viele Lösungen, um das Kopieren der Datei von einem lokalen Computer auf die Rechenknoten in den Clustern zu vereinfachen. Ein einfacher Ansatz besteht darin, eine Schnittstelle zu verwenden, die einen Mehrfachzugriff auf die Computer im Cluster ermöglicht, z. B. clusterssh (cssh). Sie können Befehle auf mehreren Computern gleichzeitig über eine Reihe von Terminalbildschirmen eingeben (jeder eine SSH-Verbindung zu einem anderen Computer im Cluster).

Da Ihr Cluster anscheinend qsubeingerichtet wurde, hängt Ihr Problem möglicherweise eher mit der Replikation der Daten auf den Computern zusammen (außer dem einfachen Ausführen eines Befehls in jedem Knoten). Um diesen Punkt anzugehen, können Sie entweder ein scpSkript schreiben , um Dinge zu und von jedem Knoten im Cluster zu kopieren (was mit SVN sicherlich besser angesprochen wird), oder Sie können ein NFS einrichten. Dies würde einen einfachen und transparenten Zugriff auf die Daten ermöglichen und auch die Notwendigkeit verringern, unnötige Daten zu replizieren.

Sie können beispielsweise auf einen Knoten zugreifen, die Daten an einen solchen Ort kopieren und die Daten einfach über die Netzwerkkommunikation remote verwenden. Ich bin nicht mit dem Einrichten eines NFS vertraut, aber Sie haben bereits Zugriff darauf (falls Ihr Home-Ordner auf allen Computern, auf die Sie zugreifen, identisch ist). Dann könnten die Skripte und Daten an einen einzelnen Ort gesendet und später von anderen abgerufen werden. Dies ähnelt dem SVN-Ansatz, ist jedoch transparenter / unkomplizierter.


4

Ihr Ansatz, ein Quellversions-Repository zu verwenden, ist gut und ermöglicht es Ihnen, auch am Cluster zu arbeiten und dann alles zurück zu kopieren.

Wenn Sie kleinere Änderungen an Ihrem Python-Skript auf Ihrem Laptop vornehmen und dann Ihr SVN-Verzeichnis im Cluster aktualisieren, arbeiten Sie direkt am Cluster-Frontend, nehmen Sie alle erforderlichen geringfügigen Änderungen vor und schreiben Sie am Ende des Tages fest alles da und Update auf deinem Laptop?

Alles, was Sie brauchen, ist, sich mit der Umgebung dort vertraut zu machen (Betriebssystem, Editor usw.) oder Ihre eigene Umgebung zu installieren (normalerweise installiere ich in meinem Home-Verzeichnis die neueste Version von Vim , Tmux usw. mit den richtigen Punktedateien, damit ich mich wohl fühle dort zu Hause.)

Sie können auch Ihre Daten und sogar Ihre Zwischenergebnisse versionieren, wenn die Größe dies zulässt. Meine Repositories umfassen häufig Code, Daten (Original- und bereinigte Versionen), Dokumentation und Papierquellen für Veröffentlichungen (Latex).

Schließlich können Sie Ihre Auftragsübermittlung per Skript ausführen, um zu vermeiden, dass Skripte manuell geändert werden. qsubakzeptiert ein Skript von stdin und akzeptiert auch alle #$Kommentare als Befehlszeilenargumente.


3

Aus dem Wortlaut Ihrer Frage gehe ich davon aus, dass Sie einen lokalen Computer und einen Remote-Computer haben, auf denen Sie zwei Dateien aktualisieren - ein Python-Skript und ein Bash-Skript. Beide Dateien unterliegen der SVN-Kontrolle und beide Computer haben Zugriff auf denselben SVN-Server.

Es tut mir leid, dass ich keine spezifischen Ratschläge für Ihr Grid-System habe, aber lassen Sie mich einige allgemeine Punkte auflisten, die ich für eine Bereitstellung als wichtig erachtet habe.

Beschränken Sie Produktionsänderungen auf Konfigurationsänderungen . Sie schreiben, dass Sie "den Pfad der Datensätze auf dem Server verwenden müssen"; Das klingt für mich so, als hätten Sie die Pfade in Ihrem Python-Skript fest codiert. Dies ist keine gute Idee, gerade weil Sie diese Pfade auf jedem anderen Computer ändern müssen, auf den Sie das Skript verschieben. Wenn Sie diese Änderungen wieder an SVN übergeben, haben Sie auf Ihrem lokalen Computer die Remote-Pfade und so weiter und so fort ... (Was ist, wenn nicht nur Pfade, sondern auch Kennwörter vorhanden sind? Sie sollten keine Produktionskennwörter in einem SVN haben Server.)

Behalten Sie also Pfade und andere Setup-Informationen in einer .iniDatei und verwenden Sie ConfigParser , um sie zu lesen, oder verwenden Sie eine .jsonDatei und verwenden Sie das json- Modul. Behalten Sie eine Kopie der Datei lokal und eine remote bei, beide unter demselben Pfad, beide ohne SVN-Kontrolle, und behalten Sie einfach den Pfad zu dieser Konfigurationsdatei im Python-Skript bei (oder rufen Sie ihn über die Befehlszeile ab, wenn Sie nicht beide behalten können Konfigurationen unter demselben Pfad).

Halten Sie die Konfiguration so klein wie möglich . Jede Konfiguration ist ein "beweglicher Teil" Ihrer Anwendung, und jedes System ist umso robuster, je weniger bewegliche Teile vorhanden sind. Ein guter Indikator für etwas, das in die Konfiguration gehört, ist genau, dass Sie es jedes Mal bearbeiten müssen, wenn Sie den Code verschieben. Dinge, die nicht bearbeitet werden mussten, können als Konstanten im Code verbleiben.

Automatisieren Sie Ihre Bereitstellung . Sie können dies über ein Bash-Skript auf Ihrem lokalen Computer tun. beachten Sie, dass Sie einen Befehl auf einem entfernten Rechner laufen durch ssh. Zum Beispiel:

svn export yourprojectpath /tmp/exportedproject
tar czf /tmp/yourproject.tgz /tmp/exportedproject
scp /tmp/myproject.tgz youruser@remotemachine:~/dev

## Remote commands are in the right hand side, between ''
ssh youruser@remotemachine 'tar xzf ~/dev/yourproject.tgz'
ssh youruser@remotemachine 'qsub ~/dev/yourproject/script.py'

Damit dies funktioniert, müssen Sie natürlich eine kennwortlose Anmeldung basierend auf öffentlichen / privaten Schlüsseln zwischen Ihrem lokalen und dem Remote-Computer einrichten.

Wenn Sie mehr als dies benötigen, können Sie an Python's Fabric oder die übergeordnete Küche denken .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.