tkherox blog

データサイエンスおよびソフトウェア開発、たまに育児についての話を書いています

dvcによるデータの管理をしてみた

はじめに

最近ではKaggleなどでkernelをsubmitしてコンペティションに参加するなどデータ分析においてもデータの管理や試行した履歴を残すといった再現性により一層注目が集まっていると感じております.
そんな中でデータのバージョン管理ツールとしてdvc(Data Version Control)というデータやモデルといった大きいデータを管理するツールがあります. 今回はdvcを試しに使ってデータ管理を行ってみましょう.

dvc.org

dvcのインストール

dvcはGitと連携して基本的に利用します.
また,dvcのコマンドはGitライクに作成されているためGitを扱える人にとっては比較的低い学習コストで導入することができます. dvcの仕組みを簡単に説明すると,dvc add でデータやモデルなどをdvcの管理対象として設定し, 生成された .dvc ファイルをGitで管理することによってサイズの大きいデータをgitで管理することなくバージョン管理を実現します.
さて以降ではdvcを実際に使って試して行きましょう.

本記事の実行環境は以下になります.

では,はじめにインストールを行います.

$ pip install dvc

Pip以外にもHomebrewやcondaなど複数のインストール方法が提供されていますのでご自身の環境に合わせて選択ください.

dvc.org

dvcの使い方

次に実際に dvc を利用してデータを管理してみましょう.
簡単のためファイルを保存する先はローカルの別ディレクトリとします.

  • gitdvc の初期化
$ 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_1data_2 のブランチで作成したdata.xmltest.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などのクラウドストレージを利用する場合も試して見ようと思います.