Vorschlag zur Verwaltung von Simulationsläufen?

9

Diese Fragen sind in comp-sci möglicherweise etwas unangebracht. Wenn es benötigt wird, schlagen Sie bitte vor, wo es passt.

Die Frage ist, wie alle Simulationsläufe effizient verwaltet werden können.

Nehmen wir zum Beispiel an, eine Simulation erfordert die Festlegung von 2 Parametern, die in einem bestimmten vorgeschlagenen Wertebereich definiert werden müssen.

Um ein besseres Ergebnis zu finden, das durch ein Paar der beiden Parameter erzielt wird (z. B. durch Vergleichen des Simulationsergebnisses mit experimentellen Daten), kann eine Sensitivitätsanalyse durchgeführt werden, indem drei Werte für jeden Parameter definiert und dann 9 Läufe formuliert werden.

Zuvor habe ich sed verwendet , um Eingaben für jeden Lauf zu ändern und jeden Lauf zu markieren, indem ich den Wert und den Parameternamen in den Ordner schreibe, in dem die Eingaben und Ergebnisse dieses Laufs gespeichert sind. Ich fand dies jedoch sehr ineffizient, sobald die Anzahl der Parameter zunimmt (z. B. Zugriff auf den Namen der Ordner in den Skripten zum Plotten).

Dann entschied ich mich, einfache Zahlen als Ordnernamen zu verwenden und die Details in einigen anderen Tabellen zu speichern. Dieser Weg ist bisher in Ordnung, erfordert jedoch einige mühsame Arbeit. Auch mit dem Wachstum der Läufe kommt es häufig vor, dass Fehler gemacht werden, z. B. ein weiterer Lauf, der bereits vor einigen Tagen durchgeführt wurde.

Haben Sie eine gute Idee zur Verwaltung dieser Läufe? Ich denke, es wäre äußerst wichtig für jemanden, der eine Monte-Carlo-Analyse durchführt.

Danke im Voraus!

Chenming Zhang
quelle
2
Ich benutze normalerweise einfache Python-Skripte für solche Aufgaben. Sie generieren die Daten, führen die Simulationen aus und verwalten die resultierenden Ausgaben. Mit Tools wie numpy / scipy / matplotlib können Sie in gewissem Umfang auch direkt analysieren und zeichnen. Manchmal gehe ich sogar noch weiter und generiere automatisch die Eingabe, die zum Testen mit hergestellten Lösungen erforderlich ist, direkt mit Sympy und verwende die Ergebnisse als Eingabe in meinem Simulationscode. Ich kann Langtangens Buch "Python Scripting for Computational Science" als Ausgangspunkt empfehlen. Hier einige typische Aufgaben in comp. Wissenschaft wird mit Python demonstriert.
Christian Waluga
Diese Frage scheint extrem thematisch zu sein. Dies ist ein reines rechnerwissenschaftliches Zeug. Ich denke, dass jeder beginnende Computerwissenschaftler das durchgemacht hat, was Chenming irgendwann durchmacht. Ich jedenfalls bin sehr interessiert zu sehen, wie andere Menschen diesen allgegenwärtigen Schmerz im Arsch angegangen sind.
Tel.

Antworten:

5

TLDR
Verwenden Sie Python, um Ihre Eingabe zu verwalten / zu ändern und Ihre Ausgabe zu korrigieren , und verwenden Sie HDF5, um Ihre Daten zu organisieren / zu speichern. So komplex es auf den ersten Blick erscheinen mag, es wird immer noch einfacher sein als SQL - alles.

Längere Antwort + Beispiel
Ich persönlich verwende eine Kombination aus Python-Skripten und dem HDF5-Dateiformat, um mit solchen Situationen umzugehen. Python-Skripte können die Textersetzungen verarbeiten, die zum Ändern Ihrer Runfiles erforderlich sind (und nach doppelten Läufen suchen). Mit einigen weiteren Skripten können Sie die Ausgabedaten aus Ihrem Programm in eine HDF5-Datei einfügen.

Es ist am einfachsten, sich HDF5 als mehr oder weniger genau wie ein normales Dateisystem vorzustellen (dh als eine Reihe von Verzeichnissen und Unterverzeichnissen auf Ihrem Computer), das sich jedoch leicht auf große Datenmengen skalieren lässt. Jedes Verzeichnis / Unterverzeichnis kann mit Metadaten versehen werden (in Ihrem Fall entweder nur die Parameter, die Sie variieren, oder der gesamte Parametersatz). Wenn es Zeit ist, Ihre Daten zu analysieren, können Sie sie anhand der Metadaten durchsuchen.

