Come gestire il controllo della versione di grandi quantità di dati (binari)


46

Sono un dottorando in Geofisica e lavoro con grandi quantità di dati di immagini (centinaia di GB, decine di migliaia di file). Lo so svne gitabbastanza bene e arriva a valorizzare la storia di un progetto, unita alla capacità di lavorare facilmente insieme e avere protezione contro la corruzione del disco. Trovo gitanche estremamente utile avere backup coerenti, ma so che git non è in grado di gestire in modo efficiente grandi quantità di dati binari.

Nei miei studi di master ho lavorato su set di dati di dimensioni simili (anche immagini) e ho avuto molti problemi a tenere traccia di versioni diverse su server / dispositivi diversi. Diffondere 100 GB sulla rete non è davvero divertente e mi è costato molto tempo e fatica.

So che altri nella scienza sembrano avere problemi simili, ma non sono riuscito a trovare una buona soluzione.

Voglio usare le strutture di archiviazione del mio istituto, quindi ho bisogno di qualcosa che possa usare un server "stupido". Vorrei anche avere un backup aggiuntivo su un disco rigido portatile, perché vorrei evitare di trasferire centinaia di GB sulla rete, ove possibile. Quindi, ho bisogno di uno strumento in grado di gestire più di una posizione remota.

Infine, ho davvero bisogno di qualcosa che altri ricercatori possano usare, quindi non deve essere super semplice, ma dovrebbe essere appreso in poche ore.

Ho valutato molte soluzioni diverse, ma nessuna sembra adatta al conto:

  • svn è alquanto inefficiente e necessita di un server intelligente
  • hg bigfile / largefile può usare solo un telecomando
  • git bigfile / media può anche usare solo un telecomando, ma non è anche molto efficiente
  • l'attico non sembra avere un registro o funzionalità diverse
  • bup sembra davvero buono, ma ha bisogno di un server "intelligente" per funzionare

Ho provato git-annex, che fa tutto ciò di cui ho bisogno (e molto altro), ma è molto difficile da usare e non ben documentato. L'ho usato per diversi giorni e non riuscivo a pensarci bene, quindi dubito che qualsiasi altro collega sarebbe interessato.

In che modo i ricercatori gestiscono set di dati di grandi dimensioni e quali sono gli altri gruppi di ricerca?

Per essere chiari, sono principalmente interessato a come gli altri ricercatori affrontano questa situazione, non solo questo set di dati specifico. Mi sembra che quasi tutti dovrebbero avere questo problema, eppure non conosco nessuno che lo abbia risolto. Devo solo conservare un backup dei dati originali e dimenticare tutto questo controllo della versione? È quello che fanno tutti gli altri?


1
@scaaahu Non penso che questa sia necessariamente una domanda software; una risposta accettabile potrebbe anche descrivere un flusso di lavoro o una combinazione di strumenti e sistemi. (Comunque, essere in argomento da qualche altra parte non dovrebbe prendere in considerazione la decisione di chiudere una domanda qui.)

2
Solo per proteggermi dalla corruzione dei dati con i dati delle immagini, eseguo periodicamente uno script che ricalcola un file di checksum con tutti i file e i loro checksum md5. Il file checksum viene quindi tenuto in git. Ora posso vedere immediatamente con git diff se uno dei checksum è cambiato. E posso anche vedere quali file sono stati rimossi e aggiunti. E se ci sono ad esempio segni di corruzione dei dati, allora posso usare i backup regolari per ripristinare le vecchie versioni. Non perfetto ma meglio di niente.

1
@JukkaSuomela Penso che sia una domanda ragionevole quando hai set di dati molto grandi, se questi set di dati cambiano frequentemente ... in quei casi, il backup spesso è quello che viene usato come controllo della versione.

1
Sto votando per chiudere questa domanda come fuori tema perché riguarda dati / database piuttosto che qualcosa di specifico per il mondo accademico. Le domande sono fantastiche e (IMHO) dovrebbe essere spostato su DataScience.SE o (forse) su Database.SE.
Piotr Migdal,

