Azure Databricks で MLflow プロジェクトを実行する

MLflow Project は、再利用可能、再現可能な方法でデータ サイエンス コードをパッケージ化するための形式です。 MLflow Projects コンポーネントには、プロジェクトを実行するための API とコマンド ライン ツールが含まれています。これは、Tracking コンポーネントとも統合して、ソース コードのパラメーターと git コミットを自動的に記録し、再現性を確保します。

この記事では、MLflow Project の形式と、MLflow CLI を使用して Azure Databricks クラスターで MLflow プロジェクトをリモートで実行する方法について説明します。これにより、データ サイエンス コードの垂直方向のスケーリングが簡単になります。

MLflow プロジェクトの形式

任意のローカル ディレクトリまたは Git リポジトリを MLflow プロジェクトとして扱うことができます。 プロジェクトは次の規則によって定義されます。

  • プロジェクト名は、ディレクトリの名前である。
  • ソフトウェア環境が python_env.yaml で指定されている (存在する場合)。 python_env.yaml ファイルが存在しない場合、MLflow で、プロジェクトの実行時に Python (具体的には virtualenv で使用できる最新の Python) のみを含む virtualenv 環境を使用する。
  • パラメーターを明示的に宣言しない場合、プロジェクト内の .py ファイルまたは .sh ファイルをエントリ ポイントにすることができる。 パラメーターのセットを使用してこのようなコマンドを実行すると、MLflow は --key <value> 構文を使用して各パラメーターをコマンド ラインで渡す。

さらに多くのオプションを指定するには、MLproject ファイルを追加します。これは YAML 構文のテキスト ファイルです。 MLproject ファイルの例は次のようになります。

name: My Project

python_env: python_env.yaml

entry_points:
  main:
    parameters:
      data_file: path
      regularization: {type: float, default: 0.1}
    command: "python train.py -r {regularization} {data_file}"
  validate:
    parameters:
      data_file: path
    command: "python validate.py {data_file}"

Databricks Runtime 13.0 ML 以降では、MLflow プロジェクトを Databricks ジョブの種類クラスター内で正常に実行できません。 既存の MLflow プロジェクトを Databricks Runtime 13.0 ML 以降に移行するには、「MLflow Databricks Spark ジョブ プロジェクト形式」を参照してください。

MLflow Databricks Spark ジョブ プロジェクト形式

MLflow Databricks Spark のジョブ プロジェクトは、MLflow 2.14 で導入された MLflow プロジェクトのタイプです。 このプロジェクト タイプは、Spark ジョブ クラスター内から MLflow プロジェクトの実行をサポートしており、databricks バックエンドを使用してのみ実行できます。

Databricks Spark ジョブ プロジェクトでは、databricks_spark_job.python_file または entry_points を設定する必要があります。 どちらかの設定を指定しないか、両方を指定すると、例外が発生します。

次の例では、MLproject 設定を使用する databricks_spark_job.python_file ファイルを示しています。 この設定では、Python 実行ファイルとその引数にハードコーディングされたパスを使用します。

name: My Databricks Spark job project 1

databricks_spark_job:
    python_file: "train.py"   # the file which is the entry point file to execute
    parameters: ["param1", "param2"]   # a list of parameter strings
    python_libraries:   # dependencies required by this project
      - mlflow==2.4.1   # MLflow dependency is required
      - scikit-learn

次の例では、MLproject 設定を使用する entry_points ファイルを示しています。

name: My Databricks Spark job project 2

databricks_spark_job:
    python_libraries: # dependencies to be installed as databricks cluster libraries
      - mlflow==2.4.1
      - scikit-learn

entry_points:
  main:
    parameters:
      model_name: {type: string, default: model}
      script_name: {type: string, default: train.py}
    command: "python {script_name} {model_name}"

entry_points 設定では、次のようなコマンド ライン パラメーターを使用するパラメーターを渡すことができます。

mlflow run . -b databricks --backend-config cluster-spec.json \
 -P script_name=train.py -P model_name=model123 \
 --experiment-id <experiment-id>

次の制限事項は Databricks Spark ジョブ プロジェクトに適用されます。

  • このプロジェクト タイプでは、MLproject ファイルで docker_envpython_envconda_env のセクションの指定がサポートされていません。
  • プロジェクトの依存関係は、databricks_spark_job セクションの python_libraries フィールドで指定する必要があります。 Python のバージョンは、このプロジェクト タイプではカスタマイズできません。
  • 実行環境では、Databricks Runtime 13.0 以降を使用するジョブ クラスターで実行するために、メインの Spark ドライバー ランタイム環境を使用する必要があります。
    • 同様に、プロジェクトに必要として定義されているすべての Python 依存関係は、Databricks クラスターの依存関係としてインストールする必要があります。 この動作は、ライブラリを別の環境にインストールする必要があった以前のプロジェクト実行動作とは異なります。

MLflow プロジェクトを実行する

既定のワークスペースの Azure Databricks クラスターで MLflow プロジェクトを実行するには、次のコマンドを使用します。

mlflow run <uri> -b databricks --backend-config <json-new-cluster-spec>

ここで、<uri> は、MLflow プロジェクトを含む Git リポジトリの URI またはフォルダーであり、 <json-new-cluster-spec>new_cluster structure を含む JSON ドキュメントです。 Git URI は https://github.com/<repo>#<project-folder> の形式にする必要があります。

