Zum Inhalt springen

Effizientes Hyperparameter-Tuning mit Ray Tune und YOLOv8

Die Hyperparameteroptimierung ist entscheidend für das Erreichen der Spitzenleistung des Modells, indem der optimale Satz von Hyperparametern ermittelt wird. Dabei werden Versuche mit unterschiedlichen Hyperparametern durchgeführt und die Leistung jedes Versuchs bewertet.

Beschleunige das Tuning mit Ultralytics YOLOv8 und Ray Tune

Ultralytics YOLOv8 enthält Ray Tune für die Abstimmung der Hyperparameter, wodurch die Optimierung der Hyperparameter des YOLOv8 Modells vereinfacht wird. Mit Ray Tune kannst du fortschrittliche Suchstrategien, Parallelität und frühzeitiges Anhalten nutzen, um den Abstimmungsprozess zu beschleunigen.

Ray Tune

Ray Tune Übersicht

Ray Tune ist eine Bibliothek zum Abstimmen von Hyperparametern, die auf Effizienz und Flexibilität ausgelegt ist. Sie unterstützt verschiedene Suchstrategien, Parallelität und Frühstoppstrategien und lässt sich nahtlos in gängige Machine-Learning-Frameworks integrieren, darunter Ultralytics YOLOv8 .

Integration mit Weights & Biases

YOLOv8 ermöglicht auch die optionale Integration mit Weights & Biases zur Überwachung des Tuning-Prozesses.

Installation

Um die benötigten Pakete zu installieren, führe sie aus:

Installation

# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]"

# Optionally install W&B for logging
pip install wandb

Verwendung

Verwendung

from ultralytics import YOLO

# Load a YOLOv8n model
model = YOLO("yolov8n.pt")

# Start tuning hyperparameters for YOLOv8n training on the COCO8 dataset
result_grid = model.tune(data="coco8.yaml", use_ray=True)

tune() Parameter der Methode

Die tune() Methode in YOLOv8 bietet eine einfach zu bedienende Schnittstelle für die Abstimmung der Hyperparameter mit Ray Tune. Sie akzeptiert mehrere Argumente, mit denen du den Abstimmungsprozess anpassen kannst. Nachfolgend findest du eine ausführliche Erklärung der einzelnen Parameter:

Parameter Typ Beschreibung Standardwert
data str Die Dataset-Konfigurationsdatei (im YAML-Format), mit der der Tuner ausgeführt werden soll. Diese Datei sollte die Pfade für die Trainings- und Validierungsdaten sowie andere datensatzspezifische Einstellungen enthalten.
space dict, optional Ein Wörterbuch, das den Hyperparameter-Suchraum für Ray Tune definiert. Jeder Schlüssel entspricht einem Hyperparameternamen, und der Wert gibt den Wertebereich an, der bei der Abstimmung untersucht werden soll. Wenn nichts angegeben wird, verwendet YOLOv8 einen Standardsuchraum mit verschiedenen Hyperparametern.
grace_period int, optional Die Karenzzeit in Epochen für den ASHA-Scheduler in Ray Tune. Der Scheduler bricht keinen Versuch vor dieser Anzahl von Epochen ab, damit das Modell eine gewisse Mindesttrainingszeit hat, bevor es eine Entscheidung über einen vorzeitigen Abbruch trifft. 10
gpu_per_trial int, optional Die Anzahl der GPUs, die während der Abstimmung pro Versuch zugewiesen werden. Dies hilft, die Nutzung von GPU zu steuern, insbesondere in Umgebungen mit mehrerenGPU . Wenn keine Angabe gemacht wird, nutzt der Tuner alle verfügbaren GPUs. Keine
iterations int, optional Die maximale Anzahl der Versuche, die während der Abstimmung durchgeführt werden. Mit diesem Parameter kannst du die Gesamtzahl der getesteten Hyperparameterkombinationen steuern und sicherstellen, dass der Abstimmungsprozess nicht unendlich lange dauert. 10
**train_args dict, optional Zusätzliche Argumente zur Übergabe an die train() Methode während der Abstimmung. Diese Argumente können Einstellungen wie die Anzahl der Trainingsepochen, die Stapelgröße und andere trainingsspezifische Konfigurationen beinhalten. {}

