Freigeben über


Hyperopt-Konzepte

Hinweis

Die Open-Source-Version von Hyperopt wird nicht mehr gepflegt.

Hyperopt wird in der nächsten haupt-DBR ML-Version entfernt. Azure Databricks empfiehlt die Verwendung von Optuna für eine ähnliche Erfahrung und den Zugriff auf aktuellere Hyperparameter-Optimierungsalgorithmen.

In diesem Artikel werden einige der Konzepte beschrieben, mit denen Sie vertraut sein müssen, um verteilte Hyperopt-Konzepte verwenden zu können.

Inhalt dieses Abschnitts:

Beispiele zur Verwendung von Hyperopt in Azure Databricks finden Sie unter Hyperopt.

fmin()

Für die Hyperopt-Ausführung verwenden Sie fmin(). Die Argumente für fmin() sind in der Tabelle angezeigt. Weitere Informationen finden Sie in der Hyperopt-Dokumentation. Beispiele für die Verwendung der einzelnen Argumente finden Sie in den Beispielnotebooks.

Argumentname BESCHREIBUNG
fn Objective-Funktion. Hyperopt ruft diese Funktion über Werte auf, die aus dem im Space-Argument bereitgestellten Hyperparameterraum generiert wurden. Diese Funktion kann den Verlust als Skalarwert oder in einem Wörterbuch zurückgeben (weitere Informationen finden Sie in der Hyperopt-Dokumentation). Diese Funktion enthält in der Regel Code für Modelltraining- und Verlustberechnung.
space Sie definiert den zu durchsuchenden Hyperparameterraum. Hyperopt ermöglicht große Flexibilität bei der Definition dieses Raums. Sie können eine kategorische Option auswählen, z. B. Algorithmus oder probabilistische Verteilung für numerische Werte wie „uniform“ und „log“.
algo Der für die Suche im Hyperparameterraum zu verwendende Hyperopt-Suchalgorithmus. Am häufigsten verwendet werden hyperopt.rand.suggest für die zufällige Suche und hyperopt.tpe.suggest für TPE.
max_evals Anzahl der Hyperparametereinstellungen, die ausprobiert werden sollen (Anzahl der anzupassenden Modelle).
max_queue_len Anzahl der Hyperparametereinstellungen, die Hyperopt im Voraus generieren soll. Der Hyperopt TPE-Generierungsalgorithmus kann einige Zeit in Anspruch nehmen, daher kann es hilfreich sein, diese Anzahl über den Standardwert 1 hinaus zu erhöhen, aber im Allgemeinen nicht über die SparkTrials Einstellung parallelism hinaus.
trials Ein Trials- oder SparkTrials-Objekt. Verwenden Sie SparkTrials, wenn Sie in der Objective-Funktion Algorithmen für einzelne Computer wie Scikit-Learn-Methoden aufrufen. Verwenden Sie Trials, wenn Sie in der Objective-Funktion verteilte Trainingsalgorithmen wie MLlib-Methoden oder Horovod aufrufen.
early_stop_fn Eine optionale Funktion zum vorzeitigen Beenden, um zu bestimmen, ob fmin beendet werden soll, bevor max_evals erreicht wird. Der Standardwert ist None. Die Eingabesignatur der Funktion ist Trials, *args, und die Ausgabesignatur ist bool, *args. Die boolesche Ausgabe gibt an, ob beendet werden soll oder nicht. *args ist ein beliebiger Zustand, wobei die Ausgabe eines Aufrufs von early_stop_fn als Eingabe für den nächsten Aufruf dient. Trials kann ein SparkTrials-Objekt sein. Bei der Verwendung von SparkTrials wird nicht garantiert, dass die Funktion zum vorzeitigen Beenden nach jedem Versuch ausgeführt wird, stattdessen wird sie abgefragt. Beispiel für eine Funktion zum vorzeitigen Beenden

Die Klasse SparkTrials

SparkTrials ist eine von Databricks entwickelte API, mit der Sie eine Hyperopt-Ausführung verteilen können, ohne weitere Änderungen an Ihrem Hyperopt-Code vorzunehmen. SparkTrials beschleunigt die Optimierung einzelner Computer, indem Versuche auf Spark-Worker verteilt werden.

Hinweis

SparkTrials dient der Parallelisierung von Berechnungen für ML-Modelle mit einzelnen Computern, wie z. B. scikit-learn. Für Modelle, die mit verteilten ML-Algorithmen wie MLlib oder Horovod erstellt wurden, darf SparkTrials nicht verwendet werden. In diesem Fall wird der Modellerstellungsprozess automatisch im Cluster parallelisiert und die Hyperopt-Standardklasse Trials verwendet werden.

