MLflow と Azure Machine Learning を使用した Azure Databricks ML 実験の追跡

MLflow は、機械学習の実験のライフ サイクルを管理するためのオープンソース ライブラリです。 MLflow を使用すると、Azure Databricks と Azure Machine Learning を統合して、この両方の製品を確実に最大限に活用することができます。

この記事では、次のことについて説明します。

前提条件

サンプルの Notebook

Azure Databricks でのモデルのトレーニングと Azure Machine Learning へのデプロイ」では、Azure Databricks でモデルをトレーニングし、Azure Machine Learning にデプロイする方法を示します。 また、Azure Databricks の MLflow インスタンスで実験やモデルを追跡し、Azure Machine Learning をデプロイに利用したい場合の対処法も含まれています。

ライブラリのインストール

クラスターにライブラリをインストールするには、 [ライブラリ] タブに移動して、 [新規インストール] を選択します。

mlflow with azure databricks

[パッケージ] フィールドに「azureml-mlflow」と入力し、次に [インストール] を選択します。 必要に応じてこの手順を繰り返して、実験のための他の追加パッケージをクラスターにインストールします。

Azure DB install mlflow library

MLflow を使用して Azure Databricks 実行を追跡する

Azure Databricks は、MLflow を使用して次の 2 とおりの方法で実験を追跡するように構成できます。

既定では、Azure Databricks ワークスペースをリンクしたときに、デュアルトラッキングが構成されます。

Azure Databricks と Azure Machine Learning でのデュアルトラッキング

ADB ワークスペースを Azure Machine Learning ワークスペースにリンクすると、Azure Machine Learning ワークスペースと Azure Databricks ワークスペースで実験データを同時に追跡できるようになります。 これはデュアル追跡と呼ばれます。

警告

プライベート リンク対応 Azure Machine Learning ワークスペースのデュアル追跡は、現在サポートされていません。 代わりに、Azure Machine Learning ワークスペースで排他的追跡を構成してください。

警告

デュアルトラッキングは、現時点では 21Vianet によって運営される Microsoft Azure ではサポートされていません。 代わりに、Azure Machine Learning ワークスペースで排他的追跡を構成してください。

ADB ワークスペースを新規または既存の Azure Machine Learning ワークスペースにリンクするには、

  1. Azure ポータルにサインインします。
  2. ADB ワークスペースの [概要] ページに移動します。
  3. 右下の [Link Azure Machine Learning workspace](Azure Machine Learning ワークスペースをリンク) ボタンを選択します。

Link Azure DB and Azure Machine Learning workspaces

Azure Databricks ワークスペースを Azure Machine Learning ワークスペースにリンクすると、MLflow Tracking は次のすべての場所で追跡されるように自動的に設定されます。

  • リンクされた Azure Machine Learning ワークスペース。
  • 元の ADB ワークスペース。

その後、今までと同じように Azure Databricks で MLflow を使用できます。 次の例では、Azure Databricks で通常行われるように実験名を設定し、一部のパラメーターのログ記録を開始しています。

import mlflow 

experimentName = "/Users/{user_name}/{experiment_folder}/{experiment_name}" 
mlflow.set_experiment(experimentName) 

with mlflow.start_run():
   mlflow.log_param('epochs', 20)
   pass

Note

追跡とは反対に、モデル レジストリでは、Azure Machine Learning と Azure Databricks の両方で同時にモデルを登録することはサポートしていません。 どちらか一方を使う必要があります。 詳細については、「MLflow を使ってレジストリにモデルを登録する」セクションを参照してください。

Azure Machine Learning ワークスペースでのみ追跡する

追跡対象の実験を 1 か所で管理する場合は、Azure Machine Learning ワークスペースでのみ追跡するように MLflow 追跡を設定できます。 この構成には、Azure Machine Learning のデプロイ オプションを使って、より簡単にデプロイへのパスを有効にするという利点があります。