Indem du diese Parameter anpasst, kannst du den Hyperparameter-Optimierungsprozess genau auf deine Bedürfnisse und die verfügbaren Rechenressourcen abstimmen.

Standard-Suchraum Beschreibung

In der folgenden Tabelle sind die Standard-Suchraumparameter für das Hyperparameter-Tuning in YOLOv8 mit Ray Tune aufgeführt. Jeder Parameter hat einen bestimmten Wertebereich, der durch tune.uniform().

Parameter Wertebereich Beschreibung
lr0 tune.uniform(1e-5, 1e-1) Anfängliche Lernrate
lrf tune.uniform(0.01, 1.0) Endgültiger Lernratenfaktor
momentum tune.uniform(0.6, 0.98) Momentum
weight_decay tune.uniform(0.0, 0.001) Gewichtsabnahme
warmup_epochs tune.uniform(0.0, 5.0) Aufwärm-Epochen
warmup_momentum tune.uniform(0.0, 0.95) Aufwärmschwung
box tune.uniform(0.02, 0.2) Box Verlust Gewicht
cls tune.uniform(0.2, 4.0) Klasse Verlust Gewicht
hsv_h tune.uniform(0.0, 0.1) Bereich der Farbtonvergrößerung
hsv_s tune.uniform(0.0, 0.9) Bereich der Sättigungserweiterung
hsv_v tune.uniform(0.0, 0.9) Wert (Helligkeit) Vergrößerungsbereich
degrees tune.uniform(0.0, 45.0) Bereich der Rotationsvergrößerung (Grad)
translate tune.uniform(0.0, 0.9) Bereich der Übersetzungserweiterung
scale tune.uniform(0.0, 0.9) Skalierung des Vergrößerungsbereichs
shear tune.uniform(0.0, 10.0) Bereich der Scherungserhöhung (Grad)
perspective tune.uniform(0.0, 0.001) Bereich der Perspektivvergrößerung
flipud tune.uniform(0.0, 1.0) Vertikale Flip-Augmentationswahrscheinlichkeit
fliplr tune.uniform(0.0, 1.0) Horizontale Flip-Augmentationswahrscheinlichkeit
mosaic tune.uniform(0.0, 1.0) Wahrscheinlichkeit der Mosaikvergrößerung
mixup tune.uniform(0.0, 1.0) Verwechslungswahrscheinlichkeit der Vergrößerung
copy_paste tune.uniform(0.0, 1.0) Kopieren-Einfügen-Erweiterungswahrscheinlichkeit

Beispiel für einen benutzerdefinierten Suchraum

In diesem Beispiel zeigen wir dir, wie du einen benutzerdefinierten Suchraum für die Abstimmung der Hyperparameter mit Ray Tune und YOLOv8 verwenden kannst. Indem du einen benutzerdefinierten Suchraum angibst, kannst du den Abstimmungsprozess auf bestimmte Hyperparameter von Interesse konzentrieren.

Verwendung

from ultralytics import YOLO

# Define a YOLO model
model = YOLO("yolov8n.pt")

# Run Ray Tune on the model
result_grid = model.tune(
    data="coco8.yaml",
    space={"lr0": tune.uniform(1e-5, 1e-1)},
    epochs=50,
    use_ray=True,
)

Im obigen Codeschnipsel erstellen wir ein YOLO Modell mit den vortrainierten Gewichten "yolov8n.pt". Dann rufen wir die tune() Methode, wobei die Datensatzkonfiguration mit "coco8.yaml" angegeben wird. Wir stellen einen eigenen Suchraum für die anfängliche Lernrate zur Verfügung lr0 unter Verwendung eines Wörterbuchs mit dem Schlüssel "lr0" und dem Wert tune.uniform(1e-5, 1e-1). Schließlich übergeben wir zusätzliche Trainingsargumente, wie die Anzahl der Epochen, direkt an die Tune-Methode als epochs=50.

