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

Uploaded CPython 3.14Windows x86-64

envpool-1.2.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (52.8 MB view details)

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

envpool-1.2.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (51.2 MB view details)

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

envpool-1.2.5-cp314-cp314-macosx_11_0_arm64.whl (36.8 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

envpool-1.2.5-cp313-cp313-win_amd64.whl (42.5 MB view details)

Uploaded CPython 3.13Windows x86-64

envpool-1.2.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (52.8 MB view details)

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

envpool-1.2.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (51.2 MB view details)

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

envpool-1.2.5-cp313-cp313-macosx_11_0_arm64.whl (36.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

envpool-1.2.5-cp312-cp312-win_amd64.whl (42.5 MB view details)

Uploaded CPython 3.12Windows x86-64

envpool-1.2.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (52.8 MB view details)

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

envpool-1.2.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (51.2 MB view details)

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

envpool-1.2.5-cp312-cp312-macosx_11_0_arm64.whl (36.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

envpool-1.2.5-cp311-cp311-win_amd64.whl (42.5 MB view details)

Uploaded CPython 3.11Windows x86-64

envpool-1.2.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (52.7 MB view details)

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

envpool-1.2.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (51.2 MB view details)

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

envpool-1.2.5-cp311-cp311-macosx_11_0_arm64.whl (36.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: envpool-1.2.5-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 44.5 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.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b06d404b16753654bf86b153de107c5eb5fe460eaceafd1c92dcb5841b0e7ead
MD5 c1941dc64bcdc2c383fd1eec49d9d912
BLAKE2b-256 4c124a0d1de9e9214253f3a439671ae33228e98dca7246ba14bede7b12a056e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4416ecef24ec2c5ae831ac3649d87464253d028c64d696758083a3c37c93fe82
MD5 4352e43f0976d569295600650b21b968
BLAKE2b-256 ba26d56b9b9596247c3d9d77b1608bc74bb85f600be486df3e51415f578cbdff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9c3fbbe616261f4d388cab1b714fef06b0ed47e80ece5248b216f3719e0873a9
MD5 cae0f9d73d7409d28857f17a90237f8d
BLAKE2b-256 2f2d1a29a995ba489352e118bf5e7d17a45ada767c6db67def6c6cd0d56d51c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 343c7d49b79f1dc3aa4478ea054abada520895bd22ca6f4c2292dcf3a83a0917
MD5 3c94640fc9ede4374e7e4d2aac589f07
BLAKE2b-256 ee2602d68272be8dea0daf981e5251613e02861c91512784dc8ff97a4975e2de

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 42.5 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.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 053d5e0dde8e0993de3897f8f0d20b0aeacbcaa56eafdf8921870404fae40d6d
MD5 e420fbdae268398b9b5bc844bee6d762
BLAKE2b-256 2c4a8bf318714eb8e6875081872e96aa2e8c4c7aeed122d964c701d37a726107

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 92aaadfdf07d64cc3eb0c86488499a1e522dc132699aaf78d898fdb00ff6ee4a
MD5 8244b9f206176f64b42809ee7f158e5b
BLAKE2b-256 06673ed14d21e07e973d9559fb60ac4bb803d52f6eafd0f611be939efd53374f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5e55a1d875cc204066f48e5362716c4c217319385f65d94fcb625a96a3acf721
MD5 d1802e9cc0a04a3dbb9abf919b67314b
BLAKE2b-256 d869bd4067403f3d68db394d4165f6ff8ff8c8d52dc54eabd75912a151cab75b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 194ed75ebc2dfb22acb61c6f481fba67f2bfb0206f8660df13d48b37e50b1dee
MD5 13ec148faa3471f8008bb5fbd0818abe
BLAKE2b-256 4f3ff2a4769780b796b294bba214e1bcd03ba80d455c65e5382e3ded8b0f1cfc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 42.5 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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2e55d555ae2f1bf1521dd8cfe0c4ba8eb317bf8a6f7c271f6e8337275faf4149
MD5 084249dacc28a0d86baadb522c5b2767
BLAKE2b-256 55e38b66a1a712304a2b3c287139ab67ea0072baa73637a256ca50e816b425c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1128fdb57115645973f1079158c2e2c192633c4cc17166627be9efc905943d1a
MD5 1581a9b9a76a6962f7a3650ac349dc2e
BLAKE2b-256 3f525378437ea2250cf49e1df8d742a1b37b9ea3a27bfaaa754eb89ad2bd02c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fef3950edd6c4a0c50f0599550de68d4ce54d7969ed6261022d9fa05b6165f0c
MD5 840cd38b6123a057637a81542792775a
BLAKE2b-256 a9fe4722d63ef0a5b7f3096281f4197219ba837fe0801f36002076acbab51b62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a57d8a2a103880722b35fb0fe394fa6401f29e6ac4cd6644de345e72219b6529
MD5 0330d470878d64008460a66383824941
BLAKE2b-256 a9e5eb4db81ae3c13b189e861f7bcd320eb12c42a93a8985a2a26e137f39b388

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 42.5 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.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0e28fbf613c563617a9575944f15735e0b585e875bf36d02298a5d1d89064f7a
MD5 d524c360d7f24831f2c3bcf1a5315983
BLAKE2b-256 5a7437fa5d5ae0dbda100bc17eddb007c9346a57edd83176f99798637214d353

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f3842a3df372b0f35db76d36b1c8dcc3c623566e4557031a232e7af5ab195e25
MD5 39e3acd6155deaf62be3328c47f62c6f
BLAKE2b-256 a402c28cf83f5d7731462d4612af19a9df9b793d6f0355a34b486fff6c4936ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c2edffc5e2982e1429b86cd3212a12f0c7d29cb91142d6d68a675b8b89d16a0a
MD5 1736dcba4f1174743eca70905a4489fe
BLAKE2b-256 1c5fef37f239a8068d5f064ac019655210406338d638c4ded55e0d084f7fee4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44a7890a1367ae464f741f6f359ca8a8a3c70211ee3ff30290c0747fafd73156
MD5 d30263da8249763d6f590ca00fd41a20
BLAKE2b-256 6e3592b211319559188ce28ad6b01107549dbb304635b31f3298d4801cbd8cb1

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