1
@Johann Lo scienziato dei dati ha origini diverse. Il mio è in meccanica quantistica, per esempio. Il punto qui è che: 1. StackExchange scoraggia le cosiddette domande sulla barca e 2. è meglio ottenere le migliori pratiche piuttosto che come è risolto da persone che hanno dovuto risolverlo ma non ne avevano idea.
Piotr Migdal,

Risposte:


12

Quello che sto usando è una sorta di soluzione ibrida:

  • backup dei dati grezzi
  • git del flusso di lavoro
  • istantanee manuali del flusso di lavoro + dati elaborati, che sono rilevanti, ad esempio:
    • preelaborazione standard
    • richiede molto tempo
    • per la pubblicazione

Ritengo che raramente sia sensato avere una cronologia completa delle revisioni di una grande quantità di dati binari, perché il tempo necessario per rivedere le modifiche alla fine sarà così travolgente da non ripagare a lungo termine. Forse una procedura di snapshot semi-automatica (eventualmente per risparmiare spazio su disco, non replicando i dati invariati su diverse istantanee) sarebbe di aiuto.


Bene, sto usando find . -type f -print0 | xargs -0 md5sum > checksums.md5per calcolare i checksum e md5sum -c checksums.md5ai checksum e la versione controlla i checksum. Ciò aiuta a controllare i dati in posizioni diverse / su macchine diverse. Sembra essere il meglio che possiamo fare al momento,
Johann,

Se modificando i tuoi dati, cambi sempre il nome del file, allora potrebbe essere una buona soluzione. Altrimenti, consiglio vivamente di controllare i dati stessi, ad esempio con rsync(una copia) dei dati originali. Un'altra possibilità che è comune nelle neuroscienze (anche se non mi piace così tanto perché a volte non è così ben documentata come dovrebbe essere), è usare il pacchetto nipype python, che può essere visto come un (tipo di) flusso di lavoro manager e gestisce automaticamente la cache dei dati binari delle fasi intermedie dell'analisi.
norok2

@norok hai descritto un ottimo quadro generale. Ho implementato qualcosa di simile nello strumento DVC: dai un'occhiata alla mia risposta di seguito. Apprezzerei il tuo feedback.
Dmitry Petrov,

9

Ho affrontato problemi simili con set di dati di biologia sintetica molto grandi, in cui disponiamo di molti, molti GB di dati di citometria a flusso distribuiti su molte, molte migliaia di file e abbiamo bisogno di mantenerli coerentemente tra i gruppi di collaborazione in (più) diverse istituzioni.

Il tipico controllo di versione come svn e git non è pratico per questa circostanza, perché non è progettato per questo tipo di set di dati. Invece, siamo passati all'utilizzo delle soluzioni di "cloud storage", in particolare DropBox e Bittorrent Sync. DropBox ha il vantaggio di fare almeno un po 'di log primitivo e di controllo della versione e di gestire i server per te, ma lo svantaggio è che è un servizio commerciale, devi pagare per l'archiviazione di grandi dimensioni e stai mettendo i tuoi dati non pubblicati su un deposito commerciale; non devi pagare molto, però, quindi è un'opzione praticabile. Bittorrent Sync ha un'interfaccia molto simile, ma la esegui tu stesso sui tuoi server di archiviazione e non ha alcun controllo della versione. Entrambi hanno ferito la mia anima programmatrice, ma sono le migliori soluzioni che i miei collaboratori e io abbiamo trovato finora.


Esiste una popolare versione open source di Dropbox, OwnCloud. Non l'ho provato, però.

9

Ho usato il versioning sui bucket Amazon S3 per gestire 10-100 GB in 10-100 file. Il trasferimento può essere lento, quindi ha aiutato a comprimere e trasferire in parallelo, o semplicemente eseguire calcoli su EC2. La libreria boto offre una bella interfaccia Python.



6

Non controlliamo la versione dei file di dati effettivi. Non vorremmo nemmeno se lo avessimo archiviato come CSV anziché in forma binaria. Come ha detto Riccardo M. , non passeremo il tempo a rivedere le modifiche riga per riga su un set di dati di 10 milioni di righe.

Invece, insieme al codice di elaborazione, controllo la versione dei metadati:

  • Data di modifica
  • Dimensione del file
  • Conteggio righe
  • Nomi delle colonne

