Parallel Hyperparameter Optimization (HPO) on Container Runtime¶
Die Snowflake ML Hyperparameter-Optimierung (HPO) API ist ein modellunabhängiges Framework, das eine effiziente, parallelisierte Hyperparameter-Abstimmung von Modellen ermöglicht. Sie können jedes Open-Source-Framework oder jeden Algorithmus verwenden. Sie können auch Snowflake ML-APIs verwenden.
You can use HPO in a Snowflake Notebook that’s configured to use the Container Runtime on Snowpark Container Services (SPCS). After you create such a notebook, you can:
Trainieren eines Modells mit einem beliebigen Open-Source-Paket und Verwenden dieser API, um den Hyperparameter-Tuning-Prozess zu verteilen
Trainieren eines Modells mit APIs für verteiltes Training von Snowflake ML und Skalieren von HPO bei gleichzeitiger Skalierung jedes Trainingslaufs
The HPO workload that you initiate from your notebook executes inside Snowpark Container Services on either CPU or GPU instances. The workload scales out to the CPU or GPU cores that are available on a single node in the SPCS compute pool.
Die parallelisierte HPO-API bietet die folgenden Vorteile:
Eine einzige API, die automatisch alle komplexen Aufgaben der Verteilung des Trainings auf mehrere Ressourcen übernimmt
Die Möglichkeit, mit praktisch jedem Framework oder Algorithmus zu trainieren, unter Verwendung von Open-Source-ML-Frameworks oder der Modellierungs-APIs von Snowflake ML
Eine Auswahl an Tuning- und Sampling-Optionen, einschließlich Bayes’scher und zufälliger Suchalgorithmen sowie verschiedener kontinuierlicher und nicht-kontinuierlicher Sampling-Funktionen
Enge Datenintegration mit dem Rest von Snowflake, z. B. effiziente Datenaufnahme (Ingestion) über Snowflake-Datensets oder -Datenframes und automatische Erfassung der ML-Datenherkunft
Bemerkung
Sie können den HPO-Lauf skalieren, um mehrere Knoten im SPCS-Computepool zu verwenden. Weitere Informationen dazu finden Sie unter Workload auf einem Multi-Node-Cluster ausführen.
Optimieren Sie die Hyperparameter eines Modells¶
Verwenden Sie die Snowflake ML HPO-API, um ein Modell zu tunen. Die folgenden Schritte veranschaulichen den Vorgang:
Nehmen Sie die Daten auf.
Verwenden Sie den Suchalgorithmus, um die Strategie für die Optimierung der Hyperparameter zu definieren.
Definieren Sie, wie die Hyperparameter abgetastet werden.
Konfigurieren Sie den Tuner.
Holen Sie sich die Hyperparameter und Trainingsmetriken von jedem Trainingsauftrag.
Starten Sie den Trainingsauftrag.
Holen Sie sich die Ergebnisse des Trainings.
In den folgenden Abschnitten werden die vorangegangenen Schritte erläutert. Ein Beispiel finden Sie unter Container Runtime HPO-Beispiel.
Nehmen Sie die Daten auf.¶
Verwenden Sie das Objekt dataset_map, um die Daten in die HPO-API zu übernehmen. Das dataset_map-Objekt ist ein Wörterbuch, das den Trainings- oder Testdatensatz mit dem entsprechenden Snowflake DataConnector-Objekt verbindet. Das Objekt dataset_map wird an die Trainingsfunktion übergeben. Im Folgenden finden Sie ein Beispiel für ein dataset_map-Objekt:
Definieren Sie den Suchalgorithmus¶
Definieren Sie den Suchalgorithmus, der zur Erkundung des Hyperparameterraums verwendet wird. Der Algorithmus verwendet die Ergebnisse früherer Versuche, um zu bestimmen, wie die Hyperparameter konfiguriert werden sollen. Sie können die folgenden Suchalgorithmen verwenden:
Rastersuche
Durchsucht ein Raster nach Hyperparamter-Werten, die Sie definieren. Die HPO-API wertet jede mögliche Kombination von Hyperparametern aus. Im Folgenden sehen Sie ein Beispiel für ein Hyperparameter-Raster:
Im vorangegangenen Beispiel hat jeder Parameter zwei mögliche Werte. Es gibt 8 (2 * 2 * 2) mögliche Kombinationen von Hyperparametern.
Bayessche Optimierung
Verwendet ein probabilistisches Modell, um den nächsten Satz von zu bewertenden Hyperparametern zu bestimmen. Der Algorithmus verwendet die Ergebnisse früherer Versuche, um zu bestimmen, wie die Hyperparameter konfiguriert werden sollen. Weitere Informationen zur Bayes’schen Optimierung finden Sie unter Bayes’sche Optimierung.
Zufällige Suche
Nimmt zufällige Stichproben aus dem Hyperparameterraum. Dies ist ein einfacher und effektiver Ansatz, der besonders gut bei großen oder gemischten (kontinuierlichen oder diskreten) Suchräumen funktioniert.
Sie können den folgenden Code verwenden, um den Suchalgorithmus zu definieren:
Definieren Sie Hyperparameter-Sampling¶
Verwenden Sie die Suchraumfunktionen, um die Hyperparameter-Sampling-Methode bei jedem Versuch zu definieren. Verwenden Sie sie, um den Bereich und die Art der Werte zu beschreiben, die die Hyperparameter annehmen können.
Im Folgenden finden Sie die verfügbaren Stichprobenfunktionen:
uniform(
lower,upper): Nimmt einen kontinuierlichen Wert gleichmäßig zwischen dem unteren und oberen Wert auf. Nützlich für Parameter wie Dropout-Raten oder Regularisierungsstärken.loguniform(
lower,upper): Nimmt einen Wert im logarithmischen Raum auf, ideal für Parameter, die mehrere Größenordnungen umfassen (z. B. Lernraten).randint(
lower,upper): Nimmt eine ganze Zahl gleichmäßig zwischen dem unteren (inklusive) und oberen (exklusive) Wert auf. Geeignet für diskrete Parameter wie die Anzahl der Ebenen.choice(options): Wählt zufällig einen Wert aus einer vorgegebenen Liste aus. Wird oft für kategorische Parameter verwendet.
Im Folgenden finden Sie ein Beispiel dafür, wie Sie den Suchraum mit der Uniform-Funktion definieren können:
Konfigurieren Sie den Tuner¶
Verwenden Sie das Objekt TunerConfig, um den Tuner zu konfigurieren. Innerhalb des Objekts geben Sie die zu optimierende Metrik, den Optimierungsmodus und die anderen Ausführungsparameter an. Im Folgenden finden Sie die verfügbaren Konfigurationsoptionen:
Metrik Die Leistungsmetrik, wie z. B. Genauigkeit oder Verlust, die Sie optimieren möchten.
Modus bestimmt, ob das Ziel darin besteht, die Metrik zu maximieren oder zu minimieren (
"max"oder"min").Suchalgorithmus legt die Strategie zur Erkundung des Hyperparameterraums fest.
Anzahl der Versuche legt die Gesamtzahl der zu bewertenden Hyperparameter-Konfigurationen fest.
Parallelität legt fest, wie viele Versuche gleichzeitig laufen können.
Der folgende Beispielcode verwendet die Bayes’sche Optimierungsbibliothek, um die Genauigkeit eines Modells über fünf Versuche zu maximieren.
Holen Sie sich die Hyperparameter und Trainingsmetriken¶
Die Snowflake ML HPO-API benötigt die Trainingsmetriken und Hyperparameter aus jedem Trainingslauf, um die Hyperparameter effektiv zu optimieren. Verwenden Sie das Objekt TunerContext, um die Hyperparameter und Trainingsmetriken zu erhalten. Das folgende Beispiel erstellt eine Trainingsfunktion, um die Hyperparameter und Trainingsmetriken zu ermitteln:
Initiieren Sie den Trainings-Job¶
Verwenden Sie das Objekt Tuner, um den Trainings-Job zu starten. Das Objekt Tuner nimmt die Trainingsfunktion, den Suchraum und die Tuner-Konfiguration als Argumente an. Im Folgenden finden Sie ein Beispiel dafür, wie Sie den Trainings-Job initiieren:
Der vorangehende Code verteilt die Trainingsfunktion auf die verfügbaren Ressourcen. Es sammelt und fasst die Versuchsergebnisse zusammen und identifiziert die beste Konfiguration.
Holen Sie sich die Ergebnisse des Trainings-Jobs¶
Nachdem alle Versuche abgeschlossen sind, konsolidiert das Objekt
TunerResultsdie Ergebnisse der einzelnen Versuche. Es bietet einen strukturierten Zugang zu den Leistungsmetriken, der besten Konfiguration und dem besten Modell.Im Folgenden finden Sie die verfügbaren Attribute:
results: Ein pandas-DataFrame mit Metriken und Konfigurationen für jeden Versuch.
best_result:: Eine DataFrame-Zeile, die den Versuch mit der besten Leistung zusammenfasst.
best_model: Die mit der besten Studie verbundene Modellinstanz, falls zutreffend.
Der folgende Code liefert die Ergebnisse, das beste Modell und das beste Ergebnis:
API-Referenz¶
Tuner¶
Im Folgenden finden Sie die Import-Anweisung für das Tuner-Modul:
Die Tuner-Klasse ist die Hauptschnittstelle für die Interaktion mit der Container Runtime HPO-API. Um einen HPO-Job auszuführen, verwenden Sie den folgenden Code, um ein Tuner-Objekt zu initialisieren und die Run-Methode mit den Snowflake-Datensätzen aufzurufen.
SearchSpace¶
Im Folgenden finden Sie die Importanweisung für den Suchraum:
Der folgende Code definiert die Suchraumfunktionen:
TunerConfig¶
Im Folgenden finden Sie die Importanweisung für das TunerConfig-Modul:
Verwenden Sie den folgenden Code, um die Konfigurationsklasse für den Tuner zu definieren:
SearchAlgorithm¶
Im Folgenden finden Sie die Importanweisung für den Suchalgorithmus:
Der folgende Code erstellt ein Objekt für einen Suchalgorithmus der Bayes’schen Optimierung:
Der folgende Code erstellt ein Objekt für einen zufälligen Suchalgorithmus:
TunerResults¶
Der folgende Code erstellt ein TunerResults-Objekt:
get_tuner_context¶
Im Folgenden finden Sie die Importanweisung für das get_tuner_context-Modul:
Diese Hilfsmethode ist dafür gedacht, innerhalb der Trainingsfunktion aufgerufen zu werden. Sie gibt ein TunerContext-Objekt zurück, das mehrere nützliche Felder für die Durchführung der Studie enthält, darunter:
Vom HPO-Framework für die aktuelle Studie ausgewählte Hyperparameter.
Der für das Training benötigte Datensatz.
Eine Hilfsfunktion zum Berichten von Metriken, die das HPO-Framework beim Vorschlagen des nächsten Satzes von Hyperparametern unterstützt
Der folgende Code erstellt ein Tuner-Kontextobjekt:
Einschränkungen¶
Die Bayes’sche Optimierung erfordert kontinuierliche Suchräume und funktioniert nur mit der einheitlichen Stichprobenfunktion. Sie ist nicht kompatibel mit diskreten Parametern, die mit den tune.randint- oder tune.choice-Methoden ausgewählt werden. Um diese Beschränkung zu umgehen, verwenden Sie entweder tune.uniform und wandeln den Parameter innerhalb der Trainingsfunktion um, oder Sie wechseln zu einem Sampling-Algorithmus, der sowohl diskrete als auch kontinuierliche Räume verarbeitet, wie z. B. tune.RandomSearch.
Problembehandlung¶
Fehlermeldung |
Mögliche Ursachen |
Mögliche Lösungen |
|---|---|---|
Ungültige Suchraumkonfiguration: BayesOpt verlangt, dass alle Sampling-Funktionen vom Typ „Uniform“ sind. |
Die Bayes’sche Optimierung funktioniert nur mit einheitlichem Sampling, nicht mit diskreten Stichproben. (Siehe Einschränkungen oben.) |
|
Unzureichende CPU-Ressourcen. Benötigt: 16, Verfügbar: 8. Die Anzahl der erforderlichen und verfügbaren Ressourcen kann unterschiedlich sein. |
|
Folgen Sie den Anweisungen in der Fehlermeldung. |
Unzureichende GPU-Ressourcen. Benötigt: 4, verfügbar: 2. Kann sich auf CPU oder GPU beziehen. Die Anzahl der erforderlichen und verfügbaren Ressourcen kann unterschiedlich sein. |
|
Folgen Sie den Anweisungen in der Fehlermeldung. |