Skip to main content

"C++-based high-performance parallel environment execution engine (vectorized env) for general RL environments."

Project description


PyPI Downloads arXiv Read the Docs Unittest GitHub issues GitHub stars GitHub forks GitHub license

EnvPool is a C++-based batched environment pool with pybind11 and thread pool. It has high performance (~1M raw FPS with Atari games, ~3M raw FPS with Mujoco simulator on DGX-A100) and compatible APIs (supports both gym and dm_env, both sync and async, both single and multi player environment). Currently it supports:

Here are EnvPool's several highlights:

Check out our arXiv paper for more details!

Installation

PyPI

EnvPool is currently hosted on PyPI. It supports Python 3.11-3.13 on Linux, macOS, and Windows.

You can simply install EnvPool with the following command:

$ pip install envpool

After installation, open a Python console and type

import envpool
print(envpool.__version__)

If no error occurs, you have successfully installed EnvPool.

Platform notes:

  • PyPI wheels do not require a separate Qt installation at runtime.
  • Windows Procgen wheels bundle the required Qt runtime DLLs (Qt5Core.dll and Qt5Gui.dll) next to the extension module.
  • Building from source still requires platform-local build dependencies, including Qt 5. The full per-platform setup is documented in Build From Source.

From Source

Please refer to the guideline.

Documentation

The tutorials and API documentation are hosted on envpool.readthedocs.io.

The example scripts are under examples/ folder; benchmark scripts are under benchmark/ folder.

Benchmark Results

The historical benchmark tables below were produced with ALE Atari environment PongNoFrameskip-v4 (with environment wrappers from OpenAI Baselines) and Mujoco environment Ant-v3 on different hardware setups, including a TPUv3-8 virtual machine (VM) of 96 CPU cores and 2 NUMA nodes, and an NVIDIA DGX-A100 of 256 CPU cores with 8 NUMA nodes. The current scripts under benchmark/ use Gymnasium's ALE/Pong-v5 and Ant-v5. Baselines include 1) naive Python for-loop; 2) the most popular RL environment parallelization execution by Python subprocess, e.g., gym.vector_env; 3) to our knowledge, the fastest RL environment executor Sample Factory before EnvPool.

We report EnvPool performance with sync mode, async mode, and NUMA + async mode, compared with the baselines on different number of workers (i.e., number of CPU cores). As we can see from the results, EnvPool achieves significant improvements over the baselines on all settings. On the high-end setup, EnvPool achieves 1 Million frames per second with Atari and 3 Million frames per second with Mujoco on 256 CPU cores, which is 14.9x / 19.6x of the gym.vector_env baseline. On a typical PC setup with 12 CPU cores, EnvPool's throughput is 3.1x / 2.9x of gym.vector_env.

Atari Highest FPS Laptop (12) Workstation (32) TPU-VM (96) DGX-A100 (256)
For-loop 4,893 7,914 3,993 4,640
Subprocess 15,863 47,699 46,910 71,943
Sample-Factory 28,216 138,847 222,327 707,494
EnvPool (sync) 37,396 133,824 170,380 427,851
EnvPool (async) 49,439 200,428 359,559 891,286
EnvPool (numa+async) / / 373,169 1,069,922
Mujoco Highest FPS Laptop (12) Workstation (32) TPU-VM (96) DGX-A100 (256)
For-loop 12,861 20,298 10,474 11,569
Subprocess 36,586 105,432 87,403 163,656
Sample-Factory 62,510 309,264 461,515 1,573,262
EnvPool (sync) 66,622 380,950 296,681 949,787
EnvPool (async) 105,126 582,446 887,540 2,363,864
EnvPool (numa+async) / / 896,830 3,134,287

Please refer to the benchmark page for more details.

API Usage

The following content shows both synchronous and asynchronous API usage of EnvPool. You can also run the full script at examples/env_step.py

Synchronous API

import envpool
import numpy as np

