機械学習のためのGithub、CometMLを使ってみた
CometMLとは
開発をする際にGithubを使うことが多いと思いますが、機械学習のような開発段階でも実験を重ねる場合にはGithubは相性が良くないなと感じていました。
その課題を解決するサービスがCometMLです。やはり同じ課題を感じている人は多く、記事をシェアするだけで結構いいねが付きましたw
このサービスは、機械学習の実験を管理するための様々な便利機能を提供しています。今回は簡単に使ってみた機能などを紹介しようと思います。
何が嬉しいのか、なぜ必要なのか
機械学習プロダクトの開発工程は、一般的なソフトウェアの開発工程と異なる点が多いです。特に、構築したモデルを訓練し、その性能評価を行う「実験(Experiments)」は機械学習プロダクトの開発工程において重要なものです。
「実験」ではモデルの構造やハイパーパラメータなど、様々な条件や設定のもとで何度も行われます。どんな設定で行った実験がどんな結果になって、他の実験と比べるとどのような差異があるのか、というような記録を管理することは重要な作業になりますが、これはgitのような既存のツールでは難しいという課題がありました。
CometMLを使うことで「実験」単位の管理や比較を簡単に行えるようになり、チーム内で情報を共有しやすくなりより開発に効率的にすることが可能になります。
また、Keras,TF,PyTorch,sckit-learn,theanoに対応しているのもいいところです(Chainer対応はまだのようです…)。
実際に使ってみた
では実際にCometMLを使ってみます!
基本的な使い方は以下のとおりです。
1. comet_mlライブラリをインストール
2. プロジェクトの作成
3. cometMLのAPIキーを取得
4. 自身のソースコードにcomet_ml用のトラッキングコードを埋め込む
順番に見ていきましょう。
comet_mlライブラリをインストール
pipで一発で入ります。簡単ですw
pip install comet_ml
cometMLのAPIキーを取得
cometMLのWebサイトの右上のプルダウンメニューからProjectsページに飛びます。そのページまた右上にあるNew Projectボタンをクリックしてプロジェクトの情報を入力することで、新しいプロジェクトを作成できます。
出来上がったプロジェクトのView projectボタンをクリックすることで、プロジェクトの詳細ページに遷移します。APIキーはここに記載されています。
訓練用スクリプトにトラッキング用コードを追加
cometMLと連携したい実験のコードに、管理するためのコードを追加します。
まずExperimentクラスのインスタンスを作成します。引数として、先程取得したAPIキーとプロジェクトネームを入力してください。共通のAPI Key でプロジェクトネームごとに切り替えられるようです。
from comet_ml import Experiment
experiment = Experiment(api_key=”YOUR_API_KEY”, project_name=”project name”))
comet_mlの読み込みはソースの一番上でやる必要があるようです。
ただし、 __feature__
などを読み込んでいる場合はその下で大丈夫です。
上記以外の Experiment
クラスの引数は以下です。
team_name: Optional. Attach an experiment to a project that belongs to this team.
log_code: Default(True) — allows you to enable/disable code logging
auto_param_logging: Default(True) — allows you to enable/disable hyper parameters logging
auto_metric_logging: Default(True) — allows you to enable/disable metrics logging
parse_args: Default(True) — allows you to enable/disable automatic parsing of CLI arguments
管理するパラメータを以下のように定義し、Experimentインスタンスに渡します。
batch_size = 128
num_classes = 10
epochs = 20
num_nodes = 64
optimizer = "adam"
activation = 'relu'
params={'batch_size': batch_size,
'epochs': epochs,
'layer1_type': 'Dense',
'layer1_num_nodes': num_nodes,
'layer1_activation': activation,
'optimizer': optimizer}
experiment.log_multiple_params(params)
kerasのoptimizersで定義されているクラスでoptimizerを渡すと管理画面でnot json serializeメッセージが出てしまいました(実害はなさそう)。
そして、モデルの訓練および評価をwith句の中に入れることでトラッキングをしてくれます。
with experiment.train():
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test),
callbacks=[EarlyStopping(monitor='val_loss',
min_delta=1e-4,
patience=3,
verbose=1,
mode='auto')]
)
with experiment.test():
loss, accuracy = model.evaluate(x_test, y_test)
metrics = {
'loss':loss,
'accuracy':accuracy
}
experiment.log_multiple_metrics(metrics)
また、 experiment.log_dataset_hash(x_train)
とすることで使用したデータセットをハッシュ値としてユニークに保存してくれます。
プロジェクトの実験一覧ページの中で同じデータセットで行った実験だけを絞り込むことも出来て便利です。
実験は以下のサンプルを用いてmnistの分類を行ってみました。
Documentation: Comet let's you track code, experiments, and results on ML projects. It's fast, simple, and free for…www.comet.ml
実験結果
実験詳細ページでは以下の内容を確認、編集できます。
Chart
スクリプトで指定したパラメータの遷移を確認することが出来ます。
表示するパラメータの選択や平滑化(smoothing)の指定も出来ます。
Code
実際に訓練に使用したコードを確認できます。
APIキーが見えなくなっているのも気が利いています。
Hyper Parameters
実験で使用したハイパーパラメータが確認できます。
Metrics
Chartでも表示していたパラメータの詳細が確認できます。
ここで表示するパラメータを選択すると、Chartにそれが反映されます。
Graph definition
訓練に使用したモデルのネットワーク構造を確認できます。
Output
実験スクリプト実行時の標準出力が表示されます。
Installed Packages
実験時の環境にインストールされていたパッケージの一覧が確認できます(pip freezeした結果ですねw)。
Notes
実験毎に記録を記入することが出来ます。ここでコードと一緒に実験内容を共有できるのが便利ですね。
Pull Request
またGithubのリポジトリと連携させることでPRも送れるようです。
便利な機能
その他にもCometMLには便利な機能が用意されています。
実験結果の比較表示
複数の実験結果を並べて表示し比較することが出来ます。
Projectページで複数の実験を選択した後、Compareボタンをクリックすることで、実験結果を同時に表示して、比較が行なえます。
ハイパーパラメータチューニング
CometMLにはグリッドサーチのようなハイパーパラメータをチューニングする機能もついて居ます。
チューニングしたいパラメータをPCSフォーマットの文字列で定義し、Optimizerクラスを使用することで簡単にチューニングが行えるようです。
Optimizer — Comet.ml
ただし、これは有料プラン限定の機能なようです…
まとめ
チュートリアルに注釈つけたようなエントリーになってしまいましたが、なかなか便利な気がします。まだシードラウンドのスタートアップということで今後の改善にも期待したいです。
プロダクトとしても、ユーザーの強い課題感を解決しているように思うので、イケてる印象です。
チームでも実際に運用してみてまた知見がたまれば共有したいと思います!