Databricksでの MLflow プロジェクトの実行
MLflow プロジェクトは、再利用可能で再現可能な方法でデータサイエンス コードをパッケージ化するための形式です。MLflow プロジェクト コンポーネントには、プロジェクトを実行するための API とコマンド ライン ツールが含まれており、追跡コンポーネントと統合して、再現のためにソース コードのパラメーターと git コミットを自動的に記録します。
この記事では、MLflow プロジェクトの形式と、データサイエンス コードを垂直方向にスケーリングしやすくする MLflow CLI を使用して Databricks クラスターで MLflow プロジェクトをリモートで実行する方法について説明します。
MLflow プロジェクトの実行は、Databricks コミュニティ エディションではサポートされていません。
MLflow プロジェクトの形式
任意のローカル ディレクトリまたは Git リポジトリを MLflow プロジェクトとして扱うことができます。 次の規則でプロジェクトを定義します。
プロジェクトの名前は、ディレクトリの名前です。
ソフトウェア環境は、存在する場合は
python_env.yaml
で指定されます。python_env.yaml
ファイルが存在しない場合、MLflow はプロジェクトの実行時に Python (具体的には、virtualenv で使用できる最新の Python) のみを含む仮想環境を使用します。プロジェクト内の
.py
または.sh
ファイルは、パラメーターを明示的に宣言せずにエントリ ポイントにすることができます。 パラメーターのセットを指定してこのようなコマンドを実行すると、MLflow は--key <value>
構文を使用してコマンド ラインで各パラメーターを渡します。
より多くのオプションを指定するには、YAML 構文のテキスト ファイルである MLproject ファイルを追加します。 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
いずれかを設定する必要があります。 どちらか一方を指定しないか、両方の設定を指定しないと、例外が発生します。
次に、databricks_spark_job.python_file
設定を使用する MLproject
ファイルの例を示します。この設定では、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
次に、entry_points
設定を使用する MLproject
ファイルの例を示します。
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_env
、python_env
、またはconda_env
のセクションの指定はサポートされていません。プロジェクトの依存関係は、
databricks_spark_job
セクションのpython_libraries
フィールドで指定する必要があります。このプロジェクト タイプでは、Python のバージョンをカスタマイズできません。実行環境では、Databricks Runtime 13.0 以降を使用するジョブ クラスターで実行するために、メインの Spark ドライバー ランタイム環境を使用する必要があります。
同様に、プロジェクトに必須として定義されているすべての Python 依存関係は、Databricks クラスターの依存関係としてインストールする必要があります。 この動作は、ライブラリを別の環境にインストールする必要があった以前のプロジェクト実行動作とは異なります。
MLflow プロジェクトを実行する
既定のワークスペースの Databricks クラスターで MLflow プロジェクトを実行するには、次のコマンドを使用します。
mlflow run <uri> -b databricks --backend-config <json-new-cluster-spec>
ここで、 <uri>
は MLflow プロジェクトを含む Git リポジトリ URI またはフォルダー、 <json-new-cluster-spec>
は new_cluster構造を含む JSON ドキュメントです。 Git URI の形式は https://github.com/<repo>#<project-folder>
である必要があります。
クラスター指定の例を次に示します。
{
"spark_version": "7.3.x-scala2.12",
"num_workers": 1,
"node_type_id": "i3.xlarge"
}
ワーカーにライブラリをインストールする必要がある場合は、「クラスター仕様」形式を使用します。 Python wheelファイルはDBFSにアップロードし、pypi
依存関係として指定する必要があることに注意してください。 例えば:
{
"new_cluster": {
"spark_version": "7.3.x-scala2.12",
"num_workers": 1,
"node_type_id": "i3.xlarge"
},
"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()
...
例
この例では、エクスペリメントを作成する方法、Databricks クラスターで MLflow チュートリアル プロジェクトを実行する方法、ジョブ実行出力を表示する方法、エクスペリメントでの実行を表示する方法を示します。
要件
pip install mlflow
を使用してMLflowをインストールします。Databricks CLI をインストールして構成します。Databricks クラスターでジョブを実行するには、Databricks CLI 認証メカニズムが必要です。
ステップ 1: エクスペリメントを作成する
ワークスペースで、 [ MLflow エクスペリメント>作成] を選択します。
名前 フィールドに、
Tutorial
と入力します。[ 作成] をクリックします。 エクスペリメント ID をメモします。 この例では、
14622565
です。
ステップ 2: MLflow チュートリアル プロジェクトを実行する
次のステップ では、 MLFLOW_TRACKING_URI
環境変数を設定してプロジェクトを実行し、トレーニング パラメーター、メトリクス、およびトレーニング済みモデルを前のステップでメモしたエクスペリメントに記録します。
MLFLOW_TRACKING_URI
環境変数を Databricks ワークスペースに設定します。export MLFLOW_TRACKING_URI=databricks
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 ===
MLflow 実行出力の最後の行にある URL
https://<databricks-instance>#job/<job-id>/run/1
をコピーします。
リソース
機械学習フロー プロジェクトの例については、機械学習機能をコードに簡単に含めることを目的とした、すぐに実行できるプロジェクトのリポジトリを含む MLflow App Libraryを参照してください。