# make gym env
env = envpool.make("Pong-v5", env_type="gym", num_envs=100)
# or use envpool.make_gym(...)
obs = env.reset()  # should be (100, 4, 84, 84)
act = np.zeros(100, dtype=int)
obs, rew, term, trunc, info = env.step(act)

Under the synchronous mode, envpool closely resembles openai-gym/dm-env. It has the reset and step functions with the same meaning. However, there is one exception in envpool: batch interaction is the default. Therefore, during the creation of the envpool, there is a num_envs argument that denotes how many envs you like to run in parallel.

env = envpool.make("Pong-v5", env_type="gym", num_envs=100)

The first dimension of action passed to the step function should equal num_envs.

act = np.zeros(100, dtype=int)

You don't need to manually reset one environment when any of done is true; instead, all envs in envpool have enabled auto-reset by default.

Asynchronous API

import envpool
import numpy as np

# make asynchronous
num_envs = 64
batch_size = 16
env = envpool.make("Pong-v5", env_type="gym", num_envs=num_envs, batch_size=batch_size)
action_num = env.action_space.n
env.async_reset()  # send the initial reset signal to all envs
while True:
    obs, rew, term, trunc, info = env.recv()
    env_id = info["env_id"]
    action = np.random.randint(action_num, size=batch_size)
    env.send(action, env_id)

In the asynchronous mode, the step function is split into two parts: the send/recv functions. send takes two arguments, a batch of action, and the corresponding env_id that each action should be sent to. Unlike step, send does not wait for the envs to execute and return the next state, it returns immediately after the actions are fed to the envs. (The reason why it is called async mode).

env.send(action, env_id)

To get the "next states", we need to call the recv function. However, recv does not guarantee that you will get back the "next states" of the envs you just called send on. Instead, whatever envs finishes execution gets recved first.

state = env.recv()

Besides num_envs, there is one more argument batch_size. While num_envs defines how many envs in total are managed by the envpool, batch_size specifies the number of envs involved each time we interact with envpool. e.g. There are 64 envs executing in the envpool, send and recv each time interacts with a batch of 16 envs.

envpool.make("Pong-v5", env_type="gym", num_envs=64, batch_size=16)

There are other configurable arguments with envpool.make; please check out EnvPool Python interface introduction.

Contributing

EnvPool is still under development. More environments will be added, and we always welcome contributions to help EnvPool better. If you would like to contribute, please check out our contribution guideline.

License

EnvPool is under Apache2 license.

Other third-party source-code and data are under their corresponding licenses.

We do not include their source code and data in this repo.

Citing EnvPool

If you find EnvPool useful, please cite it in your publications.

