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 Coverage 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 Gymnasium 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.14 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:

  • Linux Procgen wheels intentionally do not vendor Qt. If making a Procgen environment reports missing libQt5Core.so.5 or libQt5Gui.so.5, install the system Qt 5 runtime, for example with apt install qtbase5-dev or dnf install qt5-qtbase.
  • Windows Procgen wheels bundle the required Qt runtime DLLs (Qt5Core.dll and Qt5Gui.dll) next to the extension module.
  • Windows source/release CI validates MuJoCo rendering with Mesa software OpenGL. To reproduce that setup locally, point ENVPOOL_DLL_DIR at a Mesa DLL directory and set GALLIUM_DRIVER=llvmpipe plus MESA_GL_VERSION_OVERRIDE=4.5COMPAT.
  • 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 Gymnasium env
env = envpool.make("Pong-v5", env_type="gymnasium", num_envs=100)
# or use envpool.make_gymnasium(...)
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 Gymnasium and 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="gymnasium", 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="gymnasium", 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="gymnasium", num_envs=64, batch_size=16)

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

Rendering

EnvPool exposes rendering through the Python wrapper. Create the env with render_mode="rgb_array" to get batched RGB output, or render_mode="human" to display a single env through OpenCV.

import envpool

env = envpool.make(
    "Ant-v5",
    env_type="gymnasium",
    num_envs=4,
    render_mode="rgb_array",
    render_width=480,
    render_height=480,
)
env.reset()
frames = env.render(env_ids=[0, 2])
assert frames.shape == (2, 480, 480, 3)

render() is batch-first, so even a single render keeps the batch dimension: env.render().shape == (1, H, W, 3). If env_ids is omitted, EnvPool renders render_env_id (default 0). camera_id can be overridden per call, while the output size is fixed at env creation time via render_width and render_height.

The repo test suite also exercises rendering. make bazel-test runs repeated render checks for every render-capable env family, and make release-test includes a wheel smoke that calls render() after reset(). On Windows, the MuJoCo render tests use the same ENVPOOL_DLL_DIR Mesa preload hook described above when you want software OpenGL instead of the system driver.

viewer = envpool.make(
    "WalkerWalk-v1",
    env_type="gymnasium",
    num_envs=1,
    render_mode="human",
    render_env_id=0,
)
viewer.reset()
viewer.render()

render_mode="human" returns None and currently supports a single env id per call. It also requires opencv-python to be installed.

Pixel Observations

For MuJoCo tasks, pixel observations can also be exposed directly through the regular observation API by passing from_pixels=True. This path is produced natively in C++, without routing through Python-side render().

pixels = envpool.make(
    "WalkerWalk-v1",
    env_type="gymnasium",
    num_envs=2,
    from_pixels=True,
    frame_stack=3,
    render_width=84,
    render_height=84,
)
obs, info = pixels.reset()
assert obs.shape == (2, 9, 84, 84)

Pixel observations use channel-first layout. With frame_stack=1, each environment returns (3, H, W); with frame_stack=3, EnvPool stacks frames on the channel dimension and returns (9, H, W). This matches the usual PyTorch BCHW convention directly. If render_width / render_height are omitted, EnvPool defaults them to 84.

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.2.3-cp314-cp314-win_amd64.whl (38.9 MB view details)

Uploaded CPython 3.14Windows x86-64

