nikkie-ftnextの日記

イベントレポートや読書メモを発信

DVCでデータバージョニング 素振りの記

はじめに

アイの歌声を聴かせて、冒頭17分だけでもみんな観て! nikkieです。

さて、最近、Data Science Version Control(以下、DVC)というツールがあることを知りました。
DVCでできることはたくさんあるようですが、まずは一歩目としてDVCによる、データサイエンスで扱うファイルのバージョン管理の素振りをまとめます。

目次

この記事のまとめ

以下のドキュメントやYouTube動画に沿って手を動かしています。

素振り内容

  • DVCを使ってローカルマシンとリモートストレージでデータを同期
  • DVCでデータのバージョン管理

DVCとは

iterative.ai社による「Open-source Version Control System for Machine Learning Projects」(機械学習プロジェクト向けのオープンソースバージョン管理システム)を謳うツールです。

機械学習プロジェクトでは、データやモデルといった大容量のファイルを扱います。
大きなファイルはGitでは管理しづらいのですが、Gitと合わせてDVCを使うことでバージョン管理できます!
大きなファイルの管理はDVCが担当し、言わば Gitを拡張 してくれます(どうやるかはこの後をお楽しみに)

DVCを使うことで私たちは、大きなデータセットのようなGitの外側に置いておきたいファイルにまでGitによるバージョン管理を拡張できる(動画 10:251 意訳)

DVCのインストール

DVCはPythonで実装されており、pipでインストールできます2

pip install dvc[gdrive]

リモートストレージごとに必要な依存関係を含めてインストールしました。
今回はGoogleドライブを使っていきます。

you might need to install optional dependencies: [s3], [gdrive], [gs], [azure], [ssh], [hdfs], [webdav], [oss]. (引用元

動作環境

DVCでデータバージョニング♪

初期設定の後

  • ローカルマシンとリモートストレージでデータを同期
  • DVCでデータのバージョン管理

の素振りをしていきます。

初期設定

git init
dvc init

隠しディレクトリ.dvc(とその中のファイル)と隠しファイル.dvcignoreができます3

  • .dvc/.gitignore (.dvc下のキャッシュディレクトリや一時ディレクトリを無視)
  • .dvc/config (この時点では空)
  • .dvcignore (この素振りでは扱いません)

できたファイルをgit commitして進みます。

mkdir data

以下では、機械学習プロジェクトで使う大容量ファイルをdataディレクトリに置きます。

ローカルマシンとリモートストレージでデータを同期

まずローカルマシンにデータを取得します。

dvc get https://github.com/iterative/dataset-registry get-started/data.xml -o data/data.xml

data/data.xml (14MB) のファイルが取得されます。
サイズは小さいと思うかもしれませんが、これを「機械学習プロジェクトで使う大容量ファイル」とみなして進めます。

大容量ファイルをGitではなくDVCで管理しましょう。

dvc add data/data.xml

2つのファイルができます。

  • data/.gitignore (Gitにはdata/data.xmlを無視させます)
  • data/data.xml.dvc (DVCがファイルの管理に使うメタデータ

この2つのファイルをgit commitします。

続いてGoogleドライブ(リモートストレージ)と同期しましょう。
Googleドライブ(マイドライブ以下)にフォルダを作り、URLを控えます。
https://drive.google.com/drive/folders/{ID}
URLのID部分を使って、DVCを設定します。

dvc remote add -d storage gdrive://{ID}

-dはデフォルトのリモートにする設定とのことです。
この設定により.dvc/configが変更されます。
これをgit commitしましょう。

リモートストレージの指定をしたら、データをリモートに同期しましょう。

dvc push

初回は、Googleドライブの認証・認可が必要になります。
ターミナルの出力に従い、表示されたAuthorization codeを入力すれば済みます4

ローカルのデータを消しても、リモートからpullできます5

rm data/data.xml
dvc pull

どうやら.dvc/cacheの中身とGoogleドライブが同期しているようです。

DVCでデータのバージョン管理

data/data.xmlの容量を倍にします(14MB -> 28MB)。

cp data/data.xml /tmp/
cat /tmp/data.xml >> data/data.xml

データの変更をDVCで追跡します。

dvc add data/data.xml

メタデータdata/data.xml.dvcに記録されたファイルサイズとハッシュが書き変わりました。
このファイルはGit管理しているので、Gitにコミットを作ります。

変更したデータをリモートストレージと同期しましょう。

dvc push

リモートストレージやローカルのキャッシュディレクトリには14MBのデータと28MBのデータ、両方が格納されます。
続く操作でdata/data.xml.dvcを変更し、データを取り出します。

最後にdata/data.xml14MBに戻しましょう。

まずdata/data.xml.dvcを1つ前のコミットに戻します (最新のコミットはdata/data.xmlを28MBに変えた後にdvc addした内容になっているため)。

git checkout HEAD^1 data/data.xml.dvc

メタデータdata/data.xml.dvcは14MBに戻りました。
データを戻しましょう。

dvc checkout

data/data.xmlのサイズを見ると、14MBに戻っています!

このデータを14MBで扱っていきたければ、戻したdata/data.xml.dvcgit commitします。

今回はデータをバージョン管理しましたが、データだけに限らず、モデルのファイル(pickleなど)も同様にDVCで管理できそうです!

終わりに

DVC、なかなか好感触です!
機械学習の実験を回しているとき「データ上書きしたら」って注意を払っているんですが、DVCに管理を任せると「上書きしても戻せばいいや」って前のめりにいけそうですね。
また、dvc addなどでデータのバージョン管理だけを導入できる(小さく始められる)のもよさそうです。
慣れたらパイプライン導入(おまけ参照)と進めていけそうです(バージョン管理だけ試していまいちなら引き返せる)。

おまけ:DVCで他にもできること

ここで示したデータのバージョン管理の他にも、機械学習プロジェクトを捗らせそうな機能があるようです!

パイプラインの定義・実行(dvc repro

DVCでDAGが定義でき(yamlで表現)、例えば「データ分割」「特徴量抽出」「モデル訓練」とスクリプトを順に実行させられるようです。
実行結果とパラメタはキャッシュされるので、「モデル訓練」だけパラメタを変えてパイプラインを実行できそう、捗りそう!
(AirflowやPrefectなどのワークフローエンジンのポジションをDVCも担えるってことですかね。モデル訓練でhydraなどは組合せられるのかな?)

実験管理(dvc exp

パイプラインを使って実験を回す例がYouTubeに見つかりました。
その後にdvc expがコマンドに加わったようで、こちらは積ん読です(さらに便利になっているといいな)。


  1. 文字起こしによると「and dvc is helping us extend git version control to files that we want to keep outside of git things like a big data set」

  2. https://dvc.org/doc/install#install-as-a-python-library なお、macOSbrewLinuxのパッケージリポジトリからのインストールもできます

  3. 匿名化された使用情報のオプトアウトも案内されます。オプトアウトするやり方は https://dvc.org/doc/user-guide/analytics#opting-out を参照

  4. 依存関係にPyDrive2がありました。認証・認可に関してGoogleドライブの操作は https://qiita.com/ftnext/items/60ced8bc432bec6101f0#2-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D が参考になるかもしれません(差分:Googleドライブで許可した後に表示されるAuthorization codeをターミナルに入力する必要があります)

  5. 動画にならってrm -r .dvc/cacheとキャッシュの中まで消したところ、「failed to pull data from the cloud」とエラーになりました。これはIssueなどを確認してみたいですね。再度dvc getして事なきを得ました(ファイル自体は変わらないため)