Ich arbeite an einem datenwissenschaftlichen Projekt mit Python. Das Projekt hat mehrere Phasen. Jede Phase umfasst das Aufnehmen eines Datensatzes, das Verwenden von Python-Skripten, Hilfsdaten, Konfigurationen und Parametern sowie das Erstellen eines weiteren Datensatzes. Ich speichere den Code in Git, so dass dieser Teil abgedeckt ist. Ich würde gerne hören über:
- Tools zur Versionskontrolle von Daten.
- Werkzeuge, mit denen Stufen und Experimente reproduziert werden können.
- Protokoll und vorgeschlagene Verzeichnisstruktur für ein solches Projekt.
- Automatisierte Build / Run-Tools.
python
tools
version-control
Yuval F
quelle
quelle
Antworten:
Das Thema reproduzierbarer Forschung (RR) ist sehr beliebt heute und folglich ist riesig , aber ich hoffe , dass meine Antwort sein wird , umfassend genug , um als Antwort und genügend Informationen für bietet weitere Forschung , sollten Sie dies tun entscheiden.
Python-spezifische Tools für RR gibt es sicherlich, aber ich halte es für sinnvoller, sich auf universellere Tools zu konzentrieren (Sie wissen nie genau, mit welchen Programmiersprachen und Computerumgebungen Sie in Zukunft arbeiten werden). Schauen wir uns trotzdem an, welche Tools für Ihre Liste verfügbar sind.
1) Tools zur Versionskontrolle von Daten . Wenn Sie nicht vorhaben, mit (sehr) großen Datenmengen zu arbeiten , ist es wahrscheinlich sinnvoll, dieselben zu verwenden
git
, die Sie für die Versionskontrolle des Quellcodes verwenden. Die Infrastruktur ist schon da. Auch wenn Ihre Dateien binär und groß sind, kann dieser Rat hilfreich sein: https://stackoverflow.com/questions/540535/managing-large-binary-fileses-with-git .2) Tools zum Verwalten von RR-Workflows und -Experimenten . Hier ist eine Liste der beliebtesten Tools in dieser Kategorie, nach meinem besten Wissen (in absteigender Reihenfolge der Beliebtheit):
Taverna Workflow Management System ( http://www.taverna.org.uk ) - sehr solide, wenn auch etwas zu komplexe Tools. Das Hauptwerkzeug ist eine Java-basierte Desktop-Software. Es ist jedoch mit dem Online-Workflow-Repository-Portal myExperiment ( http://www.myexperiment.org ) kompatibel , in dem Benutzer ihre RR-Workflows speichern und freigeben können. Das mit Taverna vollständig kompatible webbasierte RR-Portal heißt Taverna Online , wird jedoch von einer völlig anderen Organisation in Russland entwickelt und gepflegt (dort als OnlineHPC bezeichnet : http://onlinehpc.com ).
Das Kepler-Projekt ( https://kepler-project.org )
VisTrails ( http://vistrails.org )
Madagaskar ( http://www.reproducibility.org )
BEISPIEL . Hier ist ein interessanter Artikel über wissenschaftliche Workflows mit einem Beispiel für das tatsächliche Workflow-Design und die Datenanalyse, basierend auf Kepler- und myExperiment- Projekten: http://f1000research.com/articles/3-110/v1 .
Es gibt viele RR-Tools, die ein Paradigma für die Erstellung von Lese- und Schreibprogrammen implementieren , wie beispielsweise die
LaTeX
Softwarefamilie. Tools , die Hilfe bei der Erstellung von Berichten und Präsentation ist auch eine große Kategorie, woSweave
undknitr
sind wohl die bekanntesten diejenigen.Sweave
ist ein Tool, das sich auf R konzentriert, aber mit etwas mehr Aufwand in Python-basierte Projekte integriert werden kann ( https://stackoverflow.com/questions/2161152/sweave-for-python ). Ich denke, dassknitr
dies eine bessere Option sein könnte, da es modern ist, umfangreiche Unterstützung durch beliebte Tools (wieRStudio
) hat und sprachneutral ist ( http://yihui.name/knitr/demo/engines ).3) Protokoll und vorgeschlagene Verzeichnisstruktur . Wenn ich richtig verstanden habe, was Sie unter Verwendung des Ausdrucks Protokoll ( Workflow ) impliziert haben , glaube ich, dass der standardmäßige RR-Datenanalyse-Workflow im Allgemeinen aus den folgenden aufeinander folgenden Phasen besteht: Datenerfassung => Datenaufbereitung (Bereinigen, Umwandeln, Zusammenführen, Abtasten) => Datenanalyse => Präsentation der Ergebnisse (Erstellung von Berichten und / oder Präsentationen). Trotzdem ist jeder Workflow projektspezifisch und daher müssen für einige bestimmte Aufgaben möglicherweise zusätzliche Schritte hinzugefügt werden.
Informationen zur Beispielverzeichnisstruktur finden Sie in der Dokumentation zum R-Paket
ProjectTemplate
( http://projecttemplate.net ), um Datenanalyse-Workflows und -Projekte zu automatisieren:4) Automatisierte Build / Run-Tools . Da sich meine Antwort auf universelle (sprachneutrale) RR-Tools konzentriert, sind die beliebtesten Tools
make
. Lesen Sie den folgenden Artikel aus bestimmten Gründen, um ihnmake
als bevorzugtes Tool zur Automatisierung von RR-Workflows zu verwenden: http://bost.ocks.org/mike/make . Sicher gibt es andere ähnliche Tools, die entweder einige Aspekte verbessernmake
oder einige zusätzliche Funktionen hinzufügen. Zum Beispiel:ant
(offiziell Apache Ant: http://ant.apache.org ),Maven
("next generationant
": http://maven.apache.org ),rake
( https://github.com/ruby/rake ) ,Makepp
( http://makepp.sourceforge.net). Eine umfassende Liste solcher Tools finden Sie in Wikipedia: http://en.wikipedia.org/wiki/List_of_build_automation_software .quelle
Seit ich im akademischen Bereich forsche, bin ich ständig auf der Suche nach einem zufriedenstellenden Arbeitsablauf. Ich denke, dass ich endlich etwas gefunden habe, mit dem ich glücklich bin:
1) Alles unter Versionskontrolle stellen, zB Git:
Für Hobby-Forschungsprojekte benutze ich GitHub, für die Forschung bei der Arbeit benutze ich den privaten GitLab-Server, der von unserer Universität bereitgestellt wird. Dort behalte ich auch meine Datensätze.
2) Ich mache die meisten meiner Analysen zusammen mit der Dokumentation zu IPython-Notebooks. Es ist (für mich) sehr gut organisiert, den Code, die Zeichnungen und die Diskussion / Schlussfolgerung in einem Dokument zu haben. Wenn ich größere Skripte ausführe, füge ich sie normalerweise in separate Skript-PY-Dateien ein, aber ich führe sie trotzdem aus vom IPython-Notizbuch über% run magic, um Informationen zu Zweck, Ergebnis und anderen Parametern hinzuzufügen.
Ich habe eine kleine cell-magic-Erweiterung für IPython- und IPython-Notizbücher geschrieben, die sich "Wasserzeichen" nennt und mit der ich bequem Zeitstempel erstelle und die verschiedenen Paketversionen sowie Git-Hashes nachverfolge
Zum Beispiel
Weitere Informationen finden Sie in der Dokumentation hier .
quelle
Das beste Werkzeug für die Reproduzierbarkeit besteht darin, ein Protokoll Ihrer Aktionen zu erstellen.
Dies kann auf einem Blatt Papier festgehalten werden. Wenn Ihre Experimente jedoch in einen Rechenrahmen passen, können Sie diesen Protokollierungsprozess mithilfe von Rechentools teilweise oder vollständig automatisieren (insbesondere, indem Sie die sehr großen Eingabedatensätze und die Ausgabe nachverfolgen Zahlen).
Ein großartiges Reproduzierbarkeitstool für Python mit einer geringen Lernkurve ist natürlich IPython / Jupyter Notebook (vergessen Sie nicht die Magie von % logon und% logstart ). Tipp: Um sicherzustellen, dass Ihr Notebook reproduzierbar ist, starten Sie den Kernel neu und versuchen Sie, alle Zellen von oben nach unten auszuführen (Schaltfläche Alle Zellen ausführen): Wenn dies funktioniert, speichern Sie alles in einer Archivdatei ("Einfrieren"), insbesondere Wenn Sie Zellen nicht linear, nicht sequenziell und nicht offensichtlich ausführen müssen, um Fehler zu vermeiden, müssen Sie ein wenig nacharbeiten.
Ein weiteres großartiges Tool, das sehr neu ist (2015), ist Recipe , das Sumatra sehr ähnlich ist (siehe unten), aber speziell für Python entwickelt wurde. Ich weiß nicht, ob es mit Jupyter-Notizbüchern funktioniert, aber ich weiß, dass der Autor sie häufig verwendet, und ich vermute, dass es in Zukunft sein wird, wenn es derzeit nicht unterstützt wird.
Git ist auch fantastisch und nicht an Python gebunden. Es wird Ihnen nicht nur helfen, einen Überblick über alle Ihre Experimente, Codes, Datensätze, Zahlen usw. zu behalten, sondern bietet Ihnen auch Werkzeuge, mit denen Sie mithilfe einer wissenschaftlichen Methode die Spitzhacke pflegen ( git - bisect ), zusammenarbeiten ( tadeln ) und Fehler beheben ( git - bisect ) können Debugging-Methode ( Delta-Debugging genannt ). Hier ist die Geschichte eines fiktiven Forschers, der versucht, sein eigenes Experimentprotokollierungssystem zu erstellen, bis es ein Faksimile von Git wird.
Ein weiteres allgemeines Werkzeug mit jeder Sprache arbeiten (mit einem Python - API auf pypi ) ist Sumatra , die speziell auf Hilfe soll Sie tun replizierbar Forschung ( replizierbar Ziele die gleichen Ergebnisse angesichts der exakt gleichen Code und Software zu produzieren, während die Reproduzierbarkeit Ziele der produzieren gleiche Ergebnisse bei jedem Medium, das viel schwieriger und zeitaufwendiger und nicht automatisierbar ist).
So funktioniert Sumatra: Für jedes Experiment, das Sie mit Sumatra durchführen, verhält sich diese Software wie ein "Speicherzustand", der in Videospielen häufig vorkommt. Genauer gesagt, wird es sparen:
Anschließend wird eine Datenbank mit dem Zeitstempel und anderen Metadaten für jedes Ihrer Experimente erstellt, die Sie später mithilfe der webGUI crawlen können. Da Sumatra den vollständigen Status Ihrer Anwendung für ein bestimmtes Experiment zu einem bestimmten Zeitpunkt gespeichert hat, können Sie den Code, der zu einem bestimmten Zeitpunkt zu einem bestimmten Ergebnis geführt hat, jederzeit wiederherstellen. Auf diese Weise haben Sie reproduzierbare Nachforschungen zu geringen Kosten (mit Ausnahme der Speicherung, wenn Sie arbeiten an großen Datenmengen, können jedoch Ausnahmen konfigurieren, wenn Sie nicht jedes Mal alles speichern möchten.
Ein weiteres großartiges Tool ist GNOMEs Zeitgeist (zuvor in Python programmiert, jetzt aber in Vala portiert), ein umfassendes Action-Journaling-System, das alles aufzeichnet, was Sie tun, und das maschinelles Lernen verwendet, um die Beziehung zwischen Elementen für einen bestimmten Zeitraum zusammenzufassen zu Ähnlichkeiten und Nutzungsmustern, z. B. zur Beantwortung von Fragen wie "Was war für mich am relevantesten, als ich im letzten Jahr einen Monat an Projekt X gearbeitet habe?" . Interessanterweise hat Zim Desktop Wiki , eine Notizen-App ähnlich wie Evernote, ein Plugin für die Arbeit mit Zeitgeist.
Letztendlich können Sie entweder Git oder Sumatra oder eine beliebige andere Software verwenden, die Ihnen ungefähr die gleiche Reproduzierbarkeit bietet, aber Sumatra ist speziell auf wissenschaftliche Forschung zugeschnitten, sodass es einige ausgefallene Tools wie eine Web-GUI zum Crawlen bietet Ihre Ergebnisse, während Git eher auf die Codewartung zugeschnitten ist (aber es hat Debugging-Tools wie git-bisect. Wenn Ihre Experimente also Codes beinhalten, ist es möglicherweise sogar besser). Oder natürlich können Sie beide verwenden!
/ EDIT: dsign hat hier einen sehr wichtigen Punkt angesprochen : Die Reproduzierbarkeit Ihres Setups ist ebenso wichtig wie die Reproduzierbarkeit Ihrer Anwendung. Mit anderen Worten, Sie sollten mindestens eine vollständige Liste der von Ihnen verwendeten Bibliotheken und Compiler zusammen mit ihren genauen Versionen und den Details Ihrer Plattform bereitstellen .
Beim wissenschaftlichen Rechnen mit Python habe ich festgestellt, dass das Packen einer Anwendung zusammen mit den Bibliotheken einfach zu schmerzhaft ist. Daher verwende ich jetzt nur ein wissenschaftliches All-in-One-Python-Paket wie Anaconda (mit der großartigen Paketmanager- Conda ). und raten Sie den Benutzern, dasselbe Paket zu verwenden. Eine andere Lösung könnte darin bestehen, ein Skript zur automatischen Generierung einer virtuellen Datei bereitzustellen oder alles mit der kommerziellen Docker-Anwendung, wie von dsign oder dem OpenSource- Vagrant angegeben , zu verpacken (z. B. mit pylearn2-in-a-Box, die mithilfe von Vagrant eine leicht umverteilbare Datei erstellt Paket für die virtuelle Umgebung).
Schließlich können Sie eine virtuelle Maschine erstellen (siehe VirtualBox) und sogar den Status der Maschine (Snapshot) mit Ihrem Experiment speichern, um sicherzustellen, dass Sie jederzeit über eine voll funktionsfähige Umgebung verfügen. Dann können Sie diese virtuelle Maschine einfach mit allem, was enthalten ist, teilen, sodass jeder Ihr Experiment mit Ihrem genauen Setup replizieren kann. Dies ist wahrscheinlich der beste Weg, um ein softwarebasiertes Experiment zu replizieren. Container sind möglicherweise eine leichtgewichtigere Alternative, umfassen jedoch nicht die gesamte Umgebung, sodass die Replikationstreue weniger robust ist.
/ EDIT2: Hier ist ein großartiges Video, das zusammenfasst (zum Debuggen, aber dies kann auch für die Forschung angewendet werden), was für reproduzierbare Forschung von grundlegender Bedeutung ist: Ihre Experimente und die einzelnen Schritte der wissenschaftlichen Methode protokollieren, eine Art "explizites Experimentieren" .
quelle
Achten Sie darauf, Docker zu überprüfen ! Und im Allgemeinen all die anderen guten Dinge, die das Software-Engineering über Jahrzehnte geschaffen hat, um Isolation und Reproduzierbarkeit zu gewährleisten.
Ich möchte betonen, dass es nicht genug ist , haben nur reproduzierbare Abläufe, sondern auch einfache Workflows zu reproduzieren. Lassen Sie mich zeigen, was ich meine. Angenommen, Ihr Projekt verwendet Python, eine Datenbank X und Scipy. Mit Sicherheit werden Sie eine bestimmte Bibliothek verwenden, um von Python aus eine Verbindung zu Ihrer Datenbank herzustellen, und Scipy wird wiederum einige spärliche algebraische Routinen verwenden. Dies ist auf jeden Fall eine sehr einfache Einrichtung, aber nicht ganz einfach einzurichten, beabsichtigt Wortspiel. Wenn jemand Ihre Skripte ausführen möchte, muss er alle Abhängigkeiten installieren. Oder schlimmer noch, sie hat möglicherweise bereits inkompatible Versionen davon installiert. Das zu reparieren, braucht Zeit. Es wird auch einige Zeit dauern, bis Sie Ihre Berechnungen in einen Cluster, einen anderen Cluster oder auf einige Cloud-Server verschieben müssen.
Hier finde ich Docker nützlich. Docker ist eine Möglichkeit, Rezepte für binäre Umgebungen zu formalisieren und zu kompilieren. Sie können Folgendes in ein Dockerfile schreiben (ich verwende hier nur Englisch anstelle der Dockerfile-Syntax):
Einige der Zeilen werden Dinge in Python mithilfe von pip installieren, da pip eine sehr saubere Arbeit bei der Auswahl bestimmter Paketversionen leisten kann. Schau es dir auch an!
Und das ist es. Wenn Sie Ihre Docker-Datei nach dem Erstellen erstellen können, kann sie von jedem an einem beliebigen Ort erstellt werden (vorausgesetzt, sie haben auch Zugriff auf Ihre projektspezifischen Dateien, z. B. weil Sie sie in eine öffentliche URL einfügen, auf die von der Docker-Datei aus verwiesen wird). Was am besten ist, Sie können die resultierende Umgebung (als "Bild" bezeichnet) auf einen öffentlichen oder privaten Server (als "Register" bezeichnet) hochladen, damit andere Personen sie verwenden können. Wenn Sie also Ihren Workflow veröffentlichen, haben Sie sowohl ein vollständig reproduzierbares Rezept in Form einer Docker-Datei als auch eine einfache Möglichkeit für Sie oder andere Personen, Ihre Arbeit zu reproduzieren:
Oder wenn sie in Ihren Skripten herumstöbern möchten:
quelle
Leider habe ich nicht genug Reputationspunkte, um auf den Beitrag von Plank zu antworten, also muss ich auf den gesamten Thread antworten - tut mir leid.
Eigentlich bin ich der Entwickler des oben erwähnten Open Source Collective Knowledge Framework. Es wird versucht, die gemeinsame Nutzung von Artefakten und experimentellen Workflows als wiederverwendbare und reproduzierbare Python-Komponenten mit einer über GitHub gemeinsam genutzten einheitlichen JSON-API und JSON-Meta zu vereinfachen. Sie können mit derselben einheitlichen JSON-API auch mit Predictive Analytics verbunden werden.
Wir haben gerade die neue Version V1.8.1 veröffentlicht und eine umfangreiche Dokumentation bereitgestellt, sodass es hoffentlich einfacher ist, die Konzepte jetzt zu verstehen: http://github.com/ctuning/ck/wiki
Wir haben jetzt viele akademische und industrielle Projekte, die auf diesem Framework basieren. Sie können eines davon überprüfen - die Crowdsourcing-Programmoptimierung für mobile Geräte, die von Freiwilligen reproduzierbar bereitgestellt werden: http://cknowledge.org/repo
Wir verfolgen auch verschiedene Ressourcen in Bezug auf reproduzierbare Wissenschaft hier: https://github.com/ctuning/ck/wiki/Enabling-open-science
Obwohl ich mich hauptsächlich darauf konzentriere, die Forschung von Computersystemen reproduzierbar zu machen, hatte ich interessante Chats mit Kollegen aus anderen Bereichen und es scheint, als hätten sie sehr ähnliche Probleme. Ich würde mich sehr freuen, wenn unser Framework anderen Communities weiterhelfen könnte! Wenn Sie Fragen oder Anregungen haben, können Sie sich gerne an uns wenden!
quelle
Es gibt einen ganzen Kurs, der sich der reproduzierbaren Forschung widmet. https://www.coursera.org/learn/reproducible-research Dieser Kurs basiert auf R, aber die zugrunde liegende Idee kann gelernt werden.
Eine einfache Möglichkeit besteht darin, ein Ipython-Notizbuch zu haben und jede schmutzige Arbeit, die Sie ausführen, zu speichern.
quelle
Ich bin kürzlich auf das folgende Tool gestoßen : http://github.com/ctuning/ck . Es ist bereits in Python geschrieben und scheint zu enthalten, was Sie benötigen (mein Kollege verwendet es im Pilotprojekt, um die Bilderkennung zu automatisieren).
Vorteile:
Nachteile:
quelle
Ich habe vor kurzem ein Open-Source-Tool namens http://dvc.org oder DVC erstellt und veröffentlicht , das genau das tut, was Sie erreichen möchten:
dvc repro data/scores.csv
Reproduziert alle erforderlichen Schritte in Bezug auf DAG.data
standardmäßig), in dem Sie alle Datendateien speichern sollten. DVC verschiebt jedoch den eigentlichen Inhalt transparent in das.cache
Verzeichnis und erstellt die Symlinks (ja, ich habe es auch für Windows gemacht). Das.cache
Verzeichnis ist nicht mit Git synchronisiert, kann jedoch per Befehl über die Cloud (S3 oder GCP)dvc sync data/scores.csv
synchronisiert werden (es synchronisiert die entsprechende Datendatei aus dem Cache wie.cache/scores.csv_29de545
).Das DVC-Tutorial ist ein guter Ausgangspunkt - "Data Version Control: iteratives maschinelles Lernen" .
quelle
HAFTUNGSAUSSCHLUSS: Ich arbeite in einer Firma, Datmo , die ein Open-Source-Tool dafür erstellt.
Die beste Vorgehensweise für die Reproduzierbarkeit ist die folgende:
1) Containerisieren Sie Ihre Umgebung zunächst in eine Docker-Umgebung, indem Sie eine Docker-Datei erstellen und sicherstellen, dass alle Abhängigkeiten in dieser Datei abgedeckt sind. Ich fand diese Ressource am besten ( https://arxiv.org/pdf/1410.0846.pdf )
2) Sobald Sie dies haben, möchten Sie entscheiden, wo Sie alle Leistungsmetriken und -konfigurationen nachverfolgen können (damit Sie sie für zukünftige Experimente erneut aufrufen können).
3) Schreiben Sie abschließend eine Dokumentation, damit ein neuer Experimentator / Entwickler Ihren Code überprüfen, mit der Umgebung replizieren und feststellen kann, wo Sie Ihre Konfigurationen und Leistungsmetriken aufbewahrt haben.
quelle