大量の(バイナリ)データのバージョン管理を処理する方法


46

私は地球物理学の博士課程の学生であり、大量の画像データ(数十GB、数万のファイル)を扱っています。私はプロジェクトの歴史を十分に知ってsvnおりgit、大切にし、簡単に連携し、ディスクの破損から保護する能力を備えています。私は見つけることgitも一貫性のあるバックアップを持つために非常に役立つが、私はそのgitのが効率的に大量のバイナリデータを扱うことができない知っています。

修士課程の研究では、同様のサイズのデータ​​セット(画像も)に取り組み、さまざまなサーバー/デバイスでさまざまなバージョンを追跡するのに多くの問題がありました。ネットワーク上で100GBを差分するのは本当に面白くなく、多くの時間と労力がかかります。

科学の他の人たちも同様の問題を抱えているようですが、良い解決策を見つけることができませんでした。

私は研究所のストレージ設備を使いたいので、「ダム」サーバーを使用できるものが必要です。また、可能な限りネットワーク上で数百GBの転送を避けたいので、ポータブルハードディスクに追加のバックアップを作成したいと思います。したがって、複数のリモートロケーションを処理できるツールが必要です。

最後に、他の研究者が使用できるものが本当に必要なので、それは非常に単純である必要はありませんが、数時間で学習できるはずです。

私は多くの異なるソリューションを評価しましたが、法案に合うものはありません:

  • SVNはやや非効率的であり、スマートサーバーが必要です
  • hg bigfile / largefileは1つのリモートのみを使用できます
  • git bigfile / mediaはリモートを1つしか使用できませんが、あまり効率的でもありません
  • 屋根裏部屋にはログや差分機能がないようです
  • bupは本当に良さそうですが、動作するには「スマート」サーバーが必要です

私は試してみましたがgit-annex、これは私がそれを行うために必要なすべてのことを行います(そしてそれ以上)私はこれを数日間使用しましたが、頭を動かすことができなかったので、他の同僚が興味を持っているとは思いません。

研究者は大規模なデータセットをどのように扱い、他の研究グループは何を使用していますか?

明確にするために、私は主に、この特定のデータセットだけでなく、他の研究者がこの状況にどのように対処するかに興味があります。ほとんどの人がこの問題を抱えているはずですが、それを解決した人は誰も知りません。元のデータのバックアップを保持し、このバージョン管理機能をすべて忘れる必要がありますか?それは他のみんながやっていることですか?


