MLflowとは何か

Databricksのコアコンポーネントシリーズは一旦これで終了です。

https://qiita.com/taka_yayoi/items/31190da754106b2d284e

https://qiita.com/taka_yayoi/items/07c9396809edbf2699b6

Databricksにおける並列処理エンジンは**Apache Spark**、ストレージフォーマットは**Delta Lake**です。それではもう一つのコアコンポーネントである[**MLflow**](https://mlflow.org/)は何に活用されるのでしょうか？本書ではMLflowとは何か、そのメリットは何かを説明します。

かつては、Jupyter notebookで機械学習モデルを構築し、モデルをExcelで管理していた身からすると、MLflowの無い生活には戻れません。

# 背景

過去数年を通じて機械学習モデルは様々なユースケースで活用されています。そして、大規模言語モデルの出現も起爆剤となっています。
![Screenshot 2023-09-13 at 18.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8ae221f2-3f72-5455-edb6-817de9793798.png)

しかし、機械学習の営みで重要なのは機械学習モデルだけではありません。
![Screenshot 2023-09-13 at 18.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/68742c97-15c0-c9dd-1a9d-182076466a8f.png)
**出典:** https://papers.nips.cc/paper/2015/file/86df7dcfd896fcaf2674f757a2463eba-Paper.pdf

中央の緑の箱に示すように、MLコードは現実世界のMLシステムのほんの一部です。必要となる周辺のインフラストラクチャは広大で複雑です。

そして、データサイエンティストとデータエンジニアの用いる技術は大きく異なり、データも技術もサイロ化されています。
![Screenshot 2023-09-13 at 18.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/09dec065-5780-708e-bc81-4bacad80ca1f.png)

さらに、機械学習のライフサイクルはマニュアルであり、一貫性がなく分断されています。
![Screenshot 2023-09-13 at 18.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3e1bcd0e-32ec-cb1c-4a9a-103f0aa61d8c.png)

このような状況を打開するためにも**標準化**が必要です。

# 標準化の必要性

あなたがデータサイエンティストだと仮定し、モデルを構築する日々の業務をイメージしてみましょう。

何かしらの機械学習モデルを構築したものとします。
![Screenshot 2023-09-13 at 18.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7206f020-1198-e059-59f7-76c3649f21e4.png)

精度が変化したのを見て思いを巡らします。

> 特徴量エンジニアリングに変更があったのか？

![Screenshot 2023-09-13 at 18.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/496a409f-0209-5074-b05f-aff6c9645459.png)

それ以外にもいろいろなことに気を配らなくてはなりません。

> ハイパーパラメータはどのように変更された？

> このモデルをトレーニングしたデータが変更された？

> トレーニング時の精度は？

> 他に見逃していることは？

メモ帳やExcelでこれら全てを追跡することは不可能と言っても過言ではありません。

# ソフトウェアのリリースと機械学習モデルのデプロイの違い

従来からあるソフトウェアのリリースサイクルと、機械学習モデルをデプロイするサイクルも大きく異なります。
![Screenshot 2023-09-13 at 18.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c16cf118-e11a-bd9e-c515-76e8f5c55c8f.png)

(特にウォーターフォール型の)ソフトウェア開発は仕様や要件に即したソフトウェアをリリースすれば一旦サイクルは終了します。一方で、機械学習モデルのウォーターフォール開発はイメージできません。基本的にはデータやアルゴリズムに対する試行錯誤を繰り返すことになります。さらに、一旦モデルをデプロイ(配備)したとしてもデータの傾向変化などによって精度が劣化([ドリフト](https://qiita.com/taka_yayoi/items/879506231b9ec19dc6a5))することが起こりえます。

要は **MLモデルのデプロイは大変！** ということなのです。

# MLflow

このような大変さを解決するために開発されたのがMLflowという訳です。
![Screenshot 2023-09-13 at 18.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/30652855-6289-72b8-0603-2ab6d903ea69.png)

MLflowは2018年6月に公開されました。MLflowは完全な機械学習ライフサイクルを管理するために設計された唯一のオープンソースフレームワークです。

なお、プロジェクト開始以降、Sparkよりもすごい勢いでコントリビューターが増加しています。すごいですね。
![Screenshot 2023-09-13 at 18.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c95e090b-34a7-d254-b9b3-9dffb21129c4.png)

# MLflowのコンポーネント

(最近いくつかのコンポーネントが追加されていますが)MLflowには主に4つのコンポーネントから構成されています。
![Screenshot 2023-09-13 at 18.47.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/93fa4ba3-a274-faf4-ec18-b6652c63d7ea.png)

- **MLflow Tracking:** 上述したモデルの追跡を一手に引き受けてくれます。
- **MLflow Projects:** モデルの実行環境の可搬性を実現します。トレーニングしたモデルの依存関係などをパッケージングして、様々な環境での実行を実現します。
- **MLflow Models:** 様々なモデルを**フレーバー**として表現し、様々な環境で活用できるようにモデルを標準化します。
- **MLflow Model Registry:** 機械学習モデル版GitHubです。モデルのバージョン管理、ステータス管理、コラボレーションを可能にします。

## MLflow Tracking

MLflowトラッキングサーバーが、いかなる環境であってもトレーニングされたモデルを必要な情報と共に記録します。これによって、データサイエンティストの方は**優れたモデル**の構築にフォーカスできるようになります。トレーニングしたモデルはMLflowが面倒を見るので、あとでUIなどからモデルに簡単にアクセスできます。
![Screenshot 2023-09-13 at 18.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9ef71a32-27b3-74a7-ab9f-fff556b08023.png)

トラッキングされるものは以下の通りです。

- **パラメータ**: コードに対するキーバリューの入力値(決定木の深さ、データのバージョンなど)
- **メトリクス**: (時間と共にアップデートされる)精度指標。
- **モデル**: 機械学習モデル本体。
- **アーティファクト**: 任意のファイル。グラフなども含めることが可能。
- **ソース:** モデルをトレーニングしたソースコード。

トラッキングは簡単です。以下のようなトレーニングのコードがあるとします。

```py
   # ElasticNetによる線形回帰のScikit学習
   lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
   lr.fit(train_x, train_y)

   # 予測
   predicted_qualities = lr.predict(test_x)

   # メトリクスの評価
   (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)
```

コードを`mlflow.start_run()`ブロックに含めて、mlflowのメソッドで記録するだけです。なお、明示的にメソッドを呼び出すこともできますが、[Auto Logging](https://mlflow.org/docs/latest/tracking.html#automatic-logging)を活用して、自動で必要な情報を記録させることも可能です。

```py
with mlflow.start_run() as run:

   # ElasticNetによる線形回帰のScikit学習
   lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
   lr.fit(train_x, train_y)

   # 予測
   predicted_qualities = lr.predict(test_x)

   # メトリクスの評価
   (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)

   # 記録
   mlflow.log_param("alpha", alpha)
   ...
```

## MLflow Projects

MLflowプロジェクトを用いることで、モデルの実行に必要な情報をパッケージングできるので様々な環境での再利用が可能となります。
![Screenshot 2023-09-13 at 19.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/017dc60f-8c5d-d18c-b116-48ae84fa6795.png)

ディレクトリ配下に、必要なコードや`conda.yaml`ファイルを格納することで再実行を容易にします。
![Screenshot 2023-09-13 at 19.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0baeea3f-4496-4984-870e-a9562e91ae24.png)

## MLflow Models

様々なライブラリのモデルを**フレーバー**として表現することで、様々な環境にモデルを持ち込むことが可能となります。
![Screenshot 2023-09-13 at 19.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8e09ebee-0d5c-bc5e-bf13-a05a14052b82.png)


[こちら](https://mlflow.org/docs/latest/models.html#built-in-model-flavors)にあるように、様々なフレーバーが提供されています。

- Python関数
- R関数
- Keras
- PyTorch
- Scikit-learn
- Spark MLlib
- XGBoost
- LightGBM
- Prophet
- Pmdarima
- OpenAI

これらのフレーバーを活用してモデルを記録することで、いろいろな環境でこれらの機械学習モデルを呼び出して実行することができます。

## MLflow Model Registry

上述したようにMLflowモデルレジストリは機械学習モデル版のGitHubです。
![Screenshot 2023-09-13 at 19.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1bce7be6-142d-91a1-6968-eb1293bed9a7.png)

企業においては、多くのデータサイエンティストの方がテーマに合わせて様々なモデルを構築すると思いますが、そのようなモデルの一元管理やコラボレーションを可能にします。ここでいうコラボレーションには以下のようなものがあります。

- あるデータサイエンティストが実験を通じて構築した機械学習モデルを先輩のサイエンティストがレビューして、本番環境へのデプロイを承認する。承認されたモデルは本番環境に自動でデプロイされる。
- ある機械学習モデルに対してコメントする。
- モデルのステータス変更に関する通知を受け取る。
- モデルの説明ページにアクセスして用途やモデルを生成したコードを確認する。

![Screenshot 2023-09-13 at 19.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e27ae2a6-c8ab-a105-9766-8034c1c7c521.png)
![Screenshot 2023-09-13 at 19.13.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9b4200ed-d56b-e7c8-8607-98fe26459f5a.png)
![Screenshot 2023-09-13 at 19.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55efa9c0-c033-d19d-526b-0ae7e7ba12f4.png)
![Screenshot 2023-09-13 at 19.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9c62e08f-e92b-d4f5-ac30-e4bc700632e3.png)

# まとめ

MLflowを活用することで、**原理原則に基づいたデータサイエンスとML**を実現することができます。すなわち、[MLOps](https://qiita.com/taka_yayoi/items/47dcd3aee7d028aeef79)です！

- ある機械学習モデルを本番環境に移行する前に、このモデルを構築する際に用いたデータ、パラメーター、環境が何であったのかに悩むことがなくなります。なぜならば、すべてがMLflowによって[記録](https://qiita.com/taka_yayoi/items/66e401045538f70774bd)されているからです！
- 野放図な機械学習モデルの運用とはおさらばし、[ガバナンスが効いた環境](https://qiita.com/taka_yayoi/items/7db4b6bac19453f7f8d7)下で適切な承認フローを経て機械学習モデルが運用されるようになります！
- 属人的な機械学習モデルの運用ともおさらばし、[モデルレジストリ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995)で機械学習モデルを集中管理することで各人のノートパソコンにモデルが閉じ込められることが無くなり、チーム間でのノウハウ(どのようなデータを用いて、どのようなライブラリ、ロジックを用いてモデルを構築することで良い精度が出るのか等)の共有が促進されます！

なお、MLflowはオープンソースですが、Databricksの環境では最初から[インテグレーション](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)されていますので、[サインアップ](https://databricks.com/jp/try-databricks)いただければすぐに活用いただけます(宣伝)。

凄まじいスピードで[大規模言語モデルのサポート](https://qiita.com/taka_yayoi/items/431fa69430c5c6a5e741)も進んでいるMLflow、ぜひご活用ください！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)