4. Erweiterte Funktionen

4. Erweiterte Funktionen

EvoX bietet viele erweiterte Funktionen, um komplexere Anforderungen zu erfüllen. Nachdem Sie sich mit den Grundlagen vertraut gemacht haben, stellt dieses Kapitel vor, wie Sie die Framework-Konfiguration anpassen, optionale Plugin-Module verwalten und die Leistung optimieren können – damit Sie EvoX bei Bedarf erweitern und feinabstimmen können.

Benutzerdefinierte Konfiguration

Die Standardeinstellungen von EvoX passen für die meisten Situationen, aber manchmal möchten Sie vielleicht das Verhalten oder die Parameter des Frameworks anpassen. Zum Beispiel:

  • Anpassung von Algorithmus-Parametern: Neben der grundlegenden Populationsgröße und der Anzahl der Iterationen bieten viele Algorithmen erweiterte Parameter. Zum Beispiel erlaubt CMA-ES die Konfiguration der initialen Kovarianzmatrix, und NSGA-II bietet Parameter für die Crowding-Distanz. Sie können Parameter an den Konstruktor des Algorithmus übergeben, z. B. passt GA(crossover_prob=0.9, mutation_prob=0.1) die Crossover- und Mutationswahrscheinlichkeiten im Genetic Algorithm an. Das Anpassen dieser Werte kann die Leistung feinabstimmen. Beziehen Sie sich auf die EvoX-Dokumentation für die API jedes Algorithmus, wo verfügbare Parameter und Standardwerte aufgeführt sind.

  • Austausch von Operator-Komponenten: Sie können interne evolutionäre Operatoren (z. B. Selektions- oder Mutationsstrategien) austauschen. Einige Algorithmus-Klassen unterstützen die Übergabe benutzerdefinierter Operator-Objekte. Zum Beispiel unterstützt Differential Evolution (DE) möglicherweise benutzerdefinierte Mutationsoperatoren, sodass Sie eine eigene Funktion oder Operator-Klasse bereitstellen können. Das modulare Design von EvoX unterstützt diesen Austausch im “Plugin-Stil”. Dies erfordert typischerweise ein Verständnis der Algorithmus-Interna und ist für Standardanwendungsfälle meist nicht notwendig.

  • Multi-Objective-Einstellungen: Für die mehrkriterielle Optimierung müssen Sie möglicherweise Präferenzen oder Gewichtungen konfigurieren – zum Beispiel das Setzen von Gewichtsvektoren für gewichtete Summenmethoden oder das Anpassen von Referenzpunkten während der Evolution. Diese Konfigurationen werden typischerweise über Parameter in der Problem- oder Algorithmus-Klasse bereitgestellt. Zum Beispiel definiert problem = DTLZ2(d=12, m=3) ein 12-dimensionales Problem mit 3 Zielen. Einige Algorithmen erlauben die Übergabe benutzerdefinierter Referenzvektoren. Das Lesen der Algorithmus-Dokumentation hilft Ihnen, solche Einstellungen voll auszuschöpfen.

  • Logging und Ausgabe: Der standardmäßige EvalMonitor protokolliert bereits wichtige Optimierungsmetriken. Wenn Sie zusätzliche Informationen benötigen (z. B. Populationsdiversität oder durchschnittliche Fitness pro Generation), können Sie den Monitor anpassen oder manuell innerhalb Ihrer Schleife protokollieren. Für lang andauernde Aufgaben möchten Sie vielleicht in eine Datei protokollieren. Dies kann mit der logging-Bibliothek von Python oder einfacher Datei-E/A erfolgen, um Ergebnisse für eine spätere Analyse anzuhängen.

Zusammenfassend bedeutet benutzerdefinierte Konfiguration, das Standardverhalten von EvoX für eine bestimmte Aufgabe zu ändern. Dies beinhaltet normalerweise eine tiefere Nutzung der EvoX API. Wir werden im Abschnitt Entwicklung und Erweiterung mehr dazu behandeln. Für Anfänger gilt: EvoX bietet flexible Schnittstellen, die es erfahrenen Benutzern ermöglichen, fast jedes Detail anzupassen – aber Sie können auch bei den Standardeinstellungen bleiben und schnell Ergebnisse erzielen.

Plugin-Management

