4. Fonctionnalités Avancées

4. Fonctionnalités Avancées

EvoX offre de nombreuses fonctionnalités avancées pour répondre à des besoins plus complexes. Après vous être familiarisé avec les bases, ce chapitre présente comment personnaliser la configuration du framework, gérer les modules de plugins optionnels et optimiser les performances — vous permettant d’étendre et d’ajuster EvoX lorsque cela est nécessaire.

Configuration Personnalisée

Les paramètres par défaut d’EvoX conviennent à la plupart des situations, mais vous pourriez parfois vouloir personnaliser le comportement ou les paramètres du framework. Par exemple :

  • Réglage des Paramètres de l’Algorithme : Au-delà de la taille de base de la population et du nombre d’itérations, de nombreux algorithmes exposent des paramètres avancés. Par exemple, CMA-ES permet la configuration de la matrice de covariance initiale, et NSGA-II expose les paramètres de distance de foule (crowding distance). Vous pouvez passer des paramètres au constructeur de l’algorithme, par ex. GA(crossover_prob=0.9, mutation_prob=0.1) personnalise les probabilités de croisement et de mutation dans l’Algorithme Génétique. Le réglage de ces éléments peut affiner les performances. Référez-vous à la documentation d’EvoX pour l’API de chaque algorithme, où les paramètres disponibles et les valeurs par défaut sont listés.

  • Remplacement des Composants Opérateurs : Vous pouvez remplacer les opérateurs évolutifs internes (par ex. stratégies de sélection ou de mutation). Certaines classes d’algorithmes supportent le passage d’objets opérateurs personnalisés. Par exemple, l’Évolution Différentielle (DE) peut supporter des opérateurs de mutation personnalisés, vous permettant de fournir une fonction personnalisée ou une classe Operator. La conception modulaire d’EvoX supporte ce remplacement de type « plugin ». Cela nécessite généralement de comprendre le fonctionnement interne de l’algorithme et n’est habituellement pas nécessaire pour les cas d’utilisation standard.

  • Paramètres Multi-Objectifs : Pour l’optimisation multi-objectifs, vous pourriez avoir besoin de configurer des préférences ou des poids — par exemple, définir des vecteurs de poids pour les méthodes de somme pondérée ou ajuster les points de référence pendant l’évolution. Ces configurations sont généralement exposées via des paramètres dans la classe du problème ou de l’algorithme. Par exemple, problem = DTLZ2(d=12, m=3) définit un problème à 12 dimensions et 3 objectifs. Certains algorithmes permettent de passer des vecteurs de référence personnalisés. Lire la documentation de l’algorithme vous aide à tirer pleinement parti de tels paramètres.

  • Journalisation et Sortie : Le EvalMonitor par défaut journalise déjà les métriques d’optimisation clés. Si vous avez besoin d’infos supplémentaires (par ex. diversité de la population ou fitness moyen par génération), vous pouvez personnaliser le moniteur ou journaliser manuellement dans votre boucle. Pour les tâches de longue durée, vous voudrez peut-être journaliser dans un fichier. Cela peut être fait en utilisant la bibliothèque logging de Python ou de simples E/S de fichiers pour ajouter les résultats pour une analyse ultérieure.

En résumé, la configuration personnalisée signifie modifier le comportement par défaut d’EvoX pour une tâche spécifique. Cela implique généralement une utilisation plus approfondie de l’API d’EvoX. Nous en couvrirons davantage dans la section développement et extension. Pour les débutants, rappelez-vous simplement : EvoX offre des interfaces flexibles qui permettent aux utilisateurs expérimentés d’ajuster presque chaque détail — mais vous pouvez aussi vous en tenir aux valeurs par défaut et obtenir des résultats rapidement.

Gestion des Plugins

