Re:ゼロから始めるML生活

どちらかといえばエミリア派です

実験管理について考える

f:id:nogawanogawa:20201204221433p:plain

この記事はMLOps Advent Calendar 2020 - Qiita7日目の記事です。

機械学習では、データサイエンティストは実に多くの実験を行い、膨大な数の実験からより良いモデルへと繋がる着想を得ていきます。 逆に言えば、機械学習に関する開発においては非常に多くの実験が行われ、それらを効率よく・適切に管理することができなければ、優れたモデルを効率よく開発することへの妨げになってしまいかねません。 このように、機械学習に関する開発において実験管理は非常に重要な役割を果たすと私は考えています。

しかし、実験管理と一口に言っても、ノートブックのバージョン管理だったり、ハイパーパラメータの違いの記録、はたまた学習時のバリデーションスコアの記録など、細かな要素は多岐にわたります。 そして、こうした細かな「やらなければならないこと」に簡単に対応することは意外と難しく、やらなければならないが具体的に何をどれだけしたら良いのかわからなくて苦労するケースも多いかもしれません。

そんなことを考えている折、こんな記事を見かけました。

neptune.ai

どうやら、世の中には様々な実験管理のサービスがあるらしく、それらの比較記事でした。 今回は、上記の記事を参考にしつつ、実験管理についてまとめてみたのでその記録です。

tl;dr;

  • 実験管理とは?
    • 機械学習モデルの開発の際に発生する大量の実験の情報を管理する事
  • なぜ必要?
    • モデル開発では大量の実験を行い、その情報の記録のコストも膨大になる
    • 一方で後から実験を参照してより良いモデルのために活用したい
    • 簡単かつ効率よく実験の内容を記録していくことがモデル開発の効率に影響を与える
  • 何を管理する?
    • 下記5項目について記録する必要があると考える
      • コードバージョン
      • データバージョン
      • ハイパーパラメータ
      • メトリクス
      • 環境
  • 実験管理の仕組みにはどんな機能が必要?
    • 下記3点が必要と考える
      • 情報の記録
      • 記録情報の可視化
      • システムとしての機能
  • これから導入するなら取りうる選択肢は?
    • SaaSを使うなら
      • MLFlow (Managed)
      • Comet.ml
      • WandB
      • Neptune.ai
    • オンプレや自前で管理で頑張るなら
      • 初手はMLFlowで問題ないと思われる
      • その他、ライブラリがたくさん作られてるのでお好みで選んでいくのが良さそう

実験管理 is なに?

Every experiment is sacred (すべての実験は神聖なもの)
Every experiment is great (すべての実験は素晴らしい)
If an experiment is wasted (実験が無駄になると)
God gets quite irate (神が怒る)
sacred, 訳:DeepL

機械学習では、一般に多くの実験が行われ、それぞれのモデルの性能を評価しながらモデルの構築を進めていきます。 実験では大掛かりな変更もあれば、パラメータを変更した程度のちょっとした変更もあり、結果として実験のパターンは非常に多くなります。 このように膨大な実験を行っていると、過去の実験でどんなことを行い、どのような結果だったかを管理ていないと、同じ実験を繰り返す羽目になったりします。 こうした状況は、モデル開発のプロセス自体に支障をきたしかねないため、実験管理は機械学習において非常に重要な要素といえます。

では、実験管理では具体的に、何を管理して、そのためにどんな機能が必要なのでしょうか?

このあたりの記事を参考に、考えてみたいと思います。

medium.com

何を管理する?

実験管理では、過去の実験についての記録を後から参照して、内容を分析できるだけの情報が記録対象として必要になります。

こちらの記事*1によれば、実験管理として主に管理対象とされるのは、

  • コードバージョン
    • どのようなコードで実験を行ったか
  • データバージョン
    • どのようなデータで学習・テストを行ったか
  • ハイパーパラメータ
    • ハイパーパラメータとして何を使用したか
  • メトリクス
    • 実験の結果、どのような結果が得られたか
    • その時のマシンリソースの使用状況はどのようなものであったか
  • 環境
    • 実際に動作したときのマシンとしてどのようなものを使用していたか

