概要
Databricks にて Hyperopt を利用した際に特定の MLflow の experiment へトラッキングする方法を共有します。Hyperopt 利用時には、MLflow へトラッキングする際にset_experiment
により experiment を指定することで想定通りにトラッキングできました。
mlflow.set_experiment(experiment_id="1420974677739169")
with mlflow.start_run():
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
Hyperopt 利用時には親子関係でトラッキングが実施されるため、次のリンク先にて記載されている MLflow の仕様により、experiment_id の指定方法によっては想定通りに動作しない場合があります。
本記事では、次のリンク先にあるサンプルノートブックに基づいた検証結果を共有します。サンプルノートブックの一部を修正し、その実行結果を確認しました。
引用元: hyperopt-sklearn-model-selection - Databricks (microsoft.com)
Hyperopt の詳細を知りたい場合には、次のドキュメントが参考になります。
- Hyperopt の概念 - Azure Databricks | Microsoft Learn
- ハイパーパラメーターの調整 - Azure Databricks | Microsoft Learn
- scikit-learn と MLflow を使用したハイパーパラメーター チューニングの並列化 - Azure Databricks | Microsoft Learn
- モデルの型を Hyperopt と MLflow と比較する - Azure Databricks | Microsoft Learn
基本的な Hyperopt 利用時の MLflow へのトラッキング動作の確認
サンプルノートブックの実行結果から基本的な Hyperopt による MLflow へのトラッキングに関する動作を確認します。
サンプルノートブックでは、fmin
メソッドを実行する際に、mlflow.start_run
によりトラッキングが実施されるようになっております。experiment_id を指定していないため、現在のノートブックにトラッキングされます。
Hyperopt で、チューニング対象の関数をobject
パラメータに指定するのですが、サンプルノートブックでは次のようなコードとなっております。MLflow へのトラッキングが明示されておりませんが、fmin
メソッドがトラッキング対象となっているため ML モデルの学習時に MLflow へトラッキングするようです。
サンプルノートブックの実行後、現在のノートブック上の experiment を確認すると、MLflow に対して親子階層でトラッキングされることが確認できました。dashing-sheep-743
が親の experiment であり、spiffy-rat-555
やorderly-finch-409
などが子の experiment です。
親の experiment では、fmin
メソッド実行時のパラメータや実行時のソースであるノートブックへのリンクが記載されています。
子の experiment では、モデル学習時のハイパーパラメータやメトリックなどの ML モデルの情報が記載されています。
指定した experiment にトラッキングする方法
C1. set_experiment
メソッドで experiment_id を指定する方法
set_experiment
メソッドで experiment_id を指定するため、トラッキング先の experiment を作成後、サンプルノートブックのコードを次のように修正しました。
修正前
with mlflow.start_run():
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
修正後
mlflow.set_experiment(experiment_id="1420974677739169")
with mlflow.start_run():
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
ノートブックを実行すると、指定した experiment に親子階層でトラッキングされました。
想定通りに experiment にトラッキングできない例
E1. fmin
メソッド実行時に experiment_id を指定する方法
fmin
メソッド実行時に experiment_id を指定するため、サンプルノートブックのコードを次のように修正しました。
修正前
with mlflow.start_run():
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
修正後
with mlflow.start_run(experiment_id="1420974677739169"):
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
修正したノートブックを実行すると、fmin
メソッド実行に関するトラッキングのみ指定した experiment に実施されていました。
ML モデルの学習に関するトラッキングは、実行したノートブックの experiment に記載されていました。そのため、親子階層でトラッキングされていないため、想定通りにトラッキングできていないと判断しました。
E2. fmin
メソッドとobject
指定の関数実行時に experiment_id を指定する方法
fmin
メソッドとobject
指定の関数実行時に experiment_id を指定するため、サンプルノートブックのコードを次のように修正しました。
修正前
with mlflow.start_run():
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
def objective(params):
classifier_type = params['type']
del params['type']
if classifier_type == 'svm':
clf = SVC(**params)
elif classifier_type == 'rf':
clf = RandomForestClassifier(**params)
elif classifier_type == 'logreg':
clf = LogisticRegression(**params)
else:
return 0
accuracy = cross_val_score(clf, X, y_discrete).mean()
# Because fmin() tries to minimize the objective, this function must return the negative accuracy.
return {'loss': -accuracy, 'status': STATUS_OK}
修正後
with mlflow.start_run(experiment_id="1420974677739169"):
best_result = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=32,
trials=spark_trials)
def objective(params):
with mlflow.start_run(experiment_id="1420974677739169"):
classifier_type = params['type']
del params['type']
if classifier_type == 'svm':
clf = SVC(**params)
elif classifier_type == 'rf':
clf = RandomForestClassifier(**params)
elif classifier_type == 'logreg':
clf = LogisticRegression(**params)
else:
return 0
accuracy = cross_val_score(clf, X, y_discrete).mean()
# Because fmin() tries to minimize the objective, this function must return the negative accuracy.
return {'loss': -accuracy, 'status': STATUS_OK}
修正したノートブックを実行すると、fmin
メソッド実行に関するトラッキングのみ指定した experiment に実施されていました。
ML モデルの学習に関するトラッキングは、実行したノートブックの experiment に記載されていました。そのため、親子階層でトラッキングされていないため、想定通りにトラッキングできていないと判断しました。