5

Wir entwickeln ein Datenverarbeitungstool, um einige wissenschaftliche Ergebnisse aus einer gegebenen Menge von Rohdaten zu extrahieren. In der Datenwissenschaft ist es sehr wichtig, dass Sie Ihre Ergebnisse wiederherstellen und die Berechnungen wiederholen können, die zu einem ErgebnissatzWie man ein wissenschaftliches Datenverarbeitungswerkzeug markiert, um die Wiederholbarkeit sicherzustellen

führten. Da das Werkzeug sich entwickelt, brauchen wir einen Weg, um herauszufinden, welche Revision/Aufbau unseres Werkzeugs generiert eine bestimmte Ergebnismenge und wie Sie die entsprechende Quelle finden, aus der das Werkzeug erstellt wurde.

Das Tool ist in C++ und Python geschrieben; Zusammenkleben der C++ Teile mit Boost :: Python. Wir verwenden CMake als ein Build-System, das Dateien für Linux erzeugt. Derzeit ist das Projekt in einem Subversion Repo gespeichert, aber einige von uns verwenden bereits git resp. hg und wir planen, das gesamte Projekt in naher Zukunft zu einem von ihnen zu migrieren.

Was sind die Best Practices in einem solchen Szenario, um eine eindeutige Zuordnung zwischen Quellcode, Binärdatei und Ergebnismenge zu erhalten?

Ideen diskutieren wir bereits:

  • Irgendwie die globale Revisionsnummer Injektion
  • eine Build-Nummer Generator
  • die gesamte Quelltext innerhalb der ausführbaren Datei verwenden Speichern von selbst

Antwort

3

Dies ist ein Problem, für das ich eine Menge Zeit arbeite. Zu was @VonC bereits geschrieben hat, lassen Sie mich ein paar Gedanken hinzufügen.

Ich denke, dass das Thema Software Configuration Management gut verstanden und oft in kommerziellen Umgebungen sorgfältig geübt wird. Dieser allgemeine Ansatz fehlt jedoch oft in wissenschaftlichen Datenverarbeitungsumgebungen, von denen viele entweder in der Wissenschaft verbleiben oder aus ihr hervorgegangen sind. Wenn Sie sich jedoch in einer solchen Arbeitsumgebung befinden, stehen Ihnen leicht verfügbare Quellen für Informationen und Ratschläge sowie zahlreiche Hilfsmittel zur Verfügung. Ich werde darauf nicht weiter eingehen.

Ich glaube nicht, dass Ihr Vorschlag, den gesamten Quellcode in eine ausführbare Datei einzuschließen, auch wenn machbar, notwendig ist.In der Tat, wenn Sie SCM richtig bekommen, dann ist einer der wesentlichen Tests, die Sie so gemacht haben und weiterhin tun, Ihre Fähigkeit, "alte" ausführbare Dateien bei Bedarf neu zu erstellen. Sie sollten auch in der Lage sein zu bestimmen, welche Version der Quellen in den einzelnen ausführbaren Dateien und Versionen verwendet wurde. Diese sollten den Quellcode in einer ausführbaren Datei unnötig machen.

Das Thema Verknüpfen von Ergebnissätzen in Berechnungen ist auch, wie Sie sagen, essentiell. Hier sind einige der Komponenten der Lösung, die wir erstellen:

Wir entfernen uns von der traditionellen unstrukturierten Textdatei, die für die Ausgabe vieler wissenschaftlicher Programme charakteristisch ist, in Richtung strukturierter Dateien, in unserem Fall sind wir es Betrachten von HDF5 und XML, in denen sowohl die interessierenden Daten als auch die Metadaten gespeichert sind. Die Metadaten enthalten die Identifikation des Programms (und der Version), mit dem die Ergebnisse erzeugt wurden, die Identifizierung der Eingabedatensätze, die Job-Parameter und eine Menge anderer Dinge.

Wir schauten uns ein DBMS an, um unsere Ergebnisse zu speichern; Wir würden gerne diesen Weg gehen, aber wir haben nicht die Mittel, dies in diesem Jahr zu tun, wahrscheinlich auch nicht als nächstes. Aber Unternehmen verwenden DBMS aus einer Vielzahl von Gründen, und einer der Gründe ist ihre Fähigkeit, einen Rollback durchzuführen, um einen Audit-Trail, so etwas zu bieten.

Wir schauen uns auch genau an, welche Ergebnissätze gespeichert werden müssen. Ein guter Ansatz wäre es, nur Originaldaten zu speichern, die von unseren Feldsensoren erfasst wurden. Leider benötigen einige unserer Berechnungen 1000 Stunden CPU-Stunden, um zu produzieren, so dass es unmöglich ist, sie zu reproduzieren ab-initio auf Anfrage. Wir werden jedoch in Zukunft weitaus weniger Zwischendaten speichern als in der Vergangenheit.

Wir machen es auch viel schwieriger (ich würde es für unmöglich halten, aber ich bin mir nicht sicher, ob wir schon da sind), damit Benutzer Ergebnissätze direkt bearbeiten können. Sobald jemand das tut, sind alle Herkunftsinformationen in der Welt falsch und nutzlos.

Schließlich, wenn Sie mehr über das Thema lesen möchten, googlen für ähnliche Themen wie "wissenschaftlicher Workflow" und "Datenherkunft".

EDIT: Es ist nicht klar, was ich oben geschrieben habe, aber wir haben unsere Programme modifiziert, so dass sie ihre eigene Identifizierung enthalten (wir Subversion Keyword-Fähigkeiten für diesen Einsatz mit einer Verlängerung oder zwei unserer eigenen) und schreiben diese in jede Ausgabe, die sie produzieren.

1

Sie müssen betrachte git submodules von hg subrepos.

Die beste Vorgehensweise in diesem Szenario o einen Elternteil Repo zu haben, die Referenz wird:

  • die Quellen des Werkzeugs
  • die Ergebnismenge von diesem Werkzeug
  • idealerweise der C++ Compiler (won erzeugt ‚t jeden Tag)
  • in idealer Weise die python-Distribution (wird nicht jeden Tag weiterentwickeln) entwickeln

jeder von thos e sind eine Komponente, dh ein unabhängiges Repository (Git oder Mercurial).
Eine genaue Revision jeder Komponente wird durch ein Eltern-Repository referenziert.

Der gesamte Prozess ist repräsentativ für eine component-based approach, und ist der Schlüssel in der Verwendung eines SCM (hier Software Konfiguration Management) in seiner vollsten Form.

Verwandte Themen