次の例で示すように、MLflow 追跡 URI が Azure Machine Learning のみを指すように構成する必要があります。

追跡 URI を構成する

  1. ワークスペースの追跡 URI を取得します。

    適用対象: Azure CLI ML 拡張機能 v2 (現行)

    1. ログインとワークスペースの構成:

      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location> 
      
    2. az ml workspace コマンドを使って追跡 URI を取得できます。

      az ml workspace show --query mlflow_tracking_uri
      
  2. 追跡 URI の構成:

    次に、メソッド set_tracking_uri() では、MLflow 追跡 URI をその URI にポイントします。

    import mlflow
    
    mlflow.set_tracking_uri(mlflow_tracking_uri)
    

    ヒント

    Azure Databricks クラスターや Azure Synapse Analytics クラスターなどの共有環境で作業する場合は、クラスター レベルで環境変数 MLFLOW_TRACKING_URI を設定し、セッションごとに実行するのではなく、クラスターで実行されているすべてのセッションについて Azure Machine Learning を指すように MLflow 追跡 URI を自動的に構成すると便利です。

    Configure the environment variables in an Azure Databricks cluster

    環境変数を設定すると、このようなクラスターで実行されるすべての実験が Azure Machine Learning で追跡されるようになります。

認証を構成する

追跡を構成したら、関連付けられているワークスペースに対して認証を行う方法も構成する必要があります。 既定では、MLflow 用の Azure Machine Learning プラグインは、既定のブラウザーを開いて資格情報の入力を求める対話型認証を実行します。 Azure Machine Learning ワークスペースで MLflow の認証方法を構成するその他の方法については、「Azure Machine Learning 用に MLflow を構成する」の「認証を構成する」を参照してください。

セッションに接続されているユーザーがいる対話型ジョブの場合は、対話型認証を使用できるため、これ以上の操作は必要ありません。

警告

対話型ブラウザー認証では、資格情報の入力を求めるメッセージが表示されると、コードの実行がブロックされます。 これは、トレーニング ジョブなどの無人環境での認証には適したオプションではありません。 他の認証モードを構成することをお勧めします。

無人実行が必要なシナリオでは、Azure Machine Learning と通信するようにサービス プリンシパルを構成する必要があります。

import os

os.environ["AZURE_TENANT_ID"] = "<AZURE_TENANT_ID>"
os.environ["AZURE_CLIENT_ID"] = "<AZURE_CLIENT_ID>"
os.environ["AZURE_CLIENT_SECRET"] = "<AZURE_CLIENT_SECRET>"

ヒント

共有環境で作業する場合は、コンピューティングでこれらの環境変数を構成することをお勧めします。 ベスト プラクティスとして、可能な限り Azure Key Vault のインスタンスでシークレットとして管理します。 たとえば、Azure Databricks では、クラスター構成で AZURE_CLIENT_SECRET={{secrets/<scope-name>/<secret-name>}} のようにして環境変数でシークレットを使用できます。 Azure Databricks で行う方法については、「環境変数でシークレットを参照する」を参照するか、お使いのプラットフォームで同様のドキュメントを参照してください。

Azure Machine Learning の実験名

MLflow が Azure Machine Learning ワークスペース内の実験のみを追跡するように構成されている場合、実験の名前付け規則は Azure Machine Learning で使われているものに従う必要があります。 Azure Databricks では、実験名には /Users/alice@contoso.com/iris-classifier のように実験が保存されている場所へのパスが付けられます。 ただし、Azure Machine Learning では、実験名を直接指定する必要があります。 先ほどの例のように、同じ実験でも iris-classifier という名前を直接付けることになります。

mlflow.set_experiment(experiment_name="experiment-name")

パラメーター、メトリック、成果物の追跡

その後、今までと同じように Azure Databricks で MLflow を使用できます。 詳細については、「メトリックのログと確認およびログ ファイル」を参照してください。

