Pokud je v Hyperoptu povolená možnost SparkTrials, spuštění nejsou vnořená

Problém

SparkTrials je rozšíření Hyperopt, které umožňuje distribuci běhů na pracovníky Sparku.

Když spustíte MLflow spuštěný s nástrojem nested=True v pracovní funkci, výsledky by se měly vnořovat do nadřazeného spuštění.

V některých případech nejsou výsledky vnořené v nadřazeném běhu, i když jste nested=True v pracovní funkci spustili SparkTrials.

Příklad:

from hyperopt import fmin, tpe, hp, Trials, STATUS_OK

def train(params):
  """
  An example train method that computes the square of the input.
  This method will be passed to `hyperopt.fmin()`.

  :param params: hyperparameters. Its structure is consistent with how search space is defined. See below.
  :return: dict with fields 'loss' (scalar loss) and 'status' (success/failure status of run)
  """
  with mlflow.start_run(run_name='inner_run', nested=True) as run:

    x, = params
  return {'loss': x ** 2, 'status': STATUS_OK}

with mlflow.start_run(run_name='outer_run_with_sparktrials'):
  spark_trials_run_id = mlflow.active_run().info.run_id
  argmin = fmin(
    fn=train,
    space=search_space,
    algo=algo,
    max_evals=16,
    trials=spark_trials
  )

Očekávané výsledky:

Očekával se výstup z SparkTrials.

Skutečné výsledky:

Skutečný výstup z SparkTrials

Příčina

Open source verze Hyperopt nepodporuje požadované funkce, které jsou nezbytné pro správně vnořené SparkTrials MLflow spuštěné v Azure Databricks.

Řešení

Databricks Runtime pro Machine Learning obsahuje interní rozvětvení Hyperopt s dalšími funkcemi. Pokud chcete používat SparkTrials, měli byste použít Databricks Runtime pro Machine Learning místo ruční instalace Hyperopt z open source úložišť.