From ab24f8039f54af5192b5242c69f741a893bdda71 Mon Sep 17 00:00:00 2001 From: kronion Date: Thu, 23 Sep 2021 07:50:10 -0500 Subject: [PATCH] PPO variant with invalid action masking (#25) * Add wrappers * Add maskable distributions * Add mypy configuration * Add maskable base datastructures * Add ppo_mask package * Fix circular dependency and remove test code that slipped in * Automatically mask vecenv if env is masked * Fix debugging change that slipped in * Workaround for subclassing RolloutBufferSamples * Duplicate lots of policy code in order to swap out the distributions used * Fix pytype error * Maintain py 3.6 compatibility * Fix isort lint errors * Use pyproject.toml to configure black line length * Blacken * Remove mypy.ini * Fully replace RolloutBufferSamples * Drop support for continuous distributions, remove SDE-related code * Eliminate MaskableAlgorithm and MaskableOnPolicyAlgorithm * Fix formatting * Override superclass methods as needed, fix circular import, improve naming * Fix codestyle * Eliminate VecActionMasker, replace with utils * Fix codestyle * Support masking for MultiDiscrete action spaces * Fix codestyle * Don't require the env to provide the mask already flattened * Consistent naming, prefer 'Maskable' to 'Masked' * Register policy * Link to abstract instead of pdf * Allow distribution masking to be unapplied + improved comments and docstrings * Don't use deprecated implicit optional typing * Check codestyle * Add docstring and remove misplaced TODO * Simplify env masking API, error if API unmet. Make use_masking a learn() kwarg * Fix codestyle * Update various internals to be consistent with latest SB3 * Simplify MaskableRolloutBuffer reset * Add docstring and type annotations * Ensure old probs aren't cached * Fix for new logger * Add test + fixes * Start doc * Fix type annotation * Remove abstract class + add test * Fix evaluation (add support for multi envs) * Handle merge conflicts in documentation * Bugfix: mask updates should apply to original logits, not the last masked output * Add test of distribution masking behavior * Reformat * Add MultiBinary support, remove unneeded distribution type checks * Remove unused import * Fix when using multiple envs * Remove addressed TODO * Upgrade for SB3 1.2.0 * Update docs with results + how to replicate * Add action masker tests, move wrapper tests * Move distributions, add more distribution tests * Add MaskablePPO tests, simplify and rename discrete test env * Address TODO * Add tests for MaskableMultiCategoricalDistribution, fix distributions * Add maskable identity envs for all supported action spaces, add tests, fix bug * Formatting fixes * Update doc env * Dict support not ready * Cleanup Co-authored-by: Antonin RAFFIN --- Makefile | 2 +- docs/conda_env.yml | 6 +- docs/images/10x10_combined.png | Bin 0 -> 78024 bytes docs/images/10x10_mask.png | Bin 0 -> 51336 bytes docs/images/10x10_no_mask.png | Bin 0 -> 60769 bytes docs/images/4x4_combined.png | Bin 0 -> 82211 bytes docs/images/4x4_mask.png | Bin 0 -> 59404 bytes docs/images/4x4_no_mask.png | Bin 0 -> 62014 bytes docs/index.rst | 1 + docs/misc/changelog.rst | 30 +- docs/modules/ppo_mask.rst | 256 ++++++++ pyproject.toml | 2 + sb3_contrib/__init__.py | 1 + sb3_contrib/common/envs/__init__.py | 5 + .../common/envs/invalid_actions_env.py | 116 ++++ sb3_contrib/common/maskable/__init__.py | 0 sb3_contrib/common/maskable/buffers.py | 98 ++++ sb3_contrib/common/maskable/callbacks.py | 107 ++++ sb3_contrib/common/maskable/distributions.py | 272 +++++++++ sb3_contrib/common/maskable/evaluation.py | 148 +++++ sb3_contrib/common/maskable/policies.py | 402 +++++++++++++ sb3_contrib/common/maskable/utils.py | 38 ++ sb3_contrib/common/wrappers/__init__.py | 1 + sb3_contrib/common/wrappers/action_masker.py | 32 + sb3_contrib/ppo_mask/__init__.py | 2 + sb3_contrib/ppo_mask/policies.py | 15 + sb3_contrib/ppo_mask/ppo_mask.py | 551 ++++++++++++++++++ sb3_contrib/version.txt | 2 +- setup.cfg | 3 + tests/test_distributions.py | 316 ++++++++++ tests/test_invalid_actions.py | 232 ++++++++ tests/test_train_eval_mode.py | 45 +- tests/wrappers/test_action_masker.py | 78 +++ .../test_time_feature.py} | 0 34 files changed, 2755 insertions(+), 6 deletions(-) create mode 100644 docs/images/10x10_combined.png create mode 100644 docs/images/10x10_mask.png create mode 100644 docs/images/10x10_no_mask.png create mode 100644 docs/images/4x4_combined.png create mode 100644 docs/images/4x4_mask.png create mode 100644 docs/images/4x4_no_mask.png create mode 100644 docs/modules/ppo_mask.rst create mode 100644 pyproject.toml create mode 100644 sb3_contrib/common/envs/__init__.py create mode 100644 sb3_contrib/common/envs/invalid_actions_env.py create mode 100644 sb3_contrib/common/maskable/__init__.py create mode 100644 sb3_contrib/common/maskable/buffers.py create mode 100644 sb3_contrib/common/maskable/callbacks.py create mode 100644 sb3_contrib/common/maskable/distributions.py create mode 100644 sb3_contrib/common/maskable/evaluation.py create mode 100644 sb3_contrib/common/maskable/policies.py create mode 100644 sb3_contrib/common/maskable/utils.py create mode 100644 sb3_contrib/common/wrappers/action_masker.py create mode 100644 sb3_contrib/ppo_mask/__init__.py create mode 100644 sb3_contrib/ppo_mask/policies.py create mode 100644 sb3_contrib/ppo_mask/ppo_mask.py create mode 100644 tests/test_distributions.py create mode 100644 tests/test_invalid_actions.py create mode 100644 tests/wrappers/test_action_masker.py rename tests/{test_wrappers.py => wrappers/test_time_feature.py} (100%) diff --git a/Makefile b/Makefile index a8f34af..d36ad2e 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ check-codestyle: # Sort imports isort --check ${LINT_PATHS} # Reformat using black - black --check -l 127 ${LINT_PATHS} + black --check ${LINT_PATHS} commit-checks: format type lint diff --git a/docs/conda_env.yml b/docs/conda_env.yml index 627daac..52f7498 100644 --- a/docs/conda_env.yml +++ b/docs/conda_env.yml @@ -6,7 +6,7 @@ dependencies: - cpuonly=1.0=0 - pip=20.2 - python=3.6 - - pytorch=1.5.0=py3.6_cpu_0 + - pytorch=1.8.1=py3.6_cpu_0 - pip: - gym>=0.17.2 - cloudpickle @@ -15,4 +15,6 @@ dependencies: - numpy - matplotlib - sphinx_autodoc_typehints - - stable-baselines3>=0.10.0a0 + - stable-baselines3>=1.2.0 + # See https://github.com/readthedocs/sphinx_rtd_theme/issues/1115 + - sphinx_rtd_theme>=1.0 diff --git a/docs/images/10x10_combined.png b/docs/images/10x10_combined.png new file mode 100644 index 0000000000000000000000000000000000000000..e93cd1a59443e7c93eab926bfb7eb8ced3ee8ca3 GIT binary patch literal 78024 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%0D<1#iQ96AceI`6kffXIGFRF7}%!mi1 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 u+;EWk0A_60ex9Zspyi`o&N#t2BsYV literal 0 HcmV?d00001 diff --git a/docs/images/10x10_no_mask.png b/docs/images/10x10_no_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d2a9ff09ffdf387fe4c8ba1d448f3e22b2ca1d GIT binary patch literal 60769 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

_wc_H_){jSiWGgw{!h#K;898!K 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 literal 0 HcmV?d00001 diff --git a/docs/images/4x4_mask.png b/docs/images/4x4_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa76eebbb906e360cc81fb5dd5384af1eee3746 GIT binary patch literal 59404 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

Qsu3gAZX00K`*eUXI8#XpG)V8eqY85%H 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 YQQFv(&6}of(dfw-arryBqWX{j6O0KhX8-^I literal 0 HcmV?d00001 diff --git a/docs/images/4x4_no_mask.png b/docs/images/4x4_no_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..a78ecb285ebc574c262bab596ddb83458c911d86 GIT binary patch literal 62014 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index f86c47e..8e37c71 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,6 +33,7 @@ RL Baselines3 Zoo also offers a simple interface to train, evaluate agents and d modules/tqc modules/qrdqn + modules/ppo_mask .. toctree:: :maxdepth: 1 diff --git a/docs/misc/changelog.rst b/docs/misc/changelog.rst index 07a42a0..79693dd 100644 --- a/docs/misc/changelog.rst +++ b/docs/misc/changelog.rst @@ -3,6 +3,31 @@ Changelog ========== +Release 1.2.1a0 (WIP) +------------------------------- + +**Invalid action masking for PPO** + +Breaking Changes: +^^^^^^^^^^^^^^^^^ + +New Features: +^^^^^^^^^^^^^ +- Added ``MaskablePPO`` algorithm (@kronion) + +Bug Fixes: +^^^^^^^^^^ + +Deprecations: +^^^^^^^^^^^^^ + +Others: +^^^^^^^ + + +Documentation: +^^^^^^^^^^^^^^ + Release 1.2.0 (2021-09-08) ------------------------------- @@ -13,6 +38,9 @@ Breaking Changes: ^^^^^^^^^^^^^^^^^ - Upgraded to Stable-Baselines3 >= 1.2.0 +New Features: +^^^^^^^^^^^^^ + Bug Fixes: ^^^^^^^^^^ - QR-DQN and TQC updated so that their policies are switched between train and eval mode at the correct time (@ayeright) @@ -156,4 +184,4 @@ Stable-Baselines3 is currently maintained by `Antonin Raffin`_ (aka `@araffin`_) Contributors: ------------- -@ku2482 @guyk1971 @minhlong94 @ayeright +@ku2482 @guyk1971 @minhlong94 @ayeright @kronion diff --git a/docs/modules/ppo_mask.rst b/docs/modules/ppo_mask.rst new file mode 100644 index 0000000..1b5a60d --- /dev/null +++ b/docs/modules/ppo_mask.rst @@ -0,0 +1,256 @@ +.. _ppo_mask: + +.. automodule:: sb3_contrib.ppo_mask + +Maskable PPO +============ + +Implementation of `invalid action masking `_ for the Proximal Policy Optimization(PPO) +algorithm. Other than adding support for action masking, the behavior is the same as in SB3's core PPO algorithm. + + +.. rubric:: Available Policies + +.. autosummary:: + :nosignatures: + + MlpPolicy + CnnPolicy + .. MultiInputPolicy + + +Notes +----- + +- Paper: https://arxiv.org/abs/2006.14171 +- Blog post: https://costa.sh/blog-a-closer-look-at-invalid-action-masking-in-policy-gradient-algorithms.html +- Additional Blog post: https://boring-guy.sh/posts/masking-rl/ + + +Can I use? +---------- + +- Recurrent policies: ❌ +- Multi processing: ✔️ +- Gym spaces: + + +============= ====== =========== +Space Action Observation +============= ====== =========== +Discrete ✔️ ✔️ +Box ❌ ✔️ +MultiDiscrete ✔️ ✔️ +MultiBinary ✔️ ✔️ +Dict ❌ ❌ +============= ====== =========== + + +Example +------- + +Train a PPO agent on ``InvalidActionEnvDiscrete``. ``InvalidActionEnvDiscrete`` has a ``action_masks`` method that +returns the invalid action mask (``True`` if the action is valid, ``False`` otherwise). + +.. code-block:: python + + from sb3_contrib import MaskablePPO + from sb3_contrib.common.envs import InvalidActionEnvDiscrete + from sb3_contrib.common.maskable.evaluation import evaluate_policy + from sb3_contrib.common.maskable.utils import get_action_masks + + + env = InvalidActionEnvDiscrete(dim=80, n_invalid_actions=60) + model = MaskablePPO("MlpPolicy", env, gamma=0.4, seed=32, verbose=1) + model.learn(5000) + + evaluate_policy(model, env, n_eval_episodes=20, reward_threshold=90, warn=False) + + model.save("ppo_mask") + del model # remove to demonstrate saving and loading + + model = MaskablePPO.load("ppo_mask") + + obs = env.reset() + while True: + # Retrieve current action mask + action_masks = get_action_masks(env) + action, _states = model.predict(obs, action_masks=action_masks) + obs, rewards, dones, info = env.step(action) + env.render() + + +If the environment implements the invalid action mask but using a different name, you can use the ``ActionMasker`` +to specify the name (see `PR #25 `_): + + +.. code-block:: python + + import gym + import numpy as np + + from sb3_contrib.common.maskable.policies import MaskableActorCriticPolicy + from sb3_contrib.common.wrappers import ActionMasker + from sb3_contrib.ppo_mask import MaskablePPO + + + def mask_fn(env: gym.Env) -> np.ndarray: + # Do whatever you'd like in this function to return the action mask + # for the current env. In this example, we assume the env has a + # helpful method we can rely on. + return env.valid_action_mask() + + + env = ... # Initialize env + env = ActionMasker(env, mask_fn) # Wrap to enable masking + + # MaskablePPO behaves the same as SB3's PPO unless the env is wrapped + # with ActionMasker. If the wrapper is detected, the masks are automatically + # retrieved and used when learning. Note that MaskablePPO does not accept + # a new action_mask_fn kwarg, as it did in an earlier draft. + model = MaskablePPO(MaskableActorCriticPolicy, env, verbose=1) + model.learn() + + # Note that use of masks is manual and optional outside of learning, + # so masking can be "removed" at testing time + model.predict(observation, action_masks=valid_action_array) + + +Results +------- + +Results are shown for two MicroRTS benchmarks: MicrortsMining4x4F9-v0 (600K steps) and MicrortsMining10x10F9-v0 +(1.5M steps). For each, models were trained with and without masking, using 3 seeds. + +4x4 +^^^ + +No masking +"""""""""" + +.. image:: /images/4x4_no_mask.png + +With masking +"""""""""""" + +.. image:: /images/4x4_mask.png + +Combined +"""""""" + +.. image:: /images/4x4_combined.png + +10x10 +^^^^^ + +No masking +"""""""""" + +.. image:: /images/10x10_no_mask.png + +With masking +"""""""""""" + +"""""""" + +.. image:: /images/10x10_mask.png + +Combined +"""""""" + +.. image:: /images/10x10_combined.png + +More information may be found in the +`associated PR `_. + +How to replicate the results? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Clone the repo for the experiment: + +.. code-block:: bash + + git clone git@github.com:kronion/microrts-ppo-comparison.git + cd microrts-ppo-comparison + +Install dependencies: + +.. code-block:: bash + + # Install MicroRTS: + rm -fR ~/microrts && mkdir ~/microrts && \ + wget -O ~/microrts/microrts.zip http://microrts.s3.amazonaws.com/microrts/artifacts/202004222224.microrts.zip && \ + unzip ~/microrts/microrts.zip -d ~/microrts/ + + # You may want to make a venv before installing packages + pip install -r requirements.txt + +Train several times with various seeds, with and without masking: + +.. code-block:: bash + + # python sb/train_ppo.py [output dir] [MicroRTS map size] [--mask] [--seed int] + + # 4x4 unmasked + python sb3/train_ppo.py zoo 4 --seed 42 + python sb3/train_ppo.py zoo 4 --seed 43 + python sb3/train_ppo.py zoo 4 --seed 44 + + # 4x4 masked + python sb3/train_ppo.py zoo 4 --mask --seed 42 + python sb3/train_ppo.py zoo 4 --mask --seed 43 + python sb3/train_ppo.py zoo 4 --mask --seed 44 + + # 10x10 unmasked + python sb3/train_ppo.py zoo 10 --seed 42 + python sb3/train_ppo.py zoo 10 --seed 43 + python sb3/train_ppo.py zoo 10 --seed 44 + + # 10x10 masked + python sb3/train_ppo.py zoo 10 --mask --seed 42 + python sb3/train_ppo.py zoo 10 --mask --seed 43 + python sb3/train_ppo.py zoo 10 --mask --seed 44 + +View the tensorboard log output: + +.. code-block:: bash + + # For 4x4 environment + tensorboard --logdir zoo/4x4/runs + + # For 10x10 environment + tensorboard --logdir zoo/10x10/runs + + +Parameters +---------- + +.. autoclass:: MaskablePPO + :members: + :inherited-members: + + +MaskablePPO Policies +-------------------- + +.. autoclass:: MlpPolicy + :members: + :inherited-members: + +.. autoclass:: sb3_contrib.common.maskable.policies.MaskableActorCriticPolicy + :members: + :noindex: + +.. autoclass:: CnnPolicy + :members: + +.. autoclass:: sb3_contrib.common.maskable.policies.MaskableActorCriticCnnPolicy + :members: + :noindex: + +.. .. autoclass:: MultiInputPolicy +.. :members: +.. +.. .. autoclass:: sb3_contrib.common.maskable.policies.MaskableMultiInputActorCriticPolicy +.. :members: +.. :noindex: diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..dcff8a7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.black] +line-length = 127 diff --git a/sb3_contrib/__init__.py b/sb3_contrib/__init__.py index 8f253e1..c90336a 100644 --- a/sb3_contrib/__init__.py +++ b/sb3_contrib/__init__.py @@ -1,5 +1,6 @@ import os +from sb3_contrib.ppo_mask import MaskablePPO from sb3_contrib.qrdqn import QRDQN from sb3_contrib.tqc import TQC diff --git a/sb3_contrib/common/envs/__init__.py b/sb3_contrib/common/envs/__init__.py new file mode 100644 index 0000000..20bdffe --- /dev/null +++ b/sb3_contrib/common/envs/__init__.py @@ -0,0 +1,5 @@ +from sb3_contrib.common.envs.invalid_actions_env import ( + InvalidActionEnvDiscrete, + InvalidActionEnvMultiBinary, + InvalidActionEnvMultiDiscrete, +) diff --git a/sb3_contrib/common/envs/invalid_actions_env.py b/sb3_contrib/common/envs/invalid_actions_env.py new file mode 100644 index 0000000..aed67db --- /dev/null +++ b/sb3_contrib/common/envs/invalid_actions_env.py @@ -0,0 +1,116 @@ +from typing import List, Optional + +import numpy as np +from gym import spaces +from stable_baselines3.common.envs import IdentityEnv + + +class InvalidActionEnvDiscrete(IdentityEnv): + """ + Identity env with a discrete action space. Supports action masking. + """ + + def __init__( + self, + dim: Optional[int] = None, + ep_length: int = 100, + n_invalid_actions: int = 0, + ): + if dim is None: + dim = 1 + assert n_invalid_actions < dim, f"Too many invalid actions: {n_invalid_actions} < {dim}" + + space = spaces.Discrete(dim) + self.n_invalid_actions = n_invalid_actions + self.possible_actions = np.arange(space.n) + self.invalid_actions: List[int] = [] + super().__init__(space=space, ep_length=ep_length) + + def _choose_next_state(self) -> None: + self.state = self.action_space.sample() + # Randomly choose invalid actions that are not the current state + potential_invalid_actions = [i for i in self.possible_actions if i != self.state] + self.invalid_actions = np.random.choice(potential_invalid_actions, self.n_invalid_actions, replace=False) + + def action_masks(self) -> List[bool]: + return [action not in self.invalid_actions for action in self.possible_actions] + + +class InvalidActionEnvMultiDiscrete(IdentityEnv): + """ + Identity env with a multidiscrete action space. Supports action masking. + """ + + def __init__( + self, + dims: Optional[List[int]] = None, + ep_length: int = 100, + n_invalid_actions: int = 0, + ): + if dims is None: + dims = [1, 1] + + if n_invalid_actions > sum(dims) - len(dims): + raise ValueError(f"Cannot find a valid action for each dim. Set n_invalid_actions <= {sum(dims) - len(dims)}") + + space = spaces.MultiDiscrete(dims) + self.n_invalid_actions = n_invalid_actions + self.possible_actions = np.arange(sum(dims)) + self.invalid_actions: List[int] = [] + super().__init__(space=space, ep_length=ep_length) + + def _choose_next_state(self) -> None: + self.state = self.action_space.sample() + + converted_state: List[int] = [] + running_total = 0 + for i in range(len(self.action_space.nvec)): + converted_state.append(running_total + self.state[i]) + running_total += self.action_space.nvec[i] + + # Randomly choose invalid actions that are not the current state + potential_invalid_actions = [i for i in self.possible_actions if i not in converted_state] + self.invalid_actions = np.random.choice(potential_invalid_actions, self.n_invalid_actions, replace=False) + + def action_masks(self) -> List[bool]: + return [action not in self.invalid_actions for action in self.possible_actions] + + +class InvalidActionEnvMultiBinary(IdentityEnv): + """ + Identity env with a multibinary action space. Supports action masking. + """ + + def __init__( + self, + dims: Optional[int] = None, + ep_length: int = 100, + n_invalid_actions: int = 0, + ): + if dims is None: + dims = 1 + + if n_invalid_actions > dims: + raise ValueError(f"Cannot find a valid action for each dim. Set n_invalid_actions <= {dims}") + + space = spaces.MultiBinary(dims) + self.n_invalid_actions = n_invalid_actions + self.possible_actions = np.arange(2 * dims) + self.invalid_actions: List[int] = [] + super().__init__(space=space, ep_length=ep_length) + + def _choose_next_state(self) -> None: + self.state = self.action_space.sample() + + converted_state: List[int] = [] + running_total = 0 + for i in range(self.action_space.n): + converted_state.append(running_total + self.state[i]) + running_total += 2 + + # Randomly choose invalid actions that are not the current state + potential_invalid_actions = [i for i in self.possible_actions if i not in converted_state] + self.invalid_actions = np.random.choice(potential_invalid_actions, self.n_invalid_actions, replace=False) + + def action_masks(self) -> List[bool]: + return [action not in self.invalid_actions for action in self.possible_actions] diff --git a/sb3_contrib/common/maskable/__init__.py b/sb3_contrib/common/maskable/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sb3_contrib/common/maskable/buffers.py b/sb3_contrib/common/maskable/buffers.py new file mode 100644 index 0000000..672435e --- /dev/null +++ b/sb3_contrib/common/maskable/buffers.py @@ -0,0 +1,98 @@ +from typing import Generator, NamedTuple, Optional + +import numpy as np +import torch as th +from gym import spaces +from stable_baselines3.common.buffers import RolloutBuffer +from stable_baselines3.common.vec_env import VecNormalize + + +class MaskableRolloutBufferSamples(NamedTuple): + observations: th.Tensor + actions: th.Tensor + old_values: th.Tensor + old_log_prob: th.Tensor + advantages: th.Tensor + returns: th.Tensor + action_masks: th.Tensor + + +class MaskableRolloutBuffer(RolloutBuffer): + """ + Rollout buffer that also stores the invalid action masks associated with each observation. + + :param buffer_size: Max number of element in the buffer + :param observation_space: Observation space + :param action_space: Action space + :param device: + :param gae_lambda: Factor for trade-off of bias vs variance for Generalized Advantage Estimator + Equivalent to classic advantage when set to 1. + :param gamma: Discount factor + :param n_envs: Number of parallel environments + """ + + def __init__(self, *args, **kwargs): + self.action_masks = None + super().__init__(*args, **kwargs) + + def reset(self) -> None: + if isinstance(self.action_space, spaces.Discrete): + mask_dims = self.action_space.n + elif isinstance(self.action_space, spaces.MultiDiscrete): + mask_dims = sum(self.action_space.nvec) + elif isinstance(self.action_space, spaces.MultiBinary): + mask_dims = 2 * self.action_space.n # One mask per binary outcome + else: + raise ValueError(f"Unsupported action space {type(self.action_space)}") + + self.mask_dims = mask_dims + self.action_masks = np.ones((self.buffer_size, self.n_envs, self.mask_dims), dtype=np.float32) + + super().reset() + + def add(self, *args, action_masks: Optional[np.ndarray] = None, **kwargs) -> None: + """ + :param action_masks: Masks applied to constrain the choice of possible actions. + """ + if action_masks is not None: + self.action_masks[self.pos] = action_masks.reshape((self.n_envs, self.mask_dims)) + + super().add(*args, **kwargs) + + def get(self, batch_size: Optional[int] = None) -> Generator[MaskableRolloutBufferSamples, None, None]: + assert self.full, "" + indices = np.random.permutation(self.buffer_size * self.n_envs) + # Prepare the data + if not self.generator_ready: + for tensor in [ + "observations", + "actions", + "values", + "log_probs", + "advantages", + "returns", + "action_masks", + ]: + self.__dict__[tensor] = self.swap_and_flatten(self.__dict__[tensor]) + self.generator_ready = True + + # Return everything, don't create minibatches + if batch_size is None: + batch_size = self.buffer_size * self.n_envs + + start_idx = 0 + while start_idx < self.buffer_size * self.n_envs: + yield self._get_samples(indices[start_idx : start_idx + batch_size]) + start_idx += batch_size + + def _get_samples(self, batch_inds: np.ndarray, env: Optional[VecNormalize] = None) -> MaskableRolloutBufferSamples: + data = ( + self.observations[batch_inds], + self.actions[batch_inds], + self.values[batch_inds].flatten(), + self.log_probs[batch_inds].flatten(), + self.advantages[batch_inds].flatten(), + self.returns[batch_inds].flatten(), + self.action_masks[batch_inds].reshape(-1, self.mask_dims), + ) + return MaskableRolloutBufferSamples(*map(self.to_torch, data)) diff --git a/sb3_contrib/common/maskable/callbacks.py b/sb3_contrib/common/maskable/callbacks.py new file mode 100644 index 0000000..9832548 --- /dev/null +++ b/sb3_contrib/common/maskable/callbacks.py @@ -0,0 +1,107 @@ +import os + +import numpy as np +from stable_baselines3.common.callbacks import EvalCallback +from stable_baselines3.common.vec_env import sync_envs_normalization + +from sb3_contrib.common.maskable.evaluation import evaluate_policy + + +class MaskableEvalCallback(EvalCallback): + """ + Callback for evaluating an agent. Supports invalid action masking. + + :param eval_env: The environment used for initialization + :param callback_on_new_best: Callback to trigger + when there is a new best model according to the ``mean_reward`` + :param n_eval_episodes: The number of episodes to test the agent + :param eval_freq: Evaluate the agent every eval_freq call of the callback. + :param log_path: Path to a folder where the evaluations (``evaluations.npz``) + will be saved. It will be updated at each evaluation. + :param best_model_save_path: Path to a folder where the best model + according to performance on the eval env will be saved. + :param deterministic: Whether the evaluation should + use a stochastic or deterministic actions. + :param render: Whether to render or not the environment during evaluation + :param verbose: + :param warn: Passed to ``evaluate_policy`` (warns if ``eval_env`` has not been + wrapped with a Monitor wrapper) + :param use_masking: Whether or not to use invalid action masks during evaluation + """ + + def __init__(self, *args, use_masking: bool = True, **kwargs): + super().__init__(*args, **kwargs) + self.use_masking = use_masking + + def _on_step(self) -> bool: + if self.eval_freq > 0 and self.n_calls % self.eval_freq == 0: + # Sync training and eval env if there is VecNormalize + sync_envs_normalization(self.training_env, self.eval_env) + + # Reset success rate buffer + self._is_success_buffer = [] + + # Note that evaluate_policy() has been patched to support masking + episode_rewards, episode_lengths = evaluate_policy( + self.model, + self.eval_env, + n_eval_episodes=self.n_eval_episodes, + render=self.render, + deterministic=self.deterministic, + return_episode_rewards=True, + warn=self.warn, + callback=self._log_success_callback, + use_masking=self.use_masking, + ) + + if self.log_path is not None: + self.evaluations_timesteps.append(self.num_timesteps) + self.evaluations_results.append(episode_rewards) + self.evaluations_length.append(episode_lengths) + + kwargs = {} + # Save success log if present + if len(self._is_success_buffer) > 0: + self.evaluations_successes.append(self._is_success_buffer) + kwargs = dict(successes=self.evaluations_successes) + + np.savez( + self.log_path, + timesteps=self.evaluations_timesteps, + results=self.evaluations_results, + ep_lengths=self.evaluations_length, + **kwargs, + ) + + mean_reward, std_reward = np.mean(episode_rewards), np.std(episode_rewards) + mean_ep_length, std_ep_length = np.mean(episode_lengths), np.std(episode_lengths) + self.last_mean_reward = mean_reward + + if self.verbose > 0: + print(f"Eval num_timesteps={self.num_timesteps}, " f"episode_reward={mean_reward:.2f} +/- {std_reward:.2f}") + print(f"Episode length: {mean_ep_length:.2f} +/- {std_ep_length:.2f}") + # Add to current Logger + self.logger.record("eval/mean_reward", float(mean_reward)) + self.logger.record("eval/mean_ep_length", mean_ep_length) + + if len(self._is_success_buffer) > 0: + success_rate = np.mean(self._is_success_buffer) + if self.verbose > 0: + print(f"Success rate: {100 * success_rate:.2f}%") + self.logger.record("eval/success_rate", success_rate) + + # Dump log so the evaluation results are printed with the correct timestep + self.logger.record("time/total timesteps", self.num_timesteps, exclude="tensorboard") + self.logger.dump(self.num_timesteps) + + if mean_reward > self.best_mean_reward: + if self.verbose > 0: + print("New best mean reward!") + if self.best_model_save_path is not None: + self.model.save(os.path.join(self.best_model_save_path, "best_model")) + self.best_mean_reward = mean_reward + # Trigger callback if needed + if self.callback is not None: + return self._on_event() + + return True diff --git a/sb3_contrib/common/maskable/distributions.py b/sb3_contrib/common/maskable/distributions.py new file mode 100644 index 0000000..1ccf5ee --- /dev/null +++ b/sb3_contrib/common/maskable/distributions.py @@ -0,0 +1,272 @@ +from abc import ABC, abstractmethod +from typing import List, Optional, Tuple + +import numpy as np +import torch as th +from gym import spaces +from stable_baselines3.common.distributions import Distribution +from torch import nn +from torch.distributions import Categorical +from torch.distributions.utils import logits_to_probs + + +class MaskableCategorical(Categorical): + """ + Modified PyTorch Categorical distribution with support for invalid action masking. + + To instantiate, must provide either probs or logits, but not both. + + :param probs: Tensor containing finite non-negative values, which will be renormalized + to sum to 1 along the last dimension. + :param logits: Tensor of unnormalized log probabilities. + :param validate_args: Whether or not to validate that arguments to methods like lob_prob() + and icdf() match the distribution's shape, support, etc. + :param masks: An optional boolean ndarray of compatible shape with the distribution. + If True, the corresponding choice's logit value is preserved. If False, it is set to a + large negative value, resulting in near 0 probability. + """ + + def __init__( + self, + probs: Optional[th.Tensor] = None, + logits: Optional[th.Tensor] = None, + validate_args: Optional[bool] = None, + masks: Optional[np.ndarray] = None, + ): + self.masks: Optional[th.Tensor] = None + super().__init__(probs, logits, validate_args) + self._original_logits = self.logits + self.apply_masking(masks) + + def apply_masking(self, masks: Optional[np.ndarray]) -> None: + """ + Eliminate ("mask out") chosen categorical outcomes by setting their probability to 0. + + :param masks: An optional boolean ndarray of compatible shape with the distribution. + If True, the corresponding choice's logit value is preserved. If False, it is set + to a large negative value, resulting in near 0 probability. If masks is None, any + previously applied masking is removed, and the original logits are restored. + """ + + if masks is not None: + device = self.logits.device + self.masks = th.as_tensor(masks, dtype=th.bool, device=device).reshape(self.logits.shape) + HUGE_NEG = th.tensor(-1e8, dtype=self.logits.dtype, device=device) + + logits = th.where(self.masks, self._original_logits, HUGE_NEG) + else: + self.masks = None + logits = self._original_logits + + # Reinitialize with updated logits + super().__init__(logits=logits) + + # self.probs may already be cached, so we must force an update + self.probs = logits_to_probs(self.logits) + + def entropy(self) -> th.Tensor: + if self.masks is None: + return super().entropy() + + # Highly negative logits don't result in 0 probs, so we must replace + # with 0s to ensure 0 contribution to the distribution's entropy, since + # masked actions possess no uncertainty. + device = self.logits.device + p_log_p = self.logits * self.probs + p_log_p = th.where(self.masks, p_log_p, th.tensor(0.0, device=device)) + return -p_log_p.sum(-1) + + +class MaskableDistribution(Distribution, ABC): + @abstractmethod + def apply_masking(self, masks: Optional[np.ndarray]) -> None: + """ + Eliminate ("mask out") chosen distribution outcomes by setting their probability to 0. + + :param masks: An optional boolean ndarray of compatible shape with the distribution. + If True, the corresponding choice's logit value is preserved. If False, it is set + to a large negative value, resulting in near 0 probability. If masks is None, any + previously applied masking is removed, and the original logits are restored. + """ + + +class MaskableCategoricalDistribution(MaskableDistribution): + """ + Categorical distribution for discrete actions. Supports invalid action masking. + + :param action_dim: Number of discrete actions + """ + + def __init__(self, action_dim: int): + super().__init__() + self.distribution: Optional[MaskableCategorical] = None + self.action_dim = action_dim + + def proba_distribution_net(self, latent_dim: int) -> nn.Module: + """ + Create the layer that represents the distribution: + it will be the logits of the Categorical distribution. + You can then get probabilities using a softmax. + + :param latent_dim: Dimension of the last layer + of the policy network (before the action layer) + :return: + """ + action_logits = nn.Linear(latent_dim, self.action_dim) + return action_logits + + def proba_distribution(self, action_logits: th.Tensor) -> "MaskableCategoricalDistribution": + # Restructure shape to align with logits + reshaped_logits = action_logits.view(-1, self.action_dim) + self.distribution = MaskableCategorical(logits=reshaped_logits) + return self + + def log_prob(self, actions: th.Tensor) -> th.Tensor: + assert self.distribution is not None, "Must set distribution parameters" + return self.distribution.log_prob(actions) + + def entropy(self) -> th.Tensor: + assert self.distribution is not None, "Must set distribution parameters" + return self.distribution.entropy() + + def sample(self) -> th.Tensor: + assert self.distribution is not None, "Must set distribution parameters" + return self.distribution.sample() + + def mode(self) -> th.Tensor: + assert self.distribution is not None, "Must set distribution parameters" + return th.argmax(self.distribution.probs, dim=1) + + def actions_from_params(self, action_logits: th.Tensor, deterministic: bool = False) -> th.Tensor: + # Update the proba distribution + self.proba_distribution(action_logits) + return self.get_actions(deterministic=deterministic) + + def log_prob_from_params(self, action_logits: th.Tensor) -> Tuple[th.Tensor, th.Tensor]: + actions = self.actions_from_params(action_logits) + log_prob = self.log_prob(actions) + return actions, log_prob + + def apply_masking(self, masks: Optional[np.ndarray]) -> None: + assert self.distribution is not None, "Must set distribution parameters" + self.distribution.apply_masking(masks) + + +class MaskableMultiCategoricalDistribution(MaskableDistribution): + """ + MultiCategorical distribution for multi discrete actions. Supports invalid action masking. + + :param action_dims: List of sizes of discrete action spaces + """ + + def __init__(self, action_dims: List[int]): + super().__init__() + self.distributions: List[MaskableCategorical] = [] + self.action_dims = action_dims + + def proba_distribution_net(self, latent_dim: int) -> nn.Module: + """ + Create the layer that represents the distribution: + it will be the logits (flattened) of the MultiCategorical distribution. + You can then get probabilities using a softmax on each sub-space. + + :param latent_dim: Dimension of the last layer + of the policy network (before the action layer) + :return: + """ + + action_logits = nn.Linear(latent_dim, sum(self.action_dims)) + return action_logits + + def proba_distribution(self, action_logits: th.Tensor) -> "MaskableMultiCategoricalDistribution": + # Restructure shape to align with logits + reshaped_logits = action_logits.view(-1, sum(self.action_dims)) + + self.distributions = [ + MaskableCategorical(logits=split) for split in th.split(reshaped_logits, tuple(self.action_dims), dim=1) + ] + return self + + def log_prob(self, actions: th.Tensor) -> th.Tensor: + assert len(self.distributions) > 0, "Must set distribution parameters" + + # Restructure shape to align with each categorical + actions = actions.view(-1, len(self.action_dims)) + + # Extract each discrete action and compute log prob for their respective distributions + return th.stack( + [dist.log_prob(action) for dist, action in zip(self.distributions, th.unbind(actions, dim=1))], dim=1 + ).sum(dim=1) + + def entropy(self) -> th.Tensor: + assert len(self.distributions) > 0, "Must set distribution parameters" + return th.stack([dist.entropy() for dist in self.distributions], dim=1).sum(dim=1) + + def sample(self) -> th.Tensor: + assert len(self.distributions) > 0, "Must set distribution parameters" + return th.stack([dist.sample() for dist in self.distributions], dim=1) + + def mode(self) -> th.Tensor: + assert len(self.distributions) > 0, "Must set distribution parameters" + return th.stack([th.argmax(dist.probs, dim=1) for dist in self.distributions], dim=1) + + def actions_from_params(self, action_logits: th.Tensor, deterministic: bool = False) -> th.Tensor: + # Update the proba distribution + self.proba_distribution(action_logits) + return self.get_actions(deterministic=deterministic) + + def log_prob_from_params(self, action_logits: th.Tensor) -> Tuple[th.Tensor, th.Tensor]: + actions = self.actions_from_params(action_logits) + log_prob = self.log_prob(actions) + return actions, log_prob + + def apply_masking(self, masks: Optional[np.ndarray]) -> None: + assert len(self.distributions) > 0, "Must set distribution parameters" + + split_masks = [None] * len(self.distributions) + if masks is not None: + masks = th.as_tensor(masks) + + # Restructure shape to align with logits + masks = masks.view(-1, sum(self.action_dims)) + + # Then split columnwise for each discrete action + split_masks = th.split(masks, tuple(self.action_dims), dim=1) + + for distribution, mask in zip(self.distributions, split_masks): + distribution.apply_masking(mask) + + +class MaskableBernoulliDistribution(MaskableMultiCategoricalDistribution): + """ + Bernoulli distribution for multibinary actions. Supports invalid action masking. + + :param action_dim: Number of binary actions + """ + + def __init__(self, action_dim: int): + # Two states per binary action + action_dims = [2] * action_dim + super().__init__(action_dims) + + +def make_masked_proba_distribution(action_space: spaces.Space) -> MaskableDistribution: + """ + Return an instance of Distribution for the correct type of action space + + :param action_space: the input action space + :return: the appropriate Distribution object + """ + + if isinstance(action_space, spaces.Discrete): + return MaskableCategoricalDistribution(action_space.n) + elif isinstance(action_space, spaces.MultiDiscrete): + return MaskableMultiCategoricalDistribution(action_space.nvec) + elif isinstance(action_space, spaces.MultiBinary): + return MaskableBernoulliDistribution(action_space.n) + else: + raise NotImplementedError( + "Error: probability distribution, not implemented for action space" + f"of type {type(action_space)}." + " Must be of type Gym Spaces: Discrete, MultiDiscrete." + ) diff --git a/sb3_contrib/common/maskable/evaluation.py b/sb3_contrib/common/maskable/evaluation.py new file mode 100644 index 0000000..82b8cc3 --- /dev/null +++ b/sb3_contrib/common/maskable/evaluation.py @@ -0,0 +1,148 @@ +import warnings +from typing import Any, Callable, Dict, List, Optional, Tuple, Union + +import gym +import numpy as np +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.vec_env import DummyVecEnv, VecEnv, VecMonitor, is_vecenv_wrapped + +from sb3_contrib.common.maskable.utils import get_action_masks, is_masking_supported +from sb3_contrib.ppo_mask import MaskablePPO + + +def evaluate_policy( # noqa: C901 + model: MaskablePPO, + env: Union[gym.Env, VecEnv], + n_eval_episodes: int = 10, + deterministic: bool = True, + render: bool = False, + callback: Optional[Callable[[Dict[str, Any], Dict[str, Any]], None]] = None, + reward_threshold: Optional[float] = None, + return_episode_rewards: bool = False, + warn: bool = True, + use_masking: bool = True, +) -> Union[Tuple[float, float], Tuple[List[float], List[int]]]: + """ + Runs policy for ``n_eval_episodes`` episodes and returns average reward. + If a vector env is passed in, this divides the episodes to evaluate onto the + different elements of the vector env. This static division of work is done to + remove bias. See https://github.com/DLR-RM/stable-baselines3/issues/402 for more + details and discussion. + + .. note:: + If environment has not been wrapped with ``Monitor`` wrapper, reward and + episode lengths are counted as it appears with ``env.step`` calls. If + the environment contains wrappers that modify rewards or episode lengths + (e.g. reward scaling, early episode reset), these will affect the evaluation + results as well. You can avoid this by wrapping environment with ``Monitor`` + wrapper before anything else. + + :param model: The RL agent you want to evaluate. + :param env: The gym environment. In the case of a ``VecEnv`` + this must contain only one environment. + :param n_eval_episodes: Number of episode to evaluate the agent + :param deterministic: Whether to use deterministic or stochastic actions + :param render: Whether to render the environment or not + :param callback: callback function to do additional checks, + called after each step. Gets locals() and globals() passed as parameters. + :param reward_threshold: Minimum expected reward per episode, + this will raise an error if the performance is not met + :param return_episode_rewards: If True, a list of rewards and episde lengths + per episode will be returned instead of the mean. + :param warn: If True (default), warns user about lack of a Monitor wrapper in the + evaluation environment. + :param use_masking: Whether or not to use invalid action masks during evaluation + :return: Mean reward per episode, std of reward per episode. + Returns ([float], [int]) when ``return_episode_rewards`` is True, first + list containing per-episode rewards and second containing per-episode lengths + (in number of steps). + """ + + if use_masking and not is_masking_supported(env): + raise ValueError("Environment does not support action masking. Consider using ActionMasker wrapper") + + is_monitor_wrapped = False + + if not isinstance(env, VecEnv): + env = DummyVecEnv([lambda: env]) + + is_monitor_wrapped = is_vecenv_wrapped(env, VecMonitor) or env.env_is_wrapped(Monitor)[0] + + if not is_monitor_wrapped and warn: + warnings.warn( + "Evaluation environment is not wrapped with a ``Monitor`` wrapper. " + "This may result in reporting modified episode lengths and rewards, if other wrappers happen to modify these. " + "Consider wrapping environment first with ``Monitor`` wrapper.", + UserWarning, + ) + + n_envs = env.num_envs + episode_rewards = [] + episode_lengths = [] + + episode_counts = np.zeros(n_envs, dtype="int") + # Divides episodes among different sub environments in the vector as evenly as possible + episode_count_targets = np.array([(n_eval_episodes + i) // n_envs for i in range(n_envs)], dtype="int") + + current_rewards = np.zeros(n_envs) + current_lengths = np.zeros(n_envs, dtype="int") + observations = env.reset() + states = None + + while (episode_counts < episode_count_targets).any(): + if use_masking: + action_masks = get_action_masks(env) + actions, state = model.predict( + observations, + state=states, + deterministic=deterministic, + action_masks=action_masks, + ) + else: + actions, states = model.predict(observations, state=states, deterministic=deterministic) + observations, rewards, dones, infos = env.step(actions) + current_rewards += rewards + current_lengths += 1 + for i in range(n_envs): + if episode_counts[i] < episode_count_targets[i]: + + # unpack values so that the callback can access the local variables + reward = rewards[i] + done = dones[i] + info = infos[i] + + if callback is not None: + callback(locals(), globals()) + + if dones[i]: + if is_monitor_wrapped: + # Atari wrapper can send a "done" signal when + # the agent loses a life, but it does not correspond + # to the true end of episode + if "episode" in info.keys(): + # Do not trust "done" with episode endings. + # Monitor wrapper includes "episode" key in info if environment + # has been wrapped with it. Use those rewards instead. + episode_rewards.append(info["episode"]["r"]) + episode_lengths.append(info["episode"]["l"]) + # Only increment at the real end of an episode + episode_counts[i] += 1 + else: + episode_rewards.append(current_rewards[i]) + episode_lengths.append(current_lengths[i]) + episode_counts[i] += 1 + current_rewards[i] = 0 + current_lengths[i] = 0 + if states is not None: + states[i] *= 0 + + if render: + env.render() + + mean_reward = np.mean(episode_rewards) + std_reward = np.std(episode_rewards) + if reward_threshold is not None: + assert mean_reward > reward_threshold, "Mean reward below threshold: " f"{mean_reward:.2f} < {reward_threshold:.2f}" + if return_episode_rewards: + return episode_rewards, episode_lengths + return mean_reward, std_reward diff --git a/sb3_contrib/common/maskable/policies.py b/sb3_contrib/common/maskable/policies.py new file mode 100644 index 0000000..d7c9522 --- /dev/null +++ b/sb3_contrib/common/maskable/policies.py @@ -0,0 +1,402 @@ +from functools import partial +from typing import Any, Dict, List, Optional, Tuple, Type, Union + +import gym +import numpy as np +import torch as th +from stable_baselines3.common.policies import BasePolicy +from stable_baselines3.common.torch_layers import ( + BaseFeaturesExtractor, + CombinedExtractor, + FlattenExtractor, + MlpExtractor, + NatureCNN, +) +from stable_baselines3.common.type_aliases import Schedule +from torch import nn + +from sb3_contrib.common.maskable.distributions import MaskableDistribution, make_masked_proba_distribution + + +class MaskableActorCriticPolicy(BasePolicy): + """ + Policy class for actor-critic algorithms (has both policy and value prediction). + Used by A2C, PPO and the likes. + + :param observation_space: Observation space + :param action_space: Action space + :param lr_schedule: Learning rate schedule (could be constant) + :param net_arch: The specification of the policy and value networks. + :param activation_fn: Activation function + :param ortho_init: Whether to use or not orthogonal initialization + :param features_extractor_class: Features extractor to use. + :param features_extractor_kwargs: Keyword arguments + to pass to the features extractor. + :param normalize_images: Whether to normalize images or not, + dividing by 255.0 (True by default) + :param optimizer_class: The optimizer to use, + ``th.optim.Adam`` by default + :param optimizer_kwargs: Additional keyword arguments, + excluding the learning rate, to pass to the optimizer + """ + + def __init__( + self, + observation_space: gym.spaces.Space, + action_space: gym.spaces.Space, + lr_schedule: Schedule, + net_arch: Optional[List[Union[int, Dict[str, List[int]]]]] = None, + activation_fn: Type[nn.Module] = nn.Tanh, + ortho_init: bool = True, + features_extractor_class: Type[BaseFeaturesExtractor] = FlattenExtractor, + features_extractor_kwargs: Optional[Dict[str, Any]] = None, + normalize_images: bool = True, + optimizer_class: Type[th.optim.Optimizer] = th.optim.Adam, + optimizer_kwargs: Optional[Dict[str, Any]] = None, + ): + + if optimizer_kwargs is None: + optimizer_kwargs = {} + # Small values to avoid NaN in Adam optimizer + if optimizer_class == th.optim.Adam: + optimizer_kwargs["eps"] = 1e-5 + + super().__init__( + observation_space, + action_space, + features_extractor_class, + features_extractor_kwargs, + optimizer_class=optimizer_class, + optimizer_kwargs=optimizer_kwargs, + squash_output=False, + ) + + # Default network architecture, from stable-baselines + if net_arch is None: + if features_extractor_class == NatureCNN: + net_arch = [] + else: + net_arch = [dict(pi=[64, 64], vf=[64, 64])] + + self.net_arch = net_arch + self.activation_fn = activation_fn + self.ortho_init = ortho_init + + self.features_extractor = features_extractor_class(self.observation_space, **self.features_extractor_kwargs) + self.features_dim = self.features_extractor.features_dim + + self.normalize_images = normalize_images + + # Action distribution + self.action_dist = make_masked_proba_distribution(action_space) + + self._build(lr_schedule) + + def forward( + self, + obs: th.Tensor, + deterministic: bool = False, + action_masks: Optional[np.ndarray] = None, + ) -> Tuple[th.Tensor, th.Tensor, th.Tensor]: + """ + Forward pass in all the networks (actor and critic) + + :param obs: Observation + :param deterministic: Whether to sample or use deterministic actions + :param action_masks: Action masks to apply to the action distribution + :return: action, value and log probability of the action + """ + latent_pi, latent_vf = self._get_latent(obs) + # Evaluate the values for the given observations + values = self.value_net(latent_vf) + distribution = self._get_action_dist_from_latent(latent_pi) + if action_masks is not None: + distribution.apply_masking(action_masks) + actions = distribution.get_actions(deterministic=deterministic) + log_prob = distribution.log_prob(actions) + return actions, values, log_prob + + def _get_constructor_parameters(self) -> Dict[str, Any]: + data = super()._get_constructor_parameters() + + data.update( + dict( + net_arch=self.net_arch, + activation_fn=self.activation_fn, + lr_schedule=self._dummy_schedule, # dummy lr schedule, not needed for loading policy alone + ortho_init=self.ortho_init, + optimizer_class=self.optimizer_class, + optimizer_kwargs=self.optimizer_kwargs, + features_extractor_class=self.features_extractor_class, + features_extractor_kwargs=self.features_extractor_kwargs, + ) + ) + return data + + def _build_mlp_extractor(self) -> None: + """ + Create the policy and value networks. + Part of the layers can be shared. + """ + # Note: If net_arch is None and some features extractor is used, + # net_arch here is an empty list and mlp_extractor does not + # really contain any layers (acts like an identity module). + self.mlp_extractor = MlpExtractor( + self.features_dim, + net_arch=self.net_arch, + activation_fn=self.activation_fn, + device=self.device, + ) + + def _build(self, lr_schedule: Schedule) -> None: + """ + Create the networks and the optimizer. + + :param lr_schedule: Learning rate schedule + lr_schedule(1) is the initial learning rate + """ + self._build_mlp_extractor() + + self.action_net = self.action_dist.proba_distribution_net(latent_dim=self.mlp_extractor.latent_dim_pi) + self.value_net = nn.Linear(self.mlp_extractor.latent_dim_vf, 1) + + # Init weights: use orthogonal initialization + # with small initial weight for the output + if self.ortho_init: + # TODO: check for features_extractor + # Values from stable-baselines. + # features_extractor/mlp values are + # originally from openai/baselines (default gains/init_scales). + module_gains = { + self.features_extractor: np.sqrt(2), + self.mlp_extractor: np.sqrt(2), + self.action_net: 0.01, + self.value_net: 1, + } + for module, gain in module_gains.items(): + module.apply(partial(self.init_weights, gain=gain)) + + # Setup optimizer with initial learning rate + self.optimizer = self.optimizer_class(self.parameters(), lr=lr_schedule(1), **self.optimizer_kwargs) + + def _get_latent(self, obs: th.Tensor) -> Tuple[th.Tensor, th.Tensor]: + """ + Get the latent code (i.e., activations of the last layer of each network) + for the different networks. + + :param obs: Observation + :return: Latent codes + for the actor, the value function and for gSDE function + """ + # Preprocess the observation if needed + features = self.extract_features(obs) + latent_pi, latent_vf = self.mlp_extractor(features) + + return latent_pi, latent_vf + + def _get_action_dist_from_latent(self, latent_pi: th.Tensor) -> MaskableDistribution: + """ + Retrieve action distribution given the latent codes. + + :param latent_pi: Latent code for the actor + :return: Action distribution + """ + action_logits = self.action_net(latent_pi) + return self.action_dist.proba_distribution(action_logits=action_logits) + + def _predict( + self, + observation: th.Tensor, + deterministic: bool = False, + action_masks: Optional[np.ndarray] = None, + ) -> th.Tensor: + """ + Get the action according to the policy for a given observation. + + :param observation: + :param deterministic: Whether to use stochastic or deterministic actions + :param action_masks: Action masks to apply to the action distribution + :return: Taken action according to the policy + """ + latent_pi, _ = self._get_latent(observation) + distribution = self._get_action_dist_from_latent(latent_pi) + if action_masks is not None: + distribution.apply_masking(action_masks) + return distribution.get_actions(deterministic=deterministic) + + def predict( + self, + observation: Union[np.ndarray, Dict[str, np.ndarray]], + state: Optional[np.ndarray] = None, + mask: Optional[np.ndarray] = None, + deterministic: bool = False, + action_masks: Optional[np.ndarray] = None, + ) -> Tuple[np.ndarray, Optional[np.ndarray]]: + """ + Get the policy action and state from an observation (and optional state). + Includes sugar-coating to handle different observations (e.g. normalizing images). + + :param observation: the input observation + :param state: The last states (can be None, used in recurrent policies) + :param mask: The last masks (can be None, used in recurrent policies) + :param deterministic: Whether or not to return deterministic actions. + :param action_masks: Action masks to apply to the action distribution + :return: the model's action and the next state + (used in recurrent policies) + """ + # TODO (GH/1): add support for RNN policies + # if state is None: + # state = self.initial_state + # if mask is None: + # mask = [False for _ in range(self.n_envs)] + + # Switch to eval mode (this affects batch norm / dropout) + self.set_training_mode(False) + + observation, vectorized_env = self.obs_to_tensor(observation) + + with th.no_grad(): + actions = self._predict(observation, deterministic=deterministic, action_masks=action_masks) + # Convert to numpy + actions = actions.cpu().numpy() + + if isinstance(self.action_space, gym.spaces.Box): + if self.squash_output: + # Rescale to proper domain when using squashing + actions = self.unscale_action(actions) + else: + # Actions could be on arbitrary scale, so clip the actions to avoid + # out of bound error (e.g. if sampling from a Gaussian distribution) + actions = np.clip(actions, self.action_space.low, self.action_space.high) + + if not vectorized_env: + if state is not None: + raise ValueError("Error: The environment must be vectorized when using recurrent policies.") + actions = actions[0] + + return actions, state + + def evaluate_actions( + self, + obs: th.Tensor, + actions: th.Tensor, + action_masks: Optional[np.ndarray] = None, + ) -> Tuple[th.Tensor, th.Tensor, th.Tensor]: + """ + Evaluate actions according to the current policy, + given the observations. + + :param obs: + :param actions: + :return: estimated value, log likelihood of taking those actions + and entropy of the action distribution. + """ + latent_pi, latent_vf = self._get_latent(obs) + distribution = self._get_action_dist_from_latent(latent_pi) + if action_masks is not None: + distribution.apply_masking(action_masks) + log_prob = distribution.log_prob(actions) + values = self.value_net(latent_vf) + return values, log_prob, distribution.entropy() + + +class MaskableActorCriticCnnPolicy(MaskableActorCriticPolicy): + """ + CNN policy class for actor-critic algorithms (has both policy and value prediction). + Used by A2C, PPO and the likes. + + :param observation_space: Observation space + :param action_space: Action space + :param lr_schedule: Learning rate schedule (could be constant) + :param net_arch: The specification of the policy and value networks. + :param activation_fn: Activation function + :param ortho_init: Whether to use or not orthogonal initialization + :param features_extractor_class: Features extractor to use. + :param features_extractor_kwargs: Keyword arguments + to pass to the features extractor. + :param normalize_images: Whether to normalize images or not, + dividing by 255.0 (True by default) + :param optimizer_class: The optimizer to use, + ``th.optim.Adam`` by default + :param optimizer_kwargs: Additional keyword arguments, + excluding the learning rate, to pass to the optimizer + """ + + def __init__( + self, + observation_space: gym.spaces.Space, + action_space: gym.spaces.Space, + lr_schedule: Schedule, + net_arch: Optional[List[Union[int, Dict[str, List[int]]]]] = None, + activation_fn: Type[nn.Module] = nn.Tanh, + ortho_init: bool = True, + features_extractor_class: Type[BaseFeaturesExtractor] = NatureCNN, + features_extractor_kwargs: Optional[Dict[str, Any]] = None, + normalize_images: bool = True, + optimizer_class: Type[th.optim.Optimizer] = th.optim.Adam, + optimizer_kwargs: Optional[Dict[str, Any]] = None, + ): + super(MaskableActorCriticCnnPolicy, self).__init__( + observation_space, + action_space, + lr_schedule, + net_arch, + activation_fn, + ortho_init, + features_extractor_class, + features_extractor_kwargs, + normalize_images, + optimizer_class, + optimizer_kwargs, + ) + + +class MaskableMultiInputActorCriticPolicy(MaskableActorCriticPolicy): + """ + MultiInputActorClass policy class for actor-critic algorithms (has both policy and value prediction). + Used by A2C, PPO and the likes. + + :param observation_space: Observation space (Tuple) + :param action_space: Action space + :param lr_schedule: Learning rate schedule (could be constant) + :param net_arch: The specification of the policy and value networks. + :param activation_fn: Activation function + :param ortho_init: Whether to use or not orthogonal initialization + :param features_extractor_class: Uses the CombinedExtractor + :param features_extractor_kwargs: Keyword arguments + to pass to the feature extractor. + :param normalize_images: Whether to normalize images or not, + dividing by 255.0 (True by default) + :param optimizer_class: The optimizer to use, + ``th.optim.Adam`` by default + :param optimizer_kwargs: Additional keyword arguments, + excluding the learning rate, to pass to the optimizer + """ + + def __init__( + self, + observation_space: gym.spaces.Dict, + action_space: gym.spaces.Space, + lr_schedule: Schedule, + net_arch: Optional[List[Union[int, Dict[str, List[int]]]]] = None, + activation_fn: Type[nn.Module] = nn.Tanh, + ortho_init: bool = True, + features_extractor_class: Type[BaseFeaturesExtractor] = CombinedExtractor, + features_extractor_kwargs: Optional[Dict[str, Any]] = None, + normalize_images: bool = True, + optimizer_class: Type[th.optim.Optimizer] = th.optim.Adam, + optimizer_kwargs: Optional[Dict[str, Any]] = None, + ): + super(MaskableMultiInputActorCriticPolicy, self).__init__( + observation_space, + action_space, + lr_schedule, + net_arch, + activation_fn, + ortho_init, + features_extractor_class, + features_extractor_kwargs, + normalize_images, + optimizer_class, + optimizer_kwargs, + ) diff --git a/sb3_contrib/common/maskable/utils.py b/sb3_contrib/common/maskable/utils.py new file mode 100644 index 0000000..b4f0990 --- /dev/null +++ b/sb3_contrib/common/maskable/utils.py @@ -0,0 +1,38 @@ +import numpy as np +from stable_baselines3.common.type_aliases import GymEnv +from stable_baselines3.common.vec_env import VecEnv + +EXPECTED_METHOD_NAME = "action_masks" + + +def get_action_masks(env: GymEnv) -> np.ndarray: + """ + Checks whether gym env exposes a method returning invalid action masks + + :param env: the Gym environment to get masks from + :return: A numpy array of the masks + """ + + if isinstance(env, VecEnv): + return np.stack(env.env_method(EXPECTED_METHOD_NAME)) + else: + return getattr(env, EXPECTED_METHOD_NAME)() + + +def is_masking_supported(env: GymEnv) -> bool: + """ + Checks whether gym env exposes a method returning invalid action masks + + :param env: the Gym environment to check + :return: True if the method is found, False otherwise + """ + + if isinstance(env, VecEnv): + try: + # TODO: add VecEnv.has_attr() + env.get_attr(EXPECTED_METHOD_NAME) + return True + except AttributeError: + return False + else: + return hasattr(env, EXPECTED_METHOD_NAME) diff --git a/sb3_contrib/common/wrappers/__init__.py b/sb3_contrib/common/wrappers/__init__.py index 5e59c76..8b591b4 100644 --- a/sb3_contrib/common/wrappers/__init__.py +++ b/sb3_contrib/common/wrappers/__init__.py @@ -1 +1,2 @@ +from sb3_contrib.common.wrappers.action_masker import ActionMasker from sb3_contrib.common.wrappers.time_feature import TimeFeatureWrapper diff --git a/sb3_contrib/common/wrappers/action_masker.py b/sb3_contrib/common/wrappers/action_masker.py new file mode 100644 index 0000000..5850f2c --- /dev/null +++ b/sb3_contrib/common/wrappers/action_masker.py @@ -0,0 +1,32 @@ +from typing import Callable, Union + +import gym +import numpy as np + + +class ActionMasker(gym.Wrapper): + """ + Env wrapper providing the method required to support masking. + + Exposes a method called action_masks(), which returns masks for the wrapped env. + This wrapper is not needed if the env exposes the expected method itself. + + :param env: the Gym environment to wrap + :param action_mask_fn: A function that takes a Gym environment and returns an action mask, + or the name of such a method provided by the environment. + """ + + def __init__(self, env: gym.Env, action_mask_fn: Union[str, Callable[[gym.Env], np.ndarray]]): + super().__init__(env) + + if isinstance(action_mask_fn, str): + found_method = getattr(self.env, action_mask_fn) + if not callable(found_method): + raise ValueError(f"Environment attribute {action_mask_fn} is not a method") + + self._action_mask_fn = found_method + else: + self._action_mask_fn = action_mask_fn + + def action_masks(self) -> np.ndarray: + return self._action_mask_fn(self.env) diff --git a/sb3_contrib/ppo_mask/__init__.py b/sb3_contrib/ppo_mask/__init__.py new file mode 100644 index 0000000..014cd93 --- /dev/null +++ b/sb3_contrib/ppo_mask/__init__.py @@ -0,0 +1,2 @@ +from sb3_contrib.ppo_mask.policies import CnnPolicy, MlpPolicy # , MultiInputPolicy +from sb3_contrib.ppo_mask.ppo_mask import MaskablePPO diff --git a/sb3_contrib/ppo_mask/policies.py b/sb3_contrib/ppo_mask/policies.py new file mode 100644 index 0000000..9164363 --- /dev/null +++ b/sb3_contrib/ppo_mask/policies.py @@ -0,0 +1,15 @@ +from stable_baselines3.common.policies import register_policy + +from sb3_contrib.common.maskable.policies import ( # MaskableMultiInputActorCriticPolicy, + MaskableActorCriticCnnPolicy, + MaskableActorCriticPolicy, +) + +MlpPolicy = MaskableActorCriticPolicy +CnnPolicy = MaskableActorCriticCnnPolicy +# MultiInputPolicy = MaskableMultiInputActorCriticPolicy + +register_policy("MlpPolicy", MaskableActorCriticPolicy) +register_policy("CnnPolicy", MaskableActorCriticCnnPolicy) +# Currently not supported +# register_policy("MultiInputPolicy", MaskableMultiInputActorCriticPolicy) diff --git a/sb3_contrib/ppo_mask/ppo_mask.py b/sb3_contrib/ppo_mask/ppo_mask.py new file mode 100644 index 0000000..be9fb12 --- /dev/null +++ b/sb3_contrib/ppo_mask/ppo_mask.py @@ -0,0 +1,551 @@ +import time +from collections import deque +from typing import Any, Dict, Optional, Tuple, Type, Union + +import numpy as np +import torch as th +from gym import spaces +from stable_baselines3.common import utils +from stable_baselines3.common.buffers import RolloutBuffer +from stable_baselines3.common.callbacks import BaseCallback, CallbackList, ConvertCallback +from stable_baselines3.common.on_policy_algorithm import OnPolicyAlgorithm +from stable_baselines3.common.type_aliases import GymEnv, MaybeCallback, Schedule +from stable_baselines3.common.utils import explained_variance, get_schedule_fn, obs_as_tensor, safe_mean +from stable_baselines3.common.vec_env import VecEnv +from torch.nn import functional as F + +from sb3_contrib.common.maskable.buffers import MaskableRolloutBuffer +from sb3_contrib.common.maskable.policies import MaskableActorCriticPolicy +from sb3_contrib.common.maskable.utils import get_action_masks, is_masking_supported + + +class MaskablePPO(OnPolicyAlgorithm): + """ + Proximal Policy Optimization algorithm (PPO) (clip version) with Invalid Action Masking. + + Based on the original Stable Baselines 3 implementation. + + Introduction to PPO: https://spinningup.openai.com/en/latest/algorithms/ppo.html + Background on Invalid Action Masking: https://arxiv.org/abs/2006.14171 + + :param policy: The policy model to use (MlpPolicy, CnnPolicy, ...) + :param env: The environment to learn from (if registered in Gym, can be str) + :param learning_rate: The learning rate, it can be a function + of the current progress remaining (from 1 to 0) + :param n_steps: The number of steps to run for each environment per update + (i.e. batch size is n_steps * n_env where n_env is number of environment copies running in parallel) + :param batch_size: Minibatch size + :param n_epochs: Number of epoch when optimizing the surrogate loss + :param gamma: Discount factor + :param gae_lambda: Factor for trade-off of bias vs variance for Generalized Advantage Estimator + :param clip_range: Clipping parameter, it can be a function of the current progress + remaining (from 1 to 0). + :param clip_range_vf: Clipping parameter for the value function, + it can be a function of the current progress remaining (from 1 to 0). + This is a parameter specific to the OpenAI implementation. If None is passed (default), + no clipping will be done on the value function. + IMPORTANT: this clipping depends on the reward scaling. + :param ent_coef: Entropy coefficient for the loss calculation + :param vf_coef: Value function coefficient for the loss calculation + :param max_grad_norm: The maximum value for the gradient clipping + :param target_kl: Limit the KL divergence between updates, + because the clipping is not enough to prevent large update + see issue #213 (cf https://github.com/hill-a/stable-baselines/issues/213) + By default, there is no limit on the kl div. + :param tensorboard_log: the log location for tensorboard (if None, no logging) + :param create_eval_env: Whether to create a second environment that will be + used for evaluating the agent periodically. (Only available when passing string for the environment) + :param policy_kwargs: additional arguments to be passed to the policy on creation + :param verbose: the verbosity level: 0 no output, 1 info, 2 debug + :param seed: Seed for the pseudo random generators + :param device: Device (cpu, cuda, ...) on which the code should be run. + Setting it to auto, the code will be run on the GPU if possible. + :param _init_setup_model: Whether or not to build the network at the creation of the instance + """ + + def __init__( + self, + policy: Union[str, Type[MaskableActorCriticPolicy]], + env: Union[GymEnv, str], + learning_rate: Union[float, Schedule] = 3e-4, + n_steps: int = 2048, + batch_size: Optional[int] = 64, + n_epochs: int = 10, + gamma: float = 0.99, + gae_lambda: float = 0.95, + clip_range: Union[float, Schedule] = 0.2, + clip_range_vf: Union[None, float, Schedule] = None, + ent_coef: float = 0.0, + vf_coef: float = 0.5, + max_grad_norm: float = 0.5, + target_kl: Optional[float] = None, + tensorboard_log: Optional[str] = None, + create_eval_env: bool = False, + policy_kwargs: Optional[Dict[str, Any]] = None, + verbose: int = 0, + seed: Optional[int] = None, + device: Union[th.device, str] = "auto", + _init_setup_model: bool = True, + ): + super().__init__( + policy, + env, + learning_rate=learning_rate, + n_steps=n_steps, + gamma=gamma, + gae_lambda=gae_lambda, + ent_coef=ent_coef, + vf_coef=vf_coef, + max_grad_norm=max_grad_norm, + use_sde=False, + sde_sample_freq=-1, + tensorboard_log=tensorboard_log, + create_eval_env=create_eval_env, + policy_kwargs=policy_kwargs, + policy_base=MaskableActorCriticPolicy, + verbose=verbose, + seed=seed, + device=device, + _init_setup_model=False, + supported_action_spaces=( + spaces.Discrete, + spaces.MultiDiscrete, + spaces.MultiBinary, + ), + ) + + self.batch_size = batch_size + self.n_epochs = n_epochs + self.clip_range = clip_range + self.clip_range_vf = clip_range_vf + self.target_kl = target_kl + + if _init_setup_model: + self._setup_model() + + def _setup_model(self) -> None: + self._setup_lr_schedule() + self.set_random_seed(self.seed) + + self.policy = self.policy_class( + self.observation_space, + self.action_space, + self.lr_schedule, + **self.policy_kwargs, # pytype:disable=not-instantiable + ) + self.policy = self.policy.to(self.device) + + if not isinstance(self.policy, MaskableActorCriticPolicy): + raise ValueError("Policy must subclass MaskableActorCriticPolicy") + + self.rollout_buffer = MaskableRolloutBuffer( + self.n_steps, + self.observation_space, + self.action_space, + self.device, + gamma=self.gamma, + gae_lambda=self.gae_lambda, + n_envs=self.n_envs, + ) + + # Initialize schedules for policy/value clipping + self.clip_range = get_schedule_fn(self.clip_range) + if self.clip_range_vf is not None: + if isinstance(self.clip_range_vf, (float, int)): + assert self.clip_range_vf > 0, "`clip_range_vf` must be positive, " "pass `None` to deactivate vf clipping" + + self.clip_range_vf = get_schedule_fn(self.clip_range_vf) + + def _init_callback( + self, + callback: MaybeCallback, + eval_env: Optional[VecEnv] = None, + eval_freq: int = 10000, + n_eval_episodes: int = 5, + log_path: Optional[str] = None, + use_masking: bool = True, + ) -> BaseCallback: + """ + :param callback: Callback(s) called at every step with state of the algorithm. + :param eval_freq: How many steps between evaluations; if None, do not evaluate. + :param n_eval_episodes: How many episodes to play per evaluation + :param n_eval_episodes: Number of episodes to rollout during evaluation. + :param log_path: Path to a folder where the evaluations will be saved + :param use_masking: Whether or not to use invalid action masks during evaluation + :return: A hybrid callback calling `callback` and performing evaluation. + """ + # Convert a list of callbacks into a callback + if isinstance(callback, list): + callback = CallbackList(callback) + + # Convert functional callback to object + if not isinstance(callback, BaseCallback): + callback = ConvertCallback(callback) + + # Create eval callback in charge of the evaluation + if eval_env is not None: + # Avoid circular import error + from sb3_contrib.common.maskable.callbacks import MaskableEvalCallback + + eval_callback = MaskableEvalCallback( + eval_env, + best_model_save_path=log_path, + log_path=log_path, + eval_freq=eval_freq, + n_eval_episodes=n_eval_episodes, + use_masking=use_masking, + ) + callback = CallbackList([callback, eval_callback]) + + callback.init_callback(self) + return callback + + def _setup_learn( + self, + total_timesteps: int, + eval_env: Optional[GymEnv], + callback: MaybeCallback = None, + eval_freq: int = 10000, + n_eval_episodes: int = 5, + log_path: Optional[str] = None, + reset_num_timesteps: bool = True, + tb_log_name: str = "run", + use_masking: bool = True, + ) -> Tuple[int, BaseCallback]: + """ + Initialize different variables needed for training. + + :param total_timesteps: The total number of samples (env steps) to train on + :param eval_env: Environment to use for evaluation. + :param callback: Callback(s) called at every step with state of the algorithm. + :param eval_freq: How many steps between evaluations + :param n_eval_episodes: How many episodes to play per evaluation + :param log_path: Path to a folder where the evaluations will be saved + :param reset_num_timesteps: Whether to reset or not the ``num_timesteps`` attribute + :param tb_log_name: the name of the run for tensorboard log + :param use_masking: Whether or not to use invalid action masks during training + :return: + """ + + self.start_time = time.time() + if self.ep_info_buffer is None or reset_num_timesteps: + # Initialize buffers if they don't exist, or reinitialize if resetting counters + self.ep_info_buffer = deque(maxlen=100) + self.ep_success_buffer = deque(maxlen=100) + + if reset_num_timesteps: + self.num_timesteps = 0 + self._episode_num = 0 + else: + # Make sure training timesteps are ahead of the internal counter + total_timesteps += self.num_timesteps + self._total_timesteps = total_timesteps + + # Avoid resetting the environment when calling ``.learn()`` consecutive times + if reset_num_timesteps or self._last_obs is None: + self._last_obs = self.env.reset() + self._last_episode_starts = np.ones((self.env.num_envs,), dtype=bool) + # Retrieve unnormalized observation for saving into the buffer + if self._vec_normalize_env is not None: + self._last_original_obs = self._vec_normalize_env.get_original_obs() + + if eval_env is not None and self.seed is not None: + eval_env.seed(self.seed) + + eval_env = self._get_eval_env(eval_env) + + # Configure logger's outputs if no logger was passed + if not self._custom_logger: + self._logger = utils.configure_logger(self.verbose, self.tensorboard_log, tb_log_name, reset_num_timesteps) + + # Create eval callback if needed + callback = self._init_callback(callback, eval_env, eval_freq, n_eval_episodes, log_path, use_masking) + + return total_timesteps, callback + + def collect_rollouts( + self, + env: VecEnv, + callback: BaseCallback, + rollout_buffer: RolloutBuffer, + n_rollout_steps: int, + use_masking: bool = True, + ) -> bool: + """ + Collect experiences using the current policy and fill a ``RolloutBuffer``. + The term rollout here refers to the model-free notion and should not + be used with the concept of rollout used in model-based RL or planning. + + This method is largely identical to the implementation found in the parent class. + + :param env: The training environment + :param callback: Callback that will be called at each step + (and at the beginning and end of the rollout) + :param rollout_buffer: Buffer to fill with rollouts + :param n_steps: Number of experiences to collect per environment + :param use_masking: Whether or not to use invalid action masks during training + :return: True if function returned with at least `n_rollout_steps` + collected, False if callback terminated rollout prematurely. + """ + + assert isinstance(rollout_buffer, MaskableRolloutBuffer), "RolloutBuffer doesn't support action masking" + assert self._last_obs is not None, "No previous observation was provided" + # Switch to eval mode (this affects batch norm / dropout) + self.policy.set_training_mode(False) + n_steps = 0 + action_masks = None + rollout_buffer.reset() + + if use_masking and not is_masking_supported(env): + raise ValueError("Environment does not support action masking. Consider using ActionMasker wrapper") + + callback.on_rollout_start() + + while n_steps < n_rollout_steps: + with th.no_grad(): + # Convert to pytorch tensor or to TensorDict + obs_tensor = obs_as_tensor(self._last_obs, self.device) + + # This is the only change related to invalid action masking + if use_masking: + action_masks = get_action_masks(env) + + actions, values, log_probs = self.policy.forward(obs_tensor, action_masks=action_masks) + + actions = actions.cpu().numpy() + new_obs, rewards, dones, infos = env.step(actions) + + self.num_timesteps += env.num_envs + + # Give access to local variables + callback.update_locals(locals()) + if callback.on_step() is False: + return False + + self._update_info_buffer(infos) + n_steps += 1 + + if isinstance(self.action_space, spaces.Discrete): + # Reshape in case of discrete action + actions = actions.reshape(-1, 1) + + rollout_buffer.add( + self._last_obs, + actions, + rewards, + self._last_episode_starts, + values, + log_probs, + action_masks=action_masks, + ) + self._last_obs = new_obs + self._last_episode_starts = dones + + with th.no_grad(): + # Compute value for the last timestep + obs_tensor = obs_as_tensor(new_obs, self.device) + + # Masking is not needed here, the choice of action doesn't matter. + # We only want the value of the current observation. + _, values, _ = self.policy.forward(obs_tensor) + + rollout_buffer.compute_returns_and_advantage(last_values=values, dones=dones) + + callback.on_rollout_end() + + return True + + def predict( + self, + observation: np.ndarray, + state: Optional[np.ndarray] = None, + mask: Optional[np.ndarray] = None, + deterministic: bool = False, + action_masks: Optional[np.ndarray] = None, + ) -> Tuple[np.ndarray, Optional[np.ndarray]]: + """ + Get the model's action(s) from an observation. + + :param observation: the input observation + :param state: The last states (can be None, used in recurrent policies) + :param mask: The last masks (can be None, used in recurrent policies) + :param deterministic: Whether or not to return deterministic actions. + :param action_masks: Action masks to apply to the action distribution. + :return: the model's action and the next state (used in recurrent policies) + """ + return self.policy.predict(observation, state, mask, deterministic, action_masks=action_masks) + + def train(self) -> None: + """ + Update policy using the currently gathered rollout buffer. + """ + # Switch to train mode (this affects batch norm / dropout) + self.policy.set_training_mode(True) + # Update optimizer learning rate + self._update_learning_rate(self.policy.optimizer) + # Compute current clip range + clip_range = self.clip_range(self._current_progress_remaining) + # Optional: clip range for the value function + if self.clip_range_vf is not None: + clip_range_vf = self.clip_range_vf(self._current_progress_remaining) + + entropy_losses = [] + pg_losses, value_losses = [], [] + clip_fractions = [] + + continue_training = True + + # train for n_epochs epochs + for epoch in range(self.n_epochs): + approx_kl_divs = [] + # Do a complete pass on the rollout buffer + for rollout_data in self.rollout_buffer.get(self.batch_size): + actions = rollout_data.actions + if isinstance(self.action_space, spaces.Discrete): + # Convert discrete action from float to long + actions = rollout_data.actions.long().flatten() + + values, log_prob, entropy = self.policy.evaluate_actions( + rollout_data.observations, + actions, + action_masks=rollout_data.action_masks, + ) + + values = values.flatten() + # Normalize advantage + advantages = rollout_data.advantages + advantages = (advantages - advantages.mean()) / (advantages.std() + 1e-8) + + # ratio between old and new policy, should be one at the first iteration + ratio = th.exp(log_prob - rollout_data.old_log_prob) + + # clipped surrogate loss + policy_loss_1 = advantages * ratio + policy_loss_2 = advantages * th.clamp(ratio, 1 - clip_range, 1 + clip_range) + policy_loss = -th.min(policy_loss_1, policy_loss_2).mean() + + # Logging + pg_losses.append(policy_loss.item()) + clip_fraction = th.mean((th.abs(ratio - 1) > clip_range).float()).item() + clip_fractions.append(clip_fraction) + + if self.clip_range_vf is None: + # No clipping + values_pred = values + else: + # Clip the different between old and new value + # NOTE: this depends on the reward scaling + values_pred = rollout_data.old_values + th.clamp( + values - rollout_data.old_values, -clip_range_vf, clip_range_vf + ) + # Value loss using the TD(gae_lambda) target + value_loss = F.mse_loss(rollout_data.returns, values_pred) + value_losses.append(value_loss.item()) + + # Entropy loss favor exploration + if entropy is None: + # Approximate entropy when no analytical form + entropy_loss = -th.mean(-log_prob) + else: + entropy_loss = -th.mean(entropy) + + entropy_losses.append(entropy_loss.item()) + + loss = policy_loss + self.ent_coef * entropy_loss + self.vf_coef * value_loss + + # Calculate approximate form of reverse KL Divergence for early stopping + # see issue #417: https://github.com/DLR-RM/stable-baselines3/issues/417 + # and discussion in PR #419: https://github.com/DLR-RM/stable-baselines3/pull/419 + # and Schulman blog: http://joschu.net/blog/kl-approx.html + with th.no_grad(): + log_ratio = log_prob - rollout_data.old_log_prob + approx_kl_div = th.mean((th.exp(log_ratio) - 1) - log_ratio).cpu().numpy() + approx_kl_divs.append(approx_kl_div) + + if self.target_kl is not None and approx_kl_div > 1.5 * self.target_kl: + continue_training = False + if self.verbose >= 1: + print(f"Early stopping at step {epoch} due to reaching max kl: {approx_kl_div:.2f}") + break + + # Optimization step + self.policy.optimizer.zero_grad() + loss.backward() + # Clip grad norm + th.nn.utils.clip_grad_norm_(self.policy.parameters(), self.max_grad_norm) + self.policy.optimizer.step() + + if not continue_training: + break + + self._n_updates += self.n_epochs + explained_var = explained_variance(self.rollout_buffer.values.flatten(), self.rollout_buffer.returns.flatten()) + + # Logs + self.logger.record("train/entropy_loss", np.mean(entropy_losses)) + self.logger.record("train/policy_gradient_loss", np.mean(pg_losses)) + self.logger.record("train/value_loss", np.mean(value_losses)) + self.logger.record("train/approx_kl", np.mean(approx_kl_divs)) + self.logger.record("train/clip_fraction", np.mean(clip_fractions)) + self.logger.record("train/loss", loss.item()) + self.logger.record("train/explained_variance", explained_var) + self.logger.record("train/n_updates", self._n_updates, exclude="tensorboard") + self.logger.record("train/clip_range", clip_range) + if self.clip_range_vf is not None: + self.logger.record("train/clip_range_vf", clip_range_vf) + + def learn( + self, + total_timesteps: int, + callback: MaybeCallback = None, + log_interval: int = 1, + eval_env: Optional[GymEnv] = None, + eval_freq: int = -1, + n_eval_episodes: int = 5, + tb_log_name: str = "PPO", + eval_log_path: Optional[str] = None, + reset_num_timesteps: bool = True, + use_masking: bool = True, + ) -> "MaskablePPO": + iteration = 0 + + total_timesteps, callback = self._setup_learn( + total_timesteps, + eval_env, + callback, + eval_freq, + n_eval_episodes, + eval_log_path, + reset_num_timesteps, + tb_log_name, + use_masking, + ) + + callback.on_training_start(locals(), globals()) + + while self.num_timesteps < total_timesteps: + continue_training = self.collect_rollouts(self.env, callback, self.rollout_buffer, self.n_steps, use_masking) + + if continue_training is False: + break + + iteration += 1 + self._update_current_progress_remaining(self.num_timesteps, total_timesteps) + + # Display training infos + if log_interval is not None and iteration % log_interval == 0: + fps = int(self.num_timesteps / (time.time() - self.start_time)) + self.logger.record("time/iterations", iteration, exclude="tensorboard") + if len(self.ep_info_buffer) > 0 and len(self.ep_info_buffer[0]) > 0: + self.logger.record("rollout/ep_rew_mean", safe_mean([ep_info["r"] for ep_info in self.ep_info_buffer])) + self.logger.record("rollout/ep_len_mean", safe_mean([ep_info["l"] for ep_info in self.ep_info_buffer])) + self.logger.record("time/fps", fps) + self.logger.record("time/time_elapsed", int(time.time() - self.start_time), exclude="tensorboard") + self.logger.record("time/total_timesteps", self.num_timesteps, exclude="tensorboard") + self.logger.dump(step=self.num_timesteps) + + self.train() + + callback.on_training_end() + + return self diff --git a/sb3_contrib/version.txt b/sb3_contrib/version.txt index 26aaba0..348e216 100644 --- a/sb3_contrib/version.txt +++ b/sb3_contrib/version.txt @@ -1 +1 @@ -1.2.0 +1.2.1a0 diff --git a/setup.cfg b/setup.cfg index 3ddbd03..cf162f7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,9 +22,12 @@ ignore = W503,W504,E203,E231 # line breaks before and after binary operators # Ignore import not used when aliases are defined per-file-ignores = ./sb3_contrib/__init__.py:F401 + ./sb3_contrib/ppo_mask/__init__.py:F401 ./sb3_contrib/qrdqn/__init__.py:F401 ./sb3_contrib/tqc/__init__.py:F401 + ./sb3_contrib/common/vec_env/wrappers/__init__.py:F401 ./sb3_contrib/common/wrappers/__init__.py:F401 + ./sb3_contrib/common/envs/__init__.py:F401 exclude = # No need to traverse our git directory .git, diff --git a/tests/test_distributions.py b/tests/test_distributions.py new file mode 100644 index 0000000..a54a9a5 --- /dev/null +++ b/tests/test_distributions.py @@ -0,0 +1,316 @@ +import numpy as np +import pytest +import torch as th + +from sb3_contrib.common.maskable.distributions import ( + MaskableBernoulliDistribution, + MaskableCategorical, + MaskableCategoricalDistribution, + MaskableMultiCategoricalDistribution, +) + + +class TestMaskableCategorical: + def test_applying_mask(self): + """ + Show that probs change as a result of masking + """ + + starting_probs = th.Tensor([[0.2, 0.2, 0.6], [1, 0, 0]]) + expected_probs = th.Tensor([[0, 0.25, 0.75], [0, 0.5, 0.5]]) + mask = np.array([[False, True, True], [False, True, True]]) + + distribution = MaskableCategorical(probs=starting_probs) + distribution.apply_masking(mask) + assert th.allclose(distribution.probs, expected_probs) + + def test_modifying_mask(self): + """ + Show that masks apply independently of each other + """ + + starting_probs = th.Tensor([[0.2, 0.2, 0.6], [1, 0, 0]]) + expected_probs = th.Tensor([[0.5, 0.5, 0], [0, 1, 0]]) + first_mask = np.array([[False, True, True], [False, True, True]]) + second_mask = np.array([[True, True, False], [False, True, False]]) + + # pytorch converts probs to logits in a way that loses some precision and makes + # 0 probability outcomes slightly non-zero. + atol = 2e-07 + distribution = MaskableCategorical(probs=starting_probs) + assert th.allclose(distribution.probs, starting_probs, atol=atol) + + target_distribution = MaskableCategorical(probs=expected_probs) + + distribution.apply_masking(first_mask) + distribution.apply_masking(second_mask) + + assert th.allclose(distribution.probs, target_distribution.probs, atol=atol) + + def test_removing_mask(self): + """ + Show that masking may be unapplied to recover original probs + """ + + starting_probs = th.Tensor([[0.2, 0.2, 0.6], [1, 0, 0]]) + mask = np.array([[False, True, True], [False, True, True]]) + + distribution = MaskableCategorical(probs=starting_probs) + target_distribution = MaskableCategorical(probs=starting_probs) + distribution.apply_masking(mask) + distribution.apply_masking(None) + assert th.allclose(distribution.probs, target_distribution.probs) + + def test_masking_affects_entropy(self): + # All outcomes equally likely + NUM_DIMS = 3 + logits = th.Tensor([[0] * NUM_DIMS]) + dist = MaskableCategorical(logits=logits) + + # For each possible number of valid actions v, show that e^entropy == v + for v in range(1, NUM_DIMS + 1): + masks = [j < v for j in range(NUM_DIMS)] + dist.apply_masking(masks) + assert int(dist.entropy().exp()) == v + + +class TestMaskableCategoricalDistribution: + def test_distribution_must_be_initialized(self): + """ + Cannot use distribution before it has logits + """ + + DIMS = 2 + dist = MaskableCategoricalDistribution(DIMS) + with pytest.raises(AssertionError): + dist.log_prob(th.randint(DIMS - 1, (1, 3))) + + with pytest.raises(AssertionError): + dist.entropy() + + with pytest.raises(AssertionError): + dist.sample() + + with pytest.raises(AssertionError): + dist.mode() + + with pytest.raises(AssertionError): + dist.apply_masking(None) + + # But now we can + dist.proba_distribution(th.randn(1, DIMS)) + dist.log_prob(th.randint(DIMS - 1, (3, 1))) + dist.entropy() + dist.sample() + dist.mode() + dist.apply_masking(None) + + def test_logits_must_align_with_dims(self): + NUM_DIMS = 3 + dist = MaskableCategoricalDistribution(NUM_DIMS) + + # There should be one logit per dim, we're one short + logits = th.randn(1, NUM_DIMS - 1) + with pytest.raises(RuntimeError): + dist.proba_distribution(logits) + + # That's better + logits = th.randn(1, NUM_DIMS) + dist.proba_distribution(logits) + + # Other numbers of dimensions are acceptable as long as they can be realigned + logits = th.randn(NUM_DIMS) + dist.proba_distribution(logits) + logits = th.randn(3, NUM_DIMS, 3) + dist.proba_distribution(logits) + + def test_dim_masking(self): + NUM_DIMS = 2 + dist = MaskableCategoricalDistribution(NUM_DIMS) + + logits = th.Tensor([[0] * NUM_DIMS]) + dist.proba_distribution(logits) + + assert (dist.distribution.probs == 0.5).all() + assert int(dist.entropy().exp()) == NUM_DIMS + + for i in range(NUM_DIMS): + mask = np.array([False] * NUM_DIMS) + mask[i] = True + dist.apply_masking(mask) + probs = dist.distribution.probs + assert probs.sum() == 1 + assert probs[0][i] == 1 + assert int(dist.entropy().exp()) == 1 + + dist.apply_masking(None) + assert (dist.distribution.probs == 0.5).all() + assert int(dist.entropy().exp()) == NUM_DIMS + + +class TestMaskableMultiCategoricalDistribution: + def test_distribution_must_be_initialized(self): + """ + Cannot use distribution before it has logits + """ + + DIMS_PER_CAT = 2 + NUM_CATS = 2 + dist = MaskableMultiCategoricalDistribution([DIMS_PER_CAT] * NUM_CATS) + + with pytest.raises(AssertionError): + dist.log_prob(th.randint(DIMS_PER_CAT - 1, (3, NUM_CATS))) + + with pytest.raises(AssertionError): + dist.entropy() + + with pytest.raises(AssertionError): + dist.sample() + + with pytest.raises(AssertionError): + dist.mode() + + with pytest.raises(AssertionError): + dist.apply_masking(None) + + # But now we can + dist.proba_distribution(th.randn(1, DIMS_PER_CAT * NUM_CATS)) + dist.log_prob(th.randint(DIMS_PER_CAT - 1, (3, NUM_CATS))) + dist.entropy() + dist.sample() + dist.mode() + dist.apply_masking(None) + + def test_logits_must_align_with_dims(self): + DIMS_PER_CAT = 3 + NUM_CATS = 2 + dist = MaskableMultiCategoricalDistribution([DIMS_PER_CAT] * NUM_CATS) + + # There should be one logit per dim, we're one short + logits = th.randn(1, DIMS_PER_CAT * NUM_CATS - 1) + with pytest.raises(RuntimeError): + dist.proba_distribution(logits) + + # That's better + logits = th.randn(1, DIMS_PER_CAT * NUM_CATS) + dist.proba_distribution(logits) + + # Other numbers of dimensions are acceptable as long as they can be realigned + logits = th.randn(DIMS_PER_CAT * NUM_CATS) + dist.proba_distribution(logits) + logits = th.randn(3, DIMS_PER_CAT * NUM_CATS, 3) + dist.proba_distribution(logits) + + def test_dim_masking(self): + DIMS_PER_CAT = 2 + NUM_CATS = 3 + dist = MaskableMultiCategoricalDistribution([DIMS_PER_CAT] * NUM_CATS) + + logits = th.Tensor([[0] * DIMS_PER_CAT * NUM_CATS]) + dist.proba_distribution(logits) + + assert len(dist.distributions) == NUM_CATS + for i in range(NUM_CATS): + assert (dist.distributions[i].probs == 0.5).all() + assert int(dist.entropy().exp()) == DIMS_PER_CAT ** NUM_CATS + + for i in range(DIMS_PER_CAT): + mask = np.array([False] * DIMS_PER_CAT * NUM_CATS) + for j in range(NUM_CATS): + mask[j * DIMS_PER_CAT + i] = True + + dist.apply_masking(mask) + for j in range(NUM_CATS): + probs = dist.distributions[j].probs + assert probs.sum() == 1 + assert probs[0][i] == 1 + + assert int(dist.entropy().exp()) == 1 + + dist.apply_masking(None) + for i in range(NUM_CATS): + assert (dist.distributions[i].probs == 0.5).all() + assert int(dist.entropy().exp()) == DIMS_PER_CAT ** NUM_CATS + + +class TestMaskableBernoulliDistribution: + def test_distribution_must_be_initialized(self): + """ + Cannot use distribution before it has logits + """ + + DIMS = 2 + dist = MaskableBernoulliDistribution(DIMS) + + with pytest.raises(AssertionError): + dist.log_prob(th.randint(1, (2, DIMS))) + + with pytest.raises(AssertionError): + dist.entropy() + + with pytest.raises(AssertionError): + dist.sample() + + with pytest.raises(AssertionError): + dist.mode() + + with pytest.raises(AssertionError): + dist.apply_masking(None) + + # But now we can + dist.proba_distribution(th.randn(1, 2 * DIMS)) + dist.log_prob(th.randint(1, (2, DIMS))) + dist.entropy() + dist.sample() + dist.mode() + dist.apply_masking(None) + + def test_logits_must_align_with_dims(self): + NUM_DIMS = 3 + dist = MaskableBernoulliDistribution(NUM_DIMS) + + # There should be two logits per dim, we're one short + logits = th.randn(1, 2 * NUM_DIMS - 1) + with pytest.raises(RuntimeError): + dist.proba_distribution(logits) + + # That's better + logits = th.randn(1, 2 * NUM_DIMS) + dist.proba_distribution(logits) + + # Other numbers of dimensions are acceptable as long as they can be realigned + logits = th.randn(2 * NUM_DIMS) + dist.proba_distribution(logits) + logits = th.randn(3, 2 * NUM_DIMS, 3) + dist.proba_distribution(logits) + + def test_dim_masking(self): + NUM_DIMS = 2 + BINARY_STATES = 2 + dist = MaskableBernoulliDistribution(NUM_DIMS) + + logits = th.Tensor([[0] * BINARY_STATES * NUM_DIMS]) + dist.proba_distribution(logits) + + assert len(dist.distributions) == NUM_DIMS + for i in range(NUM_DIMS): + assert (dist.distributions[i].probs == 0.5).all() + assert int(dist.entropy().exp()) == BINARY_STATES * NUM_DIMS + + for i in range(BINARY_STATES): + mask = np.array([False] * BINARY_STATES * NUM_DIMS) + for j in range(NUM_DIMS): + mask[j * BINARY_STATES + i] = True + + dist.apply_masking(mask) + for j in range(NUM_DIMS): + probs = dist.distributions[j].probs + assert probs.sum() == 1 + assert probs[0][i] == 1 + + assert int(dist.entropy().exp()) == 1 + + dist.apply_masking(None) + for i in range(NUM_DIMS): + assert (dist.distributions[i].probs == 0.5).all() + assert int(dist.entropy().exp()) == BINARY_STATES * NUM_DIMS diff --git a/tests/test_invalid_actions.py b/tests/test_invalid_actions.py new file mode 100644 index 0000000..89245d9 --- /dev/null +++ b/tests/test_invalid_actions.py @@ -0,0 +1,232 @@ +import random + +import gym +import pytest +from stable_baselines3.common.env_util import make_vec_env +from stable_baselines3.common.envs import FakeImageEnv, IdentityEnv, IdentityEnvBox +from stable_baselines3.common.monitor import Monitor +from stable_baselines3.common.policies import ActorCriticPolicy + +from sb3_contrib import MaskablePPO +from sb3_contrib.common.envs import InvalidActionEnvDiscrete, InvalidActionEnvMultiBinary, InvalidActionEnvMultiDiscrete +from sb3_contrib.common.maskable.callbacks import MaskableEvalCallback +from sb3_contrib.common.maskable.evaluation import evaluate_policy +from sb3_contrib.common.maskable.utils import is_masking_supported +from sb3_contrib.common.wrappers import ActionMasker + + +def make_env(): + return InvalidActionEnvDiscrete(dim=20, n_invalid_actions=10) + + +class ToDictWrapper(gym.Wrapper): + """ + Simple wrapper to test MultInputPolicy on Dict obs. + """ + + def __init__(self, env): + super().__init__(env) + self.observation_space = gym.spaces.Dict({"obs": self.env.observation_space}) + + def reset(self): + return {"obs": self.env.reset()} + + def step(self, action): + obs, reward, done, infos = self.env.step(action) + return {"obs": obs}, reward, done, infos + + +def test_identity(): + """ + Performance test. + A randomly initialized model cannot solve that task (score ~=6), + nor a model without invalid action masking (score ~=30 after training) + which such a low training budget. + """ + env = InvalidActionEnvDiscrete(dim=70, n_invalid_actions=55) + model = MaskablePPO( + "MlpPolicy", + env, + gamma=0.4, + seed=32, + verbose=0, + ) + model.learn(3000) + evaluate_policy(model, env, n_eval_episodes=20, reward_threshold=90, warn=False) + + +def test_supports_discrete_action_space(): + """ + No errors using algorithm with an env that has a discrete action space + """ + + env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=10) + model = MaskablePPO("MlpPolicy", env, n_steps=64, seed=8) + model.learn(100) + evaluate_policy(model, env, warn=False) + + # Mask all actions except the good one, a random model should succeed + env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=19) + model = MaskablePPO("MlpPolicy", env, seed=8) + evaluate_policy(model, env, reward_threshold=99, warn=False) + + +def test_supports_multi_discrete_action_space(): + """ + No errors using algorithm with an env that has a multidiscrete action space + """ + + env = InvalidActionEnvMultiDiscrete(dims=[2, 3], n_invalid_actions=1) + model = MaskablePPO("MlpPolicy", env, n_steps=64, seed=8) + model.learn(100) + evaluate_policy(model, env, warn=False) + + # Mask all actions except the good ones, a random model should succeed + env = InvalidActionEnvMultiDiscrete(dims=[2, 3], n_invalid_actions=3) + model = MaskablePPO("MlpPolicy", env, seed=8) + evaluate_policy(model, env, reward_threshold=99, warn=False) + + +def test_supports_multi_binary_action_space(): + """ + No errors using algorithm with an env that has a multidiscrete action space + """ + + env = InvalidActionEnvMultiBinary(dims=3, n_invalid_actions=1) + model = MaskablePPO("MlpPolicy", env, n_steps=64, seed=8) + model.learn(100) + evaluate_policy(model, env, warn=False) + + # Mask all actions except the good ones, a random model should succeed + env = InvalidActionEnvMultiBinary(dims=3, n_invalid_actions=3) + model = MaskablePPO("MlpPolicy", env, seed=8) + evaluate_policy(model, env, reward_threshold=99, warn=False) + + +def test_disabling_masking(): + """ + Behave like normal PPO if masking is disabled, which allows for envs that don't provide masks + """ + + env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=19) + model = MaskablePPO("MlpPolicy", env, seed=8) + evaluate_policy(model, env, reward_threshold=99, warn=False) + + # With masking disabled, perfect performance disappears + with pytest.raises(AssertionError): + evaluate_policy(model, env, reward_threshold=99, warn=False, use_masking=False) + + # Without masking disabled, learning/evaluation will fail if the env doesn't provide masks + env = IdentityEnv(dim=2) + model = MaskablePPO("MlpPolicy", env, n_steps=64, seed=8) + with pytest.raises(ValueError): + model.learn(100) + with pytest.raises(ValueError): + evaluate_policy(model, env, warn=False) + + model.learn(100, use_masking=False) + evaluate_policy(model, env, warn=False, use_masking=False) + + +def test_masked_evaluation(): + """ + Masking can be enabled or disabled for evaluation, but masking should perform better. + """ + + env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=19) + model = MaskablePPO("MlpPolicy", env, seed=8) + masked_avg_rew, _ = evaluate_policy(model, env, warn=False) + unmasked_avg_rew, _ = evaluate_policy(model, env, warn=False, use_masking=False) + assert masked_avg_rew > unmasked_avg_rew + + +def test_supports_multi_envs(): + """ + Learning and evaluation works with VecEnvs + """ + + env = make_vec_env(make_env, n_envs=2) + assert is_masking_supported(env) + model = MaskablePPO("MlpPolicy", env, n_steps=256, gamma=0.4, seed=32, verbose=1) + model.learn(100) + evaluate_policy(model, env, warn=False) + + env = make_vec_env(IdentityEnv, n_envs=2, env_kwargs={"dim": 2}) + assert not is_masking_supported(env) + model = MaskablePPO("MlpPolicy", env, n_steps=256, gamma=0.4, seed=32, verbose=1) + with pytest.raises(ValueError): + model.learn(100) + with pytest.raises(ValueError): + evaluate_policy(model, env, warn=False) + model.learn(100, use_masking=False) + evaluate_policy(model, env, warn=False, use_masking=False) + + +def test_callback(tmp_path): + """ + No errors using MaskableEvalCallback during learning + """ + + env = make_env() + eval_env = make_env() + model = MaskablePPO("MlpPolicy", env, n_steps=64, gamma=0.4, seed=32, verbose=1) + model.learn(100, callback=MaskableEvalCallback(eval_env, eval_freq=100, warn=False, log_path=tmp_path)) + + model.learn(100, callback=MaskableEvalCallback(Monitor(eval_env), eval_freq=100, warn=False)) + + +def test_maskable_policy_required(): + """ + MaskablePPO requires a policy that subclasses MaskableActorCriticPolicy + """ + + env = make_env() + with pytest.raises(ValueError): + MaskablePPO(ActorCriticPolicy, env) + + +def test_discrete_action_space_required(): + """ + MaskablePPO requires an env with a discrete (ie non-continuous) action space + """ + + env = IdentityEnvBox() + with pytest.raises(AssertionError): + MaskablePPO("MlpPolicy", env) + + +def test_cnn(): + def action_mask_fn(env): + random_invalid_action = random.randrange(env.action_space.n) + return [i != random_invalid_action for i in range(env.action_space.n)] + + env = FakeImageEnv() + env = ActionMasker(env, action_mask_fn) + + model = MaskablePPO( + "CnnPolicy", + env, + n_steps=64, + seed=32, + verbose=1, + policy_kwargs=dict( + features_extractor_kwargs=dict(features_dim=32), + ), + ) + model.learn(100) + evaluate_policy(model, env, warn=False) + + +# Dict observations are currently not supported +# def test_dict_obs(): +# env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=10) +# env = ToDictWrapper(env) +# model = MaskablePPO("MultiInputPolicy", env, n_steps=64, seed=8) +# model.learn(100) +# evaluate_policy(model, env, warn=False) +# +# # Mask all actions except the good one, a random model should succeed +# env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=19) +# env = ToDictWrapper(env) +# model = MaskablePPO("MultiInputPolicy", env, seed=8) +# evaluate_policy(model, env, reward_threshold=99, warn=False) diff --git a/tests/test_train_eval_mode.py b/tests/test_train_eval_mode.py index cbab03f..025a143 100644 --- a/tests/test_train_eval_mode.py +++ b/tests/test_train_eval_mode.py @@ -1,3 +1,5 @@ +from typing import Union + import gym import numpy as np import pytest @@ -6,7 +8,9 @@ import torch.nn as nn from stable_baselines3.common.preprocessing import get_flattened_obs_dim from stable_baselines3.common.torch_layers import BaseFeaturesExtractor -from sb3_contrib import QRDQN, TQC +from sb3_contrib import QRDQN, TQC, MaskablePPO +from sb3_contrib.common.envs import InvalidActionEnvDiscrete +from sb3_contrib.common.maskable.utils import get_action_masks class FlattenBatchNormDropoutExtractor(BaseFeaturesExtractor): @@ -76,12 +80,51 @@ def clone_tqc_batch_norm_stats( return (actor_bias, actor_running_mean, critic_bias, critic_running_mean, critic_target_bias, critic_target_running_mean) +def clone_on_policy_batch_norm(model: Union[MaskablePPO]) -> (th.Tensor, th.Tensor): + return clone_batch_norm_stats(model.policy.features_extractor.batch_norm) + + CLONE_HELPERS = { QRDQN: clone_qrdqn_batch_norm_stats, TQC: clone_tqc_batch_norm_stats, + MaskablePPO: clone_on_policy_batch_norm, } +def test_ppo_mask_train_eval_mode(): + env = InvalidActionEnvDiscrete(dim=20, n_invalid_actions=10) + model = MaskablePPO( + "MlpPolicy", + env, + policy_kwargs=dict(net_arch=[16, 16], features_extractor_class=FlattenBatchNormDropoutExtractor), + seed=1, + ) + + bias_before, running_mean_before = clone_on_policy_batch_norm(model) + + model.learn(total_timesteps=200) + + bias_after, running_mean_after = clone_on_policy_batch_norm(model) + + assert ~th.isclose(bias_before, bias_after).all() + assert ~th.isclose(running_mean_before, running_mean_after).all() + + batch_norm_stats_before = clone_on_policy_batch_norm(model) + + observation = env.reset() + action_masks = get_action_masks(env) + first_prediction, _ = model.predict(observation, action_masks=action_masks, deterministic=True) + for _ in range(5): + prediction, _ = model.predict(observation, action_masks=action_masks, deterministic=True) + np.testing.assert_allclose(first_prediction, prediction) + + batch_norm_stats_after = clone_on_policy_batch_norm(model) + + # No change in batch norm params + for param_before, param_after in zip(batch_norm_stats_before, batch_norm_stats_after): + assert th.isclose(param_before, param_after).all() + + def test_qrdqn_train_with_batch_norm(): model = QRDQN( "MlpPolicy", diff --git a/tests/wrappers/test_action_masker.py b/tests/wrappers/test_action_masker.py new file mode 100644 index 0000000..e130959 --- /dev/null +++ b/tests/wrappers/test_action_masker.py @@ -0,0 +1,78 @@ +from typing import List + +import pytest +from gym.spaces import Discrete +from stable_baselines3.common.envs import IdentityEnv + +from sb3_contrib.common.wrappers import ActionMasker + + +class IdentityEnvDiscrete(IdentityEnv): + def __init__(self, dim: int = 1, ep_length: int = 100): + """ + Identity environment for testing purposes + + :param dim: the size of the dimensions you want to learn + :param ep_length: the length of each episode in timesteps + """ + space = Discrete(dim) + self.useless_property = 1 + super().__init__(ep_length=ep_length, space=space) + + def _action_masks(self) -> List[int]: + return [i == self.state for i in range(self.action_space.n)] + + +def action_mask_fn(env: IdentityEnvDiscrete) -> List[int]: + return [i == env.state for i in range(env.action_space.n)] + + +def test_wrapper_accepts_function(): + """ + ActionMasker accepts a function + """ + + env = IdentityEnvDiscrete() + + assert not hasattr(env, "action_masks") + env = ActionMasker(env, action_mask_fn) + assert hasattr(env, "action_masks") + + +# Wrapper accepts as string name of a method on the underlying env +def test_wrapper_accepts_attr_name(): + """ + ActionMasker accepts a string name of a method on the underlying env + """ + + env = IdentityEnvDiscrete() + + assert not hasattr(env, "action_masks") + env = ActionMasker(env, "_action_masks") + assert hasattr(env, "action_masks") + + +def test_attr_must_be_callable(): + """ + Passing ActionMasker the string name of a non-callable is an error + """ + + env = IdentityEnvDiscrete() + + with pytest.raises(ValueError): + env = ActionMasker(env, "useless_property") + + +# Wrapper method returns expected results +def test_action_masks_returns_expected_result(): + """ + ActionMasker-provided action_masks() method returns expected results + """ + + env = IdentityEnvDiscrete() + env = ActionMasker(env, action_mask_fn) + + # Only one valid action expected + masks = env.action_masks() + masks[env.state] = not masks[env.state] # Bit-flip the one expected valid action + assert all([not mask for mask in masks]) diff --git a/tests/test_wrappers.py b/tests/wrappers/test_time_feature.py similarity index 100% rename from tests/test_wrappers.py rename to tests/wrappers/test_time_feature.py