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 festenmax_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 einfmin()
-Aufruf dauern kann. Wird diese Zahl überschritten, werden alle Ausführungen undfmin()
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 SparkTrials
generiert 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, protokolliertSparkTrials
diese aktive Ausführung und beendet die Ausführung nicht, wennfmin()
zurückgegeben wird. Wenn keine aktive Ausführung vorhanden ist, erstelltSparkTrials
eine neue Ausführung, protokolliert sie und beendet die Ausführung bevorfmin()
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.