Travailler avec les modules dans EvoX

Travailler avec les modules dans EvoX

Un module est un concept fondamental en programmation qui fait référence à une unité de code autonome conçue pour effectuer une tâche spécifique ou un ensemble de tâches connexes.

Ce notebook présentera le module de base dans EvoX : ModuleBase.

Introduction aux modules

Dans le tutoriel, nous avons mentionné le processus d’exécution de base dans EvoX :

Initier un algorithme et un problème -- Configurer un moniteur -- Initier un workflow -- Exécuter le workflow

Ce processus nécessite quatre classes de base dans EvoX :

  • Algorithm
  • Problem
  • Monitor
  • Workflow

Il est nécessaire de fournir un module unifié pour eux. Dans EvoX, les quatre classes héritent toutes du module de base — ModuleBase.

Module base

Classe ModuleBase

La classe ModuleBase hérite de torch.nn.Module.

Il y a de nombreuses méthodes dans cette classe, et voici quelques méthodes importantes :

MéthodeSignatureUtilisation
__init__(self, ...)Initialiser le module.
load_state_dict(self, state_dict: Mapping[str, torch.Tensor], copy: bool = False, ...)Copier les paramètres et tampons depuis state_dict dans ce module et ses descendants. Surcharge torch.nn.Module.load_state_dict.
add_mutable(self, name: str, value: Union[torch.Tensor | nn.Module, Sequence[torch.Tensor | nn.Module], Dict[str, torch.Tensor | nn.Module]]) -> NoneDéfinir une valeur mutable dans ce module accessible via self.[name] et modifiable sur place.

Rôle du module

Dans EvoX, le ModuleBase peut aider à :

  • Contenir des valeurs mutables

    Ce module est orienté objet et peut contenir des valeurs mutables.

  • Supporter la programmation fonctionnelle

    Le modèle de programmation fonctionnelle est supporté via self.state_dict() et self.load_state_dict(...).

  • Standardiser l’initialisation :

    Fondamentalement, les sous-modules prédéfinis qui seront AJOUTÉS à ce module et accédés plus tard dans les méthodes membres doivent être traités comme des “membres non statiques”, tandis que tout autre membre doit être traité comme un “membre statique”.

    L’initialisation du module pour les membres non statiques est recommandée dans la méthode surchargée de setup (ou toute autre méthode membre) plutôt que dans __init__.

Utilisation du module

Plus précisément, il y a quelques règles pour utiliser ModuleBase dans EvoX :

Méthodes statiques

Les méthodes statiques à compiler JIT doivent être définies comme :

# One example of the static method defined in a Module

@jit
def func(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:
    return x + y

Méthodes non statiques

Si une méthode avec des flux de contrôle dynamiques Python comme if doit être utilisée avec vmap, veuillez utiliser torch.cond pour définir explicitement le flux de contrôle.