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

Uploaded CPython 3.14Windows x86-64

envpool-1.2.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (42.8 MB view details)

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

envpool-1.2.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (41.6 MB view details)

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

envpool-1.2.2-cp314-cp314-macosx_11_0_arm64.whl (28.7 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

envpool-1.2.2-cp313-cp313-win_amd64.whl (34.5 MB view details)

Uploaded CPython 3.13Windows x86-64

envpool-1.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (42.8 MB view details)

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

envpool-1.2.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (41.6 MB view details)

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

envpool-1.2.2-cp313-cp313-macosx_11_0_arm64.whl (28.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

envpool-1.2.2-cp312-cp312-win_amd64.whl (34.5 MB view details)

Uploaded CPython 3.12Windows x86-64

envpool-1.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (42.8 MB view details)

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

envpool-1.2.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (41.6 MB view details)

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

envpool-1.2.2-cp312-cp312-macosx_11_0_arm64.whl (28.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

envpool-1.2.2-cp311-cp311-win_amd64.whl (34.5 MB view details)

Uploaded CPython 3.11Windows x86-64

envpool-1.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (42.8 MB view details)

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

envpool-1.2.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (41.6 MB view details)

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

envpool-1.2.2-cp311-cp311-macosx_11_0_arm64.whl (28.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: envpool-1.2.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 36.0 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.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7b44b54dc012e7426338bd3966c63a04488e7fa5c1ebc8d0f93d766fbc6b577d
MD5 a86b4f19633f5d077555fe6e89ace8af
BLAKE2b-256 8b91c0ef95a114225ba07aad7e0aa7fc92eb8388edba1d9a554e0f6924b66e66

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5010e3d26c62a3075a428355e07bbbfbb9515d03d9ea0256b8b8f22e48fa8982
MD5 848bbce046e7c5c0b1c7445923131130
BLAKE2b-256 7058a9159b8e598510226130300c659831d9d0320c3e6cd583b6efbdb0270593

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 25b891c06a08e11071fe88bc4288bf9f43ce76f37a65039d6b2d8474cb03e33d
MD5 feeff3ff5665b9b96e58bba488feaf34
BLAKE2b-256 6276a6a8ae8cb841d064e40b84385f7e6c21f58cc9d5d7dcad6fb49fecb73cac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ff6abd548c502874ba706eb49070809008b8441095de9951e2ddf0934b7f5670
MD5 4f8a011fdfa719250fded954d785db4b
BLAKE2b-256 bed754666790becf76377b4e58ee42f1340dfc56c55b299f57e383ff88bd8608

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 34.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.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1dd10b6218ce81440dca25f8fa6d52ccadac8eb1f9091a61dd32811c9c5b3b52
MD5 56afd6550266d6c8a159b60494fc8c77
BLAKE2b-256 572642d15df2b5eb014ea295dade95dbc43db50acb92717f874aecd814c5a9d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 059dad69dd337e349a0a69b817008322fcecbb6a68024a00a53dfb9e3978ffc2
MD5 a5bd03b5ae90aedf403de17446e203d7
BLAKE2b-256 64900a685e716b702b0dbe5284bfaface3501fa97b6f8917eea04baa85c44ded

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 29107dc1dae5a12c53ca04bb35e29d6d63d308b2a5ab3ccd4c709d2d97b7ba1b
MD5 90f3271fa2d0f1a3ad36c42086a7d412
BLAKE2b-256 372cb9b5ed2c962a23e136d85cecb4db4cd02557e5aa149bb654fa02b46b5b83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e0b26925c072db6f9a138e8503570ec24dad9b8831a0c770f1e492c30308ffd
MD5 0b210128ea0c1d15f7b8cecdbf25df7b
BLAKE2b-256 dce1bb18c87fb5f5feddf1311d096ac087930736de47450fd420f65baa9d694c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 34.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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9a45725af0a54bfcec47e57ef013dfa750d35ac0ba125f2b262fdb673314124e
MD5 e33683d5248c32101e78a241728c8541
BLAKE2b-256 c7bd95a00361d05e2a890a33bcc16b2d1b2b6aca244d68fe8d1190629c83752c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6044a87328105fb0ba33576bb576af7abb782bcf1249cd947666598b4474a932
MD5 37185d584ec8bf5e087161dce115e129
BLAKE2b-256 5168ba1390b533a3fafe4afc5f7a129cdc6c2340fa66ad3d7ce7328f8025441a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1e33723f88e6616718c61e0d96129c8394bf2c8f4ae5a72cb5983a6a79b5fdbc
MD5 535ea205b231b36c82a1deda414da513
BLAKE2b-256 82a411c69cf8d6cf168abb892a4a8041fa6192c2f2cd31b405b019da01fb0e1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8bc0238010baa71bf3046f41707fbaeefe48087779f028693b085593b91e3d09
MD5 1bf8d45d1d4ef09948cea70ecff2de87
BLAKE2b-256 56ff21c103f3750e8dcd656cd3b172c6a3c4a8094437244c7dfc60cf486af64d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.2.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 34.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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8cfc17903fd9a46cc8567d21fed33552296a092eb44c0cc4f30d6b4cde6ca93c
MD5 a1f63c29784148a7a8cc41f77dba78af
BLAKE2b-256 0eb7c8e7949d887e63fc88e61365590405ff934d1e6be0286cb75635f43d0641

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 92595790e8885e52af8ada4145af5a4633b32f1870c77c6619881bdf77508661
MD5 dd3c6feaf1956e0ccd626fca19369939
BLAKE2b-256 59d994412dd15d2f93600341f53dfccbb429b2bae65c8f8027ea3325eaf1cba7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d0a95826bd833f77dda62d7410e6e2ccaefd0d014867160156dbb4eb50454d62
MD5 1a8c54fdd20c4ca5392fd612d9643950
BLAKE2b-256 4e6da81b74e42ca4304e41eea024bafd9dc93d571e1aa2720e8495edfa6e6cf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.2.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05df7b09e13b25ddabe6abb2d2ad676f0688316c91c033178328ddbbef128ee5
MD5 fc3776e3eece7bc41e6bcbbcb4cc3851
BLAKE2b-256 83956477821327af192341b3c915c5d6ce8e872786c78ca499b0e7f33ef19663

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