Les « Plugins » font ici référence aux composants optionnels ou aux modules d’extension dans EvoX — tels que les outils de visualisation, les wrappers d’environnement d’apprentissage par renforcement (reinforcement learning), et les projets frères dans l’écosystème EvoX. La gestion des plugins dans EvoX implique principalement l’installation et l’utilisation de modules optionnels. Voici quelques extensions clés et comment les gérer :

  • Plugin de Visualisation : EvoX inclut le module evox.vis_tools, qui contient un sous-module plot pour les graphiques et supporte le format de journal .exv pour les flux de données en temps réel. Pour utiliser la visualisation, installez EvoX avec l’extra vis : pip install evox[vis]. (Si non installé initialement, vous pouvez l’installer plus tard ou simplement exécuter pip install plotly pour satisfaire les dépendances.) Lors de l’utilisation d’outils visuels, vous appelez généralement les fonctions de tracé après que le moniteur a journalisé les données — par exemple, EvalMonitor.plot() utilise vis_tools.plot. S’assurer que ce plugin est installé évite les erreurs dues aux bibliothèques manquantes comme matplotlib.

  • Plugin de Neuroévolution : EvoX supporte les environnements d’apprentissage par renforcement (comme le moteur physique Brax) et l’optimisation individuelle neuronale (neuroévolution). Ces fonctionnalités sont regroupées dans l’extension neuroevolution, installée via pip install "evox[neuroevolution]". Cela inclut la bibliothèque Google Brax, Gym, et plus encore. Après l’installation, vous pouvez utiliser des wrappers comme BraxProblem dans evox.problems.neuroevolution pour transformer les environnements RL en problèmes d’optimisation. Des outils comme ParamsAndVector sont également inclus pour aplatir les paramètres de modèles PyTorch en vecteurs pour l’évolution. Notez que Brax ne fonctionne que sur Linux ou Windows via WSL — le Python Windows natif peut ne fonctionner que sur CPU. En bref, l’activation ou la désactivation des plugins EvoX est contrôlée via l’installation d’extras spécifiques.

  • Projets Frères : EvoX a des projets liés tels que EvoRL (focalisé sur l’apprentissage par renforcement évolutif) et EvoGP (programmation génétique accélérée par GPU). Ceux-ci partagent la philosophie de conception et l’interface d’EvoX. Si votre tâche est orientée RL, vous pourriez préférer ces frameworks dédiés. Gérer ces plugins signifie assurer la compatibilité des versions et satisfaire les dépendances. Par exemple, EvoRL utilise JAX et Brax, tandis qu’EvoGP peut nécessiter des bibliothèques d’arbres symboliques. Ces bibliothèques peuvent généralement coexister sans conflits. Considérez-les comme des outils complémentaires qui peuvent être appelés depuis le projet principal EvoX — ou laissés de côté pour une configuration légère.

  • Plugins Personnalisés : Grâce à la modularité d’EvoX, vous pouvez construire vos propres « plugins ». Par exemple, créez une classe Monitor personnalisée pour suivre des métriques uniques, ou une sous-classe Problem personnalisée qui enveloppe un simulateur tiers. Ceux-ci étendent efficacement les capacités d’EvoX. La bonne pratique est de suivre les contrats d’interface d’EvoX — par exemple, assurez-vous que votre Problem personnalisé a une méthode evaluate(), ou que votre Monitor personnalisé hérite d’une classe de base. Une fois testé, vous pourriez même le contribuer aux futures versions d’EvoX.

Dans l’ensemble, la gestion des plugins dans EvoX concerne l’extension flexible et le contrôle des dépendances. En tant que débutant, lors de l’installation, vous pouvez décider d’inclure ou non les extensions vis et neuroevolution. Si elles ne sont pas installées initialement, elles peuvent être ajoutées plus tard. Avec les plugins, vous pouvez surveiller les progrès de l’optimisation plus facilement et intégrer EvoX avec des outils externes pour plus de puissance.

Optimisation des Performances

