Skip to main content

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.12-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 MuJoCo wheels use the system EGL/OpenGL runtime. For Mesa on Ubuntu, install libegl1 libopengl0 libgl1-mesa-dri.
  • 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.

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

Uploaded CPython 3.14Windows x86-64

envpool-1.2.6-cp314-cp314-manylinux_2_28_x86_64.whl (63.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

envpool-1.2.6-cp314-cp314-manylinux_2_28_aarch64.whl (60.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

envpool-1.2.6-cp314-cp314-macosx_13_0_arm64.whl (44.4 MB view details)

Uploaded CPython 3.14macOS 13.0+ ARM64

envpool-1.2.6-cp313-cp313-win_amd64.whl (54.5 MB view details)

Uploaded CPython 3.13Windows x86-64

envpool-1.2.6-cp313-cp313-manylinux_2_28_x86_64.whl (63.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

envpool-1.2.6-cp313-cp313-manylinux_2_28_aarch64.whl (60.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

envpool-1.2.6-cp313-cp313-macosx_13_0_arm64.whl (44.3 MB view details)

Uploaded CPython 3.13macOS 13.0+ ARM64

envpool-1.2.6-cp312-cp312-win_amd64.whl (54.5 MB view details)

Uploaded CPython 3.12Windows x86-64

envpool-1.2.6-cp312-cp312-manylinux_2_28_x86_64.whl (63.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

envpool-1.2.6-cp312-cp312-manylinux_2_28_aarch64.whl (60.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

envpool-1.2.6-cp312-cp312-macosx_13_0_arm64.whl (44.3 MB view details)

Uploaded CPython 3.12macOS 13.0+ ARM64

File details

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

File metadata

  • Download URL: envpool-1.2.6-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 56.7 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for envpool-1.2.6-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 cc95d4950bc8c4207f84efec344a3e1ddd33717c8432655ceefaa5291c078bf9
MD5 187698379b1fcf4822e2e40f1e1dc50d
BLAKE2b-256 92d2953cc071f9f678c387eeaa62a56a399865d34465e259093b91ddbe61ea14

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6553911b5cb360f96489d9e43f2d2efe6d6ed12b450b6f9de9c6510e0712ae48
MD5 78d43f9f8588bf7a172d5ddfde24a6c0
BLAKE2b-256 5f10af28d1c04b513851af9188c418b31ec58d300e73382a265c9df1e9d39490

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 67169ee3578758656dde64505f235bc024bf0f69e5d807353fab6c14485e236f
MD5 fd5c85475927831fb44d24e25fead2be
BLAKE2b-256 745f422ae45d10b040e663213a7b9de68311c99bbfd6b63f01b29ea72c965473

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp314-cp314-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp314-cp314-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 54bbc6585dd8cf287d23f1bf2ad880e5aecbb3de8d8ee14e630ca3a910657167
MD5 a121ff4e856a2a47f04197688e5c4a8e
BLAKE2b-256 4ab2478b12cb6c92835aa28dfb8e7a60f624d6479b0c0b8bc2a47f026676cada

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.6-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 54.5 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for envpool-1.2.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6201b845befd9da7d2c7a88cc6897c4688fb07d4411adcb4013c493f5efb4d9b
MD5 e393d7fceea734ace004c4cee9cf4aa1
BLAKE2b-256 0a47ac9fbab24d093a91b9a4c1544bc4baccbda301c938ae5842a6100e8d21ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.6-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f9ebe60cf5e115e5089e22ba290bf0875821962601800f234f8e95ae4052183e
MD5 d24d828de47565239ae3746cfd09e7c5
BLAKE2b-256 5888f23f59033a5aa0e2eb6d284b37975bccda8ccfc08f48b0235ee69f4c5d7a

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 aaac9ef3ec23cf44d978e6232c687e9ffaee3caf7e8cdb35f1098c9a84c1a123
MD5 472933ec5ca8e25ca5f5adce94979e51
BLAKE2b-256 81675555cdac8894ddb266cc021822b183e863b1c90a6c23fec5db37f556b877

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp313-cp313-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp313-cp313-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 a7233e8f9621cfb069d456c31abf517bfcb1e3a5f8440e9f64050356b56c17e1
MD5 57c25cf0d7cd48e343d8c4b7d84d051d
BLAKE2b-256 bec4a0bab891e3d47ebd0abae5cd96566b485bc9018c98c7a03dbaabdd9a4dcf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.6-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 54.5 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for envpool-1.2.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 67ba0772a77cfddd9d24529407d06f0a164618bfa7ca10906ee62fa78daf8c34
MD5 e2f9bfc4dd8fbe19bd32a15e55904877
BLAKE2b-256 8053b946dd67bac5aa9c75dd35ece2565390eb28483134554648f4cfcaba6ffd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.6-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1e9f1d3bdaaea1d7ec9adf598b027e4a5985c9ec8f0740942c98589208ffaf5a
MD5 cec81928c08807ae2c0b3347523f814a
BLAKE2b-256 7879319a89e8770c61e893d790b528ca28ed9f3999ad93fa27ab634a4f086d6e

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9a55d4dec5c59bc37691083173f857b948d10ee26cdef5dfbd7cc480ebaba429
MD5 2f38b53e918c99a6c6ebfc141470d919
BLAKE2b-256 bec02b3fcd6dec54356aa3bde8171f2f0baaf2d151e98fddd66afe411c278df4

See more details on using hashes here.

File details

Details for the file envpool-1.2.6-cp312-cp312-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for envpool-1.2.6-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 05a90c9e0bb099fd1fbdd2d67d174c8e81dac5ade2fb84036840e0d32bd1733b
MD5 d764dd6402edeb7365c993db8a8495ef
BLAKE2b-256 2a7ce9857a9d01c8337ffd1a1a36ba17b9a165eb72e3be1e1a1c0cae88e2acfb

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.2.6 This release

12 files

1.2.5

16 files

1.2.4

16 files

1.2.3

16 files

1.2.2

16 files

1.2.0

16 files

1.1.1

16 files

1.1.0

8 files

1.0.1

16 files

1.0.0

9 files

0.9.0

3 files

0.8.4

5 files

0.6.6

4 files

0.5.3

3 files

0.4.6

3 files

0.4.0

3 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page