1
@scaaahuこれは必ずしもソフトウェアの質問だとは思わない。受け入れられる答えは、ワークフローまたはツールとシステムの組み合わせを記述することもできます。(とにかく、他のどこかで話題になっていることは、ここで質問を閉じる決定に

2
画像データによるデータ破損から保護するために、チェックサムファイルをすべてのファイルとmd5チェックサムで再計算するスクリプトを定期的に実行します。チェックサムファイルはgitに保存されます。チェックサムのいずれかが変更された場合、git diffですぐに確認できます。また、どのファイルが削除および追加されたかを確認することもできます。また、たとえばデータ破損の兆候がある場合は、定期的なバックアップを使用して古いバージョンを復元できます。完璧ではありませんが、何もないよりはましです。

1
@JukkaSuomela非常に大きなデータセットがあり、それらのデータセットが頻繁に変更される場合、それは合理的な質問だと思います...そのような場合、バックアップバージョン管理として使用されること多いです

1
この質問は学問に固有のものではなくデータ/データベースを扱うため、トピック外としてこの質問を終了することに投票しています。質問は素晴らしく、(IMHO)はDataScience.SEまたは(おそらく)Databases.SEに移動する必要があります。
ピョートルミグダル

1
@Johannデータサイエンティストの背景は異なります。私の例は量子力学です。ここでの全体のポイントは次のとおりです。1。StackExchangeは、いわゆるボートの質問を思いとどまらせます。
ピョートルミグダル

回答:


12

最終的に使用しているのは、一種のハイブリッドソリューションです。

  • 生データのバックアップ
  • ワークフローのgit
  • 関連するワークフローの手動スナップショット+処理されたデータ。例:
    • 標準前処理
    • 本当に時間がかかります
    • 出版用

大量のバイナリデータの完全な修正履歴を取得することはあまり賢明ではないと思います。これは、最終的に変更を確認するのに時間がかかりすぎて長期的に見返りが得られないためです。半自動スナップショット手順(最終的には、異なるスナップショット間で変更されていないデータを複製しないことにより、ディスク領域を節約するため)が役立つでしょう。


さて、私はfind . -type f -print0 | xargs -0 md5sum > checksums.md5チェックサムの計算とチェックサムの使用md5sum -c checksums.md5、およびチェックサムのバージョン管理に使用しています。これは、異なる場所/異なるマシン上のデータをチェックするのに役立ちます。私たちが現時点でできることは最高のようです
ヨハン

データを変更することにより、常にファイル名を変更する場合、それは良い解決策かもしれません。それ以外の場合は、たとえばrsync元のデータ(のコピー)でデータ自体を確認することを強くお勧めします。神経科学で一般的なもう1つの可能性(私はそれが必要とされるほど十分に文書化されていないためあまり好きではありませんが)、nipype pythonパッケージを使用することですマネージャと分析の中間ステップのバイナリデータのキャッシュを自動的に管理します。
-norok2

@norokすばらしい一般的なフレームワークについて説明しました。私はDVCツールに似たようなものを実装しました-以下の私の答えを見てください。フィードバックをお願いします。
ドミトリーペトロフ

9

私は非常に大きな合成生物学データセットで同様の問題に対処しました。そこでは、非常に多くのGBのフローサイトメトリーデータが多数の何千ものファイルに分散しており、(複数の)異なる機関の協力グループ間でそれらを一貫して維持する必要があります。

svnやgitのような典型的なバージョン管理は、このようなデータセット向けに設計されていないため、この状況では実用的ではありません。代わりに、「クラウドストレージ」ソリューション、特にDropBoxBittorrent Syncを使用することになりました。DropBoxには、少なくともいくつかの基本的なログ記録とバージョン管理を行い、サーバーを管理するという利点がありますが、商用サービスであり、大容量のストレージを支払う必要があり、未公開のデータを商用ストレージ; ただし、多くを支払う必要はありませんので、実行可能なオプションです。Bittorrent Syncのインターフェイスは非常に似ていますが、独自のストレージサーバーで自分で実行し、バージョン管理はありません。両方とも私のプログラマーの心を傷つけますが、彼らは私の協力者と私がこれまでに見つけた最高の解決策です。


Dropboxの一般的なオープンソースバージョン、OwnCloudがあります。しかし、私はそれを試していません。

9

Amazon S3バケットでバージョニングを使用して、10-100ファイルで10-100GBを管理しました。転送は低速になる可能性があるため、圧縮と転送を並行して実行したり、単にEC2で計算を実行したりするのに役立ちました。botoのライブラリは、素敵なPythonインタフェースを提供します。



6

実際のデータファイルのバージョン管理は行いません。バイナリ形式ではなく、CSVとして保存したとしても、これはしたくないでしょう。Riccardo M.が言ったように、10M行のデータセットの行ごとの変更を確認する時間を費やすつもりはありません。

代わりに、処理コードとともに、メタデータをバージョン管理します。

  • 変更日
  • ファイルサイズ
  • 行数
  • 列名

これは私の知るための十分な情報提供した場合、データファイルが変更されたとの考え VCSを強調せずに、(例えば、行を追加/削除、新しい/名前を変更した列)に変更しましたが。


5

これは非常に一般的な問題です。大学の研究プロジェクトを行ったとき、そして今、産業データ科学プロジェクトでこの痛みを感じました。

この問題を解決するためのオープンソースツールDVCを作成し、最近リリースしました。

基本的に、Gitのコードとローカルディスクまたはクラウド(S3およびGCPストレージ)のデータを組み合わせます。DVCは、データとコード間の依存関係を追跡し、依存関係グラフ(DAG)を作成します。プロジェクトを再現可能にするのに役立ちます。

DVCプロジェクトは簡単に共有できます-データをクラウドに同期し(dvc syncコマンド)、Gitリポジトリを共有し、クラウド内のデータバケットへのアクセスを提供します。

「数時間で学習可能」-良い点です。Gitに精通していれば、DVCに問題はないはずです。本当に必要なコマンドは3つだけです。

  1. dvc init-のようなgit init。既存のGitリポジトリで実行する必要があります。
  2. dvc import-データファイル(ソース)をインポートします。ローカルファイルまたはURL。
  3. dvc run-のようなワークフローのステップdvc run python mycode.py data/input.jpg data/output.csv。DVCは、ステップ間の依存関係を自動的に導出し、DAGを構築してGitに保持します。
  4. dvc repro-データファイルを再現します。例:vi mycode.py-コードを変更dvc repro data/output.csvすると、ファイル(およびすべての依存関係)が再現されます。

クラウドおよび基本的なS3またはGCPスキルを介してデータを共有するには、さらに2つのDVCコマンドを学習する必要があります。

DVCチュートリアルが最適な出発点です- 「データバージョン管理:反復機械学習」


1
これは、大きなバイナリファイル(主にビデオ)を保存する場合にのみ使用できます。MLは目標ではありません。目標は、大きなバイナリファイルを保存するリポジトリを持つことです。リポジトリには、キャッシュ、選択的チェックアウト/プル(perforceなど)、およびファイル/ディレクトリロックメカニズムが必要です。そのような目的に適していますか?
-hemu

1
@hemuはい。DVCは、ML機能(MLパイプラインや再現性など)のない基本的な大規模なデータファイルシナリオで問題なく動作します。Gitセマンティクスのため、Perforceロックのセマンティクスはサポートされていません。代わりにファイルごとのチェックアウトを使用してください。
ドミトリーペトロフ


0

DOT:Distrubuted Object Trackerリポジトリマネージャーという私のプロジェクトをご覧ください。
個人用(コラボレーションなし)のバイナリファイル用の非常にシンプルなVCSです。
チェックサムとブロック重複排除にSHA1を使用します。完全なP2P同期。
1つのユニークな機能:プル/プッシュ用のアドホックワンタイムTCPサーバー。
また、転送にSSHを使用できます。

まだリリースされていませんが、良い出発点になるかもしれません。
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

格納庫を使用してみてください。データバージョン管理の世界では比較的新しいプレーヤーですが、blobをバージョン管理するのではなく、テンソルをバージョン管理することで、本当に素晴らしい仕事をしています。ドキュメントは、開始するのに最適な場所でなければなりません。データはテンソルとして保存されているため、MLコード内で直接使用できるはずです(さらに、格納庫にはPyTorchおよびTensorflowのデータローダーがあります)。格納庫を使用すると、ゼロコストの分岐、マージ、タイムトラベルの履歴など、gitのすべての利点を得ることができます。格納庫でのクローン作成に関する素晴らしい機能の1つは、部分的なクローン作成ができることです。つまり、リモートに10 TBのデータがあり、モデルのプロトタイピングに100 MBしか必要ない場合、完全クローンではなく部分クローンで100 MBのみをフェッチできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.