MLflow でモデルのログを記録する

モデルのトレーニングが完了したら、mlflow.<model_flavor>.log_model() メソッドを使って追跡サーバーにログを記録します。 <model_flavor> は、モデルに関連付けられているフレームワークを参照します。 サポートされているモデルの種類については、こちらを参照してください。 次の例では、Spark ライブラリ MLLib で作成されたモデルが登録されています。

mlflow.spark.log_model(model, artifact_path = "model")

フレーバー spark は、Spark クラスターでモデルをトレーニングしているということを意味しているわけではなく、使われているトレーニング フレームワークによるものです (Spark で TensorFlow を使ってモデルを完全にトレーニングできるため、使うフレーバーは tensorflow になります)。

モデルは追跡中の実行の内部でログに記録されます。 つまり、モデルは Azure Databricks と Azure Machine Learning の両方 (既定)、または Azure Machine Learning のみ (追跡 URI が指すように構成した場合) で使用できます。

重要

ここでは、パラメーター registered_model_name が指定されていないことに注意してください。 このようなパラメーターの影響とレジストリのしくみの詳細については、「MLflow を使ってレジストリにモデルを登録する」セクションを参照してください。

MLflow を使ってレジストリにモデルを登録する

追跡とは反対に、モデル レジストリは Azure Databricks と Azure Machine Learning で同時に動作することはできません。 どちらか一方を使う必要があります。 既定では、モデル レジストリは Azure Databricks ワークスペースが使われ、MLflow Tracking を Azure Machine Learning ワークスペースでのみ追跡するように設定するように選んだ場合を除き、モデル レジストリは Azure Machine Learning ワークスペースとなります。

次に、既定の構成を使っていることを考えると、次の行では Azure Databricks と Azure Machine Learning の両方の対応する実行の内部でモデルをログに記録しますが、Azure Databricks にのみ登録します。

mlflow.spark.log_model(model, artifact_path = "model", 
                       registered_model_name = 'model_name')  
  • 名前付きの登録済みモデルが存在しない場合、メソッドにより新しいモデルが登録され、バージョン 1 が作成され、MLflow オブジェクト ModelVersion が返されます。

  • 名前付きの登録済みモデルが既にある場合は、メソッドにより新しいモデル バージョンが作成され、バージョン オブジェクトが返されます。

MLflow での Azure Machine Learning レジストリの使用

Azure Databricks ではなく Azure Machine Learning モデル レジストリを使用する場合は、Azure Machine Learning ワークスペースでのみ追跡するように MLflow Tracking を設定することをお勧めします。 これにより、モデルがどこに登録されているか、というあいまいさが解消され、複雑さが単純化されます。

ただし、デュアルトラッキング機能を使い続けたいが、Azure Machine Learning にモデルを登録する場合は、MLflow モデル レジストリ URI を構成することで、モデル登録に Azure Machine Learning を使うよう MLflow に指示することができます。 この URI は、MLflow の追跡 URI とまったく同じ形式と値を持っています。

mlflow.set_registry_uri(azureml_mlflow_uri)

注意

azureml_mlflow_uri の値は、ご利用の Azure Machine Learning ワークスペースでのみ追跡するように MLflow Tracking を設定するに関する記事で説明されたのと同じ方法で取得されました

このシナリオの完全な例については、「Training models in Azure Databricks and deploying them on Azure Machine Learning (Azure Databricks でモデルをトレーニングし、Azure Machine Learning にデプロイする)」の例を確認します。

Azure Machine Learning に登録したモデルのデプロイと使用

MLflow を使って Azure Machine Learning サービスに登録したモデルは、次のように使用できます。

  • Azure Machine Learning のエンドポイント (リアルタイムとバッチ): このデプロイでは、Azure Container Instances (ACI)、Azure Kubernetes (AKS) またはマネージド推論エンドポイントでのリアルタイムとバッチの両方の推論で Azure Machine Learning デプロイの機能を活用できます。

  • MLFlow モデル オブジェクトまたは Pandas UDF。Azure Databricks ノートブックでのストリーミングまたはバッチ パイプラインで使用できます。