Verarbeitung der Ray Tune Ergebnisse

Nachdem du ein Hyperparameter-Tuning-Experiment mit Ray Tune durchgeführt hast, möchtest du vielleicht verschiedene Analysen der erhaltenen Ergebnisse durchführen. Dieser Leitfaden führt dich durch gängige Arbeitsabläufe zur Verarbeitung und Analyse dieser Ergebnisse.

Tune Experiment Ergebnisse aus einem Verzeichnis laden

Nach der Durchführung des Tuning-Experiments mit tuner.fit()kannst du die Ergebnisse aus einem Verzeichnis laden. Das ist besonders nützlich, wenn du die Analyse durchführst, nachdem das ursprüngliche Trainingsskript beendet wurde.

experiment_path = f"{storage_path}/{exp_name}"
print(f"Loading results from {experiment_path}...")

restored_tuner = tune.Tuner.restore(experiment_path, trainable=train_mnist)
result_grid = restored_tuner.get_results()

Grundlegende Analyse auf Experiment-Ebene

Verschaffe dir einen Überblick darüber, wie die Versuche gelaufen sind. Du kannst schnell überprüfen, ob es bei den Versuchen Fehler gab.

if result_grid.errors:
    print("One or more trials failed!")
else:
    print("No errors!")

Grundlegende Analyse auf Trial-Ebene

Zugriff auf die Konfigurationen der einzelnen Versuchshyperparameter und die zuletzt gemeldeten Metriken.

for i, result in enumerate(result_grid):
    print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")

Darstellung der gesamten Historie der gemeldeten Metriken für eine Prüfung

Du kannst den Verlauf der gemeldeten Kennzahlen für jeden Versuch darstellen, um zu sehen, wie sich die Kennzahlen im Laufe der Zeit entwickelt haben.

import matplotlib.pyplot as plt

for result in result_grid:
    plt.plot(
        result.metrics_dataframe["training_iteration"],
        result.metrics_dataframe["mean_accuracy"],
        label=f"Trial {i}",
    )

plt.xlabel("Training Iterations")
plt.ylabel("Mean Accuracy")
plt.legend()
plt.show()

Zusammenfassung

In dieser Dokumentation haben wir gängige Arbeitsabläufe zur Analyse der Ergebnisse von Ray Tune-Experimenten mit Ultralytics behandelt. Zu den wichtigsten Schritten gehören das Laden der Versuchsergebnisse aus einem Verzeichnis, die Durchführung grundlegender Analysen auf Versuchs- und Experimentsebene und das Erstellen von Diagrammen für die Metriken.

Um das Beste aus deinen Experimenten zum Tuning von Hyperparametern herauszuholen, kannst du dir die Dokumentseite von Ray Tune zum Thema " Ergebnisse analysieren " ansehen.

FAQ

Wie stimme ich die Hyperparameter meines YOLOv8 Modells mit Ray Tune ab?

Um die Hyperparameter deines Ultralytics YOLOv8 Modells mit Ray Tune abzustimmen, befolge diese Schritte:

  1. Installiere die benötigten Pakete:

    pip install -U ultralytics "ray[tune]"
    pip install wandb  # optional for logging
    
  2. Lade dein YOLOv8 Modell und beginne mit dem Tuning:

    from ultralytics import YOLO
    
    # Load a YOLOv8 model
    model = YOLO("yolov8n.pt")
    
    # Start tuning with the COCO8 dataset
    result_grid = model.tune(data="coco8.yaml", use_ray=True)
    

Dabei werden die fortschrittlichen Suchstrategien von Ray Tune und die Parallelität genutzt, um die Hyperparameter deines Modells effizient zu optimieren. Weitere Informationen findest du in der Ray Tune-Dokumentation.

