Umgang mit der Versionskontrolle großer (binärer) Datenmengen


46

Ich bin ein Doktorand der Geophysik und arbeite mit großen Mengen von Bilddaten (Hunderte von GB, Zehntausende von Dateien). Ich kenne svnund gitverstehe mich ziemlich gut mit einer Projekthistorie, kombiniert mit der Fähigkeit, einfach zusammenzuarbeiten und Schutz vor Festplattenbeschädigung zu haben. Ich finde es gitauch sehr hilfreich, konsistente Backups zu haben, aber ich weiß, dass git große Mengen von Binärdaten nicht effizient verarbeiten kann.

Während meines Masterstudiums arbeitete ich an Datensätzen ähnlicher Größe (auch Images) und hatte viele Probleme, die verschiedenen Versionen auf verschiedenen Servern / Geräten zu verfolgen. Das Vergleichen von 100 GB über das Netzwerk macht wirklich keinen Spaß und kostet mich viel Zeit und Mühe.

Ich weiß, dass andere in der Wissenschaft ähnliche Probleme zu haben scheinen, aber ich konnte keine gute Lösung finden.

Ich möchte die Lagerräume meines Instituts nutzen, also brauche ich etwas, das einen "dummen" Server benutzen kann. Ich hätte auch gerne ein zusätzliches Backup auf einer tragbaren Festplatte, weil ich es vermeiden möchte, Hunderte von GB über das Netzwerk zu übertragen, wo immer dies möglich ist. Ich benötige also ein Tool, das mehr als einen entfernten Standort verwalten kann.

Schließlich brauche ich wirklich etwas, das andere Forscher verwenden können, es muss also nicht sehr einfach sein, sondern sollte in wenigen Stunden erlernbar sein.

Ich habe viele verschiedene Lösungen evaluiert, aber keine scheint in die Rechnung zu passen:

  • svn ist etwas ineffizient und benötigt einen intelligenten server
  • hg bigfile / largefile kann nur eine Fernbedienung verwenden
  • git bigfile / media kann auch nur eine fernbedienung verwenden, ist aber auch nicht sehr effizient
  • Dachboden scheint kein Protokoll oder unterschiedliche Fähigkeiten zu haben
  • bup sieht wirklich gut aus, benötigt aber einen "intelligenten" Server, um zu funktionieren

Ich habe versucht git-annex, das alles zu tun, was ich brauche (und vieles mehr), aber es ist sehr schwierig zu bedienen und nicht gut dokumentiert. Ich habe es mehrere Tage lang benutzt und konnte mich nicht darum kümmern, daher bezweifle ich, dass ein anderer Mitarbeiter daran interessiert wäre.

Wie gehen Forscher mit großen Datenmengen um und was verwenden andere Forschungsgruppen?

Natürlich interessiert mich in erster Linie, wie andere Forscher mit dieser Situation umgehen, nicht nur dieser spezifische Datensatz. Es scheint mir, dass fast jeder dieses Problem haben sollte, aber ich kenne niemanden, der es gelöst hat. Sollte ich nur eine Sicherungskopie der Originaldaten aufbewahren und all diese Versionskontrollsachen vergessen? Tun das alle anderen?


1
@scaaahu Ich denke nicht, dass dies unbedingt eine Software-Frage ist. Eine akzeptable Antwort könnte auch einen Workflow oder eine Kombination von Tools und Systemen beschreiben. (Wie auch immer, wenn man an einem anderen Ort mit dem Thema beschäftigt ist, sollte man nicht die Entscheidung treffen, eine Frage hier zu schließen.)

2
Um mich vor Datenkorruption mit Bilddaten zu schützen, führe ich regelmäßig ein Skript aus, das eine Prüfsummendatei mit allen Dateien und ihren md5-Prüfsummen neu berechnet. Die Prüfsummendatei wird dann in git gespeichert. Jetzt kann ich mit git diff sofort sehen, ob sich eine der Prüfsummen geändert hat. Und ich kann auch sehen, welche Dateien entfernt und hinzugefügt wurden. Und wenn es zB Anzeichen für Datenkorruption gibt, kann ich die regulären Backups verwenden, um alte Versionen wiederherzustellen. Nicht perfekt, aber besser als nichts.

1
@JukkaSuomela Ich denke , es ist eine vernünftige Frage , wenn Sie sehr große Datenmengen haben, wenn diese Datensätze häufig ändern ... in diesen Fällen Backup häufig ist , was als Versionskontrolle verwendet wird .

1
Ich stimme dafür, diese Frage als "Off-Topic" zu schließen, da es sich eher um Daten / Datenbanken als um etwas Spezielles für die Wissenschaft handelt. Die Fragen sind großartig, und (IMHO) sollte nach DataScience.SE oder (vielleicht) Databases.SE verschoben werden.
Piotr Migdal