“Plugins” beziehen sich hier auf optionale Komponenten oder Erweiterungsmodule in EvoX – wie Visualisierungstools, Wrapper für Reinforcement Learning-Umgebungen und Schwesterprojekte im EvoX-Ökosystem. Das Verwalten von Plugins in EvoX beinhaltet hauptsächlich das Installieren und Verwenden optionaler Module. Hier sind einige wichtige Erweiterungen und wie man sie verwaltet:

  • Visualisierungs-Plugin: EvoX enthält das Modul evox.vis_tools, das ein plot-Submodul für Diagramme enthält und das .exv-Logformat für Echtzeit-Datenströme unterstützt. Um die Visualisierung zu nutzen, installieren Sie EvoX mit dem vis-Extra: pip install evox[vis]. (Falls nicht zu Beginn installiert, können Sie es später installieren oder einfach pip install plotly ausführen, um die Abhängigkeiten zu erfüllen.) Wenn Sie visuelle Tools verwenden, rufen Sie typischerweise Plot-Funktionen auf, nachdem der Monitor Daten protokolliert hat – zum Beispiel nutzt EvalMonitor.plot() vis_tools.plot. Die Sicherstellung, dass dieses Plugin installiert ist, vermeidet Fehler durch fehlende Bibliotheken wie matplotlib.

  • Neuroevolution-Plugin: EvoX unterstützt Reinforcement Learning-Umgebungen (wie die Brax-Physik-Engine) und neuronale Individuenoptimierung (Neuroevolution). Diese Funktionen sind in der neuroevolution-Erweiterung gebündelt, die über pip install "evox[neuroevolution]" installiert wird. Dies umfasst die Google Brax-Bibliothek, Gym und mehr. Nach der Installation können Sie Wrapper wie BraxProblem in evox.problems.neuroevolution verwenden, um RL-Umgebungen in Optimierungsprobleme umzuwandeln. Tools wie ParamsAndVector sind ebenfalls enthalten, um PyTorch-Modellparameter für die Evolution in Vektoren zu flachen. Beachten Sie, dass Brax nur unter Linux oder Windows via WSL funktioniert – natives Windows-Python läuft möglicherweise nur auf der CPU. Kurz gesagt, das Aktivieren oder Deaktivieren von EvoX-Plugins wird über die Installation spezifischer Extras gesteuert.

  • Schwesterprojekte: EvoX hat verwandte Projekte wie EvoRL (fokussiert auf evolutionäres Reinforcement Learning) und EvoGP (GPU-beschleunigte genetische Programmierung). Diese teilen die Designphilosophie und Schnittstelle von EvoX. Wenn Ihre Aufgabe RL-lastig ist, bevorzugen Sie vielleicht diese dedizierten Frameworks. Das Verwalten dieser Plugins bedeutet, die Versionskompatibilität sicherzustellen und Abhängigkeiten zu erfüllen. Zum Beispiel verwendet EvoRL JAX und Brax, während EvoGP möglicherweise symbolische Baum-Bibliotheken benötigt. Diese Bibliotheken können normalerweise ohne Konflikte koexistieren. Betrachten Sie sie als ergänzende Werkzeuge, die vom Hauptprojekt EvoX aufgerufen werden können – oder für ein schlankes Setup ganz weggelassen werden können.

  • Benutzerdefinierte Plugins: Dank der Modularität von EvoX können Sie Ihre eigenen “Plugins” erstellen. Erstellen Sie zum Beispiel eine benutzerdefinierte Monitor-Klasse, um einzigartige Metriken zu verfolgen, oder eine benutzerdefinierte Problem-Unterklasse, die einen Simulator eines Drittanbieters wrappt. Diese erweitern effektiv die Fähigkeiten von EvoX. Best Practice ist es, den Schnittstellenverträgen von EvoX zu folgen – stellen Sie zum Beispiel sicher, dass Ihr benutzerdefiniertes Problem eine evaluate()-Methode hat oder dass Ihr benutzerdefinierter Monitor von einer Basisklasse erbt. Einmal getestet, könnten Sie es sogar zu zukünftigen Releases von EvoX beitragen.

Insgesamt geht es beim Plugin-Management in EvoX um flexible Erweiterung und Abhängigkeitskontrolle. Als Anfänger können Sie während der Installation entscheiden, ob Sie die Erweiterungen vis und neuroevolution einbeziehen möchten. Falls nicht initial installiert, können sie später hinzugefügt werden. Mit Plugins können Sie den Optimierungsfortschritt einfacher überwachen und EvoX für mehr Leistung mit externen Tools integrieren.

Leistungsoptimierung