Was sind die Standard-Hyperparameter für die YOLOv8 Abstimmung mit Ray Tune?

Ultralytics YOLOv8 verwendet die folgenden Standard-Hyperparameter für die Abstimmung mit Ray Tune:

Parameter Wertebereich Beschreibung
lr0 tune.uniform(1e-5, 1e-1) Anfängliche Lernrate
lrf tune.uniform(0.01, 1.0) Endgültiger Lernratenfaktor
momentum tune.uniform(0.6, 0.98) Momentum
weight_decay tune.uniform(0.0, 0.001) Gewichtsabnahme
warmup_epochs tune.uniform(0.0, 5.0) Aufwärm-Epochen
box tune.uniform(0.02, 0.2) Box Verlust Gewicht
cls tune.uniform(0.2, 4.0) Klasse Verlust Gewicht
hsv_h tune.uniform(0.0, 0.1) Bereich der Farbtonvergrößerung
translate tune.uniform(0.0, 0.9) Bereich der Übersetzungserweiterung

Diese Hyperparameter können an deine speziellen Bedürfnisse angepasst werden. Eine vollständige Liste und weitere Details findest du in der Anleitung zum Hyperparameter-Tuning.

Wie kann ich Weights & Biases in mein YOLOv8 Modelltuning integrieren?

So integrierst du Weights & Biases (W&B) in deinen Ultralytics YOLOv8 Abstimmungsprozess:

  1. Installiere W&B:

    pip install wandb
    
  2. Ändere dein Tuning-Skript:

    import wandb
    
    from ultralytics import YOLO
    
    wandb.init(project="YOLO-Tuning", entity="your-entity")
    
    # Load YOLO model
    model = YOLO("yolov8n.pt")
    
    # Tune hyperparameters
    result_grid = model.tune(data="coco8.yaml", use_ray=True)
    

Mit diesem Setup kannst du den Abstimmungsprozess überwachen, die Konfigurationen der Hyperparameter verfolgen und die Ergebnisse in W&B visualisieren.

Warum sollte ich Ray Tune für die Hyperparameteroptimierung mit YOLOv8 verwenden?

Ray Tune bietet zahlreiche Vorteile für die Optimierung von Hyperparametern:

  • Erweiterte Suchstrategien: Nutzt Algorithmen wie Bayes'sche Optimierung und HyperOpt für eine effiziente Parametersuche.
  • Parallelität: Unterstützt die parallele Ausführung von mehreren Versuchen, was den Abstimmungsprozess erheblich beschleunigt.
  • Frühzeitige Beendigung: Setzt Strategien wie ASHA ein, um leistungsschwache Versuche frühzeitig abzubrechen und so Rechenressourcen zu sparen.

Ray Tune lässt sich nahtlos in Ultralytics YOLOv8 integrieren und bietet eine einfach zu bedienende Schnittstelle für die effektive Abstimmung von Hyperparametern. Um loszulegen, schau dir den Leitfaden Efficient Hyperparameter Tuning with Ray Tune and YOLOv8 an.

Wie kann ich einen benutzerdefinierten Suchraum für YOLOv8 Hyperparameter-Tuning definieren?

Um einen benutzerdefinierten Suchraum für dein YOLOv8 Hyperparameter-Tuning mit Ray Tune zu definieren:

from ray import tune

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
search_space = {"lr0": tune.uniform(1e-5, 1e-1), "momentum": tune.uniform(0.6, 0.98)}
result_grid = model.tune(data="coco8.yaml", space=search_space, use_ray=True)

Damit kannst du den Bereich der Hyperparameter, wie z. B. die anfängliche Lernrate und das Momentum, das während des Abstimmungsprozesses untersucht werden soll, anpassen. Erweiterte Konfigurationen findest du im Abschnitt " Beispiel für einen benutzerdefinierten Suchraum ".



Erstellt am 2023-11-12, Aktualisiert am 2024-07-05
Autoren: glenn-jocher (10)

Kommentare