In diesem Abschnitt wird die Konfiguration von Argumenten beschrieben, die Sie an SparkTrials übergeben, sowie Aspekte der Implementierung von SparkTrials.

Argumente

SparkTrials benötigt zwei optionale Argumente:

  • parallelism: Maximale Anzahl der gleichzeitig auszuwertenden Versuche. Mit einer höheren Zahl können Sie Tests der Hyperparametereinstellungen horizontal skalieren. Da Hyperopt neue Versuche basierend auf früheren Ergebnissen vorschlägt, findet ein Trade-Off zwischen Parallelität und Adaptivität statt. Bei einer festen max_evals beschleunigt eine höhere Parallelität die Berechnungen, aber eine geringere Parallelität kann zu besseren Ergebnissen führen, da jede Iteration auf frühere Ergebnisse zugreift.

    Standardwert: Anzahl der verfügbaren Spark-Executors. Höchstwert: 128. Wenn der Wert größer als die Anzahl gleichzeitiger Aufgaben ist, die die Clusterkonfiguration zulässt, verringert SparkTrials die Parallelität auf diesen Wert.

  • timeout: Maximale Anzahl von Sekunden, die ein fmin()-Aufruf dauern kann. Wird diese Zahl überschritten, werden alle Ausführungen und fmin() beendet. Informationen über abgeschlossene Ausführungen werden gespeichert.

Implementierung

Für die Definition der Objective-Funktion fn, die an fmin() übertragen wird, und bei der Auswahl eines Cluster-Setups ist es hilfreich zu verstehen, wie SparkTrials die Abstimmungsaufgaben verteilt.

In Hyperopt entspricht ein Versuch im Allgemeinen der Anpassung eines Modells mit einer Einstellung von Hyperparametern. Hyperopt generiert iterativ Versuche, wertet sie aus und wiederholt sie.

Mit SparkTrialsgeneriert der Treiberknoten des Clusters neue Versuche, und Workerknoten werten diese Versuche aus. Jeder Versuch wird durch einen Spark-Job erzeugt, der eine Aufgabe hat, und wird in der Aufgabe auf einem Workercomputer ausgewertet. Wenn der Cluster so eingerichtet ist, dass mehrere Aufgaben pro Worker ausgeführt werden, können mehrere Versuche gleichzeitig auf diesem Worker ausgewertet werden.

SparkTrials und MLflow

Databricks Runtime ML unterstützt die Protokollierung von Workern in MLflow. Sie können benutzerdefinierten Protokollierungscode in die Objective-Funktion einfügen, die Sie an Hyperopt übergeben.

SparkTrials protokolliert Optimierungsergebnisse als verschachtelte MLflow-Ausführungen wie folgt:

  • Haupt- oder übergeordnete Ausführung: Der Aufruf von fmin() wird als Hauptausführung protokolliert. Wenn eine aktive Ausführung vorhanden ist, protokolliert SparkTrials diese aktive Ausführung und beendet die Ausführung nicht, wenn fmin() zurückgegeben wird. Wenn keine aktive Ausführung vorhanden ist, erstellt SparkTrials eine neue Ausführung, protokolliert sie und beendet die Ausführung bevor fmin() zurückgegeben wird.
  • Untergeordnete Ausführungen: Jede getestete Hyperparametereinstellung (eine „Versuch“) wird als untergeordnete Ausführung unter dem Hauptlauf protokolliert. MLflow-Protokolldatensätze von Workern werden ebenfalls unter den entsprechenden untergeordneten Ausführungen gespeichert.

Beim Aufrufen von fmin() empfiehlt Databricks eine aktive MLflow-Ausführungsverwaltung, d. h. den Aufruf von fmin() in eine with mlflow.start_run():-Anweisung einzuschließen. Dadurch ist sichergestellt, dass jeder fmin()-Aufruf in einer separaten MLflow-Hauptausführung protokolliert wird, und es ist einfacher, zusätzliche Tags, Parameter oder Metriken für diese Ausführung zu protokollieren.

Hinweis

Wenn Sie innerhalb derselben aktiven MLflow-Ausführung fmin() mehrmals aufrufen, protokolliert MLflow diese Aufrufe für die gleiche Hauptausführung. Um Namenskonflikte für protokollierte Parameter und Tags zu lösen, fügt MLflow Namen mit Konflikten eine UUID hinzu.

Bei der Protokollierung von Workern ist es nicht erforderlich, Ausführungen explizit in der Objective-Funktion zu verwalten. Rufen Sie mlflow.log_param("param_from_worker", x) in der Objective-Funktion auf, um einen Parameter für die untergeordnete Ausführung zu protokollieren. Es können Parameter, Metriken, Tags und Artefakte in der Objective-Funktion protokolliert werden.