DEV Community

Atsumi
Atsumi

Posted on • Updated on

MLflowに入門してみる

MLflowとは

公式ドキュメントのトップページによると以下。

  • オープンソースで、機械学習の一連のサイクルを管理するためのソフトウェア。
  • MLflowはPython, R, JavaのAPIを持つ他、REST APIやCLIもあるので様々なライブラリや言語と合わせて利用することができる。
  • 以下4つの機能を持つ。
    • MLflow tracking
      • 学習に利用するコードやパラメータ、学習の結果を記録することで、過去の学習記録を簡単にトラッキングできるようにする。
    • MLflow Projects
      • コードを再利用可能にする仕組み。
    • MLflow Models
      • 機械学習モデルをパッケージングし、様々なプラットフォームで利用な可能な形式で提供することを可能にする
    • MLflow Model Registry
      • 機械学習モデルを保存するレジストリ。バージョンや学習の情報などを提供する。

Tutorial

https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html

このチュートリアルの内容

  1. 線形回帰モデルを学習
  2. コードをパッケージングし再利用可能な状態にする
  3. モデルをHTTPで利用可能な形でデプロイする

実践

# 環境構築
pipenv install "mlflow[extras]" 

学習を実行(MLflow Tracking)

以下を写経
https://github.com/mlflow/mlflow/blob/master/examples/sklearn_elasticnet_wine/train.py

# 実行
## ハイパーパラメータを適当に変えていくつか作ってみる
$ pipenv run python sklearn_elasticnet_wine_train.py
$ pipenv run python sklearn_elasticnet_wine_train.py 0.6 0.6
$ pipenv run python sklearn_elasticnet_wine_train.py 0.4 0.4

# mlrunsというディレクトリができる

学習を結果を確認

# UIを起動
pipenv run mlflow ui
  • モデルの作成時刻やハイパーパラメータ、学習結果などを閲覧可能。
  • モデルごとの比較が可能

モデルをパッケージングする(MLflow Projects)

基本的なディレクトリを作る

mkdir sklearn_elasticnet_wine
mv sklearn_elasticnet_wine.py sklearn_elasticnet_wine/train.py

Projectsファイルを作成

こちらに記載のある二つのファイルを作成する。

https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html#packaging-training-code-in-a-conda-environment

conda.yamlは、UIのモデル詳細にあったのでコピペした

実行

condaは使いたくないので --no-condaを利用

pipenv run mlflow run sklearn_elasticnet_wine -P alpha=0.42 --no-conda 

MLProjectsの実行環境は、conda, Docker, System Environment (今回)の3つを選択可能。

これで、モデル生成に利用したコードと実行環境を別環境でも再現できるようになった。

モデルをサーブする(MLflow Model)

生成されたモデルアーティファクト

モデル作成のステップで作成された mlruns/0/ハッシュ値/artifacts/model/ディレクトリに必要なものが格納されている。

  • MLmodel: モデルに関するメタ情報
  • model.pkl: 学習済みモデルをシリアライズしたもの

ちなみに、MLProjectsで利用したconda.yamlもここに入っている。

web APIとしてデプロイ

こちらも、condaを入れたくないので --no-condaで動かす

pipenv run mlflow models serve -m mlruns/0/2ca121e400654d5898de9f4f9e1fe928/artifacts/model -p 1234 --no-conda 

リクエストできた。

curl -X POST -H "Content-Type:application/json; format=pandas-split" --data '{"columns":["alcohol", "chlorides", "citric acid", "density", "fixed acidity", "free sulfur dioxide", "pH", "residual sugar", "sulphates", "total sulfur dioxide", "volatile acidity"],"data":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}' http://127.0.0.1:1234/invocations

[4.479576972663602]

Top comments (0)