D2C

DVC(Data Science Version Control System)、PyTorch、Dockerを使って、機械学習プロジェクトのデータ管理をする

1.はじめに

<自己紹介>

2020年4月よりビジネスエンジニアリング部DSチームに加わる予定の坂本と申します。 今年(2019年)の4月からD2Cでインターンに参加させていただいております。 現在は修士2年で、大学院では、分光学(赤外線や近赤外線などの光)を基にしたデータ分析に関わる研究をしています。
研究室に入ってからプログラミングなどの情報分野に関する勉強を始めたため、まだプログラミングなどの経歴は浅いですが、
そこからエンジニアや、データサイエンスの分野に関心を持ちました。 D2Cに入社した理由は、ドコモユーザーに関する膨大なデータを持っているアドテク企業であること、
また、スキルアップしていく環境を大事にしていると思ったからです。 インターン前からPythonとデータサイエンスの分野については少し勉強していたのですが、 実務については未経験であったため、
AWS、Docker、Linux、Gitなどなどは完全に初心者スタートでした。 先輩社員の方々に何度もお時間を割いて教えていただき感謝しかないです。ありがとうございます。

<課題>

機械学習プロジェクトにおける課題の一つとして、深層学習モデルを書ける人が増えてきた一方で、 そのモデルを安定運用する基盤は、世の中的にも未だベストプラクティスを模索中だそうです。 このような話をDevOpsに倣って、MLOps(Machine Learning Operations)と呼んだりします。 ✔DevOpsとは??
DevOpsは、ソフトウェア開発手法の一つ。開発 と運用 を組み合わせたかばん語であり、開発担当者と運用担当者が連携して協力する開発手法をさす。厳密な定義は存在しておらず、抽象的な概念に留まっている。Wikipediaより

今回の記事では、 DVC(Data Science Version Control System)というオープンソースのツールが、 機械学習プロジェクトを管理するための基盤作り(MLOps)に適しているかという調査に携わらせてもらいました。

<今回やってみたこと>

この記事を書くまでにやったことの概要として、 ①. AWSのEC2サーバーにPyTorchをが使うことのできるDockerコンテナを起動する ②. PyTorchを勉強:PyTorchニューラルネットワーク実装ハンドブックでPyTorchの基礎を勉強 →PyTorch未経験だったため →CNNを使った画像分類まで勉強 ③. DVCを使って機械学習プロジェクトのバージョン管理を実践

2.DVC(Data Science Version Control System)とは??

DVC イメージ図(公式ドキュメントより引用)
今回の記事のメインとなるDVCは、公式ホームページより下記のように説明されています。
DVC is built to make ML models shareable and reproducible. It is designed to handle large files, data sets, machine learning models, and metrics as well as code. 公式ホームページより DVCは機械学習モデルを共有可能、かつ再現可能にするために作られている。 これは大規模なファイル、データセット、機械学習モデル、統計的数値、および、コードを処理するように設計されている。
  • つまり、DVCというツールは、Gitがコードのバージョン管理をするように、
「データセット、機械学習モデル、そのモデルの精度などをバージョン管理することのできるツール」 ということです。
  • データサイエンスの分野では、
    • データの増減により、管理が大変なデータセット
    • パラメータのチューニングにより多数作成される機械学習モデルの管理
    などがデータサイエンティストのタスクをより一層複雑にしていると思います。
このような問題をDVCを使って解決することができれば、 MLOpsを前進させることができるかもしれない! ということになります。

3.調査の流れ

<環境構築>

やったこと ・AWS EC2サーバーを立てる。(今回はp2.xlargeをインスタンスとして選択) ・PyTorch、 Jupyter Notebookなどの開発に必要なパッケージが入っているDockerイメージをpullする。 ・そのDockerイメージをEC2サーバー内で起動。 ✔Dockerとは??
Docker(ドッカー)はコンテナ型の仮想化環境を提供するオープンソースソフトウェアである。VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少なく、仮想環境 (インスタンス) 作成や起動は速く、性能劣化がほとんどないという利点を持つ。Wikipediaより

⑴PyTorchを用いた画像分類モデルの作成

PyTorchニューラルネットワーク実装ハンドブックを参考に、CNN(Convolution Neural Network)を用いた画像分類モデルを作成しました。 データ 今回は、有名なデータセットであるcifar-10データセットを用いました。
  • 全部で60000枚のデータセット(トレーニング:50000枚,、 テスト:10000枚)
  • 画像サイズ:32ピクセル×32ピクセル
  • RGBの3チャンネルカラー画像
  • 10クラス分類
モデル
  • ネットワーク: AlexNet
  • 最適化関数: 確率的勾配降下法(SGD)
  • 損失関数: 交差エントロピー誤差
  • バッチサイズ: 64
  • 最もlossが低かった時に、重みの情報を.pth形式で保存

⑵DVCを用いたモデル、データ管理

DVCの公式ホームページ チュートリアルを参考に、モデルやデータのバージョン管理を試してみました。
  • DVCのインストール
  • ディレクトリの作成、Git、DVCの初期化
