Paralelizacja hiperparametryzacji w Hyperopt

Uwaga

Wersja biblioteki Hyperopt typu open source nie jest już utrzymywana.

Funkcja Hyperopt nie jest uwzględniona w środowisku Databricks Runtime for Machine Learning po 16.4 LTS ML. Usługa Azure Databricks zaleca użycie Optuna na potrzeby optymalizacji pojedynczego węzła lub RayTune w celu uzyskania podobnego doświadczenia do przestarzałej funkcjonalności rozproszonego dostrajania hiperparametrów przy użyciu Hyperopt. Dowiedz się więcej o korzystaniu z RayTune w usłudze Azure Databricks.

W tym przykładowym notesie pokazano, jak skalować dostrajanie hiperparametryczne pojedynczej maszyny do klastra Azure Databricks przy użyciu funkcji Hyperopt z SparkTrials. Dostrajasz klasyfikator SVM scikit-learn na zestawie danych Iris, najpierw tworząc przepływ pracy na pojedynczej maszynie fmin(), a następnie równoległy go pomiędzy pracownikami Spark, przy czym MLflow automatycznie śledzi każdą próbę.

Importowanie wymaganych pakietów i ładowanie zestawu danych

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

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

# If you are running Databricks Runtime for Machine Learning, `mlflow` is already installed and you can skip the following line.
import mlflow
# Load the iris dataset from scikit-learn
iris = iris = load_iris()
X = iris.data
y = iris.target

Część 1. Workflow Hyperopt na pojedynczej maszynie

Poniżej przedstawiono kroki przepływu pracy funkcji Hyperopt:

  1. Zdefiniuj funkcję w celu zminimalizowania.
  2. Zdefiniuj miejsce wyszukiwania na hiperparametrach.
  3. Wybierz algorytm wyszukiwania.
  4. Uruchom algorytm dostrajania za pomocą funkcji Hyperopt fmin().

Aby uzyskać więcej informacji, zobacz dokumentację funkcji Hyperopt.

Definiowanie funkcji w celu zminimalizowania

W tym przykładzie używamy klasyfikatora maszyn wektorów nośnych. Celem jest znalezienie najlepszej wartości parametru Cregularyzacji .

Większość kodu dla przepływu pracy Hyperopt znajduje się w funkcji celu. W tym przykładzie użyto klasyfikatora wektorów pomocniczych z pakietu scikit-learn.

Jeśli klaster używa środowiska Databricks Runtime 11.3 ML, zmodyfikuj klasyfikator wektorów nośnych, aby podjąć argument pozycyjny. clf = SVC(C)

def objective(C):
    # Create a support vector classifier model
    clf = SVC(C=C)

    # Use the cross-validation accuracy to compare the models' performance
    accuracy = cross_val_score(clf, X, y).mean()

    # Hyperopt tries to minimize the objective function. A higher accuracy value means a better model, so you must return the negative accuracy.
    return {'loss': -accuracy, 'status': STATUS_OK}

Definiowanie miejsca wyszukiwania na hiperparametrach

Aby uzyskać szczegółowe informacje na temat definiowania przestrzeni wyszukiwania i wyrażeń parametrów, zobacz dokumentację funkcji Hyperopt .

search_space = hp.lognormal('C', 0, 1.0)

Wybieranie algorytmu wyszukiwania

Dwie główne opcje to:

  • hyperopt.tpe.suggest: Drzewo Estymatorów Parzena, podejście bayesowskie, które iteracyjnie i adaptacyjnie wybiera nowe hiperparametry do eksplorowania na podstawie poprzednich wyników
  • hyperopt.rand.suggest: Wyszukiwanie losowe, podejście nieadaptacyjne, które próbkuje w przestrzeni wyszukiwania
algo=tpe.suggest

Uruchamianie algorytmu dostrajania za pomocą funkcji Hyperopt fmin()

Ustaw max_evals maksymalną liczbę punktów w przestrzeni hiperparametrów do przetestowania, czyli maksymalną liczbę modeli do dopasowania i oceny.

argmin = fmin(
  fn=objective,
  space=search_space,
  algo=algo,
  max_evals=16)
# Print the best value found for C
print("Best value found: ", argmin)

Część 2. Dostrajanie rozproszone przy użyciu platformy Apache Spark i platformy MLflow

Aby dystrybuować dostrajanie, dodaj jeszcze jeden argument do fmin()klasy o Trials nazwie SparkTrials.

SparkTrials Przyjmuje 2 argumenty opcjonalne:

  • parallelism: liczba modeli do jednoczesnego dopasowania i oceny. Wartość domyślna to liczba dostępnych miejsc zadań platformy Spark.
  • timeout: maksymalny czas (w sekundach), przez który można uruchamiać fmin(). Wartość domyślna nie jest maksymalnym limitem czasu.

W tym przykładzie użyto bardzo prostej funkcji celu zdefiniowanej w programie Cmd 7. W takim przypadku funkcja jest uruchamiana szybko, a obciążenie uruchamiania zadań platformy Spark dominuje w czasie obliczania, więc obliczenia dla przypadku rozproszonego zajmują więcej czasu. W przypadku typowych rzeczywistych problemów funkcja celu jest bardziej złożona, a użycie SparkTrails do dystrybucji obliczeń jest szybsze niż optymalizacja sprzętu na jednej maszynie.

Automatyczne śledzenie MLflow jest domyślnie włączone. Aby go użyć, wywołaj metodę mlflow.start_run() przed wywołaniem fmin() , jak pokazano w przykładzie.

from hyperopt import SparkTrials

# To display the API documentation for the SparkTrials class, uncomment the following line.
# help(SparkTrials)
spark_trials = SparkTrials()

with mlflow.start_run():
  argmin = fmin(
    fn=objective,
    space=search_space,
    algo=algo,
    max_evals=16,
    trials=spark_trials)
# Print the best value found for C
print("Best value found: ", argmin)

Aby wyświetlić eksperyment MLflow skojarzony z notesem, kliknij ikonę Eksperyment na pasku kontekstu notesu w prawym górnym rogu. W tym miejscu można obejrzeć wszystkie przebiegi. Aby wyświetlić przebiegi w interfejsie użytkownika platformy MLflow, kliknij ikonę po prawej stronie obok pozycji Przebiegi eksperymentów.

Aby zbadać efekt dostrajania C:

  1. Wybierz przebiegi wynikowe i kliknij Porównaj.
  2. Na wykresie punktowym wybierz pozycję C dla osi X i straty dla osi Y.

Po wykonaniu czynności w ostatniej komórce w notesie, powinien wyświetlić się interfejs użytkownika MLflow.

Pokaz funkcji Hyperopt MLflow

Przykładowy notatnik

Paralelizacja hiperparametryzacji w Hyperopt

Pobierz notatnik