つまり、

  • 実験を再現できるだけの情報
  • その実験での結果

が記録されていることが、実験管理では重要と考えることができます。

どんな機能が必要?

実験管理において記録すべき対象がある程度わかったところで、今度はそれをどのように管理すべきかについて考えてみます。

この部分については、こちらの記事の内容を参考に考えてみたいと思います。

neptune.ai

我々が行う実験には、調整するものとその変化について注視すべきものが存在します。 そして、これらは単純なパラメータの変更というだけでは済まない場合が多く、ある程度のコードの書き換えによって調整していきます。 そのため、特定のコードの形状に固執することで管理対象を記録していくことは難しく、ある程度の柔軟性を持ちながら管理対象を記録していくことが望まれるのです

実験に使用した条件と、そのときの結果を柔軟に記録していくことがポイントであることがわかったところで、今度は実験管理の仕組みにどのような機能が求められるのかについて考えていきます。

上記の記事では、実験管理のサービスに関する比較がなされているのですが、今回はその比較に使用した軸に注目して考えてみます。

比較する軸として、サービスの概要(MLOpsのどこまでが守備範囲か、金額はいくらか、など)や対応ライブラリ(どのようなライブラリと一緒に使用できるか)を除いて考えると、

  • 情報の記録
  • 記録情報の可視化
  • システムとしての機能

の大きく3つが大まかに必要とされているように思います。 もちろん、用途やユーザーを取り巻く状況によってこれらすべてを満たす必要はない場合もありますが、実験管理のツール・サービスを検討する段階では、こうした点を考慮した上で選定をしていく必要があるかと思われます。

情報の記録

後から実験の内容を参照するという観点で考えると、なるべく詳細な実験に関する情報が記録されていたほうが後からのモデルの比較を行う際に有益であることは確かです。 実験管理としてカバーできていない場合には、実験の再現性のために別の仕組みによってその情報を記録していく必要が出てきます。

先に挙げた実験管理の管理対象は、簡易な記述をソースコードに埋め込むことで、なるべく自動で実験ごとに記録されていくことが望ましいと考えられ、実際に現在の実験管理ツールではそれらを実現しています。

記録情報の可視化

実験管理の目的から考えて、後から実験に関する情報を参照できることが必要となります。 そのため、多くの実験管理のツール・サービスでは、記録した内容を可視化するGUIツールが付属している場合がほとんどです。

ただ単純に可視化するだけでなく、それぞれの実験の内容をユーザーが見たい観点で比較するような機能が提供されています。 こうした、可視化に関する柔軟性は、モデルの比較や実験結果の分析の効率に影響すると考えられるので、なるべくユーザーが自由に操作できるような可視化になっていることが求められます。

システムとしての機能

ユーザーに関する制約によりますが、クラウド環境で開発を行ったり、オンプレ環境で開発を行う必要がある場合もあります。 個人で実験結果を管理できれば問題ない場合もあれば、チーム開発のために実験結果を共有したい場合もあります。

オンプレで実験管理が必要な場合には、当然オンプレ環境に実験管理のツールを導入できることが必要です。 チーム内で共有する際には、ユーザーに負担をかけない形でクラウドやリモート環境など、データの配置場所を柔軟に指定できることが求められます。 場合によっては、実験の結果にアクセスできるユーザーを制限したい(閲覧権限を付与したい)等の要件が必要になることもあります。

このように、実験管理のシステム自体にも必要となる要件が異なってきますので、そういった点も実験管理の仕組みとしては考える必要があります。

各サービスを確認する

実験管理がどのようなデータを記録して、どのような機能が必要とされる可能性があるのかといった概要がわかったところで、実際の実験管理のサービスについて確認してみます。

