Translate

2021年7月20日火曜日

MLFlow のクイックスタートを勝手に翻訳してみた

 本文書はMLFlow クイックスタートを勝手に翻訳したものです。

MLflowは、いわゆる MLOps に活用されるソフトウェアで、機械学習のトレーニング処理や推論処理コード(Python, R, Javaなど)に追加して、実行した実験のログを集約的に記録することのできるOSSです(ただし複雑な管理はできないので非プロダクション開発者や Kaggle 参加者などの利用が多いようです)。

参照は、at your own riskでお願いします。

----

MLflowのインストール


以下を実行してMLflowをインストールします。

pip install mlflow

install.packages("mlflow")
mlflow::install_mlflow()

【注意】MLflow は MacOS でも動作します。MacOSデフォルトのPythonで問題が発生した場合は、brew install python pip3 install mlflow を使用して Homebrew パッケージマネージャからPython3をインストールしてみてください。

特定のMLflowモジュールと機能(MLモデルの永続性/推論、成果物ストレージオプションなど)を使用するには、追加のライブラリをインストールする必要がある場合があります。たとえば、mlflow.tensorflowモジュールには TensorFlow がインストールされている必要があります。詳細については、https://github.com/mlflow/mlflow/blob/master/EXTRA_DEPENDENCIES.rst を参照してください

この段階で、チュートリアル に従って、一般的なワークフローにてMLflowを活用する方法をウォークスルーを済ませておくことを勧めます。

クイックスタートのダウンロード

git clone https://github.com/mlflow/mlflow を実行してMLflowのクローンを作成し、クイックスタートコードをダウンロードし、リポジトリの examples サブディレクトリに cd します(この作業ディレクトリを使用して quickstart を実行します)。

MLflowのクローンから直接実行することは避けてください。実行するとチュートリアルの段階でMLflowのPyPiインストールではなく、ソースコード側の MLflow が使用されるためです。
 

Tracking API の使用

MLflow Tracking API は、あなたのデータサイエンスコードから指標と成果物(ファイル)を記録し、あなたの実行の履歴を確認することができます。次のように簡単なPythonスクリプトを作成して、試してみることができます(このサンプルは quickstart/mlflow_tracking.py に含まれています)。

import os
from random import random, randint
from mlflow import log_metric, log_param, log_artifacts

if __name__ == "__main__":
    # Log a parameter (key-value pair)
    log_param("param1", randint(0, 100))

    # Log a metric; metrics can be updated throughout the run
    log_metric("foo", random())
    log_metric("foo", random() + 1)
    log_metric("foo", random() + 2)

    # Log an artifact (output file)
    if not os.path.exists("outputs"):
        os.makedirs("outputs")
    with open("outputs/test.txt", "w") as f:
        f.write("hello world!")
    log_artifacts("outputs")


library(mlflow)

# Log a parameter (key-value pair)
mlflow_log_param("param1", 5)

# Log a metric; metrics can be updated throughout the run
mlflow_log_metric("foo", 1)
mlflow_log_metric("foo", 2)
mlflow_log_metric("foo", 3)

# Log an artifact (output file)
writeLines("Hello world!", "output.txt")
mlflow_log_artifact("output.txt")

Tracking UI の表示


デフォルトでは、プログラムを実行する場所に関係なく、Tracking APIはデータをファイルのローカルの ./mlruns ディレクトリに書き込みます 。その後、MLflowの Tracking UI を実行できます。
 

mlflow ui


mlflow_ui()


表示させるには http://localhost:5000/ を開きます。
 

【注意】

MLflow UIまたはエラーログにメッセージ [CRITICAL] WORKER TIMEOUT が表示される場合は、 http://localhost:5000 の代わりに http://127.0.0.1:5000 を使用してみてください。


MLflow プロジェクトの実行


MLflowを使用すると、コードとその依存関係を、他のデータに対して再現可能な方法で実行可能なプロジェクトとしてパッケージ化できます。各プロジェクトには、そのコードと、その依存関係(Python環境など)を定義する MLproject ファイル、およびプロジェクトで実行できるコマンドおよび引数が含まれています。
 

mlflow run コマンドを使用して、既存のプロジェクトを簡単に実行できます。このコマンドは、ローカルディレクトリまたは GitHub URI のいずれかからプロジェクトを実行します。

mlflow run sklearn_elasticnet_wine -P alpha=0.5

mlflow run https://github.com/mlflow/mlflow-example.git -P alpha=5.0


tutorial には、依存関係を指定する MLproject ファイルを含むサンプルプロジェクトがあります。Tracking サーバを構成していない場合、プロジェクトは Tracking APIデータをローカルの mlruns ディレクトリに記録するため、 mlflow ui を使用してこれらの実行を確認できます。
 

【注意】 

デフォルトでは、 conda を使用してすべての依存関係をインストールします。 conda を使用せずにプロジェクトを実行するには、 mlflow run にオプション --no-condam を指定 できます。この場合、必要な依存関係がPython環境にすでにインストールされていることを確認する必要があります。

詳細については、MLflowプロジェクト を参照してください。
 

モデルの保存と提供


MLflow には、さまざまなツールのモデルをさまざまなフレーバで保存するための汎用 MLmodel フォーマットが含まれています。たとえば、多くのモデルをPython関数として提供できるため、さまざまなツールでモデルを提供するために、 MLmodel ファイルで各モデルをPython関数として解釈する方法を宣言できます。MLflowには、このようなモデルをローカルで実行し、Dockerコンテナまたは商用サービスプラットフォームにエクスポートするためのツールも含まれています。

