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 nécessaire.

Configuration personnalisée

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

  • Ajustement des paramètres d’algorithme : Au-delà de la taille de population de base 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 crowding. Vous pouvez passer des paramètres au constructeur de l’algorithme, par exemple GA(crossover_prob=0.9, mutation_prob=0.1) personnalise les probabilités de croisement et de mutation dans l’Algorithme Génétique. L’ajustement de ces paramètres peut affiner les performances. Consultez la documentation 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 exemple, les stratégies de sélection ou de mutation). Certaines classes d’algorithmes prennent en charge le passage d’objets opérateurs personnalisés. Par exemple, l’Évolution Différentielle (DE) peut prendre en charge des opérateurs de mutation personnalisés, vous permettant de fournir une fonction personnalisée ou une classe Operator. La conception modulaire d’EvoX prend en charge ce remplacement de type “plugin”. Cela nécessite généralement de comprendre les mécanismes internes de l’algorithme et n’est habituellement pas nécessaire pour les cas d’utilisation standard.

  • Paramètres multi-objectif : Pour l’optimisation multi-objectif, 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. La lecture de la documentation de l’algorithme vous aide à exploiter pleinement ces paramètres.

  • Journalisation et sortie : Le EvalMonitor par défaut enregistre déjà les métriques clés d’optimisation. Si vous avez besoin d’informations supplémentaires (par exemple, la diversité de la population ou la fitness moyenne par génération), vous pouvez personnaliser le moniteur ou journaliser manuellement dans votre boucle. Pour les tâches de longue durée, vous pouvez vouloir journaliser dans un fichier. Cela peut être fait en utilisant la bibliothèque logging de Python ou une simple E/S de fichier 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, retenez 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” ici font référence aux composants optionnels ou modules d’extension dans EvoX — tels que les outils de visualisation, les wrappers d’environnements d’apprentissage par renforcement et les projets frères de 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 prend en charge 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 des outils visuels, vous appelez généralement les fonctions de tracé après que le moniteur a enregistré les données — par exemple, EvalMonitor.plot() utilise vis_tools.plot. S’assurer que ce plugin est installé évite les erreurs dues à des bibliothèques manquantes comme matplotlib.

  • Plugin de neuroévolution : EvoX prend en charge les environnements d’apprentissage par renforcement (comme le moteur physique Brax) et l’optimisation d’individus neuronaux (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 natif Windows ne peut 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 connexes tels qu’EvoRL (axé 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 fortement orientée RL, vous pourriez préférer ces frameworks dédiés. La gestion de 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 EvoX principal — 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 encapsule un simulateur tiers. Ceux-ci étendent effectivement les capacités d’EvoX. La meilleure 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.

Globalement, 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 la progression de l’optimisation plus facilement et intégrer EvoX avec des outils externes pour plus de puissance.

Optimisation des performances

La performance est un atout majeur 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 exploiter pleinement cela, vous voudrez suivre quelques conseils :

  • Utiliser le parallélisme GPU : Tout d’abord, assurez-vous que votre code s’exécute réellement sur le GPU. Comme mentionné précédemment, installez PyTorch compatible CUDA et déplacez les données vers les appareils 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 l’appareil 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 le support futur 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 regroupe les évaluations lorsque possible — par exemple, les évaluations de réseaux de neurones 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 exploite au maximum les capacités parallèles de PyTorch. En bref : faites en sorte que la fonction evaluate() de votre problème opère sur des lots — pas sur des solutions individuelles — pour une accélération massive.

  • Compiler pour l’optimisation : PyTorch 2.0 a introduit torch.compile, qui compile 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 de la surcharge et n’est pas toujours supportée par toutes les fonctions ou problèmes. Mieux adaptée aux tâches à grande échelle et de longue durée. Sur Windows, assurez-vous que Triton est installé pour que torch.compile fonctionne.

  • Ajuster 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 ajustant pop_size. Sur GPU, vous pouvez souvent l’augmenter sans coût temporel 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éfinissez 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 E/S élevé), les listes ou les conversions de types de données. Gardez votre code vectorisé/tensorisé pour exploiter les noyaux rapides C++/CUDA sous-jacents et réduire la surcharge de l’interpréteur Python.

  • Déploiement distribué : Pour les problèmes ultra-grands, envisagez l’exécution sur plusieurs machines. EvoX prend en charge les configurations multi-nœuds (via la communication backend et le partitionnement). Bien que ce ne soit pas adapté aux débutants, il est bon de savoir que cela existe. Avec un cluster GPU, consultez 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 mono 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 le cProfile de Python pour analyser les goulots d’étranglement. Cela vous aide à identifier si le temps est consacré à l’évaluation, la sélection ou autre chose — afin que vous puissiez optimiser en conséquence (par exemple, en mettant en cache les calculs répétés). EvoX est conçu pour la performance, mais les tâches réelles peuvent encore rencontrer des goulots d’étranglement uniques nécessitant une analyse.

En bref, bien qu’EvoX soit déjà optimisé au niveau architectural, les utilisateurs peuvent encore améliorer les performances en utilisant correctement les GPU, le calcul par lots et l’ajustement des paramètres. Tout en recherchant la vitesse, n’oubliez pas de maintenir la qualité des résultats — l’équilibre est la clé. Au fur et à mesure que vous vous familiarisez avec EvoX, l’optimisation des performances deviendra une seconde nature.