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

Uploaded CPython 3.14Windows x86-64

envpool-1.2.4-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.4-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.4-cp314-cp314-macosx_11_0_arm64.whl (36.8 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

envpool-1.2.4-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.4-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.4-cp313-cp313-macosx_11_0_arm64.whl (36.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

envpool-1.2.4-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.4-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.4-cp312-cp312-macosx_11_0_arm64.whl (36.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

envpool-1.2.4-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.4-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.4-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.4-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: envpool-1.2.4-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.4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6a23beffe8010488a66a5808ce648cb030d1227b18692ca1d449ed579107ae96
MD5 4fe9d3970acfd8fd98d2d2ab966bc123
BLAKE2b-256 a3a67b20da37ef057eaa4b5bb64b354023ae9ea88385846fb9b4a289e8d9f7a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7e2c5cb3d42af0da332e3a2940eca345b5fa2e4c91f3e898c10ea00ea7df18dd
MD5 150d91bf861e4b6958415463d75a1ff7
BLAKE2b-256 591dc2c14e7ca10c7d91ddb9fd1b799c43ab8f829642cbd46574c89495abcedd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ff99e5abfb1a44d458ef186452c215c154eed5d71524be56fc319ecb8257f330
MD5 60f1f9d2a17748b84c528ab0bad5130a
BLAKE2b-256 2ca42aaa09a5a368ff7d40b9258977134e69489e42a4e42c450124b72b7715c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 28eb7c61c6b6a99c6f70aa1031d66085b45c821823d74c78f870c87b7d6be889
MD5 02167287e482bad491fbbc9ab7387185
BLAKE2b-256 b682317625ee409f6112a1066b758bda48c0203b50a168d091033a2d741d432a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.4-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.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 af7e7008fbe3c3148424cbcf60c68c0778ae50b0b33ad18a474f0141783ad5d1
MD5 ade6c1ccc29bf51df0cc5cdbb4b00676
BLAKE2b-256 d995f60024a52bb771ab6734acf0965535e98f4bf6b81f01b095e31b1d6066d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c37bb600fb9c60fc32b809ff4f52ad43d9186f3261ce4e92e99ea9a4177149ef
MD5 0abec1fe55258af71a13451201886444
BLAKE2b-256 3b3b753e094229929d46631e6a68c77a7f3f86ee47cd299063afbf7ae59483ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9deb4b25905f73b6c938e6d0ab8c6bcd6cfdefe242a0e7daec5a7273787c85bb
MD5 280500d0b611395470df9f25ea547928
BLAKE2b-256 732959c794979572b09481d7d7083d7b786a8e65891d1f835323fab676757582

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 08ab7b6099c597f6bda21838e801e0e5d9fa7121f0cae478e340dc4cc8a939b5
MD5 d0fbe349e8165f77b60fead1ee22282f
BLAKE2b-256 e846fcc0f770a5c7fb94e9f38460f0f7f387c2f26a59918a4c635c2585604651

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.4-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.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3d9f263d15620d1bd0a790f028aef3238a4a8fc104184ffebfd4c09e5bfe9b9a
MD5 b975fe2d66ede9dae2e4ca3c255f3ea8
BLAKE2b-256 41ab2b1bab9dc7ed05deb4cdb8039ce12321c85979cffc9c63eff86feb5487d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5661185b1af35eb12ae031e0307bd19f9ebc4b8756fc5edacea585b62ab24749
MD5 e97a1e6ffe5fcfc98d73082e3b13bbd1
BLAKE2b-256 3832c389cfe617c7f767341be3dc74aef54bd30123cd1c4668c743be8f77dad3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6424566d7265a56ed0467f6bbdae08a6558d16833eeafcd774c995ad0da4d3ee
MD5 3e31e1d1a4b4c35568381f86730ff6f5
BLAKE2b-256 6cf115550b6deb32433f211c9b9c1a7a9d10161ab93f4bcae2d7e63c62307c00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 13c3909fa315c984f18e2caa972fb29e585ca4d7bf32afb2421eec9ff788a727
MD5 d42a91e259eca1ee688df9e86423cb74
BLAKE2b-256 3f6b178046ddfd537d79be30d845ac6398189ea7ef4c8833eca263422865a7ed

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.4-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.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 080bc5f9dda7c7bedd6d6fdb2551270e948c56f1c47b7e2933d6788bc78a5732
MD5 aae738639f2d93faea143cf0cae087a5
BLAKE2b-256 4a2d47800131bdff4af208974d7c84e50e903d6aa662c2bcc220addd2588467e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 20cd25d9723dcbc8c5b60b2848b79aae8089905808ec08d4a84a69107595553b
MD5 dc61609e9e9c191a298d314691b00096
BLAKE2b-256 0735bf56adbbdefd883c5097b32ef4b71ab75decbfe2bc91f4a40efe0d5a50aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e57c0dc63ef28ef821a4455b00fcca9346b3d24502445e024664f914dc7cc9b0
MD5 f9fbb76458a7c3006dee8093f6dc8721
BLAKE2b-256 402b919e116cb2b593c54853e2870f392afebd7ef3173fd1faa97316d0d0d791

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5d252a29bf2bf30e7549320494fe3f1d4c627ef7bed3480593153265aeaf947d
MD5 4143f85f292573d91c6748a684b712d2
BLAKE2b-256 ba086221c23bf3aed36582998566106ad3206fdaf2e30a571753c78090414326

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