Leistung ist eine große Stärke von EvoX. Selbst bei Verwendung desselben Algorithmus kann die GPU-Unterstützung von EvoX die Geschwindigkeit um mehrere Größenordnungen steigern. Um dies jedoch voll auszuschöpfen, sollten Sie einige Tipps befolgen:

  • Nutzen Sie GPU-Parallelität: Stellen Sie zunächst sicher, dass Ihr Code tatsächlich auf der GPU läuft. Wie bereits erwähnt, installieren Sie CUDA-fähiges PyTorch und verschieben Sie Daten auf GPU-Geräte. Wenn Dinge langsam erscheinen, prüfen Sie mit torch.cuda.is_available() – es sollte True zurückgeben. Wenn eine GPU existiert, aber nicht genutzt wird, liegt es wahrscheinlich daran, dass Tensoren standardmäßig auf der CPU erstellt wurden. Beheben Sie dies, indem Sie explizit device setzen oder sicherstellen, dass Eingabetensoren (wie lb/ub) auf CUDA liegen. EvoX folgt dem Gerät dieser Eingaben. Auf Multi-GPU-Systemen verwendet EvoX im Allgemeinen eine GPU pro Prozess. Um mehrere GPUs zu nutzen, können Sie mehrere Prozesse mit unterschiedlichen GPUs ausführen oder auf zukünftige Unterstützung für koordinierte Multi-GPU-Ausführung warten.

  • Parallele Auswertung: Ein Hauptengpass in evolutionären Algorithmen ist die Fitness-Auswertung. Da Auswertungen oft unabhängig sind, können sie parallelisiert werden. EvoX fasst Auswertungen wenn möglich zusammen (“batching”) – zum Beispiel können neuronale Netzwerkauswertungen oder Polynomfunktionen parallel auf der GPU berechnet werden. Vermeiden Sie bei benutzerdefinierten Problemen Python-Schleifen – vektorisieren Sie Ihren Auswertungscode, um einen ganzen Batch von Kandidaten auf einmal zu verarbeiten. Dies nutzt die parallelen Fähigkeiten von PyTorch optimal. Einfach ausgedrückt: Lassen Sie die evaluate()-Funktion Ihres Problems auf Batches arbeiten – nicht auf einzelnen Lösungen – für eine massive Beschleunigung.

  • Kompilieren für Optimierung: PyTorch 2.0 führte torch.compile ein, das Modelle/Funktionen für Leistungsgewinne JIT-kompiliert. Wenn Ihre Auswertungslogik komplex ist, ziehen Sie das Kompilieren vor der Ausführung in Betracht:

    jit_state_step = torch.compile(workflow.step())

    Dies könnte die Leistung erheblich verbessern.

    Hinweis:

Die Kompilierung fügt Overhead hinzu und wird nicht immer von allen Funktionen oder Problemen unterstützt. Am besten geeignet für groß angelegte, lang andauernde Aufgaben. Stellen Sie unter Windows sicher, dass Triton installiert ist, damit torch.compile funktioniert.

  • Tuning der Populationsgröße: Eine größere Population erhöht die Diversität und die globale Suchfähigkeit – erhöht aber auch die Berechnung pro Generation. Balancieren Sie Qualität und Geschwindigkeit durch Tuning von pop_size. Auf der GPU können Sie diese oft erhöhen, ohne lineare Zeitkosten zu verursachen (dank Parallelität). Aber eine zu große Größe kann Speicherprobleme verursachen. Wenn Ihnen der GPU-Speicher ausgeht, reduzieren Sie die Populationsgröße oder die Problemdimension oder verwenden Sie FP16, um Platz zu sparen (gesetzt via torch.set_float32_matmul_precision('medium')).

  • Reduzieren von Python-Overhead: EvoX verlagert die meiste Kernberechnung auf torch.Tensor, aber benutzergeschriebene Schleifen oder benutzerdefinierte Operatoren sollten übermäßige Operationen auf Python-Ebene vermeiden. Vermeiden Sie häufige Ausgaben (hohe E/A-Kosten), Listen oder Datentypkonvertierungen. Halten Sie Ihren Code vektorisiert/tensorisiert, um schnelle C++/CUDA-Kernel unter der Haube zu nutzen und den Overhead des Python-Interpreters zu reduzieren.

  • Verteilte Bereitstellung: Für extrem große Probleme sollten Sie die Ausführung über mehrere Maschinen in Betracht ziehen. EvoX unterstützt Multi-Node-Setups (via Backend-Kommunikation und Sharding). Obwohl nicht anfängerfreundlich, ist es gut zu wissen, dass dies existiert. Beziehen Sie sich bei einem GPU-Cluster auf die EvoX-Dokumentation für verteilte Bereitstellung. Normalerweise müssen Sie Umgebungsvariablen setzen oder mit speziellen Skripten starten. Die Architektur erlaubt es, denselben Code auf Single- oder Multi-Node-Setups auszuführen. Simulieren Sie es für Ihren ersten Versuch mit mehreren Prozessen auf einer Maschine.

  • Leistungs-Profiling: Um tiefer einzutauchen, verwenden Sie Tools wie den PyTorch-Profiler oder Pythons cProfile, um Engpässe zu analysieren. Dies hilft Ihnen zu identifizieren, ob die Zeit in die Auswertung, Selektion oder etwas anderes fließt – damit Sie entsprechend optimieren können (z. B. durch Caching wiederholter Berechnungen). EvoX ist auf Leistung ausgelegt, aber reale Aufgaben können dennoch auf einzigartige Engpässe stoßen, die eine Analyse erfordern.

Kurz gesagt, während EvoX bereits auf Architekturebene optimiert ist, können Benutzer die Leistung durch korrekte Nutzung von GPUs, Batch-Computing und Parameter-Tuning weiter steigern. Denken Sie bei der Jagd nach Geschwindigkeit auch daran, die Ergebnisqualität beizubehalten – Balance ist der Schlüssel. Wenn Sie mit EvoX vertrauter werden, wird das Leistungs-Tuning zur zweiten Natur.