Azure Machine Learning エンドポイントにモデルをデプロイする

azureml-mlflow プラグインを利用して、Azure Machine Learning ワークスペースにモデルをデプロイできます。 モデルをさまざまなターゲットにデプロイする方法の完全な詳細については、MLflow モデルをデプロイする方法に関する記事を確認します。

重要

モデルをデプロイするには、Azure Machine Learning のレジストリに登録する必要があります。 もし、Azure Databricks 内の MLflow インスタンスにモデルが登録されている場合、Azure Machine Learning に再度登録する必要があります。 このような場合は、「Training models in Azure Databricks and deploying them on Azure Machine Learning (Azure Databricks でモデルをトレーニングし、Azure Machine Learning にデプロイする)」の例を参照してください

UDF を使ったバッチ スコアリングのためにモデルを ADB にデプロイする

バッチ スコアリング用に Azure Databricks クラスターを選択できます。 Mlflow を利用することにより、接続先のレジストリにあるすべてのモデルを解決できます。 通常は、次の 2 つの方法のいずれかを使用します。

  • モデルが Spark ライブラリ (MLLib など) を使用してトレーニングおよび構築された場合は、mlflow.pyfunc.spark_udf を使用してモデルを読み込み、それを Spark Pandas UDF として使用して新しいデータをスコア付けします。
  • モデルが Spark ライブラリを使用してトレーニングまたは構築されなかった場合は、mlflow.pyfunc.load_model または mlflow.<flavor>.load_model のどちらかを使用してクラスター ドライバーでモデルを読み込みます。 この方法では、クラスター内で実行されるようにしたい並列化や作業の分散を、すべて自分で調整する必要があることに注意してください。 また、MLflow により、モデルの実行に必要なライブラリがインストールされないことにも注意してください。 これらのライブラリは、実行する前に、クラスター内にインストールする必要があります。

次の例は、uci-heart-classifier という名前のレジストリからモデルを読み込み、それを Spark Pandas UDF として使用して新しいデータをスコア付けする方法を示しています。

from pyspark.sql.types import ArrayType, FloatType 

model_name = "uci-heart-classifier"
model_uri = "models:/"+model_name+"/latest"

#Create a Spark UDF for the MLFlow model 
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri) 

ヒント

レジストリにあるモデルを参照するその他の方法については、「レジストリからのモデルの読み込み」を確認してください。

モデルが読み込まれたら、次のコードを使用して新しいデータをスコア付けできます。

#Load Scoring Data into Spark Dataframe 
scoreDf = spark.table({table_name}).where({required_conditions}) 

#Make Prediction 
preds = (scoreDf 
           .withColumn('target_column_name', pyfunc_udf('Input_column1', 'Input_column2', ' Input_column3', …)) 
        ) 

display(preds) 

リソースをクリーンアップする

お使いの Azure Databricks ワークスペースを残したいが、Azure Machine Learning ワークスペースが不要になった場合は、Azure Machine Learning ワークスペースを削除できます。 この操作により、お使いの Azure Databricks ワークスペースと Azure Machine Learning ワークスペースのリンクが解除されます。

ログに記録されたメトリックと成果物をワークスペースで使用する予定がない場合、それらを個別に削除する機能は現時点では用意されていません。 代わりに、ストレージ アカウントとワークスペースを含むリソース グループを削除すれば、課金は発生しません。

  1. Azure Portal で、左端にある [リソース グループ] を選択します。

    Delete in the Azure portal

  2. 作成したリソース グループを一覧から選択します。

  3. [リソース グループの削除] を選択します。

  4. リソース グループ名を入力します。 次に、 [削除] を選択します。

次のステップ