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

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

ストリーミング モデルをログに記録してスコアを付ける方法については、 「ストリーミング モデルを保存および読み込む方法」を参照してください。

モデルのログ記録と読み込み

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

重要

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

v1.18 より前にログに記録されたMLflow モデル (Databricks Runtime 8.3 ML以前) は、デフォルトで 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}など)

  • Unity Catalog ボリューム パス ( dbfs:/Volumes/catalog_name/schema_name/volume_name/{path_to_artifact_root}/{model_path}など)

  • MLflow で管理されるアーティファクト ストレージ パス dbfs:/databricks/mlflow-tracking/

  • 登録済みのモデルパス (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 ML以降では、現在の環境とモデルの依存関係の間に不一致が検出された場合、機械学習フローによって警告が表示されます。

モデルの依存関係の復元を簡略化する追加機能は、 Databricks Runtime 11.0 ML以降に含まれています。 Databricks Runtime 11.0 ML以降では、 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 モデルのライフサイクル全体を管理するための UI と APIセットを提供するMLflowモデルレジストリにモデルを登録できます。モデルレジストリを使用してDatabricks Unity Catalogでモデルを管理する方法については、 「Unity Catalogでのモデル ライフサイクルの管理」を参照してください。 Workspace Model Registryを使用するには、 「 Workspace Model Registry (レガシー) を使用してモデルのライフサイクルを管理する」を参照してください。

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

モデルを Unity Catalog ボリュームに保存する

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

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

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

モデルアーティファクトのダウンロード

さまざまな 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>

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

Mosaic AI Model Serving を使用して、Unity Catalog モデルレジストリに REST エンドポイントとして登録された機械学習モデルをホストできます。これらのエンドポイントは、モデル バージョンとそのステージの可用性に基づいて自動的に更新されます。

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