データバージョン管理ツールのDVCを導入し、データセットをDVCで管理する方法について説明します。
DVCのインストールと初期化
DVCをインストールして初期化を行います。
DVCはpip
コマンドまたはconda
コマンドでインストールします。
$ pip install dvc
または
$ conda install -c conda-forge dvc
次にDVCの初期化を行いますが、Gitの初期化を行なっていない場合は先にgit init
を実行してください。
プロジェクトルートで以下のコマンドを実行します。
$ dvc init
Initialized DVC repository.
You can now commit the changes to git.
+---------------------------------------------------------------------+
| |
| DVC has enabled anonymous aggregate usage analytics. |
| Read the analytics documentation (and how to opt-out) here: |
| <https://dvc.org/doc/user-guide/analytics> |
| |
+---------------------------------------------------------------------+
What's next?
------------
- Check out the documentation: <https://dvc.org/doc>
- Get help and share ideas: <https://dvc.org/chat>
- Star us on GitHub: <https://github.com/iterative/dvc>
コマンドを実行すると、.dvc
と.dvcignore
が作成されます。
一旦変更をコミットしましょう。
データセットの管理先を設定する(リモートストレージ)
機械学習やディープラーニングで使用するデータセットはサイズが非常に大きく、Gitリポジトリで管理するのに適していません。
ここではAmazon S3にデータセットを保存する手順で説明します。S3が使用できなくて、NASやファイルサーバーがある場合はそちらを使っていただいても構いませんし、大容量ディスクがPCに搭載されていればそちらも選択しても構いません。
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
AmazonS3FullAccess
ポリシーをもったユーザーをAWS CLIに設定します。
またアップロードするS3バケットを用意してください(アクセス範囲には十分ご注意ください)。
$ dvc remote add -d main s3://datascience-dvc-remote-storage
Setting 'main' as a default remote.
リモートストレージを設定すると、.dvc/config
に設定が書き込まれます。
[core]
remote = main
['remote "main"']
url = s3://datascience-dvc-remote-storage
リモートストレージを追加したら変更をコミットしておきましょう。
データセットを追加する
設定できたのでデータセットを追加してみます。ここではKaggleのTitanicのデータセットを登録します。
$ mkdir -p datasets/titanic
$ cd datasets/titanic
$ kaggle competitions download -c titanic
$ unzip titanic.zip
$ rm titanic.zip
$ ls
gender_submission.csv test.csv train.csv
この時点では、追加したファイルは未追跡のファイルとして認識されています。
次に、DVCで管理するように設定します。
$ dvc add datasets/titanic
100% Adding...|█████████████████████████████████████████████████|1/1 [00:00, 43.52file/s]
To track the changes with git, run:
git add datasets/titanic.dvc datasets/.gitignore
To enable auto staging, run:
dvc config core.autostage true
新たにdatasets/titanic.dvc
とdatasets/.gitignore
が作成されました。
datasets/titanic.dvc
はtitanic
ディレクトリのMD5ハッシュ等の情報を保持しており、
outs:
- md5: bf1a6a19059092be578a3807608e236c.dir
size: 93081
nfiles: 3
path: titanic
datasets/.gitignore
はDVCで管理するように指定したtitanic
ディレクトリが設定されています。
/titanic
ここまでの変更をコミットしておきましょう。
リモートストレージに保存する
今の状態は追加したデータセットをGitリポジトリの管理下から除外し、管理情報だけをGitリポジトリで管理するようにしただけです。実際のデータセットはローカルにしか存在しません。
これをさきほど設定したS3バケットに保存しましょう。
dvc push
コマンドで保存できますが、これまでの手順通りに進めた場合、以下のようにエラーが発生します。
$ dvc push
ERROR: unexpected error - s3 is supported, but requires 'dvc-s3' to be installed: No module named 'dvc_s3'
Having any troubles? Hit us up at https://dvc.org/support, we are always happy to help!
DVCではS3をサポートしていますが、追加のモジュールが必要となるようです。では、モジュールを追加します。
$ pip install dvc-s3
または
$ conda install -c conda-forge dvc-s3
DVCをインストールしたときと同じ方法でインストールしてください。インストールができたら、再度dvc push
コマンドを実行します。
$ dvc push
4 files pushed
コンソールに出力された内容をみると、4ファイル保存したようですが、datasets/titanic
ディレクトリには3ファイルしかないはずです。リモートストレージに保存されている内容を確認してみましょう。
$ aws s3 ls s3://datascience-dvc-remote-storage
PRE 02/
PRE 61/
PRE b5/
PRE bf/
$ aws s3 ls s3://datascience-dvc-remote-storage/02/
2023-01-07 22:25:47 28629 9c9cd22461f6dbe8d9ab01def965c6
$ aws s3 ls s3://datascience-dvc-remote-storage/61/
2023-01-07 22:25:47 61194 fdd54abdbf6a85b778e937122e1194
$ aws s3 ls s3://datascience-dvc-remote-storage/b5/
2023-01-07 22:25:47 3258 6943b6ee3d9af0913ee5dd83b3d729
$ aws s3 ls s3://datascience-dvc-remote-storage/bf/
2023-01-07 22:25:47 218 1a6a19059092be578a3807608e236c.dir
最後のファイルだけ.dirとなっており、上3ファイルが各CSVファイルで、一番最後がtitanic
ディレクトリになります。
リモートストレージからデータセットを取得する
前述のとおり、データセット自体はGitリポジトリで管理されていません。そのため、新たにリポジトリをclone
した場合、データセットが存在状態となります。ですので、リモートストレージからデータセットをベット取得してくる必要があります。
ここでは、titanic
ディレクトリを削除してからデータセットを取得してみます。
$ rm -rf datasets/titanic
$ dvc pull
A datasets/titanic/
1 file added
$ ls datasets/titanic
gender_submission.csv test.csv train.csv
データセットがdvc pull
コマンドを実行することで取得できました。
また、引数でdvc
ファイルを指定することで、明示的に特定のファイル/ディレクトリだけを取得することができます。
$ dvc pull datasets/titanic.dvc
必要なデータセットだけ取得できるため、実務ではこちらの方がよく使うことになると思います。ただし、DVCの管理下に追加する単位が取得できる最小単位となるため、データセット単位で管理下に加えるのか、ファイル単位で管理下に加えるのかはプロジェクトによって検討する必要があります。
最後に
DVCでは、単にデータセットを管理するツールではなく、他にも機能があります。本記事では、その中のデータセットの管理について説明しました。