Hier ist ein kurzes Beispiel, wie dies basierend auf einigen meiner Simulationsdaten (bereits im HDF5-Format) funktionieren würde, die so aussehen:

mydata.hdf5
|___Run01(metadata: {size:13, maxSteps:1e7, maxTime:inf})
|___Run02(metadata: {size:10, maxSteps:1e6, maxTime:inf})
|___Run03(metadata: {size:13, maxSteps:1e7, maxTime:inf})
|___Run04(metadata: {size:9, maxSteps:1e7, maxTime:inf})

mydata.hdf5ist die HDF5-Datei, und Runxx ist jeweils ein Unterverzeichnis, das die Ausgabedaten einer bestimmten Simulation enthält und mit den zugehörigen Metadaten versehen ist. Ein Python-Skript, das die Läufe durchsucht und eine Liste derjenigen mit den gewünschten Metadaten zurückgibt, sieht folgendermaßen aus:

import sys
import h5py    #the python module that interfaces with HDF5

def GetRuns(hdfRoot, attributeValuePairs):
    return [subdir for subdir in hdfRoot.values() if not(attributeValuePairs.viewitems() - dict(subdir.attrs).viewitems())]

if __name__=="__main__":
    attributeValuePairs = dict(zip(sys.argv[2::2], sys.argv[3::2]))
    with h5py.File(sys.argv[1]) as hdfRoot:
        runs = GetRuns(hdfRoot, attributeValuePairs)

        #do something here with runs...

        print runs

Wenn ich mich also an einer Befehlszeile in einem Verzeichnis befände, mydata.hdf5das Folgendes enthält, könnte ich das obige Skript folgendermaßen ausführen:

python myscript.py mydata.hdf5 maxSteps 1e7 size 13

Dies würde das Skript anweisen, alle Läufe mit Metadaten zu finden, die teilweise oder vollständig übereinstimmen {'maxSteps':'1e7', 'size':'13'}. Das Skript könnte diese Daten dann nach Belieben bearbeiten (im Abschnitt "Hier etwas tun") und dann eine Liste drucken, die ungefähr so ​​aussieht:

["Run01", "Run03"]

Ein Hinweis ist jedoch, dass HDF5 nur dann eine völlig natürliche Zuordnung für Ihre Daten bietet, wenn es möglich ist, Ihre Daten als Satz von n-dimensionalen Arrays darzustellen. Es ist ziemlich üblich, dass die Ausgabe von Simulationen in einer Art Array erfolgt, daher ist dies wahrscheinlich kein Problem.

Gute Ausgangspunkte
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/

tel
quelle
2

Ich denke, wir müssten ein bisschen mehr über Ihren Workflow wissen, um ernsthafte Empfehlungen abzugeben.

Ich würde vorschlagen, Ihre Läufe wie einen Schlüsselwertspeicher zu behandeln. Erstellen Sie für jeden Lauf eine einfache Datenbank für alle Ihre Metadaten und hacken Sie dann alle relevanten Informationen aus Ihrem Lauf in einen Schlüssel, den Sie jeder Ausgabe zuweisen.

In der einfachsten Situation würden Sie eine Textdatei für Ihren Metadatenspeicher verwenden und Metadatenzeilen zu jedem Lauf sicher an Ihre Textdatei anhängen. Sie können dann Ihre Ausgabeläufe nach Belieben speichern (ein einzelnes Verzeichnis, Sicherungen mit einer Auflistung der Inhalte usw.)

Sie können diese Strategie in einer beliebigen Sprache implementieren, dies ist jedoch in Python trivial. Sie können auch einige nette Funktionen wie Pythons Fähigkeit zum Lesen und Schreiben von JSON-Daten oder zur Interaktion mit SQL-Datenbanken nutzen.

Dieser Ansatz implementiert eine sehr einfache, leichte Datenbank. Es gibt schwerere Strategien, die mehr Sicherheitsgarantien bieten. Eine neue, an der Sie interessiert sein könnten, ist SciDB . Datenbanken bieten stärkere Garantien für Ihre Daten und helfen Ihnen, Ihren Ansatz für größere Datenmengen zu skalieren.

Aron Ahmadia
quelle