DVC(Data Version Control)とは
- 大量のデータをバージョン管理するツール
- この記事では、複数人でデータの登録を行う場合の注意を述べます。
特徴
- 個別のファイル単位に差分を明示してバージョン管理するツールではない。
- 大量のデータが含まれたフォルダをありのままで管理するツール。
- 対象のフォルダのmd5の値で、その時点のそのフォルダの状況を管理している。
- *.dvc は、その状態を記載している。
- dvc のコマンドは、dvc管理対象下のフォルダを登録したり、特定版のデータを取り出すこと行っている。
- dvcでの管理データはgit と連携している。
- *.dvc ファイルはgitでのバージョン管理の対象になっている。
DVCに関する記事
DVC の本家
https://dvc.org/
qiitaの記事の例
https://qiita.com/meow_noisy/items/a644547930e6f2dea12d
DVCにデータを追加するとは
dvc へのデータの追加
dvc add ${対象のファイル・フォルダ}
このとき除外したいファイルパターンは
.dvcignore
ファイルに記載しておく。
dvc push で反映する。
git add *.dvc
git commit -m "commit message"
git push
DVC で登録してあるデータを利用するには
以下の手順をふんでいけば、DVCに登録されたデータを利用するには十分だ。
$ git checkout main
$ git pull
$ dvc pull
dvc pull に失敗する場合
ケース1: DVCのデータのリモートストレージにアクセス権限がない。
対応策: リポジトリのメンテナンス担当者に問い合わせください。Google Cloud Stoage やAmazone S3などのアクセス権限をつけてもらってください。
ケース2: dvc pull で以下のエラーがでる。DVCで登録した版に比べて、dvc pullをしている側のDVCの版が古い。
対応策: 新しい版のdvcをインストールして、dvc pull を実行してください。
git の複数のPRの場合
A さんの作業
$ git checkout -b feature/some1
# file1 へのある変更をする。
$ git add file1
$ git commit -m "メッセージ"
$ git push
B さんの作業
$ git checkout -b feature/some2
# file1 への別の変更をする。
$ git add file1
$ git commit -m "メッセージ"
$ git push
例:githubでのPRの承認とマージ
- git では、同一のファイルにそれぞれ別の変更が入っていても、自動で解消できる部分は、解消してくる。
- 自動で解決できないconflictを発生した場合には、利用者の側にconflictが生じていることを告げ、conflict の解消を求めてくる。
- 利用者は、conflictを解消してcommit を行い、git psush し、PRを更新して、マージを行う。
- そのため、git自体では、異なるPRを同時に作っていても、問題なく作業を続けられる。
dvc を複数人で登録作業するときに何が起こりやすいか
- dvc pullがすること
- *.dvc にある情報を元に、フォルダに対するmd5sum の情報から、dvc管理下のフォルダの中身を再現します。
- 中身を再現するということは、.dvcignoreに書かれていないファイルについての状況は一致させるということを意味します。
- つまり、余分なファイルがあれば削除することも実施します。
失敗する方法(やっちゃダメ)
- AさんがDVCでデータを登録するためにfeature/byA のブランチを作った。
- Aさんは、変更点を作ってそのブランチに登録した。
- しかし、まだブランチのPRのマージは完了していない
- BさんがDVCでデータを登録するためにfeature/byB のブランチを作った。
- Bさんは、変更点を作ってそのブランチに登録した。
- BさんのPRは承認され、その変更点はmain(もしくは master) に反映された。
- Aさんは、Bさんによる反映を取り入れようと思って、以下の処理をする。
まずは、main を更新しておこうと思って、git checkout main; git pull
を実行する。
そして、dvc pull
を実行する。 - この時点でDVC管理下のフォルダを見る。
- 自分がDVC管理下のフォルダに追加した改変がことごとく消えていることに気づく。
起こったこと
- git pull した時点での *.dvc のmd5sumを生じたときのファイル構成になるように改変される。
- その結果、DVC管理下のフォルダにあった未登録の改変が失われる。
教訓
- DVC には、conflictを楽に避ける仕組みがない(らしい)。
どうすればいいのか
- ファイルを追加だけの場合:
- 追加予定のデータをDVC管理下のフォルダの外に退避する。
- 作りかけていたbranch は放置する。
# 以下の手続きで、mainの最新の状況にする。
$ git checkout main
$ git pull
$ dvc pull
$ git checkout -b feature/remake
# 対比していたデータを、DVC管理下の目的の場所におく
$ dvc add 追加したデータのあるフォルダ
# リモートの保存先に反映する。
$ dvc push
$ git commit -m "コミットメッセージ"
$ git push
運用への提案
- DVCでバージョン管理するデータ管理者は1名になるようにするのがのぞましい。
- 別々に改変をする場合には、conflictを生じないように、改変の変更の順序を複数のデータ管理者で調整して行ってください。
ー---
DVC のドキュメントには以下の記述があった。
適切な運用をすればなんとかなるらしい。
しかし、まだ十分確かめていない。