この記事は、LeapMind Advent Calendar 2019の22日目の記事です。
はじめに
ディープラーニングなどの機械学習で様々な実験を行なっていると、それに応じてたくさんのモデルが作られます。その際にどのモデルがどの学習によるものなのか、わからなくなってしまった経験はないでしょうか。プログラムのソースコードであればGITのようなバージョン管理システムを使うことで管理することができます。しかしながらGITは実験モデルのような巨大なバイナリファイルを扱うには適していません。そのようなソースコード以外のデータを管理するためのツールとして、DVCを紹介します。
前提
DVCを説明する上、こちらのTensorflow Tutorialを題材として使っていきます。見ての通り、学習したモデルを model.h5
というファイルに出力します。この model.h5
ファイルをDVCで管理していきます。
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
model.save('model.h5')
DVCのインストールと初期化
まずはDVCのセットアップです。DVCはpipからインストールできます。
$ pip install dvc
まんまですね。次にDVCをプロジェクトに対して初期化します。 と、その前にGITのリポジトリを作成します。DVCはGITと併用して使う前提となっています。
$ git init
次に、今度こそDVCの初期化をします。
$ dvc init
このコマンドにより .dvc/
というディレクトリが作られ、DVCの設定などが置かれるようになります。
次に、以下のコマンドでモデルをDVCの管理下に置きます。
$ dvc add model.h5
100% Add|██████████████████████████████████|1.00/1.00 [00:00<00:00, 2.70file/s]
To track the changes with git, run:
git add .gitignore model.h5.dvc
これにより model.h5
のコピーがDVCの管理下に置かれます。 そしてmodel.h5.dvc
が生成され、代わりに model.h5
は .gitignore
に追加されます。 model.h5.dvc
はテキストファイルで、 model.h5
のハッシュ値など、DVCでの管理情報が記録されます。GITには model.h5
の代わりに model.h5.dvc
をコミットすることで、GITに直接大きなファイルを置かなくて済むようになります。
次に、DVCの管理下においたデータを異なるディレクトリにプッシュし保管します。
$ dvc remote add -d origin ~/Projects/leapmind-advent-calendar-2019-12-22.dvc
Setting 'origin' as a default remote.
$ dvc remote list
origin /Users/takumi.nakaso/Projects/leapmind-advent-calendar-2019-12-22.dvc
$ dvc push
これにより、 dvc remote
で指定したディレクトリに model.h5
がコピーされて保管されます。これで、 model.h5
それ自体はDVCに、 model.h5.dvc
はGITに管理されるという状態になります。逆に、
$ dvc pull
とすることで model.h5
を戻すこともできます。
終わりに
いかがでしたでしょうか。gitのような使い方で、ソースコードだけではなく実験モデルのようなデータも管理することができました。他にもPipelineなど独自の便利な機能がありますので、興味があれば使ってみてください。