Trabajo con Modulos en EvoX

Trabajo con Modulos en EvoX

Un modulo es un concepto fundamental en programacion que se refiere a una unidad de codigo autocontenida disenada para realizar una tarea especifica o un conjunto de tareas relacionadas.

Este cuaderno presentara el modulo basico en EvoX: ModuleBase.

Introduccion a los Modulos

En el tutorial, hemos mencionado el proceso basico de ejecucion en EvoX:

Iniciar un algoritmo y un problema -- Configurar un monitor -- Iniciar un flujo de trabajo -- Ejecutar el flujo de trabajo

Este proceso requiere cuatro clases basicas en EvoX:

  • Algorithm
  • Problem
  • Monitor
  • Workflow

Es necesario proporcionar un modulo unificado para ellas. En EvoX, las cuatro clases heredan del modulo base — ModuleBase.

Module base

Clase ModuleBase

La clase ModuleBase hereda de torch.nn.Module.

Hay muchos metodos en esta clase, y algunos metodos importantes son:

MetodoFirmaUso
__init__(self, ...)Inicializar el modulo.
load_state_dict(self, state_dict: Mapping[str, torch.Tensor], copy: bool = False, ...)Copiar parametros y buffers desde state_dict a este modulo y sus descendientes. Sobreescribe 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]]) -> NoneDefinir un valor mutable en este modulo que puede ser accedido via self.[nombre] y modificado en su lugar.

Rol del Modulo

En EvoX, el ModuleBase puede ayudar a:

  • Contener valores mutables

    Este modulo es uno orientado a objetos que puede contener valores mutables.

  • Soportar programacion funcional

    El modelo de programacion funcional es soportado via self.state_dict() y self.load_state_dict(...).

  • Estandarizar la inicializacion:

    Basicamente, los submodulos predefinidos que seran AGREGADOS a este modulo y accedidos posteriormente en metodos miembro deben tratarse como “miembros no estaticos”, mientras que cualquier otro miembro debe tratarse como “miembro estatico”.

    La inicializacion del modulo para miembros no estaticos se recomienda escribirla en el metodo sobreescrito de setup (o cualquier otro metodo miembro) en lugar de __init__.

Uso del Modulo

Especificamente, hay algunas reglas para usar ModuleBase en EvoX:

Metodos estaticos

Los metodos estaticos para JIT deben definirse como:

# Un ejemplo del metodo estatico definido en un Modulo

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

Metodos no estaticos

Si un metodo con flujos de control dinamicos de Python como if fuera a usarse con vmap, por favor usa torch.cond para definir explicitamente el flujo de control.