1
@Johann Data Scientist haben unterschiedliche Hintergründe. Meins ist zum Beispiel in der Quantenmechanik. Der springende Punkt dabei ist: 1. StackExchange rät von so genannten Bootsfragen ab und 2. es ist besser, Best Practices zu erhalten, als wie diese von Leuten gelöst werden, die sie lösen mussten, aber keine Ahnung hatten.
Piotr Migdal

Antworten:


12

Was ich letztendlich benutze, ist eine Art hybride Lösung:

  • Sicherung der Rohdaten
  • git des Workflows
  • manuelle Schnappschüsse von Workflow + verarbeiteten Daten, die relevant sind, zB:
    • Standard-Vorverarbeitung
    • wirklich zeitaufwändig
    • zur Veröffentlichung

Ich glaube, es ist selten sinnvoll, eine vollständige Überarbeitungshistorie mit einer großen Menge von Binärdaten zu haben, da die Zeit, die zum Überprüfen der Änderungen benötigt wird, irgendwann so überwältigend sein wird, dass sich dies auf lange Sicht nicht mehr auszahlt. Möglicherweise wäre ein halbautomatisches Snapshot-Verfahren (um eventuell Speicherplatz zu sparen, indem die unveränderten Daten nicht auf verschiedene Snapshots repliziert werden) hilfreich.


Nun, ich benutze find . -type f -print0 | xargs -0 md5sum > checksums.md5, um die Prüfsummen und md5sum -c checksums.md5Prüfsummen zu berechnen und die Versionskontrolle der Prüfsummen. Das hilft, die Daten an verschiedenen Orten / auf verschiedenen Maschinen zu überprüfen. Scheint das Beste zu sein, was wir im Moment tun können
Johann

Wenn Sie durch Ändern Ihrer Daten immer den Dateinamen ändern, ist dies möglicherweise eine gute Lösung. Ansonsten würde ich sehr empfehlen, die Daten selbst zu überprüfen, zum Beispiel mit rsynceiner Kopie der Originaldaten. Eine andere Möglichkeit, die in den Neurowissenschaften häufig vorkommt (obwohl sie mir nicht so gut gefällt, weil sie manchmal nicht so gut dokumentiert ist, wie sie sein sollte), ist die Verwendung des Python-Pakets nipype, das als (eine Art) Workflow angesehen werden kann Manager und verwaltet den Cache von Binärdaten der Zwischenschritte der Analyse automatisch.
norok2

@norok du hast ein tolles allgemeines Framework beschrieben. Ich habe etwas Ähnliches in das DVC-Tool implementiert - bitte sehen Sie sich meine Antwort unten an. Ich würde mich über Ihr Feedback freuen.
Dmitry Petrov

9

Ich habe ähnliche Probleme mit sehr großen synthetischen Biologiedatensätzen behandelt, bei denen wir viele, viele GB Durchflusszytometriedaten haben , die auf viele, viele Tausend Dateien verteilt sind, und die konsistent zwischen Arbeitsgruppen an (mehreren) verschiedenen Institutionen verwaltet werden müssen.

Eine typische Versionskontrolle wie svn und git ist unter diesen Umständen nicht praktikabel, da sie nur nicht für diesen Dataset-Typ entwickelt wurde. Stattdessen setzen wir Cloud-Speicherlösungen ein, insbesondere DropBox und Bittorrent Sync. DropBox hat den Vorteil, dass es zumindest einige primitive Protokollierungs- und Versionskontrollen durchführt und die Server für Sie verwaltet. Der Nachteil ist jedoch, dass es sich um einen kommerziellen Dienst handelt, für den Sie viel Speicher bezahlen müssen und Ihre unveröffentlichten Daten auf ein Konto stellen kommerzielle Lagerung; Sie müssen jedoch nicht viel bezahlen, daher ist dies eine praktikable Option. Bittorrent Sync hat eine sehr ähnliche Benutzeroberfläche, die Sie jedoch selbst auf Ihren eigenen Speicherservern ausführen und die keine Versionskontrolle besitzt. Beide verletzen meine Programmierseele, aber sie sind die besten Lösungen, die meine Mitarbeiter und ich bisher gefunden haben.


Es gibt eine beliebte Open-Source-Version von Dropbox, OwnCloud. Ich habe es aber nicht ausprobiert.

9

Ich habe die Versionierung für Amazon S3-Buckets verwendet , um 10-100 GB in 10-100 Dateien zu verwalten. Die Übertragung kann langsam sein, daher hat es geholfen, die Daten zu komprimieren und parallel zu übertragen oder nur Berechnungen auf EC2 durchzuführen. Die Boto- Bibliothek bietet eine schöne Python-Oberfläche.



6

Wir haben keine Versionskontrolle der tatsächlichen Datendateien. Wir würden es nicht einmal wollen, wenn wir es als CSV statt in binärer Form speichern würden. Wie Riccardo M. sagte, werden wir unsere Zeit nicht damit verbringen, zeilenweise Änderungen an einem Datensatz von 10 Millionen Zeilen zu überprüfen.

Stattdessen steuere ich zusammen mit dem Verarbeitungscode die Metadaten:

  • Änderungsdatum
  • Dateigröße
  • Reihenanzahl
  • Spaltennamen

