MLflow モデルの ログ記録、読み込み、登録する、デプロイ

MLflow モデルは 、Apache Spark でのバッチ推論や REST API を介したリアルタイム サービスなど、さまざまなダウンストリーム ツールで使用できる機械学習モデルをパッケージ化するための標準形式です。 この形式では、さまざまなモデル 提供および推論プラットフォームで 理解できるさまざまな フレーバー (Python関数、PyTorch 、sklearn など) でモデルを保存できる規則を定義します。

ログモデルとロードモデル

モデルのログを記録すると、MLflow によって requirements.txt ファイルと conda.yaml ファイルが自動的にログに記録されます。 これらのファイルを使用して、モデル開発環境を再作成し、 virtualenv (推奨) または condaを使用して依存関係を再インストールできます。

重要

株式会社アナコンダは、anaconda.org チャンネルの 利用規約 を更新しました。 新しい利用規約に基づいて、Anacondaのパッケージと配布に依存している場合は、商用ライセンスが必要になる場合があります。 詳細については、 Anaconda Commercial Edition FAQ を参照してください。 Anacondaチャンネルの使用は、そのサービス利用規約に準拠します。

v1.18 より前にログに記録された機械学習フロー モデル (Databricks Runtime 8.3 以前 機械学習) は、デフォルトによって conda defaults チャンネル (https://repo.anaconda.com/pkgs/) でログに記録されていました。依存関係として。 このライセンス変更により、Databricks は MLflow v1.18 以降を使用してログに記録されたモデルに対する defaults チャンネルの使用を停止しました。 ログに記録されるデフォルトのチャンネルは conda-forgeになり、コミュニティが管理する https://conda-forge.org/ を指します。

MLflow v1.18 より前に、モデルの conda 環境から defaults チャンネルを除外せずにモデルをログに記録した場合、そのモデルには、意図しない defaults チャンネルへの依存関係がある可能性があります。 モデルにこの依存関係があるかどうかを手動で確認するには、記録済みモデルにパッケージ化された conda.yaml ファイル内の channel 値を調べます。たとえば、 defaults チャンネル依存関係を持つモデルの conda.yaml は次のようになります。

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

Databricks は、Anaconda との関係の下でモデルと対話するための Anaconda リポジトリの使用が許可されているかどうかを判断できないため、Databricks は顧客に変更を強制しません。 Databricks の使用による Anaconda.com リポジトリの使用が Anaconda の条件で許可されている場合は、何もする必要はありません。

モデルの環境で使用するチャンネルを変更したい場合は、新しい conda.yamlを使用してモデルをモデルレジストリに再登録できます。 これを行うには、 log_model()conda_env パラメーターにチャンネルを指定します。

log_model() API の詳細については、使用しているモデル フレーバーの MLflow ドキュメント ( Scikit-Learnの log_modelなど) を参照してください。

conda.yaml ファイルの詳細については、 MLflow のドキュメントを参照してください。

API コマンド

モデルを MLflow トラッキング サーバーに記録するには、 mlflow.<model-type>.log_model(model, ...)を使用します。

推論またはさらなる開発のために以前に記録済みモデルをロードするには、 mlflow.<model-type>.load_model(modelpath)を使用します。ここで、 modelpath は次のいずれかです。

  • 実行相対パス ( runs:/{run_id}/{model-path}など)

  • DBFS パス

  • 登録済みのモデルパス (models:/{model_name}/{model_stage}など)。

MLflow モデルを読み込むためのオプションの完全な一覧については、 MLflow ドキュメントの「成果物の参照」を参照してください。

Python MLflow モデルの場合、追加のオプションは、 mlflow.pyfunc.load_model() を使用してモデルを汎用 Python 関数として読み込むことです。 次のコード スニペットを使用して、モデルを読み込み、データポイントをスコア付けできます。

model = mlflow.pyfunc.load_model(model_path)
model.predict(model_input)

別の方法として、モデルを Apache Spark UDF としてエクスポートし、バッチジョブまたはリアルタイムの Sparkストリーミング ジョブとして、 Spark クラスターでのスコアリングに使用することもできます。

# load input data table as a Spark DataFrame
input_data = spark.table(input_table_name)
model_udf = mlflow.pyfunc.spark_udf(spark, model_path)
df = input_data.withColumn("prediction", model_udf())

記録済みモデル 依存関係

モデルを正確に読み込むには、モデルの依存関係が正しいバージョンでノートブック環境に読み込まれていることを確認する必要があります。 Databricks Runtime 10.5 機械学習以降では、現在の環境とモデルの依存関係の間に不一致が検出された場合、機械学習フローによって警告が表示されます。

モデルの依存関係の復元を簡略化する追加機能は、 Databricks Runtime 11.0 機械学習以降に含まれています。 Databricks Runtime 11.0 機械学習以降では、 pyfunc フレーバーモデルの場合、 mlflow.pyfunc.get_model_dependencies を呼び出してモデルの依存関係を取得およびダウンロードできます。この関数は、 %pip install <file-path>を使用してインストールできる依存関係ファイルへのパスを返します。 モデルを PySpark UDF として読み込む場合は、 mlflow.pyfunc.spark_udf 呼び出しで env_manager="virtualenv" を指定します。これにより、PySpark UDF のコンテキストでモデルの依存関係が復元され、外部環境には影響しません。

Databricks Runtime 10.5 以下では、 MLflow バージョン 1.25.0 以降を手動でインストールすることで、この機能を使用することもできます。

%pip install "mlflow>=1.25.0"

記録済みモデルの依存関係 (Python および Python 以外) と成果物を記録する方法の詳細については、「 記録済みモデルの依存関係」を参照してください。

MLflow UI で自動的に生成されたコード スニペット

Databricks ノートブックにモデルを記録すると、Databricks によって、コピーしてモデルの読み込みと実行に使用できるコード スニペットが自動的に生成されます。 これらのコードスニペットを表示するには:

  1. モデルを生成した実行の [実行] 画面に移動します。 ([実行] 画面の表示方法については、「 ノートブックの表示 エクスペリメント 」を参照してください)。

  2. [アーティファクト] セクションまでスクロールします。

  3. 記録済みモデルの名前をクリックします。 右側にパネルが開き、記録済みモデルを読み込んで Spark または pandas DataFramesで予測を行うために使用できるコードが表示されます。

アーティファクトパネルのコードスニペット

ログ記録モデルの例については、「 機械学習トレーニングの実行を追跡する例」の例を参照してください。 推論のために記録済みモデルを読み込む例については、 モデル推論の例を参照してください。

モデルレジストリ 内の登録する モデル

MLflow Model Registryにモデルを登録できます。MLflow モデル レジストリは、MLflow モデルのライフサイクル全体を管理するための UI とAPIsセットを提供する集中モデル ストアです。 Model Registryを使用して Databricks Unity Catalogでモデルを管理する方法については、 Unity Catalogでモデルのライフサイクルを管理する」を参照してください。 Workspace Model Registryを使用するには、 Workspace Model Registryを使用したモデルのライフサイクルの管理」を参照してください。

API を使用してモデルを登録するには、 mlflow.register_model("runs:/{run_id}/{model-path}", "{registered-model-name}")を使用します。

モデルを DBFS に保存する

モデルをローカルに保存するには、 mlflow.<model-type>.save_model(model, modelpath)を使用します。 modelpathDBFS パスである必要があります。 たとえば、DBFS の場所 dbfs:/my_project_models を使用してプロジェクトの作業を保存する場合は、次の /dbfs/my_project_modelsモデル パスを使用する必要があります。

modelpath = "/dbfs/my_project_models/model-%f-%f" % (alpha, l1_ratio)
mlflow.sklearn.save_model(lr, modelpath)

機械学習lib モデルの場合は、 機械学習パイプラインを使用します。

モデル成果物 のダウンロード

さまざまな APIsで登録されたモデルの記録済みモデルの成果物(モデルファイル、プロット、メトリクスなど)をダウンロードできます。

Python API の例:

from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository

model_uri = MlflowClient.get_model_version_download_uri(model_name, model_version)
ModelsArtifactRepository(model_uri).download_artifacts(artifact_path="")

Java API の例:

MlflowClient mlflowClient = new MlflowClient();
// Get the model URI for a registered model version.
String modelURI = mlflowClient.getModelVersionDownloadUri(modelName, modelVersion);

// Or download the model artifacts directly.
File modelFile = mlflowClient.downloadModelVersion(modelName, modelVersion);

CLI コマンド の例:

mlflow artifacts download --artifact-uri models:/<name>/<version|stage>

オンライン サービス 用のモデルをデプロイする

MLflow の組み込みのデプロイ ツールを使用して、サードパーティのサービス フレームワークにモデルをデプロイできます。