La performance est une force majeure d’EvoX. Même en utilisant le même algorithme, le support GPU d’EvoX peut augmenter la vitesse de plusieurs ordres de grandeur. Cependant, pour en tirer pleinement parti, vous voudrez suivre quelques conseils :

  • Utiliser le Parallélisme GPU : D’abord, assurez-vous que votre code s’exécute réellement sur le GPU. Comme noté précédemment, installez PyTorch compatible CUDA et déplacez les données vers les périphériques GPU. Si les choses semblent lentes, vérifiez avec torch.cuda.is_available() — cela devrait retourner True. Si le GPU existe mais n’est pas utilisé, c’est probablement parce que les tenseurs ont été créés sur le CPU par défaut. Corrigez cela en définissant explicitement device, ou en vous assurant que les tenseurs d’entrée (comme lb/ub) sont sur CUDA. EvoX suivra le périphérique de ces entrées. Sur les systèmes multi-GPU, EvoX utilise généralement un GPU par processus. Pour exploiter plusieurs GPU, vous pouvez exécuter plusieurs processus avec différents GPU ou attendre un futur support pour l’exécution multi-GPU coordonnée.

  • Évaluation Parallèle : Un goulot d’étranglement clé dans les algorithmes évolutifs est l’évaluation de la fitness. Puisque les évaluations sont souvent indépendantes, elles peuvent être parallélisées. EvoX traite les évaluations par lots (batch) lorsque c’est possible — par exemple, les évaluations de réseaux neuronaux ou les fonctions polynomiales peuvent être calculées en parallèle en utilisant le GPU. Pour les problèmes personnalisés, évitez les boucles Python — vectorisez votre code d’évaluation pour traiter un lot entier de candidats à la fois. Cela tire le meilleur parti des capacités parallèles de PyTorch. Simplement dit : faites en sorte que la fonction evaluate() de votre problème opère sur des lots — et non sur des solutions individuelles — pour une accélération massive.

  • Compiler pour l’Optimisation : PyTorch 2.0 a introduit torch.compile, qui compile en JIT les modèles/fonctions pour des gains de performance. Si votre logique d’évaluation est complexe, envisagez de compiler avant l’exécution :

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

    Cela pourrait améliorer significativement les performances.

    Note :

La compilation ajoute une surcharge et n’est pas toujours supportée par toutes les fonctions ou problèmes. Mieux adapté pour les tâches à grande échelle et de longue durée. Sur Windows, assurez-vous que Triton est installé pour que torch.compile fonctionne.

  • Régler la Taille de la Population : Une population plus grande augmente la diversité et la capacité de recherche globale — mais augmente aussi le calcul par génération. Équilibrez qualité et vitesse en réglant pop_size. Sur GPU, vous pouvez souvent l’augmenter sans coût de temps linéaire (grâce au parallélisme). Mais une taille trop grande peut causer des problèmes de mémoire. Si vous manquez de mémoire GPU, réduisez la taille de la population ou la dimension du problème, ou utilisez FP16 pour économiser de l’espace (défini via torch.set_float32_matmul_precision('medium')).

  • Réduire la Surcharge Python : EvoX déplace la plupart des calculs principaux vers torch.Tensor, mais les boucles écrites par l’utilisateur ou les opérateurs personnalisés doivent éviter les opérations excessives au niveau Python. Évitez les affichages fréquents (coût d’E/S élevé), les listes ou les conversions de types de données. Gardez votre code vectorisé/tensorisé pour exploiter les noyaux C++/CUDA rapides en arrière-plan et réduire la surcharge de l’interpréteur Python.

  • Déploiement Distribué : Pour les problèmes ultra-larges, envisagez l’exécution sur plusieurs machines. EvoX supporte les configurations multi-nœuds (via la communication backend et le sharding). Bien que ce ne soit pas adapté aux débutants, il est bon de savoir que cela existe. Avec un cluster GPU, référez-vous à la documentation d’EvoX pour le déploiement distribué. Habituellement, vous devrez définir des variables d’environnement ou lancer avec des scripts spéciaux. L’architecture permet au même code de s’exécuter sur des configurations à nœud unique ou multi-nœuds. Pour votre premier essai, simulez-le avec plusieurs processus sur une seule machine.

  • Profilage des Performances : Pour aller plus loin, utilisez des outils comme le profileur de PyTorch ou cProfile de Python pour analyser les goulots d’étranglement. Cela vous aide à identifier si le temps passe dans l’évaluation, la sélection ou autre chose — afin que vous puissiez optimiser en conséquence (par ex. en mettant en cache les calculs répétés). EvoX est conçu pour la performance, mais les tâches du monde réel peuvent toujours rencontrer des goulots d’étranglement uniques nécessitant une analyse.

En bref, bien qu’EvoX soit déjà optimisé au niveau de l’architecture, les utilisateurs peuvent encore booster les performances en utilisant correctement les GPU, en effectuant des calculs par lots et en réglant les paramètres. Tout en recherchant la vitesse, rappelez-vous aussi de maintenir la qualité des résultats — l’équilibre est la clé. À mesure que vous vous familiariserez avec EvoX, le réglage des performances deviendra une seconde nature.