¡Bienvenido al proyecto Evotorch! Evotorch es una biblioteca de computación evolutiva de código abierto desarrollada en Nnaisense, construida sobre Pytorch. Vea la documentación para la guía en profundidad sobre el uso de Evotorch, y únase a nosotros en Slack para discusiones.
Comience instalando Evotorch:
pip install evotorch
Con Evotorch, uno puede resolver varios problemas de optimización, independientemente de si son diferenciables (es decir, permiten el descenso de gradiente). Entre los tipos de problemas que se están solucionando con Evotorch están:
Varios algoritmos de cálculo evolutivo están disponibles en Evotorch:
Dado que todos estos algoritmos se implementan en Pytorch, se benefician del uso de la vectorización y la paralelización en las GPU, acelerando drásticamente la optimización cuando las GPU están disponibles. Usando Ray, Evotorch escala estos algoritmos aún más al dividir la carga de trabajo:
A continuación se presentan algunos ejemplos de código que demuestran la API de Evotorch.
Cualquier función objetivo definida para funcionar con Pytorch puede usarse directamente con Evotorch. Una función objetivo no vectorial simplemente recibe una solución como un tensor de antorcha unidimensional y devuelve una aptitud como escalar. Una función de objetivo vectorial recibe un lote de soluciones como un tensor de antorcha bidimensional y devuelve un tensor de fitness de dimensiones. El siguiente ejemplo demuestra cómo definir y resolver el problema clásico de Rastrigin.
from evotorch import Problem
from evotorch . algorithms import SNES
from evotorch . logging import StdOutLogger , PandasLogger
import math
import matplotlib . pyplot as plt
import torch
# Declare the objective function
def rastrigin ( x : torch . Tensor ) -> torch . Tensor :
A = 10
( _ , n ) = x . shape
return A * n + torch . sum (( x ** 2 ) - A * torch . cos ( 2 * math . pi * x ), 1 )
# Declare the problem
problem = Problem (
"min" ,
rastrigin ,
initial_bounds = ( - 5.12 , 5.12 ),
solution_length = 100 ,
vectorized = True ,
# device="cuda:0" # enable this line if you wish to use GPU
)
# Initialize the SNES algorithm to solve the problem
searcher = SNES ( problem , popsize = 1000 , stdev_init = 10.0 )
# Initialize a standard output logger, and a pandas logger
_ = StdOutLogger ( searcher , interval = 10 )
pandas_logger = PandasLogger ( searcher )
# Run SNES for the specified amount of generations
searcher . run ( 2000 )
# Get the progress of the evolution into a DataFrame with the
# help of the PandasLogger, and then plot the progress.
pandas_frame = pandas_logger . to_dataframe ()
pandas_frame [ "best_eval" ]. plot ()
plt . show ()El siguiente ejemplo demuestra cómo resolver tareas de aprendizaje de refuerzo que están disponibles a través de la biblioteca del gimnasio.
from evotorch . algorithms import PGPE
from evotorch . logging import StdOutLogger , PicklingLogger
from evotorch . neuroevolution import GymNE
# Declare the problem to solve
problem = GymNE (
env = "Humanoid-v4" , # Solve the Humanoid-v4 task
network = "Linear(obs_length, act_length)" , # Linear policy
observation_normalization = True , # Normalize the policy inputs
decrease_rewards_by = 5.0 , # Decrease each reward by 5.0
num_actors = "max" , # Use all available CPUs
# num_actors=4, # Explicit setting. Use 4 actors.
)
# Instantiate a PGPE algorithm to solve the problem
searcher = PGPE (
problem ,
# Base population size
popsize = 200 ,
# For each generation, sample more solutions until the
# number of simulator interactions reaches this threshold
num_interactions = int ( 200 * 1000 * 0.75 ),
# Stop re-sampling solutions if the current population size
# reaches or exceeds this number.
popsize_max = 3200 ,
# Learning rates
center_learning_rate = 0.0075 ,
stdev_learning_rate = 0.1 ,
# Radius of the initial search distribution
radius_init = 0.27 ,
# Use the ClipUp optimizer with the specified maximum speed
optimizer = "clipup" ,
optimizer_config = { "max_speed" : 0.15 },
)
# Instantiate a standard output logger
_ = StdOutLogger ( searcher )
# Optional: Instantiate a logger to pickle and save the results periodically.
# In this example, among the saved results will be the center of the search
# distribution, since we are using PGPE which is distribution-based.
_ = PicklingLogger ( searcher , interval = 10 )
# Run the algorithm for the specified amount of generations
searcher . run ( 500 )
# Get the center point of the search distribution,
# obtain a policy out of that point, and visualize the
# agent using that policy.
center_solution = searcher . status [ "center" ]
trained_policy = problem . make_net ( center_solution )
problem . visualize ( trained_policy )Se pueden encontrar más ejemplos aquí.
Si usa Evotorch en su investigación, considere citar nuestro artículo.
@article { evotorch2023arxiv ,
title = { {EvoTorch}: Scalable Evolutionary Computation in {Python} } ,
author = { Toklu, Nihat Engin and Atkinson, Timothy and Micka, Vojtv{e}ch and Liskowski, Pawel{} and Srivastava, Rupesh Kumar } ,
journal = { arXiv preprint } ,
year = { 2023 } ,
note = { https://arxiv.org/abs/2302.12600 }
}Consulte nuestras pautas de contribución.