DVC(Data Version Control)を触ってみた
機械学習という言葉を耳にし始めた頃に興味を持ってあれこれ調べていた時期がありましたが、そこから随分と遠のいてしまいました。久々に機械学習について触れる機会が出てきたので、学び直しです。
久々に色々と情報収集している中でDVCというキーワードをよく目にする印象があったので、何ごとも試してみる精神で触ってみることにしました。
DVCとは?
DVC(Data version Control)は、Gitのようなバージョン管理をデータや機械学習のワークフローに適用できるツールです。機械学習プロジェクトでは、コードだけでなくデータやモデルの管理も重要ですが、DVCを使うとデータセットのバージョン管理や再現性の確保が容易になります。
なぜ機械学習にはDVCのような仕組みが求められるのか?
ChatGPT先生に聞いてみたり、ググってみたりしたところ、機械学習のプロジェクトでは、コードのバージョン管理だけでなく、データやモデルの管理も重要な要素のようです。
- データの変化が結果に影響する: 機械学習では、データのわずかな変更がモデルの精度や挙動に大きな影響を与えます。そのため、データのバージョン管理が欠かせません。
- 再現性の確保: 過去の実験を再現するには、特定のコードバージョンだけでなく、使用したデータセットやハイパーパラメータも正確に管理する必要があります。
- 大規模データの扱い: 一般的なGitリポジトリでは、数十GBやTB単位のデータを管理するのは現実的ではありません。DVCのような仕組みを導入することで、ストレージの負担を抑えつつ、バージョン管理を実現できます。
- チーム開発の効率化: 機械学習プロジェクトでは、データサイエンティストやエンジニアが協力して開発を進めることが多いため、統一したデータ管理の仕組みが求められます。
AIなどが身近になってきた今では、どんなデータで学習させたかによってモデルの精度や品質が変わってくることを理解するのは難しくですね。
もちろん、DVCがベストな方法かは分かりませんが、知識の1つの点を手に入れるという意味で触ってみることにします。
インストール
公式ドキュメントにはWindows、macOS、Linuxの各OSごとに手順が記載されています。ここではmacOSを例にインストール手順を紹介します。
brew install dvc
ツールのインストールが完了したら、バージョンを表示するコマンドを実行してみます。
$ dvc --version 3.59.0
バージョンが表示されたので、無事にインストールが完了していることが確認できました。
DVCの基本的な使い方
1. プロジェクトの初期化
Gitと同様に、DVCもプロジェクトの初期化が必要です。
DVCを使用するプロジェクトのルートディレクトリで以下のコマンドを実行します。
mkdir dvc-sample dvc init
ERROR: failed to initiate DVC - /Users/xxxxxx/Documents/works/dvc-sample is not tracked by any supported SCM tool (e.g. Git). Use `–no-scm` if you don’t want to use any SCM or `–subdir` if initializing inside a subdirectory of a parent SCM repository.
ソースコード管理ツール(SCM)が初期化されていないため、エラーが発生しました。Gitリポジトリを初期化してから再度実行します。
git init dvc init
$ tree . -a -L 1 . ├── .dvc ├── .dvcignore └── .git
プロジェクトの初期化が完了しました。.dvc
ディレクトリが作成され、DVCの設定ファイルが格納されています。
ここまでの流れはGitを使ったことがある方には馴染みやすいかと思います。
公式ドキュメントには、ここで1度Gitのコミットを作成する手順が記載されていますので、同じように進めます。
git status
git commit -m “Initialize DVC”
2. データの管理
DVCを使って管理対象にするデータを用意します。ここでは、公式ドキュメントにある例を使ってみます。
dvc get https://github.com/iterative/dataset-registry get-started/data.xml -o data/data.xml
これによりGitHubリポジトリからデータをダウンロードし、data/data.xml
というファイルが作成されます。
$ tree . -a -L 1 . ├── .dvc ├── .dvcignore ├── .git └── data
./data
ディレクトリの中を見てみるとdata.xml
がダウンロードされていることが確認できました。
$ tree ./data -a -L 1 ./data └── data.xml
次に、DVCでデータを管理対象に登録します。
dvc add data/data.xml
このコマンドを実行すると、.dvc
ファイルが作成され、データファイルが管理対象になります。
また、.gitignore
ファイルも自動的に作成されて、データファイルがGitの管理対象から外れるようになります。
$ tree ./data -a -L 1 ./data ├── .gitignore ├── data.xml └── data.xml.dvc
data.xml.dvc
ファイルを見ると、データファイルのハッシュ値などが記載されていました。
outs:
- md5: 22a1a2931c8370d3aeedd7183606fd7f size: 14445097 hash: md5 path: data.xml
git add . git commit -m “Add raw data”
ここまでの流れでGit上で直接データを管理せずに、DVCを使ってデータ管理ができるようになりました。
1人称であればここまでで十分かもしれませんが、チームで開発を行う場合は、Gitでいうリモートリポジトリのようなものが必要になります。
3. リモートストレージの設定
DVCでは、データをリモートストレージにアップロードすることができます。AWSのS3などクラウドストレージを使うことができますが、ここではローカルのディレクトリをリモートストレージとして設定してみます。
mkdir ~/dvc-storage dvc remote add -d myremote ~/dvc-storage
この設定を保存し、データをアップロードします。
dvc push
先ほど作成した擬似的なリモートストレージにデータがアップロードされたことを確認します。
$ tree ~/dvc-storage /Users/xxxxx/dvc-storage └── files └── md5 └── 22 └── a1a2931c8370d3aeedd7183606fd7f
3 directories, 1 file
データの取得
別の環境でデータを取得する場合、以下のコマンドを実行します。
dvc pull
これにより、リモートストレージからデータがダウンロードされます。
データの変更
ここまで触ってみて、なんとなくGitライクな操作方法でやれることがわかり、想像ができそうなので簡単に書かせてもらいます。
DVCで管理対象としている./data/data.xml
ファイルを変更したら、dvc add
コマンドを使って変更を反映します。
dvc push
コマンドを実行してリモートリポジトリに変更をアップロードします。
git commit
で変更をコミットし、リモートリポジトリにプッシュします。
バージョン間の切り替え
DVCでは、バージョン間を切り替えることができます。
git checkout
コマンドでコードのバージョンを切り替えた後、dvc checkout
コマンドでデータのバージョンも切り替えます。
git checkout <…> dv checkout
Git LFSとの違いは?
同じようによく耳にするキーワードとして、Git LFSがあります。
Git LFS(Git Large File Storage)は、Gitの拡張機能で、大容量のファイルや頻繁に更新されるバイナリファイルを効率的に管理するためのものです。
仕組みとしてはどちらも同じような機能を提供しているようにみえますが、想定されている使用用途が異なるのかなと理解しました。
- Git LFS: 画像や音声、動画などソースコード上で使用される大きいサイズのファイルを管理するのに適している
- DVC: 機械学習プロジェクトで使用されるデータセットやモデルを管理するのに適している
この辺りはもう少し理解が必要そうですが、あまり活用しているような話は見かけないような印象でした。
まとめ
使いこなすにはまだまだ理解が必要な部分が多いですが、機械学習ではモデルを学習するためにどんなデータを使ったのかなどの情報を適切に管理することが大切だということを理解できました。どんなデータで学習したのかのデータ管理が大切だからこそ、データのバージョン管理システムなどのツールが求められているのだと感じました。
まだまだ、奥深しい世界で学ぶことが沢山ありそうですが、引き続きブログに書きながら学習を進めてみたいと思います。