@inproceedings{weng2022envpool,
 author = {Weng, Jiayi and Lin, Min and Huang, Shengyi and Liu, Bo and Makoviichuk, Denys and Makoviychuk, Viktor and Liu, Zichen and Song, Yufan and Luo, Ting and Jiang, Yukun and Xu, Zhongwen and Yan, Shuicheng},
 booktitle = {Advances in Neural Information Processing Systems},
 editor = {S. Koyejo and S. Mohamed and A. Agarwal and D. Belgrave and K. Cho and A. Oh},
 pages = {22409--22421},
 publisher = {Curran Associates, Inc.},
 title = {Env{P}ool: A Highly Parallel Reinforcement Learning Environment Execution Engine},
 url = {https://proceedings.neurips.cc/paper_files/paper/2022/file/8caaf08e49ddbad6694fae067442ee21-Paper-Datasets_and_Benchmarks.pdf},
 volume = {35},
 year = {2022}
}

Disclaimer

This is not an official Sea Limited or Garena Online Private Limited product.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

envpool-1.0.0-cp313-cp313-win_amd64.whl (57.5 MB view details)

Uploaded CPython 3.13Windows x86-64

envpool-1.0.0-cp313-cp313-manylinux_2_28_x86_64.whl (84.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

envpool-1.0.0-cp313-cp313-macosx_11_0_arm64.whl (52.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

envpool-1.0.0-cp312-cp312-win_amd64.whl (57.5 MB view details)

Uploaded CPython 3.12Windows x86-64

envpool-1.0.0-cp312-cp312-manylinux_2_28_x86_64.whl (84.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

envpool-1.0.0-cp312-cp312-macosx_11_0_arm64.whl (52.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

envpool-1.0.0-cp311-cp311-win_amd64.whl (57.5 MB view details)

Uploaded CPython 3.11Windows x86-64

envpool-1.0.0-cp311-cp311-manylinux_2_28_x86_64.whl (84.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

envpool-1.0.0-cp311-cp311-macosx_11_0_arm64.whl (52.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file envpool-1.0.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: envpool-1.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 57.5 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for envpool-1.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cfef79584a392dcb1aebdbf26c66e0e03abcd2d23eda375841089b8fbe91ba68
MD5 7584b4479257b32a0e0609662653f5d9
BLAKE2b-256 50eae6019a7cbd9b24fedcad234933c374d50c4c11563596eae5fac587219e0f

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.0.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7f7cd228bd25bf65fd370ae08ac06ef7df90a5f8d8c29013d73f433cab774a76
MD5 17e891de647688623a02e8915ee6baa3
BLAKE2b-256 4b5afe34b9643148940649cc4e809809f44253c47c5e06bf6f36167fb338332f

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1ce418bba090ad26bb32e1d1b9642144bab8863da457d1b6f7ca503c948301d
MD5 ff9545007e2cc75f3f10eee2cc0b8e11
BLAKE2b-256 cf9b5d8a1eb1564836fbd81c51f23422f339e361db082e88f5e5c68aedc1e5aa

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: envpool-1.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 57.5 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for envpool-1.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 dba9a3efe9ab5478006cac90c7658eef2b182f6e6812000feb4014c3fbaccb7b
MD5 682c5b6f2c8391282665eb30041f60ee
BLAKE2b-256 a878415e553b4dcefd9286a2b9435d8660015215f06c6079f9dcfe3ac664ee9f

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.0.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b27f4e533d51f83c125e4f4d262d0ba994c8205a8ab59c551096178256b9390b
MD5 ef5415054ec021ae38f026ebc3fa0084
BLAKE2b-256 bc0f1f095d061749e1a2f5758a20c3ed58b7f6d1ecb0cf74e79d39d7f602b245

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 841f994518c2d646fb6baaa3ee4a38c4cfa557a458c9a826be55a0f0149dd34e
MD5 55acb78fa57f84987c1a6ce7b3836200
BLAKE2b-256 1a2c2d158ccf7d040c2804109919f41ba007186b4dbef9f03f852a88e9edba06

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: envpool-1.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 57.5 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for envpool-1.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d1a0f9e9a0384cb17b5de4b88418bc6dc5fa0e2afd9cb453683b47e26ca2ed3f
MD5 8ac9eba2709e9c625b1211f88a131152
BLAKE2b-256 99c30b2c28394794dcabd54a956a11de1b9d25cff7eeeed7f177239be030947e

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.0.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 736a450d4900a5c658b902adf649f2fe889db679ab73a6919fd3ec2d32bca775
MD5 ce4e2697b1b9c971cb481883535b596f
BLAKE2b-256 8eb2d83b4f3aec4b676735b731daecc8b138ef8323215a6516622b85fae60df3

See more details on using hashes here.

File details

Details for the file envpool-1.0.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f982e10161db9d04abdf413b43f4c01f48f2559c845666d5a779711418178fc
MD5 208af4eef61020e4c693ec53d4782cfb
BLAKE2b-256 492af34f32b034058abd780576f76afe0148754d0e5825e5eb425e6aa26ae20b

See more details on using hashes here.

Supported by

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