Questo mi dà abbastanza informazioni per sapere se un file di dati è cambiato e un'idea di cosa è cambiato (ad es. Righe aggiunte / cancellate, colonne nuove / rinominate), senza stressare il VCS.


5

Questo è un problema abbastanza comune. Ho avuto questo dolore quando ho fatto progetti di ricerca per un'università e ora - in progetti di scienza dei dati industriali.

Ho creato e recentemente rilasciato uno strumento open source per risolvere questo problema: DVC .

Fondamentalmente combina il tuo codice in Git e i dati nel tuo disco locale o cloud (archiviazione S3 e GCP). DVC tiene traccia della dipendenza tra dati e codice e crea il grafico delle dipendenze (DAG). Ti aiuta a rendere riproducibile il tuo progetto.

Il progetto DVC potrebbe essere facilmente condiviso: sincronizza i tuoi dati su un cloud (comando di sincronizzazione dvc), condividi il tuo repository Git e fornisci l'accesso al tuo data bucket nel cloud.

"apprendibile in poche ore" - è un buon punto. Non dovresti avere problemi con DVC se hai familiarità con Git. Hai davvero bisogno di imparare solo tre comandi:

  1. dvc init- mi piace git init. Dovrebbe essere fatto in un repository Git esistente.
  2. dvc import- importa i tuoi file di dati (fonti). File o URL locale.
  3. dvc run- passaggi del flusso di lavoro come dvc run python mycode.py data/input.jpg data/output.csv. DVC deriva automaticamente la dipendenza tra i tuoi passi, crea DAG e lo mantiene in Git.
  4. dvc repro- riprodurre il tuo file di dati. Esempio: vi mycode.py- cambia codice, quindi dvc repro data/output.csvriprodurrà il file (e tutte le dipendenze.

Devi imparare un altro paio di comandi DVC per condividere i dati attraverso il cloud e le competenze di base di S3 o GCP.

Il tutorial DVC è il miglior punto di partenza - "Controllo versione dati: apprendimento automatico iterativo"


1
Può essere utilizzato solo con l'archiviazione di file binari di grandi dimensioni (principalmente video). ML non è l'obiettivo. L'obiettivo è avere un repository per archiviare file binari di grandi dimensioni. Repo dovrebbe avere cache, checkout / pull selettivi (come perforce) e meccanismo di blocco di file / directory. È adatto a tale scopo?
hemu,

1
@hemu Sì. DVC funziona perfettamente per lo scenario di file di dati di grandi dimensioni di base senza funzionalità ML (come pipeline ML e riproducibilità). La semantica del blocco della forza non è supportata a causa della semantica Git. Si prega di utilizzare il checkout per file.
Dmitry Petrov,


0

Puoi dare un'occhiata al mio progetto chiamato DOT: Gestore del repository di Tracker oggetti distrubati.
È un VCS molto semplice per file binari per uso personale (nessuna collaborazione).
Utilizza SHA1 per il checksum e la deduplicazione a blocchi. Sincronizzazione P2P completa.
Una caratteristica unica: adhoc server TCP una volta per pull / push.
Può anche usare SSH per il trasporto.

Non è ancora stato rilasciato, ma potrebbe essere un buon punto di partenza.
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

Potresti provare a usare l' hangar . È un player relativamente nuovo nel mondo del controllo della versione dei dati, ma fa davvero un buon lavoro eseguendo il versioning dei tensori anziché il BLOB. La documentazione deve essere il posto migliore per iniziare. Poiché i dati vengono archiviati come tensori, dovresti essere in grado di usarli direttamente all'interno del tuo codice ML (inoltre l'hangar ha ora caricatori di dati per PyTorch e Tensorflow). Con l'hangar, puoi ottenere tutti i vantaggi di git come la ramificazione a costo zero, la fusione, il viaggio nel tempo attraverso la storia. Una bella caratteristica della clonazione nell'hangar è che potresti fare una clonazione parziale . Ciò significa che se si dispone di 10 TB di dati sul telecomando e sono necessari solo 100 MB per la prototipazione del modello, è possibile recuperare solo 100 MB tramite la clonazione parziale anziché un clone completo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.