Add PoolVecEnv support and update imports across the codebase #2204
+440
−7
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Implements PoolVecEnv, which is suitable for training RL algorithms with a large batch size.
Motivation and Context
For cases where large batch sizes are needed, currently SB3 provides two VecEnv:
A solution should exist that both supports large batch size and use multi-core capabilities. Although the third-party solution Envpool is suitable for this, it's C++ based. This necessitates rewriting the implementation of each environment in C++, making it less flexible when environments are already implemented in Python.
Description
PoolVecEnv is implemented here which runs N envs in M workers (M is user specified and less or equal than CPU cores).
the current implementation is bucket-base, which dispatches an (approx) equal number of envs to each subprocess. Further optimization may utilize something like threadpool when Python's new non-GIL feature is stable and extensively used.
Benchmarks
Setup: Intel.E5-2697 + 128GB Mem
(FPS is the total steps of all envs per second)
Test1: CartPole-V1

Test2: HumanoidStandup-v5

Types of changes
Checklist
make format(required)make check-codestyleandmake lint(required)make pytestandmake typeboth pass. (required)make doc(required)Note: You can run most of the checks using
make commit-checks.