envpool-1.2.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (46.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

envpool-1.2.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (45.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

envpool-1.2.3-cp314-cp314-macosx_11_0_arm64.whl (31.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

envpool-1.2.3-cp313-cp313-win_amd64.whl (37.2 MB view details)

Uploaded CPython 3.13Windows x86-64

envpool-1.2.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (46.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

envpool-1.2.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (45.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

envpool-1.2.3-cp313-cp313-macosx_11_0_arm64.whl (31.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

envpool-1.2.3-cp312-cp312-win_amd64.whl (37.2 MB view details)

Uploaded CPython 3.12Windows x86-64

envpool-1.2.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (46.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

envpool-1.2.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (45.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

envpool-1.2.3-cp312-cp312-macosx_11_0_arm64.whl (31.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

envpool-1.2.3-cp311-cp311-win_amd64.whl (37.2 MB view details)

Uploaded CPython 3.11Windows x86-64

envpool-1.2.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (46.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

envpool-1.2.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (45.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

envpool-1.2.3-cp311-cp311-macosx_11_0_arm64.whl (31.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file envpool-1.2.3-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: envpool-1.2.3-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 38.9 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for envpool-1.2.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 70f889545147aa8e4e997398793a8c77eaac8e79cf7ee6c7cf1c1f6e33463e27
MD5 3bb94dba6d8ccef8e78189378f0888dc
BLAKE2b-256 ee1ce9e88ef79046ad7e3020b802eac77a62800446c39f63b0d2abfdcb623351

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 61b25569af4ef2e6366daa27e6c82fae91659d1f93b6cbb3d0a760531636e290
MD5 454275abd489b70c9fa033caa5d72662
BLAKE2b-256 9b3763727a6100c43d9ebbfa3ef3a0f3af514e63aeb6315cb3ae13a618dee60c

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1d964bfa4cbc57fe12dc0c469971d9e2020823e396494841d31eee0757b8b4ff
MD5 029340e7bb0c48930abc1ecc8f39dfa4
BLAKE2b-256 8b070b474c9656caa193c1c250b8fd3ae0851948fd54416bf120931aaa35ab0a

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2ecbcd333c4f31e77b0a94efc40798b3393482aadcc4cfe7d73dd98c656dd320
MD5 7573286d1ce01ae3497fa12309d2051a
BLAKE2b-256 07489a4fd5a7316d54379b19e16ab1529d63cb0bcf46976db6cf0ea182c32c8e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for envpool-1.2.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 83b28c36dd8d13f6edc389b5c11a097f024e7259e0cc23db082ce091134ab31e
MD5 21cd380650ff563380870779a2d53248
BLAKE2b-256 561f0284004d30c93dd64af9b3eff005242dd988ac83174f0d920010b579bb6d

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 42d0a59db601824d8d9b7781309d08076304dcdae1e44538f045d928b968fd3a
MD5 2988120ed3c0cc2115b80931c0a437be
BLAKE2b-256 02fc8c450988de666c699d7600c9bbc0028e3a7593affc1d36af1e054f80e17c

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 58720246e04d0d8323f4f6f048eebb772afce86c9a397c513281c9e62bf0ab8a
MD5 6dab48e847e4ba1fcceb2838303dc029
BLAKE2b-256 069fb2f508a03d7c2d00cb3e195528faa9211e36c8b410457403380e0278145c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7ad3ba9526b8451ea9b910cf9dabbb2d44974b94013f41490505122b91ee2874
MD5 9e0c32203f7c2ce97039a7adf1e40ebe
BLAKE2b-256 ddc337481211dc54590c69def4c4918a8626ac20dd644fc83efb6d68c883a828

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for envpool-1.2.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 84222ee33c831a96b4f0312012c93b728d11080d492df038062c61a4f81cd99d
MD5 7083ec78a5b115fd740311f0c4b9f347
BLAKE2b-256 2a8e8fba2dfc31d74e91e4ac70933a066c735902d88868855eb27dd1a637cba6

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e1cd177e239fa1160e7c64ba7bfaa9636858485bfef46ea1baa9e7c995055127
MD5 37b0d15c9cc8edbaf4cf573bcc506f0b
BLAKE2b-256 189b22e16e2907e24871c0af2ba8e543079f50e7b836b77f9480f7862b4bf395

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5c6c3aca2211f386220e992326d93f579df45f17527bd118ebdde19b617dd7b0
MD5 216d2a05754158f8a342f5e334593770
BLAKE2b-256 33550b2840f0361e1e417bd6c6aa3b3b5784e170f40034b57de29021d01f6fc9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1b2c4042c139755103dcab961efde469a33c660835ced1c3e90b27e15d6ac836
MD5 95c714966e5a3ce729f03098d7190f5b
BLAKE2b-256 c4c8db1546953019c02f9ed811623aa0419dc7d62aa395eec76bd860be2473b0

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for envpool-1.2.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7c62ba2aa16bd5c3ae3874b5b294f8c9653a7b21e9a5759dbaf5ff195a285892
MD5 a46f64f095b12784d713d7f42c9abfe8
BLAKE2b-256 d72d12167341d3070854ef2f002d6035638bd02de3a032a708caa57655aee727

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b73cc63cd183f13aa3869131e901eba1d108f91ae3091ee623a397d0bbd29add
MD5 01eaf6b97c0a3447e4306b19fc8174cb
BLAKE2b-256 61edde4114652fd6578a9e38996ca3d7696eb5cc3fb8adf3fa42edbea763651a

See more details on using hashes here.

File details

Details for the file envpool-1.2.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 69a9a7dcd57a4e43732748b5948efb7228f4e5372c8c4ee7282f24974c72c326
MD5 3ac7185d135ebcc67a63a546791be3e1
BLAKE2b-256 ac7723d43ea7d57234bb9f14c78103c2fc65fc4465501ae94daad751c7448033

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c3c9e321e05ecf336a25a6989194eefdbb370dfee1d767dc676603589bcc680
MD5 63ae2005d19d385657b57f7c9e525d45
BLAKE2b-256 9170a8837f223ebcb36bbe5f3d7abd7db7ddbcc2d70a501ac3fa89f96a1a60a9

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