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 both gym 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:

  • PyPI wheels do not require a separate Qt installation at runtime.
  • 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 gym env
env = envpool.make("Pong-v5", env_type="gym", num_envs=100)
# or use envpool.make_gym(...)
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 openai-gym/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="gym", 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="gym", 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="gym", 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.

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

Uploaded CPython 3.14Windows x86-64

envpool-1.1.0-cp314-cp314-macosx_11_0_arm64.whl (83.7 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

envpool-1.1.0-cp313-cp313-win_amd64.whl (88.0 MB view details)

Uploaded CPython 3.13Windows x86-64

envpool-1.1.0-cp313-cp313-macosx_11_0_arm64.whl (83.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

envpool-1.1.0-cp312-cp312-win_amd64.whl (88.0 MB view details)

Uploaded CPython 3.12Windows x86-64

envpool-1.1.0-cp312-cp312-macosx_11_0_arm64.whl (83.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

envpool-1.1.0-cp311-cp311-win_amd64.whl (88.0 MB view details)

Uploaded CPython 3.11Windows x86-64

envpool-1.1.0-cp311-cp311-macosx_11_0_arm64.whl (83.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: envpool-1.1.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 89.4 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.1.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 36ce6b1e8780a4c7770cb0b2d081d858aee3d2b34de7ae6726cdb0f990bafe31
MD5 8262203f524949a151742de8d376ca35
BLAKE2b-256 deb4c06386448596b86a1a6a42cb64e77e54fb34de0d6e8da7b36e1567c1913e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8fb71615ebcd1304ea790179e877eb7f207af8f772c20175de8e87f210306c20
MD5 8393bbf71853371e07826c51afbcf324
BLAKE2b-256 97f2e8cb4bb2e310469053e1fd3d3c3e52648450994cd730c0b1ae0ea5fefda4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.1.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 88.0 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.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2b41bd1540d7971708d73100dde72826841a39dc3e6023bd5d393935b75d5fcb
MD5 e506ca7bc9d0611eae24b930da15d057
BLAKE2b-256 05840e1efe9c366ea04756a99a415918549eab3553dae02d8eb9804290168692

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2074c94824828ddf7767b7af777367e3a9c24ba32c0165d1e6d2531b56c1164
MD5 edddd0c0e3bdf0e048694eefde5be365
BLAKE2b-256 005c11808785727311c5304b7389c95281c036010b6d1523751e12e2e94c60aa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 88.0 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.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d393134367bc7be31d3c5ccb7dd01c6adf9a8a10a537c1c9c52a6d298eb80a8c
MD5 cab8e5ac22cc49b9aa76269f079ef55c
BLAKE2b-256 77a487f6b7e1b8176d5f58cf17036bb5299941a14a208ddba8e2a2e9250c0708

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e407cf1584512e4e590d521654bb4d4a28a1501db901eeef6c3dd7e0c5397ba1
MD5 9a24af1cfa490f41f0c4374465ad5b82
BLAKE2b-256 b9f5e8b79e8389fe4e5ef2f025a40b5d32577124d0dc805bd237943258851d17

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envpool-1.1.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 88.0 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for envpool-1.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 91dae9ed5a2e0b464630b2dfbb0d43bc6796754578602984d1a2dfe29ccfdbd9
MD5 64f9fb63bb9c357233315393ab1629b3
BLAKE2b-256 00f71fb046d4052c752a28592c48c0181746e5314924ee637f095c9c3afcfd7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for envpool-1.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e6383fb584ff8ac806fbf0b0c299aad88c91f4c19090e8f06fcf198fcb646592
MD5 df93b5a4b53b1b3b061c9c45dd62ea78
BLAKE2b-256 1fbfb3b7922295893db18ef509865b216c7b286def3dd3989d7611bccdc9365e

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