Skip to main content

EvoTorch is an advanced evolutionary computation library built directly on top of PyTorch, created at NNAISENSE.

Project description


Welcome to the EvoTorch project! EvoTorch is an open source evolutionary computation library developed at NNAISENSE, built on top of PyTorch. See the documentation for in-depth guidance about using EvoTorch, and join us on Slack for discussions.

Get started by installing EvoTorch:

pip install evotorch

With EvoTorch, one can solve various optimization problems, regardless of whether they are differentiable (i.e. allow gradient descent). Among the problem types that are solvable with EvoTorch are:

  • Black-box optimization problems (continuous or discrete)
  • Reinforcement learning tasks
  • Supervised learning tasks

Various evolutionary computation algorithms are available in EvoTorch:

  • Distribution-based search algorithms:
    • PGPE: Policy Gradients with Parameter-based Exploration.
    • XNES: Exponential Natural Evolution Strategies.
    • CMA-ES: Covariance Matrix Adaptation Evolution Strategies.
    • SNES: Separable Natural Evolution Strategies.
    • CEM: Cross Entropy Method.
  • Population-based search algorithms:
    • GeneticAlgorithm: A genetic algorithm implementation. Also supports multiple objectives, in which case it behaves like NSGA-II.
    • CoSyNE: Cooperative Synapse Neuroevolution.
    • MAPElites: Multi-dimensional Archive of Phenotypic Elites

Since all of these algorithms are implemented in PyTorch, they benefit from use of vectorization and parallelization on GPUs, drastically speeding up optimization when GPUs are available. Using Ray, EvoTorch scales these algorithms even further by splitting the workload across:

  • multiple CPUs
  • multiple GPUs
  • multiple computers in a Ray cluster

Examples

Below are some code examples that demonstrate the API of EvoTorch.

A black-box optimization example

Any objective function defined to work with PyTorch can be used directly with EvoTorch. A non-vectorized objective function simply receives a solution as a 1-dimensional torch tensor, and returns a fitness as a scalar. A vectorized objective function receives a batch of solutions as a 2-dimensional torch tensor, and returns a 1-dimensional tensor of fitnesses. The following example demonstrates how to define and solve the classical Rastrigin problem.

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()

A reinforcement learning example

The following example demonstrates how to solve reinforcement learning tasks that are available through the gym library.

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)

More examples can be found here.

How to cite

If you use EvoTorch in your research, please consider citing our paper.

@article{evotorch2023arxiv,
  title={{EvoTorch}: Scalable Evolutionary Computation in {Python}},
  author={Toklu, Nihat Engin and Atkinson, Timothy and Micka, Vojt\v{e}ch and Liskowski, Pawe\l{} and Srivastava, Rupesh Kumar},
  journal={arXiv preprint},
  year={2023},
  note={https://arxiv.org/abs/2302.12600}
}

How to Contribute

Please see our contribution guidelines.

Authors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

evotorch-0.5.1.tar.gz (1.7 MB view details)

Uploaded Source

Built Distribution

evotorch-0.5.1-py3-none-any.whl (275.6 kB view details)

Uploaded Python 3

File details

Details for the file evotorch-0.5.1.tar.gz.

File metadata

  • Download URL: evotorch-0.5.1.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for evotorch-0.5.1.tar.gz
Algorithm Hash digest
SHA256 6cc2d32a7b023ce412e90cfb8a138f855c1de8fd6c616d22bd1c331443b64d9d
MD5 5f8ad9b90d4c684d96da0b31064f76f2
BLAKE2b-256 07c01950179023b58bdf776798cf22ede54b1244598069496e246810d123c69a

See more details on using hashes here.

File details

Details for the file evotorch-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: evotorch-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 275.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for evotorch-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 004c634570bdc4b42297516f00d55dc76c752a843cd5ee2f7c0559fa821885bd
MD5 4d78b26da8ec080ff75eec48d672d79f
BLAKE2b-256 0541938fb4a7ea41358b26617e2c5e4b7833d68fd9687567cc7ceab92156d911

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page