各サービス・ツールは当然異なりますし、どれが良いかはユーザーの状況にもよってきますので、ここでは

  • 現在どのようなツールが実験管理ツールとして候補になるか
  • それらにどのような特徴があるか

といった点で確認したいと思います。

MLflow

MLflow自体はOSSとしても公開もされていますが、マネージドサービスももちろんあります。

databricks.com

こちらは使ったことがないですが、デモを見る限り実験管理にとどまらず、機械学習基盤全体を提供しているような感じになります。

もちろんOSSのMLFlowも手軽に使用することもできます。 こちらについては、過去に記事も書きましたので、そちらもご参照ください。 *2*3

Comet.ml

Comet.mlは実験管理でのSaaSのサービスを提供しています。

www.comet.ml

個人的な印象としては、NN系を対象にする際の機能が充実している印象です。

Comet.mlについては過去に記事を書いていますので、そちらもご参照ください。

www.nogawanogawa.com

Weights & Biases

Weights & Biases も有名なサービスです。

www.wandb.com

個人的な印象としては、必要十分な機能をシンプルに提供している印象があります。

WandBについても過去に記事を書いていますので、そちらもご参照ください。

Weights & Biasesを使ってみた - Re:ゼロから始めるML生活

Neptune.ai

Neptuneも有名な実験管理のサービスです。

neptune.ai

個人的な感覚では、Neptune.aiは機能面ではSaaSの中でも充実していると思っています。

Neptune.aiについても過去に記事を書いていますので、そちらもご参照ください。

www.nogawanogawa.com

その他

こちらの記事を参考にするに、その他にはValohaiやVerta.ai、SageMaker Studioなどが検討対象として考えられるようです。

valohai.com

https://www.verta.ai/

aws.amazon.com

この辺りのツールについては使ったことがないので紹介だけにとどめますが、実際に選定する際には候補に入る可能性はあります。

オンプレなど

実際には、データ管理ポリシーなどの制約により、自前でオンプレ環境に実験管理の仕組みを導入する必要があることもあるかと思います。 この場合には更に選択肢は多くあり、詳しくはこちらに主なサービスが記載されています。

neptune.ai

www.reddit.com

github.com

この辺りを検討に入れつつ、使う人の事情やお財布と相談しながら使い分けるとよいかと思います。

個人的な見解ですが、実験管理の仕組みを初めて検討する際には、初手としてMLFlowが最もメジャーのように思います。 理由としては日本語での文献が多数見つかるので導入する敷居が比較的低いのと、シンプルな記述で実験に関する情報をある程度記録することができるためです。 まずMLFlowを使用してみて、足りない機能がどうしても必要になってから、他のツール・サービスを検討するという流れで十分だと思います。

感想

結構前から実験管理について記事を書こうと思っていたものの、ずっと時間が取れずにかけなかったので、良い機会だったので書いてみた次第です。

こうして調べてみると、実験管理のサービスと言っても機能は様々です。 今回は、いろんなサービスや記事を参考にしながら、「実験管理って?」と考えてみた内容になります。 これから実験管理をしていったり、実験管理を含めた機械学習基盤を作る際に、上記のSaaSを参考にユーザー目線でどのような点が必要になるかを考える必要があったので、そのへんをまとめてみました。

サービスについて、いくつか使ってみてから書いているのでおそらく大丈夫だとは思っていますが、内容に間違いがありましたらこっそりTwitterのDMとかで教えていただけると嬉しいです。

また、MLOpsのアドベントカレンダーはこちらでも行われています。

adventar.org

adventarの方には人数もたくさん参加されていて、非常に面白そうなテーマが書かれています。ご興味ある方はこちらのカレンダーもチェックしてみてはいかがでしょうか?

以上、実験管理について色々考えてみた内容になります。お粗末ではありますが、個人的に書いてて楽しかったので良しとします。