Dies gibt mir genügend Informationen, um zu wissen, ob sich eine Datendatei geändert hat und was sich geändert hat (z. B. Zeilen hinzugefügt / gelöscht, neue / umbenannte Spalten), ohne das VCS zu belasten.


5

Dies ist ein ziemlich häufiges Problem. Ich hatte diesen Schmerz, als ich Forschungsprojekte für eine Universität durchgeführt habe und jetzt - in industriellen datenwissenschaftlichen Projekten.

Ich habe ein Open-Source-Tool entwickelt und kürzlich veröffentlicht, um dieses Problem zu lösen - DVC .

Es kombiniert im Grunde Ihren Code in Git und Daten auf Ihrer lokalen Festplatte oder in Ihren Clouds (S3- und GCP-Speicher). DVC verfolgt die Abhängigkeit zwischen Daten und Code und erstellt das Abhängigkeitsdiagramm (DAG). Es hilft Ihnen, Ihr Projekt reproduzierbar zu machen.

DVC-Projekte können problemlos freigegeben werden: Synchronisieren Sie Ihre Daten mit einer Cloud (Befehl dvc sync), geben Sie Ihr Git-Repository frei und ermöglichen Sie den Zugriff auf Ihren Daten-Bucket in der Cloud.

"In wenigen Stunden lernbar" - ist ein guter Punkt. Sie sollten keine Probleme mit DVC haben, wenn Sie mit Git vertraut sind. Sie müssen wirklich nur drei Befehle lernen:

  1. dvc init- wie git init. Sollte in einem vorhandenen Git-Repository erfolgen.
  2. dvc import- Importieren Sie Ihre Datendateien (Quellen). Lokale Datei oder URL.
  3. dvc run- Schritte Ihres Workflows mögen dvc run python mycode.py data/input.jpg data/output.csv. DVC leitet die Abhängigkeit zwischen Ihren Schritten automatisch ab, erstellt die DAG und speichert sie in Git.
  4. dvc repro- reproduzieren Sie Ihre Datendatei. Beispiel: vi mycode.py- Code ändern und dann dvc repro data/output.csvdie Datei (und alle Abhängigkeiten) reproduzieren.

Sie müssen einige weitere DVC-Befehle erlernen, um Daten über die Cloud und grundlegende S3- oder GCP-Kenntnisse auszutauschen.

DVC-Tutorial ist der beste Ausgangspunkt - "Data Version Control: iteratives maschinelles Lernen"


1
Kann dies verwendet werden, wenn nur große Binärdateien (hauptsächlich Videos) gespeichert werden. ML ist nicht das Ziel. Ziel ist es, ein Repo zum Speichern großer Binärdateien zu haben. Repo sollte Caching, selektives Auschecken / Ziehen (wie Perforce) und einen Mechanismus zum Sperren von Dateien / Verzeichnissen haben. Ist es für einen solchen Zweck geeignet?
Hemu

1
@hemu Ja. DVC funktioniert für das grundlegende Szenario mit großen Datendateien ohne ML-Funktionen (wie ML-Pipelines und Reproduzierbarkeit) einwandfrei. Perforce-Lock-Semantik wird aufgrund der Git-Semantik nicht unterstützt. Bitte verwenden Sie stattdessen die dateipezifische Prüfung.
Dmitry Petrov


0

Sie können sich mein Projekt mit dem Namen DOT: Distrubuted Object Tracker Repository Manager ansehen.
Es ist ein sehr einfaches VCS für Binärdateien für den persönlichen Gebrauch (keine Zusammenarbeit).
Es verwendet SHA1 für die Prüfsumme und die Block-Deduplizierung. Vollständige P2P-Synchronisierung.
Eine einzigartige Funktion: Ad-hoc-Einmal-TCP-Server für Pull / Push.
Es kann auch SSH für den Transport verwenden.

Es ist noch nicht veröffentlicht, könnte aber ein guter Ausgangspunkt sein.
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

Sie könnten versuchen, Hangar zu verwenden . Es ist ein relativ neuer Player in der Welt der Datenversionskontrolle, leistet aber wirklich gute Arbeit, indem es die Tensoren versioniert, anstatt den Blob zu versionieren. Die Dokumentation muss der beste Ausgangspunkt sein. Da die Daten als Tensoren gespeichert werden, sollten Sie sie direkt in Ihrem ML-Code verwenden können (plus Hangar verfügt jetzt über Datenlader für PyTorch und Tensorflow). Mit Hangar können Sie alle Vorteile von GIT nutzen, z. B. Verzweigung, Zusammenführung und Zeitreise durch die Geschichte. Eine nette Funktion zum Klonen im Hangar ist, dass Sie teilweise klonen können . Wenn Sie also 10 TB Daten auf Ihrer Fernbedienung haben und nur 100 MB für das Prototyping Ihres Modells benötigen, können Sie statt eines vollständigen Klons nur 100 MB durch teilweises Klonen abrufen.

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.