dvcによるデータの管理をしてみた
はじめに
最近ではKaggleなどでkernelをsubmitしてコンペティションに参加するなどデータ分析においてもデータの管理や試行した履歴を残すといった再現性により一層注目が集まっていると感じております.
そんな中でデータのバージョン管理ツールとしてdvc(Data Version Control)というデータやモデルといった大きいデータを管理するツールがあります.
今回はdvcを試しに使ってデータ管理を行ってみましょう.
dvcのインストール
dvcはGitと連携して基本的に利用します.
また,dvcのコマンドはGitライクに作成されているためGitを扱える人にとっては比較的低い学習コストで導入することができます.
dvcの仕組みを簡単に説明すると,dvc add
でデータやモデルなどをdvcの管理対象として設定し, 生成された .dvc
ファイルをGitで管理することによってサイズの大きいデータをgitで管理することなくバージョン管理を実現します.
さて以降ではdvcを実際に使って試して行きましょう.
本記事の実行環境は以下になります.
- Python 3.6.9
- DVC 0.86.2
では,はじめにインストールを行います.
$ pip install dvc
Pip以外にもHomebrewやcondaなど複数のインストール方法が提供されていますのでご自身の環境に合わせて選択ください.
dvcの使い方
次に実際に dvc を利用してデータを管理してみましょう.
簡単のためファイルを保存する先はローカルの別ディレクトリとします.
git
とdvc
の初期化
$ mkdir sample $ cd sample $ git init $ dvc init $ git commit -m "Initialize commit"
- ローカルの保存先の指定
ローカルのディレクトリを設定します.
dvcで管理したデータは指定したディレクトリに保存されます.
$ dvc remote add -d mylocal /tmp/local_storage
- データファイルのダウンロード
ブランチ名 data_1
に対してdvcの公式が公開している data.xml
をダウンロードして data
ディレクトリ配下に配置します.
$ git checkout -b data_1 $ mkdir data $ wget https://data.dvc.org/get-started/data.xml -O data/data.xml
- dvcによるデータ管理
ダウンロードした data.xml
を dvc で管理対象にしてさらに git で.dvc
ファイルを管理します.
dvc add
で指定すると.dcvファイルが生成されるので,このファイルをgitで管理することでバージョン管理できるようになります.
$ dvc add data/data.xml $ dvc push $ git add data/.gitignore data/data.xml.dvc $ git commit -m "add data.xml"
- 別のブランチに切り替えて別のデータを管理する
新たに master
ブランチから data_2
ブランチを作成して,test.gif
をdata配下に保存します.保存後dvcで管理していきます.
$ git checkout master $ git checkout -b data_2 $ wget https://www.electrictoolbox.com/images/icons/linux-bsd.gif -O data/test.gif $ dvc add data/test.gif $ dvc push $ git add data/test.gif.dvc data/.gitignore $ git commit -m "add test.gif"
- 各ブランチで管理しているdataを削除する
先ほど管理した data_1
と data_2
のブランチで作成したdata.xml
と test.gif
を削除します.機械学習でデータを削除することは比較的少ないと思うので意外と新鮮な感じになります.
$ git checkout data_1 $ rm data/data.xml $ git checkout data_2 $ rm data/test.gif
- .dvcファイルで記載した内容のデータを取得する
data_1
ブランチで管理しているsample.csvをローカルの保存先から dvc pull
で取得します.
$ git checkout data_1 $ dvc pull $ ls data sample.csv sample.csv.dvc
data_2
ブランチも同様にデータを取得します.
$ git checkout data_2 $ dvc pull $ ls data train.gif train.tsv.gif
このように.dvcファイルと紐づいたデータ,.dvcファイルと紐づいたgitという形でバージョンとデータを紐づけることができます.
チームで分析する時や再現性を確保する時には非常に有効なツールとして活用できそうです.
ファイル保存先をリモートサーバに設定
そして,最後にデータの保存先をローカルではなくリモートのサーバ等に設定する場合の方法を記載しておきます.
企業などの環境によってはクラウドストレージなどが利用できない場合などがあるかと思うので,オンプレのリモート環境をハブにしてデータを授受する方法で対処することが想定されます.
以下にその方法を記載しておきます.
データを保存する際のコマンドは共通なので,設定のみを変更すればリモートサーバをストレージとして利用できます.デフォルトではsshに必要なライブラリが不足しているため以下のコマンドを用いてdvcを拡張します.
$ pip install dvc[ssh]
今回は以下の条件をストレージとして利用する場合の設定を記載します.
- ホスト: example.com
- ストレージパス: /home/user/tmp
- ユーザ名: user
- 認証: private key
$ dvc remote add remote_storage ssh://user@example.com:22/home/user/tmp
リモートの接続にはparamikoを介して行っており,公開鍵認証に利用する秘密鍵にパスフレーズを設定している場合は追加で設定が必要になります. 下記設定をしない場合はエラーが発生して正常に動作しないので注意してください.
$ dvc remote modify remote_storage ask_password true
これでリモートサーバをストレージとして利用することができます.
$ dvc push --remote remote_storage
まとめ
今回はdvcの使い方とリモートサーバをストレージとして利用した場合の設定方法をご紹介しました.非常に便利なので今後も継続的に利用していきたいと思います.
今度はS3などのクラウドストレージを利用する場合も試して見ようと思います.