DVCのプロジェクトを実行するためのディレクトリを作成します。 Git、 DVCを初期化し、 git commitを行います。 dvc initにより作成された各ファイルを、git commitにより、Gitの管理下に置きます。
  • リモートストレージの設定
データやモデルの情報を保存しておくリモートストレージの設定を行います。
ローカルストレージを設定することも可能ですが、S3(AWS)、 Azure、 Google Cloud Strageなどのリモートストレージが使用可能です。 今回、私はAWSのS3を以下のようなコマンドでリモートストレージに設定しました。 こちらに各リモートストレージの設定方法が記述されています。
  • データをDVCで管理する
今回は、データを.npy形式にしてDVC、Gitを駆使して管理します。
あらかじめ作成しておいた画像データ;data.npyとラベルデータ;label.npyを
dvc addを用いてリモートストレージに保存し、DVCの管理下に置きます。 DVCでは、dvc adddvc runコマンドを実行することで作成される、.dvcという固有のファイルにデータやモデルなどの情報を保存します。 .dvcファイルはGitの管理下に置きます。 ✔DVCの管理下に置かれているデータを修正、変更する場合 DVCの管理下に置かれているデータを修正、変更する場合、 dvc unprotectもしくは、dvc removeコマンドを使って以前のデータファイルを削除しなければなりません。
  • データ、モデルの共有
dvc pushでリモートストレージへデータ、モデルをpushします。
dvc pullでデータ、モデルをpullすることができます。
  • プロジェクトのディレクトリ構造
本調査のプロジェクトでは、最終的に以下のようなディレクトリ構造になりました。
ディレクトリ構造
  • プロジェクトのパイプラインを作成する
こちらの作業がDVCを使用していく上での最も重要になる部分だと思っています。 dvcと機械学習プロジェクトの紐づけをして、
機械学習プロジェクトのパイプラインのステージファイル作成のために、dvc runというコマンドを使用します。 dvc runコマンドには、さまざまな条件を指定するためのオプションがあるため、そちらを先に紹介します。
  • dvc runオプション
    • -f : 出力されるステージファイルの.dvcファイルの名称。
    • -d : .dvcファイルが依存しているデータファイルやソースファイルを指定。これを指定することにより、dvcとの紐づけが可能になっている。
    • -o : コマンドによって出力されるファイル、ディレクトリを指定。
    • -M : コマンドによってmetricsファイルが出力される場合に指定。
      など
今回は、以下のようにdvc runコマンドを実行し、パイプラインを作成しました。 ⑴データの前処理、データの分割 ⑵モデルの学習 ⑶モデルの評価 ⑷Gitにコミット、DVCへのプッシュ パイプラインが問題なく作成できたら、Gitに.dvcファイルをgit addgit commitし、dvc pushを行います。 ✔この行程は各ステージファイル作成時に行ってもOKです。 作成したパイプラインは、 で確認することができます。 .dvcファイルに関するパイプラインを確認
出力に関するパイプラインを確認
  • モデル、データのバージョン管理
DVCでは、モデルのコードやデータを変更したときに、
ソースコード、モデル、モデルの精度などをバージョン管理しておくことができます。 今回は、データのバージョン管理の実践として、
本調査で用いたcifar-10データセットを半分(30000枚)にしてみました。 ⑴ まず、git checkout -b ブランチ名を実行し、新たなブランチを作成、そのブランチに移動します。 ⑵ そのブランチで として、今までのdvcデータファイルをremoveします。 ⑶ ここで、data.npy、 label.npyに当たるデータに変更を加えます。(今回の場合はデータをそれぞれ半分ずつにします。) ⑷ 新たなデータファイルをdvc addして、新たなdvcデータファイルをgit addgit commitします。 dvc reproでmasterブランチで作成したパイプラインと同じ処理を行ってくれます。 ⑹加わった変更をGitにコミットします。 dvc metrics showコマンドでバージョンごとの結果を確認することができます。
masterが本来のデータ数、half-data、half-data-2がデータを半分にした際の精度となっています。 ✔前のバージョンに移動する場合 異なるバージョンに移動する場合は、git checkoutdvc checkoutというコマンドを使用します。 < master ブランチに移動する場合 > Git、DVCのこれらのコマンドにより、データやモデル、ソースコードなどの情報がmasterブランチの情報に変更されていることが確認できました。 checkoutイメージ図(公式ドキュメントより引用)

4.まとめ

DVCを使って、機械学習プロジェクトのデータ管理、モデル管理を目的とした調査を試みました。 今回の調査で私が感じたDVCのメリット、デメリットを簡単に挙げさせていただきます。 メリット
  • データ、モデル、ソースコードをバージョンごとに管理することができる、また、それをチーム内で共有することができる。
  • 一度パイプラインを作成してしまえば、dvc reproコマンドで、一括でプログラムの処理を行ってくれる。
デメリット??
  • git checkoutdvc checkout周りでエラーが頻発し、大変だった。
    →Gitの知識がある程度無いと、エラーを起こしてしまったときに事故になりそう
  • 一連の処理が複雑なので、GUIがあると便利だなと感じた。

5.出典・参照


関連タグ