この機能を説明するために、 mlflow.sklearn パッケージは scikit-learn モデルをMLflowアーティファクトとしてログに記録し、それらを再度ロードして提供することができます。次のように実行できるトレーニングアプリケーションサンプル sklearn_logistic_regression/train.py があります。

python sklearn_logistic_regression/train.py


サンプルを実行すると、実験のMLflow実行IDが出力されます。 mlflow ui を見ると 、実行によって MLmodel 説明ファイルと pickled scikit-learn モデルを含む model フォルダが保存されていることがわかります。成果物ディレクトリ(ここでは「モデル」)内の実行IDとモデルのパスをさまざまなツールに渡すことができます。たとえば、MLflowには、Pythonベースのモデル用の単純なRESTサーバが含まれています。

mlflow models serve -m runs:/<RUN_ID>/model

【注意】

デフォルトでは、サーバはポート番号 5000 で実行されます。そのポートがすでに使用されている場合は、 –-port オプションを使用して別のポートを指定します。

例: mlflow models serve -m runs:/<RUN_ID>/model --port 1234



サーバを起動したら、サンプルデータを渡して、推論を確認できます。

次のサンプルでは、JSONでシリアル化された pandas DataFrame を split オリエンテーション付きでモデルサーバに送信するために curl を使用します。pyfunc モデルサーバで受け入れられる入力データ形式の詳細については、 MLflowデプロイメントツールドキュメント を参照してください。

curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:5000/invocations

は、次の値を返却します。

[1, 0]

詳細は MLflowモデル を参照してください。
 

リモート Tracking サーバへのログ記録


上記の例では、MLflowはそれが実行されているマシンのローカルファイルシステムにデータを記録します。結果を一元的に管理したり、チーム全体で共有したりするために、リモート Tracking サーバにログを記録するようにMLflowを構成できます。リモート Tracking サーバにアクセスするには、以下のどちらかを実行します:
 

リモートマシンで Tracking サーバを起動


リモートマシンで Tracking サーバを起動 します。

次に、環境変数 MLFLOW_TRACKING_URI をサーバのURIに設定するか、プログラムの先頭に以下を追加することにより、リモート Tracking サーバにログを記録 できます。

import mlflow
mlflow.set_tracking_uri("http://YOUR-SERVER:4040")
mlflow.set_experiment("my-experiment")


library(mlflow)
install_mlflow()
mlflow_set_tracking_uri("http://YOUR-SERVER:4040")
mlflow_set_experiment("/my-experiment")

Databricks CommunityEditionにログイン


または、ホスト型 Tracking サーバを含む無料サービスである Databricks Community Edition にサインアップします。Community Editionは、実稼働のユースケースではなく、迅速な実験を目的としていることに注意してください。サインアップ後、 databricks configure を実行してMLflowのクレデンシャルファイルを作成し、ホストとして https://community.cloud.databricks.com を指定し ます。

Community Edition サーバにログインするには、環境変数 MLFLOW_TRACKING_URIdatabricks に設定するか、プログラムの先頭に以下を追加します。

import mlflow
mlflow.set_tracking_uri("databricks")
# Note: on Databricks, the experiment name passed to set_experiment must be a valid path
# in the workspace, like '/Users/<your-username>/my-experiment'. See
# https://docs.databricks.com/user-guide/workspace.html for more info.
mlflow.set_experiment("/my-experiment")


library(mlflow)
install_mlflow()
mlflow_set_tracking_uri("databricks")
# Note: on Databricks, the experiment name passed to mlflow_set_experiment must be a
# valid path in the workspace, like '/Users/<your-username>/my-experiment'.  See
# https://docs.databricks.com/user-guide/workspace.html for more info.
mlflow_set_experiment("/my-experiment")

-----

機械学習モデルの改善では、コード上もしくは外部パラメータファイルなどのプロパティ上のハイパーパラメータやパラメータをちょこちょこ変えたり、入出力データセットをコロコロ変えながら何度もトレーニング、バリデーション、テスト、推論を実行するサイクルをくりかえす。

たいていは一人作業が多くなるけど、それでも2回前に自分が実行した実験がどんなパラメータでどんなデータセットをどういうモデルで実行したのかを覚えておくことは難しい。一番大きな理由は、トレーニング処理が数時間から数日かかる場合がおおいため、人間側の中短期記憶がだめになっていることが少なくない。

メモすればいい、とはおもうのだけど毎回同じフォーマットで記録することが大変なのだ。特にaccuracyなどの結果指標値は書いたり書かなかったりして何度も同じ実験を繰り返してしまう人は少なくないと思う(じぶんもそうだったりする)。

なので、IT実験はITで管理すべき..ということでMLFlowなどのMLOpsツールが出始めている。MLFlowは、Pythonパッケージで難易度もそれほどたかくないので、いわゆるデータサイエンティストでも入れられる。

データサイエンティストのほとんどの人がコンピュータ工学(CS)好きで、情報システム(IS)がからっきしの人なので、うんたらOpsといったシステムとしてのITを理解する脳が発達していないことが多い。

だから比較的利用がかんたんな MLFlow などに飛びつく人が多いのかもしれない..

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...