クラスター指定の例を次に示します。

{
  "spark_version": "7.3.x-scala2.12",
  "num_workers": 1,
  "node_type_id": "Standard_DS3_v2"
}

ワーカーにライブラリをインストールする必要がある場合は、"クラスター指定" の形式を使用します。 Python ホイール ファイルは DBFS にアップロードし、pypi 依存関係として指定する必要があることに注意してください。 次に例を示します。

{
  "new_cluster": {
    "spark_version": "7.3.x-scala2.12",
    "num_workers": 1,
    "node_type_id": "Standard_DS3_v2"
  },
  "libraries": [
    {
      "pypi": {
        "package": "tensorflow"
      }
    },
    {
      "pypi": {
         "package": "/dbfs/path_to_my_lib.whl"
      }
    }
  ]
}

重要

  • .egg および .jar の依存関係は MLflow プロジェクトではサポートされていません。
  • Docker 環境での MLflow プロジェクトの実行はサポートされていません。
  • Databricks で MLflow プロジェクトを実行するときは、新しいクラスター指定を使用する必要があります。 既存のクラスターに対するプロジェクトの実行はサポートされていません。

SparkR の使用

MLflow プロジェクトの実行で SparkR を使用するには、プロジェクトのコードで、次のように、まず SparkR をインストールしてインポートする必要があります。

if (file.exists("/databricks/spark/R/pkg")) {
    install.packages("/databricks/spark/R/pkg", repos = NULL)
} else {
    install.packages("SparkR")
}

library(SparkR)

続いて、プロジェクトで SparkR セッションを初期化し、通常どおり SparkR を使用できます。

sparkR.session()
...

この例では、実験を作成する方法、Azure Databricks クラスターで MLflow チュートリアル プロジェクトを実行する方法、ジョブ実行の出力を表示する方法、および実験で実行を表示する方法を示します。

必要条件

  1. pip install mlflow を使用して MLflow をインストールします。
  2. DATABRICKS CLI をインストールして構成します。 Azure Databricks クラスターでジョブを実行するには、Databricks CLI 認証メカニズムが必要です。

手順 1: 実験を作成する

  1. ワークスペースで [MLflow 実験の作成>] を選択します。

  2. [名前] フィールドに「Tutorial」と入力します。

  3. Create をクリックしてください。 実験 ID をメモしておきます。 この例では 14622565 です。

    実験 ID

手順 2: MLflow チュートリアル プロジェクトを実行する

次の手順では、MLFLOW_TRACKING_URI 環境変数を設定し、プロジェクトを実行して、前の手順でメモしておいた実験にトレーニングパラメーター、メトリック、およびトレーニング済みのモデルを記録します。

  1. MLFLOW_TRACKING_URI 環境変数を Azure Databricks ワークスペースに設定します。

    export MLFLOW_TRACKING_URI=databricks
    
  2. MLflow チュートリアル プロジェクトを実行して、ワイン モデルをトレーニングします。 <experiment-id> を前の手順でメモしておいた実験 ID で置き換えます。

    mlflow run https://github.com/mlflow/mlflow#examples/sklearn_elasticnet_wine -b databricks --backend-config cluster-spec.json --experiment-id <experiment-id>
    
    === Fetching project from https://github.com/mlflow/mlflow#examples/sklearn_elasticnet_wine into /var/folders/kc/l20y4txd5w3_xrdhw6cnz1080000gp/T/tmpbct_5g8u ===
    === Uploading project to DBFS path /dbfs/mlflow-experiments/<experiment-id>/projects-code/16e66ccbff0a4e22278e4d73ec733e2c9a33efbd1e6f70e3c7b47b8b5f1e4fa3.tar.gz ===
    === Finished uploading project to /dbfs/mlflow-experiments/<experiment-id>/projects-code/16e66ccbff0a4e22278e4d73ec733e2c9a33efbd1e6f70e3c7b47b8b5f1e4fa3.tar.gz ===
    === Running entry point main of project https://github.com/mlflow/mlflow#examples/sklearn_elasticnet_wine on Databricks ===
    === Launched MLflow run as Databricks job run with ID 8651121. Getting run status page URL... ===
    === Check the run's status at https://<databricks-instance>#job/<job-id>/run/1 ===
    
  3. MLflow 実行出力の最後の行にある URL https://<databricks-instance>#job/<job-id>/run/1 をコピーします。

手順 3: Azure Databricks ジョブの実行を表示する

  1. ブラウザーで前の手順でコピーしておいた URL を開いて、Azure Databricks ジョブ実行の出力を表示します。

    ジョブ実行の出力

手順 4: 実験と MLflow 実行の詳細を表示する

  1. Azure Databricks ワークスペースで実験に移動します。

    実験に進む

  2. 実験をクリックします。

    実験を表示する

  3. 実行の詳細を表示するには、[日付] 列のリンクをクリックします。

    実行の詳細

実行のログを表示するには、[ジョブの出力] フィールドの [ログ] リンクをクリックします。

リソース

MLflow プロジェクトの例については、「MLflow アプリ ライブラリ」を参照してください。これには、コードに ML 機能を簡単に組み込むことを目的とした、実行可能なプロジェクトのリポジトリが含まれています。