From 78e8d405d7bf6186c8529ed26967cb17ccbe420c Mon Sep 17 00:00:00 2001 From: Stelios Tymvios <52372765+PartiallyTyped@users.noreply.github.com> Date: Wed, 27 May 2020 10:53:01 +0300 Subject: [PATCH 1/4] Implemented Vectorized Action Noise (#34) * Implemented Vectorized Action Noise Vectorized Action Noise allows for multiple instances of ActionNoiseProcesses to run in parallel. This makes it easier to run TD3/SAC/DDPG with VecEnv. * fixed linting issues * make test function name consistent Co-authored-by: Antonin RAFFIN * sanity checks and more detailed test * Update stable_baselines3/common/noise.py Co-authored-by: Antonin RAFFIN * Added assertion error message in noises setter * Corrected tests to reflect change to AssertionError from ValueError Co-authored-by: Antonin RAFFIN --- docs/misc/changelog.rst | 3 +- stable_baselines3/common/noise.py | 83 ++++++++++++++++++++++++++++++- tests/test_utils.py | 35 +++++++++++++ 3 files changed, 118 insertions(+), 3 deletions(-) diff --git a/docs/misc/changelog.rst b/docs/misc/changelog.rst index e28e9c4..174efde 100644 --- a/docs/misc/changelog.rst +++ b/docs/misc/changelog.rst @@ -18,6 +18,7 @@ New Features: - Added ``cmd_util`` and ``atari_wrappers`` - Added support for ``MultiDiscrete`` and ``MultiBinary`` observation spaces (@rolandgvc) - Added ``MultiCategorical`` and ``Bernoulli`` distributions for PPO/A2C (@rolandgvc) +- Added ``VectorizedActionNoise`` for continuous vectorized environments (@PartiallyTyped) Bug Fixes: ^^^^^^^^^^ @@ -229,4 +230,4 @@ And all the contributors: @XMaster96 @kantneel @Pastafarianist @GerardMaggiolino @PatrickWalter214 @yutingsz @sc420 @Aaahh @billtubbs @Miffyli @dwiel @miguelrass @qxcv @jaberkow @eavelardev @ruifeng96150 @pedrohbtp @srivatsankrishnan @evilsocket @MarvineGothic @jdossgollin @SyllogismRXS @rusu24edward @jbulow @Antymon @seheevic @justinkterry @edbeeching -@flodorner @KuKuXia @NeoExtended @solliet @mmcenta @richardwu @kinalmehta @rolandgvc @tkelestemur +@flodorner @KuKuXia @NeoExtended @PartiallyTyped @mmcenta @richardwu @kinalmehta @rolandgvc @tkelestemur diff --git a/stable_baselines3/common/noise.py b/stable_baselines3/common/noise.py index f27b542..d18866c 100644 --- a/stable_baselines3/common/noise.py +++ b/stable_baselines3/common/noise.py @@ -1,5 +1,6 @@ -from typing import Optional +from typing import Optional, List, Iterable from abc import ABC, abstractmethod +import copy import numpy as np @@ -45,7 +46,7 @@ class NormalActionNoise(ActionNoise): class OrnsteinUhlenbeckActionNoise(ActionNoise): """ - A Ornstein Uhlenbeck action noise, this is designed to aproximate brownian motion with friction. + An Ornstein Uhlenbeck action noise, this is designed to aproximate brownian motion with friction. Based on http://math.stackexchange.com/questions/1287634/implementing-ornstein-uhlenbeck-in-matlab @@ -84,3 +85,81 @@ class OrnsteinUhlenbeckActionNoise(ActionNoise): def __repr__(self) -> str: return f'OrnsteinUhlenbeckActionNoise(mu={self._mu}, sigma={self._sigma})' + + +class VectorizedActionNoise(ActionNoise): + """ + A Vectorized action noise for parallel environments. + + :param base_noise: ActionNoise The noise generator to use + :param n_envs: (int) The number of parallel environments + """ + + def __init__(self, base_noise: ActionNoise, n_envs: int): + try: + self.n_envs = int(n_envs) + assert self.n_envs > 0 + except (TypeError, AssertionError): + raise ValueError(f"Expected n_envs={n_envs} to be positive integer greater than 0") + + self.base_noise = base_noise + self.noises = [copy.deepcopy(self.base_noise) for _ in range(n_envs)] + + def reset(self, indices: Optional[Iterable[int]] = None) -> None: + """ + Reset all the noise processes, or those listed in indices + + :param indices: Optional[Iterable[int]] The indices to reset. Default: None. + If the parameter is None, then all processes are reset to their initial position. + """ + if indices is None: + indices = range(len(self.noises)) + + for index in indices: + self.noises[index].reset() + + def __repr__(self) -> str: + return f"VecNoise(BaseNoise={repr(self.base_noise)}), n_envs={len(self.noises)})" + + def __call__(self) -> np.ndarray: + """ + Generate and stack the action noise from each noise object + """ + noise = np.stack([noise() for noise in self.noises]) + return noise + + @property + def base_noise(self) -> ActionNoise: + return self._base_noise + + @base_noise.setter + def base_noise(self, base_noise: ActionNoise): + if base_noise is None: + raise ValueError("Expected base_noise to be an instance of ActionNoise, not None", ActionNoise) + if not isinstance(base_noise, ActionNoise): + raise TypeError("Expected base_noise to be an instance of type ActionNoise", ActionNoise) + self._base_noise = base_noise + + @property + def noises(self) -> List[ActionNoise]: + return self._noises + + @noises.setter + def noises(self, noises: List[ActionNoise]) -> None: + noises = list(noises) # raises TypeError if not iterable + assert len(noises) == self.n_envs, f"Expected a list of {self.n_envs} ActionNoises, found {len(noises)}." + + different_types = [ + i for i, noise in enumerate(noises) + if not isinstance(noise, type(self.base_noise)) + ] + + if len(different_types): + raise ValueError( + f"Noise instances at indices {different_types} don't match the type of base_noise", + type(self.base_noise) + ) + + self._noises = noises + for noise in noises: + noise.reset() diff --git a/tests/test_utils.py b/tests/test_utils.py index e2317a0..1c82782 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -10,6 +10,8 @@ from stable_baselines3.common.monitor import Monitor from stable_baselines3.common.evaluation import evaluate_policy from stable_baselines3.common.cmd_util import make_vec_env, make_atari_env from stable_baselines3.common.vec_env import DummyVecEnv, SubprocVecEnv +from stable_baselines3.common.noise import ( + VectorizedActionNoise, OrnsteinUhlenbeckActionNoise, ActionNoise) @pytest.mark.parametrize("env_id", ['CartPole-v1', lambda: gym.make('CartPole-v1')]) @@ -107,3 +109,36 @@ def test_evaluate_policy(): episode_rewards, _ = evaluate_policy(model, model.get_env(), n_eval_episodes, return_episode_rewards=True) assert len(episode_rewards) == n_eval_episodes + + +def test_vec_noise(): + num_envs = 4 + num_actions = 10 + mu = np.zeros(num_actions) + sigma = np.ones(num_actions) * 0.4 + base: ActionNoise = OrnsteinUhlenbeckActionNoise(mu, sigma) + with pytest.raises(ValueError): + vec = VectorizedActionNoise(base, -1) + with pytest.raises(ValueError): + vec = VectorizedActionNoise(base, None) + with pytest.raises(ValueError): + vec = VectorizedActionNoise(base, "whatever") + + vec = VectorizedActionNoise(base, num_envs) + assert vec.n_envs == num_envs + assert vec().shape == (num_envs, num_actions) + assert not (vec() == base()).all() + with pytest.raises(ValueError): + vec = VectorizedActionNoise(None, num_envs) + with pytest.raises(TypeError): + vec = VectorizedActionNoise(12, num_envs) + with pytest.raises(AssertionError): + vec.noises = [] + with pytest.raises(TypeError): + vec.noises = None + with pytest.raises(ValueError): + vec.noises = [None] * vec.n_envs + with pytest.raises(AssertionError): + vec.noises = [base] * (num_envs - 1) + assert all(isinstance(noise, type(base)) for noise in vec.noises) + assert len(vec.noises) == num_envs From 42f432c79c286901064739a1bff32555e757071a Mon Sep 17 00:00:00 2001 From: mloo3 Date: Mon, 1 Jun 2020 04:37:42 -0400 Subject: [PATCH 2/4] Fix TD3 Example Code Documentation (#38) Fix TD3's example code --- docs/misc/changelog.rst | 3 ++- docs/modules/td3.rst | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/misc/changelog.rst b/docs/misc/changelog.rst index 174efde..5bceb63 100644 --- a/docs/misc/changelog.rst +++ b/docs/misc/changelog.rst @@ -45,6 +45,7 @@ Documentation: - Added most documentation (adapted from Stable-Baselines) - Added link to CONTRIBUTING.md in the README (@kinalmehta) - Added gSDE project and update docstrings accordingly +- Fix ``TD3`` example code block Pre-Release 0.5.0 (2020-05-05) @@ -230,4 +231,4 @@ And all the contributors: @XMaster96 @kantneel @Pastafarianist @GerardMaggiolino @PatrickWalter214 @yutingsz @sc420 @Aaahh @billtubbs @Miffyli @dwiel @miguelrass @qxcv @jaberkow @eavelardev @ruifeng96150 @pedrohbtp @srivatsankrishnan @evilsocket @MarvineGothic @jdossgollin @SyllogismRXS @rusu24edward @jbulow @Antymon @seheevic @justinkterry @edbeeching -@flodorner @KuKuXia @NeoExtended @PartiallyTyped @mmcenta @richardwu @kinalmehta @rolandgvc @tkelestemur +@flodorner @KuKuXia @NeoExtended @PartiallyTyped @mmcenta @richardwu @kinalmehta @rolandgvc @tkelestemur @mloo3 diff --git a/docs/modules/td3.rst b/docs/modules/td3.rst index 86a939d..cb2a4e1 100644 --- a/docs/modules/td3.rst +++ b/docs/modules/td3.rst @@ -62,17 +62,20 @@ Example .. code-block:: python + import gym import numpy as np from stable_baselines3 import TD3 from stable_baselines3.td3.policies import MlpPolicy from stable_baselines3.common.noise import NormalActionNoise, OrnsteinUhlenbeckActionNoise + env = gym.make('Pendulum-v0') + # The noise objects for TD3 n_actions = env.action_space.shape[-1] action_noise = NormalActionNoise(mean=np.zeros(n_actions), sigma=0.1 * np.ones(n_actions)) - model = TD3(MlpPolicy, 'Pendulum-v0', action_noise=action_noise, verbose=1) + model = TD3(MlpPolicy, env, action_noise=action_noise, verbose=1) model.learn(total_timesteps=10000, log_interval=10) model.save("td3_pendulum") env = model.get_env() From bb012532615068323b52ec223a94f5ace31f4c4b Mon Sep 17 00:00:00 2001 From: Roland Gavrilescu Date: Mon, 1 Jun 2020 10:55:44 +0100 Subject: [PATCH 3/4] Tensorboard integration (#30) * init commit tensorboard-integration * Added tb logger to ppo (with output exclusions) * fixed truncated stdout * categorize stdout outputs by tag * separated exclusions from values, added missing logs * saving exclusions as dict instead of list * reformatting, auto run indexing * included renaming suggestions, fixed tests * tb support for sac * linting * moved logging to base class * tb support for td3 * removed histograms, non-verbose output working * modifed changelog * linting * fixed type error * moved logger config to utils * removed episode_rewards log from ppo * Enable tensorboard in tests * Remove unused import * Update logger sub titles * Minor edit for PPO * Update logger and tb log folder * Pass correct logger to Callbacks * updated docs * added tb example image to docs * add support for continuing training in tensorboard * added tensorboard to docs index * added tb test * moved logger config to _setup_learn, updated tests * accessing verbose from base class * Update doc and tests * Rename session -> time * Update version * Update logger truncate * Update types * Remove duplicated code Co-authored-by: Antonin RAFFIN --- README.md | 4 +- docs/_static/img/Tensorboard_example.png | Bin 0 -> 238697 bytes docs/guide/callbacks.rst | 2 +- docs/guide/install.rst | 2 +- docs/guide/tensorboard.rst | 82 +++++++ docs/index.rst | 3 +- docs/misc/changelog.rst | 10 +- setup.py | 4 +- stable_baselines3/a2c/a2c.py | 12 +- stable_baselines3/common/base_class.py | 55 +++-- stable_baselines3/common/callbacks.py | 9 +- stable_baselines3/common/logger.py | 273 ++++++++++++++--------- stable_baselines3/common/utils.py | 50 ++++- stable_baselines3/ppo/ppo.py | 79 +++---- stable_baselines3/sac/sac.py | 18 +- stable_baselines3/td3/td3.py | 10 +- stable_baselines3/version.txt | 2 +- tests/test_logger.py | 70 +++--- tests/test_tensorboard.py | 36 +++ 19 files changed, 488 insertions(+), 233 deletions(-) create mode 100644 docs/_static/img/Tensorboard_example.png create mode 100644 docs/guide/tensorboard.rst create mode 100644 tests/test_tensorboard.py diff --git a/README.md b/README.md index f8d5b27..402d556 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ These algorithms will make it easier for the research community and industry to | Custom policies | :heavy_check_mark: | | Common interface | :heavy_check_mark: | | Ipython / Notebook friendly | :heavy_check_mark: | +| Tensorboard support | :heavy_check_mark: | | PEP8 code style | :heavy_check_mark: | | Custom callback | :heavy_check_mark: | | High code coverage | :heavy_check_mark: | @@ -48,7 +49,6 @@ Planned features: ### Planned features (v1.1+) -- [ ] Full Tensorboard support - [ ] DQN extensions (prioritized replay, double q-learning, ...) - [ ] Support for `Tuple` and `Dict` observation spaces - [ ] Recurrent Policies @@ -99,7 +99,7 @@ Install the Stable Baselines3 package: pip install stable-baselines3[extra] ``` -This includes an optional dependencies like OpenCV or `atari-py` to train on atari games. If you do not need those, you can use: +This includes an optional dependencies like Tensorboard, OpenCV or `atari-py` to train on atari games. If you do not need those, you can use: ``` pip install stable-baselines3 ``` diff --git a/docs/_static/img/Tensorboard_example.png b/docs/_static/img/Tensorboard_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c3628a144514028dd12a3ddede2b5ca7b8d1636c GIT binary patch literal 238697 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�vR8h6!v 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 P6Zqr*Z0-M!9j*KiQuT+I literal 0 HcmV?d00001 diff --git a/docs/guide/callbacks.rst b/docs/guide/callbacks.rst index 4a4773e..26f5807 100644 --- a/docs/guide/callbacks.rst +++ b/docs/guide/callbacks.rst @@ -44,7 +44,7 @@ This will give you access to events (``_on_training_start``, ``_on_step``) and u # self.locals = None # type: Dict[str, Any] # self.globals = None # type: Dict[str, Any] # The logger object, used to report things in the terminal - # self.logger = None # type: logger.Logger + # self.logger = None # stable_baselines3.common.logger # # Sometimes, for event callback, it is useful # # to have access to the parent object # self.parent = None # type: Optional[BaseCallback] diff --git a/docs/guide/install.rst b/docs/guide/install.rst index 61553ec..27c431b 100644 --- a/docs/guide/install.rst +++ b/docs/guide/install.rst @@ -29,7 +29,7 @@ To install Stable Baselines3 with pip, execute: pip install stable-baselines3[extra] -This includes an optional dependencies like OpenCV or ```atari-py``` to train on atari games. If you do not need those, you can use: +This includes an optional dependencies like Tensorboard, OpenCV or ```atari-py``` to train on atari games. If you do not need those, you can use: .. code-block:: bash diff --git a/docs/guide/tensorboard.rst b/docs/guide/tensorboard.rst new file mode 100644 index 0000000..7ae2ffa --- /dev/null +++ b/docs/guide/tensorboard.rst @@ -0,0 +1,82 @@ +.. _tensorboard: + +Tensorboard Integration +======================= + +Basic Usage +------------ + +To use Tensorboard with stable baselines3, you simply need to pass the location of the log folder to the RL agent: + +.. code-block:: python + + from stable_baselines3 import A2C + + model = A2C('MlpPolicy', 'CartPole-v1', verbose=1, tensorboard_log="./a2c_cartpole_tensorboard/") + model.learn(total_timesteps=10000) + + +You can also define custom logging name when training (by default it is the algorithm name) + +.. code-block:: python + + from stable_baselines3 import A2C + + model = A2C('MlpPolicy', 'CartPole-v1', verbose=1, tensorboard_log="./a2c_cartpole_tensorboard/") + model.learn(total_timesteps=10000, tb_log_name="first_run") + # Pass reset_num_timesteps=False to continue the training curve in tensorboard + # By default, it will create a new curve + model.learn(total_timesteps=10000, tb_log_name="second_run", reset_num_timesteps=False) + model.learn(total_timesteps=10000, tb_log_name="third_run", reset_num_timesteps=False) + + +Once the learn function is called, you can monitor the RL agent during or after the training, with the following bash command: + +.. code-block:: bash + + tensorboard --logdir ./a2c_cartpole_tensorboard/ + +you can also add past logging folders: + +.. code-block:: bash + + tensorboard --logdir ./a2c_cartpole_tensorboard/;./ppo2_cartpole_tensorboard/ + +It will display information such as the episode reward (when using a ``Monitor`` wrapper), the model losses and other parameter unique to some models. + +.. image:: ../_static/img/Tensorboard_example.png + :width: 600 + :alt: plotting + +Logging More Values +------------------- + +Using a callback, you can easily log more values with TensorBoard. +Here is a simple example on how to log both additional tensor or arbitrary scalar value: + +.. code-block:: python + + import numpy as np + + from stable_baselines3 import SAC + from stable_baselines3.common.callbacks import BaseCallback + + model = SAC("MlpPolicy", "Pendulum-v0", tensorboard_log="/tmp/sac/", verbose=1) + + + class TensorboardCallback(BaseCallback): + """ + Custom callback for plotting additional values in tensorboard. + """ + + def __init__(self, verbose=0): + super(TensorboardCallback, self).__init__(verbose) + + def _on_step(self) -> bool: + # Log scalar value (here a random variable) + value = np.random.random() + self.logger.record('random_value', value) + return True + + + model.learn(50000, callback=TensorboardCallback()) diff --git a/docs/index.rst b/docs/index.rst index 9693f8b..2c531c9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,7 +25,7 @@ Main Features - Documented functions and classes - Tests, high code coverage and type hints - Clean code - +- Tensorboard support .. toctree:: @@ -42,6 +42,7 @@ Main Features guide/custom_env guide/custom_policy guide/callbacks + guide/tensorboard guide/rl_zoo guide/migration guide/checking_nan diff --git a/docs/misc/changelog.rst b/docs/misc/changelog.rst index 5bceb63..8df8ef8 100644 --- a/docs/misc/changelog.rst +++ b/docs/misc/changelog.rst @@ -3,12 +3,17 @@ Changelog ========== -Pre-Release 0.6.0a10 (WIP) +Pre-Release 0.6.0a11 (WIP) ------------------------------ Breaking Changes: ^^^^^^^^^^^^^^^^^ - Remove State-Dependent Exploration (SDE) support for ``TD3`` +- Methods were renamed in the logger: + - ``logkv`` -> ``record``, ``writekvs`` -> ``write``, ``writeseq`` -> ``write_sequence``, + - ``logkvs`` -> ``record_dict``, ``dumpkvs`` -> ``dump``, + - ``getkvs`` -> ``get_log_dict``, ``logkv_mean`` -> ``record_mean``, + New Features: ^^^^^^^^^^^^^ @@ -18,7 +23,9 @@ New Features: - Added ``cmd_util`` and ``atari_wrappers`` - Added support for ``MultiDiscrete`` and ``MultiBinary`` observation spaces (@rolandgvc) - Added ``MultiCategorical`` and ``Bernoulli`` distributions for PPO/A2C (@rolandgvc) +- Added support for logging to tensorboard (@rolandgvc) - Added ``VectorizedActionNoise`` for continuous vectorized environments (@PartiallyTyped) +- Log evaluation in the ``EvalCallback`` using the logger Bug Fixes: ^^^^^^^^^^ @@ -26,6 +33,7 @@ Bug Fixes: - Fixed version number that had a new line included - Fixed weird seg fault in docker image due to FakeImageEnv by reducing screen size - Fixed ``sde_sample_freq`` that was not taken into account for SAC +- Pass logger module to ``BaseCallback`` otherwise they cannot write in the one used by the algorithms Deprecations: ^^^^^^^^^^^^^ diff --git a/setup.py b/setup.py index bf9d823..87c737c 100644 --- a/setup.py +++ b/setup.py @@ -106,7 +106,9 @@ setup(name='stable_baselines3', # For render 'opencv-python', # For atari games, - 'atari_py~=0.2.0', 'pillow' + 'atari_py~=0.2.0', 'pillow', + # Tensorboard support + 'tensorboard' ] }, description='Pytorch version of Stable Baselines, implementations of reinforcement learning algorithms.', diff --git a/stable_baselines3/a2c/a2c.py b/stable_baselines3/a2c/a2c.py index 9cd58fd..c7364c3 100644 --- a/stable_baselines3/a2c/a2c.py +++ b/stable_baselines3/a2c/a2c.py @@ -141,13 +141,13 @@ class A2C(PPO): self.rollout_buffer.values.flatten()) self._n_updates += 1 - logger.logkv("n_updates", self._n_updates) - logger.logkv("explained_variance", explained_var) - logger.logkv("entropy_loss", entropy_loss.item()) - logger.logkv("policy_loss", policy_loss.item()) - logger.logkv("value_loss", value_loss.item()) + logger.record("train/n_updates", self._n_updates, exclude="tensorboard") + logger.record("train/explained_variance", explained_var) + logger.record("train/entropy_loss", entropy_loss.item()) + logger.record("train/policy_loss", policy_loss.item()) + logger.record("train/value_loss", value_loss.item()) if hasattr(self.policy, 'log_std'): - logger.logkv("std", th.exp(self.policy.log_std).mean().item()) + logger.record("train/std", th.exp(self.policy.log_std).mean().item()) def learn(self, total_timesteps: int, diff --git a/stable_baselines3/common/base_class.py b/stable_baselines3/common/base_class.py index a2405d6..e24bd2c 100644 --- a/stable_baselines3/common/base_class.py +++ b/stable_baselines3/common/base_class.py @@ -11,7 +11,7 @@ import gym import torch as th import numpy as np -from stable_baselines3.common import logger +from stable_baselines3.common import logger, utils from stable_baselines3.common.policies import BasePolicy, get_policy_from_name from stable_baselines3.common.utils import set_random_seed, get_schedule_fn, update_learning_rate, get_device from stable_baselines3.common.vec_env import DummyVecEnv, VecEnv, unwrap_vec_normalize, VecNormalize, VecTransposeImage @@ -35,6 +35,7 @@ class BaseRLModel(ABC): :param learning_rate: (float or callable) learning rate for the optimizer, it can be a function of the current progress (from 1 to 0) :param policy_kwargs: (Dict[str, Any]) Additional arguments to be passed to the policy on creation + :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) :param verbose: (int) The verbosity level: 0 none, 1 training information, 2 debug :param device: (Union[th.device, str]) Device on which the code should run. By default, it will try to use a Cuda compatible device and fallback to cpu @@ -58,6 +59,7 @@ class BaseRLModel(ABC): policy_base: Type[BasePolicy], learning_rate: Union[float, Callable], policy_kwargs: Dict[str, Any] = None, + tensorboard_log: Optional[str] = None, verbose: int = 0, device: Union[th.device, str] = 'auto', support_multi_env: bool = False, @@ -91,6 +93,7 @@ class BaseRLModel(ABC): self.start_time = None self.policy = None self.learning_rate = learning_rate + self.tensorboard_log = tensorboard_log self.lr_schedule = None # type: Optional[Callable] self._last_obs = None # type: Optional[np.ndarray] # When using VecNormalize: @@ -191,7 +194,7 @@ class BaseRLModel(ABC): An optimizer or a list of optimizers. """ # Log the current learning rate - logger.logkv("learning_rate", self.lr_schedule(self._current_progress)) + logger.record("train/learning_rate", self.lr_schedule(self._current_progress)) if not isinstance(optimizers, list): optimizers = [optimizers] @@ -289,7 +292,7 @@ class BaseRLModel(ABC): """ Return a trained model. - :param total_timesteps: (int) The total number of samples to train on + :param total_timesteps: (int) The total number of samples (env steps) to train on :param callback: (function (dict, dict)) -> boolean function called at every steps with state of the algorithm. It takes the local and global variables. If it returns False, training is aborted. :param log_interval: (int) The number of timesteps before logging. @@ -491,23 +494,27 @@ class BaseRLModel(ABC): return callback def _setup_learn(self, + total_timesteps: int, eval_env: Optional[GymEnv], callback: Union[None, Callable, List[BaseCallback], BaseCallback] = None, eval_freq: int = 10000, n_eval_episodes: int = 5, log_path: Optional[str] = None, reset_num_timesteps: bool = True, - ) -> 'BaseCallback': + tb_log_name: str = 'run', + ) -> Tuple[int, 'BaseCallback']: """ Initialize different variables needed for training. + :param total_timesteps: (int) The total number of samples (env steps) to train on :param eval_env: (Optional[GymEnv]) :param callback: (Union[None, BaseCallback, List[BaseCallback, Callable]]) :param eval_freq: (int) :param n_eval_episodes: (int) :param log_path (Optional[str]): Path to a log folder :param reset_num_timesteps: (bool) Whether to reset or not the ``num_timesteps`` attribute - :return: (BaseCallback) + :param tb_log_name: (str) the name of the run for tensorboard log + :return: (int, Tuple[BaseCallback]) """ self.start_time = time.time() self.ep_info_buffer = deque(maxlen=100) @@ -519,6 +526,9 @@ class BaseRLModel(ABC): 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 # Avoid resetting the environment when calling ``.learn()`` consecutive times if reset_num_timesteps or self._last_obs is None: @@ -532,10 +542,13 @@ class BaseRLModel(ABC): eval_env = self._get_eval_env(eval_env) + # Configure logger's outputs + 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) - return callback + return total_timesteps, callback def _update_info_buffer(self, infos: List[Dict[str, Any]], dones: Optional[np.ndarray] = None) -> None: """ @@ -697,6 +710,7 @@ class OffPolicyRLModel(BaseRLModel): learning_starts: int = 100, batch_size: int = 256, policy_kwargs: Dict[str, Any] = None, + tensorboard_log: Optional[str] = None, verbose: int = 0, device: Union[th.device, str] = 'auto', support_multi_env: bool = False, @@ -709,13 +723,13 @@ class OffPolicyRLModel(BaseRLModel): sde_support: bool = True): super(OffPolicyRLModel, self).__init__(policy, env, policy_base, learning_rate, - policy_kwargs, verbose, + policy_kwargs, tensorboard_log, verbose, device, support_multi_env, create_eval_env, monitor_wrapper, seed, use_sde, sde_sample_freq) self.buffer_size = buffer_size self.batch_size = batch_size self.learning_starts = learning_starts - self.actor = None + self.actor = None # type: Optional[th.nn.Module] self.replay_buffer = None # type: Optional[ReplayBuffer] # Update policy keyword arguments if sde_support: @@ -752,7 +766,7 @@ class OffPolicyRLModel(BaseRLModel): self.replay_buffer = pickle.load(file_handler) assert isinstance(self.replay_buffer, ReplayBuffer), 'The replay buffer must inherit from ReplayBuffer class' - def collect_rollouts(self, + def collect_rollouts(self, # noqa: C901 env: VecEnv, # Type hint as string to avoid circular import callback: 'BaseCallback', @@ -873,22 +887,23 @@ class OffPolicyRLModel(BaseRLModel): if action_noise is not None: action_noise.reset() - # Display training infos - if self.verbose >= 1 and log_interval is not None and self._episode_num % log_interval == 0: + # Log training infos + if log_interval is not None and self._episode_num % log_interval == 0: fps = int(self.num_timesteps / (time.time() - self.start_time)) - logger.logkv("episodes", self._episode_num) + logger.record("time/episodes", self._episode_num, exclude="tensorboard") if len(self.ep_info_buffer) > 0 and len(self.ep_info_buffer[0]) > 0: - logger.logkv('ep_rew_mean', self.safe_mean([ep_info['r'] for ep_info in self.ep_info_buffer])) - logger.logkv('ep_len_mean', self.safe_mean([ep_info['l'] for ep_info in self.ep_info_buffer])) - logger.logkv("fps", fps) - logger.logkv('time_elapsed', int(time.time() - self.start_time)) - logger.logkv("total timesteps", self.num_timesteps) + logger.record('rollout/ep_rew_mean', self.safe_mean([ep_info['r'] for ep_info in self.ep_info_buffer])) + logger.record('rollout/ep_len_mean', self.safe_mean([ep_info['l'] for ep_info in self.ep_info_buffer])) + logger.record("time/fps", fps) + logger.record('time/time_elapsed', int(time.time() - self.start_time), exclude="tensorboard") + logger.record("time/total timesteps", self.num_timesteps, exclude="tensorboard") if self.use_sde: - logger.logkv("std", (self.actor.get_std()).mean().item()) + logger.record("train/std", (self.actor.get_std()).mean().item()) if len(self.ep_success_buffer) > 0: - logger.logkv('success rate', self.safe_mean(self.ep_success_buffer)) - logger.dumpkvs() + logger.record('rollout/success rate', self.safe_mean(self.ep_success_buffer)) + # Pass the number of timesteps for tensorboard + logger.dump(step=self.num_timesteps) mean_reward = np.mean(episode_rewards) if total_episodes > 0 else 0.0 diff --git a/stable_baselines3/common/callbacks.py b/stable_baselines3/common/callbacks.py index 5f1e172..6b5c1cc 100644 --- a/stable_baselines3/common/callbacks.py +++ b/stable_baselines3/common/callbacks.py @@ -9,7 +9,7 @@ import numpy as np from stable_baselines3.common.vec_env import DummyVecEnv, VecEnv, sync_envs_normalization from stable_baselines3.common.evaluation import evaluate_policy -from stable_baselines3.common.logger import Logger +from stable_baselines3.common import logger if typing.TYPE_CHECKING: from stable_baselines3.common.base_class import BaseRLModel # pytype: disable=pyi-error @@ -34,7 +34,7 @@ class BaseCallback(ABC): self.verbose = verbose self.locals = None # type: Optional[Dict[str, Any]] self.globals = None # type: Optional[Dict[str, Any]] - self.logger = None # type: Optional[Logger] + self.logger = None # Sometimes, for event callback, it is useful # to have access to the parent object self.parent = None # type: Optional[BaseCallback] @@ -47,7 +47,7 @@ class BaseCallback(ABC): """ self.model = model self.training_env = model.get_env() - self.logger = Logger.CURRENT + self.logger = logger self._init_callback() def _init_callback(self) -> None: @@ -313,6 +313,9 @@ class EvalCallback(EventCallback): 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 mean_reward > self.best_mean_reward: if self.verbose > 0: diff --git a/stable_baselines3/common/logger.py b/stable_baselines3/common/logger.py index 9269eb5..d23726e 100644 --- a/stable_baselines3/common/logger.py +++ b/stable_baselines3/common/logger.py @@ -5,9 +5,15 @@ import os import tempfile import warnings from collections import defaultdict -from typing import Dict, List, TextIO, Union, Any, Optional +from typing import Dict, List, TextIO, Union, Any, Optional, Tuple import pandas +import numpy as np +import torch as th +try: + from torch.utils.tensorboard import SummaryWriter +except ImportError: + SummaryWriter = None DEBUG = 10 INFO = 20 @@ -21,11 +27,14 @@ class KVWriter(object): Key Value writer """ - def writekvs(self, kvs: Dict) -> None: + def write(self, key_values: Dict[str, Any], + key_excluded: Dict[str, Union[str, Tuple[str, ...]]], step: int = 0) -> None: """ - write a dictionary to file + Write a dictionary to file - :param kvs: (dict) + :param key_values: (dict) + :param key_excluded: (dict) + :param step: (int) """ raise NotImplementedError @@ -41,11 +50,11 @@ class SeqWriter(object): sequence writer """ - def writeseq(self, seq: List): + def write_sequence(self, sequence: List): """ - write an array to file + write_sequence an array to file - :param seq: (list) + :param sequence: (list) """ raise NotImplementedError @@ -65,16 +74,29 @@ class HumanOutputFormat(KVWriter, SeqWriter): self.file = filename_or_file self.own_file = False - def writekvs(self, kvs: Dict) -> None: + def write(self, key_values: Dict, key_excluded: Dict, step: int = 0) -> None: # Create strings for printing key2str = {} - for (key, val) in sorted(kvs.items()): - if isinstance(val, float): + tag = None + for (key, value), (_, excluded) in zip(sorted(key_values.items()), sorted(key_excluded.items())): + + if excluded is not None and 'stdout' in excluded: + continue + + if isinstance(value, float): # Align left - val_str = f'{val:<8.3g}' + value_str = f'{value:<8.3g}' else: - val_str = str(val) - key2str[self._truncate(key)] = self._truncate(val_str) + value_str = str(value) + + if key.find('/') > 0: # Find tag and add it to the dict + tag = key[:key.find('/') + 1] + key2str[self._truncate(tag)] = '' + # Remove tag from key + if tag is not None and tag in key: + key = str(' ' + key[len(tag):]) + + key2str[self._truncate(key)] = self._truncate(value_str) # Find max widths if len(key2str) == 0: @@ -87,10 +109,10 @@ class HumanOutputFormat(KVWriter, SeqWriter): # Write out the data dashes = '-' * (key_width + val_width + 7) lines = [dashes] - for (key, val) in sorted(key2str.items()): + for key, value in key2str.items(): key_space = ' ' * (key_width - len(key)) - val_space = ' ' * (val_width - len(val)) - lines.append(f"| {key}{key_space} | {val}{val_space} |") + val_space = ' ' * (val_width - len(value)) + lines.append(f"| {key}{key_space} | {value}{val_space} |") lines.append(dashes) self.file.write('\n'.join(lines) + '\n') @@ -98,14 +120,14 @@ class HumanOutputFormat(KVWriter, SeqWriter): self.file.flush() @classmethod - def _truncate(cls, string: str) -> str: - return string[:20] + '...' if len(string) > 23 else string + def _truncate(cls, string: str, max_length: int = 23) -> str: + return string[:max_length - 3] + '...' if len(string) > max_length else string - def writeseq(self, seq: List) -> None: - seq = list(seq) - for (i, elem) in enumerate(seq): + def write_sequence(self, sequence: List) -> None: + sequence = list(sequence) + for i, elem in enumerate(sequence): self.file.write(elem) - if i < len(seq) - 1: # add space unless this is the last one + if i < len(sequence) - 1: # add space unless this is the last one self.file.write(' ') self.file.write('\n') self.file.flush() @@ -127,22 +149,28 @@ class JSONOutputFormat(KVWriter): """ self.file = open(filename, 'wt') - def writekvs(self, kvs: Dict) -> None: - for key, value in sorted(kvs.items()): + def write(self, key_values: Dict[str, Any], + key_excluded: Dict[str, Union[str, Tuple[str, ...]]], step: int = 0) -> None: + for (key, value), (_, excluded) in zip(sorted(key_values.items()), sorted(key_excluded.items())): + + if excluded is not None and 'json' in excluded: + continue + if hasattr(value, 'dtype'): if value.shape == () or len(value) == 1: # if value is a dimensionless numpy array or of length 1, serialize as a float - kvs[key] = float(value) + key_values[key] = float(value) else: # otherwise, a value is a numpy array, serialize as a list or nested lists - kvs[key] = value.tolist() - self.file.write(json.dumps(kvs) + '\n') + key_values[key] = value.tolist() + self.file.write(json.dumps(key_values) + '\n') self.file.flush() def close(self) -> None: """ closes the file """ + self.file.close() @@ -153,13 +181,15 @@ class CSVOutputFormat(KVWriter): :param filename: (str) the file to write the log to """ + self.file = open(filename, 'w+t') self.keys = [] - self.sep = ',' + self.separator = ',' - def writekvs(self, kvs: Dict) -> None: + def write(self, key_values: Dict[str, Any], + key_excluded: Dict[str, Union[str, Tuple[str, ...]]], step: int = 0) -> None: # Add our current row to the history - extra_keys = kvs.keys() - self.keys + extra_keys = key_values.keys() - self.keys if extra_keys: self.keys.extend(extra_keys) self.file.seek(0) @@ -172,12 +202,12 @@ class CSVOutputFormat(KVWriter): self.file.write('\n') for line in lines[1:]: self.file.write(line[:-1]) - self.file.write(self.sep * len(extra_keys)) + self.file.write(self.separator * len(extra_keys)) self.file.write('\n') for i, key in enumerate(self.keys): if i > 0: self.file.write(',') - value = kvs.get(key) + value = key_values.get(key) if value is not None: self.file.write(str(value)) self.file.write('\n') @@ -190,25 +220,49 @@ class CSVOutputFormat(KVWriter): self.file.close() -def valid_float_value(value: Any) -> bool: - """ - Returns True if the value can be successfully cast into a float +class TensorBoardOutputFormat(KVWriter): + def __init__(self, folder: str): + """ + Dumps key/value pairs into TensorBoard's numeric format. - :param value: (Any) the value to check - :return: (bool) - """ - try: - float(value) - return True - except TypeError: - return False + :param folder: (str) the folder to write the log to + """ + assert SummaryWriter is not None, ("tensorboard is not installed, you can use " + "pip install tensorboard to do so") + self.writer = SummaryWriter(log_dir=folder) + + def write(self, key_values: Dict[str, Any], + key_excluded: Dict[str, Union[str, Tuple[str, ...]]], step: int = 0) -> None: + + for (key, value), (_, excluded) in zip(sorted(key_values.items()), + sorted(key_excluded.items())): + + if excluded is not None and 'tensorboard' in excluded: + continue + + if isinstance(value, np.ScalarType): + self.writer.add_scalar(key, value, step) + + if isinstance(value, th.Tensor): + self.writer.add_histogram(key, value, step) + + # Flush the output to the file + self.writer.flush() + + def close(self) -> None: + """ + closes the file + """ + if self.writer: + self.writer.close() + self.writer = None def make_output_format(_format: str, log_dir: str, log_suffix: str = '') -> KVWriter: """ return a logger for the requested format - :param _format: (str) the requested format to log to ('stdout', 'log', 'json' or 'csv') + :param _format: (str) the requested format to log to ('stdout', 'log', 'json' or 'csv' or 'tensorboard') :param log_dir: (str) the logging directory :param log_suffix: (str) the suffix for the log file :return: (KVWriter) the logger @@ -222,6 +276,8 @@ def make_output_format(_format: str, log_dir: str, log_suffix: str = '') -> KVWr return JSONOutputFormat(os.path.join(log_dir, f'progress{log_suffix}.json')) elif _format == 'csv': return CSVOutputFormat(os.path.join(log_dir, f'progress{log_suffix}.csv')) + elif _format == 'tensorboard': + return TensorBoardOutputFormat(log_dir) else: raise ValueError(f'Unknown format specified: {_format}') @@ -230,52 +286,56 @@ def make_output_format(_format: str, log_dir: str, log_suffix: str = '') -> KVWr # API # ================================================================ -def logkv(key: Any, val: Any) -> None: +def record(key: str, value: Any, + exclude: Optional[Union[str, Tuple[str, ...]]] = None) -> None: """ Log a value of some diagnostic Call this once for each diagnostic quantity, each iteration If called many times, last value will be used. :param key: (Any) save to log this key - :param val: (Any) save to log this value + :param value: (Any) save to log this value + :param exclude: (str or tuple) outputs to be excluded """ - Logger.CURRENT.logkv(key, val) + Logger.CURRENT.record(key, value, exclude) -def logkv_mean(key: Any, val: Union[int, float]) -> None: +def record_mean(key: str, value: Union[int, float], + exclude: Optional[Union[str, Tuple[str, ...]]] = None) -> None: """ - The same as logkv(), but if called many times, values averaged. + The same as record(), but if called many times, values averaged. :param key: (Any) save to log this key - :param val: (Number) save to log this value + :param value: (Number) save to log this value + :param exclude: (str or tuple) outputs to be excluded """ - Logger.CURRENT.logkv_mean(key, val) + Logger.CURRENT.record_mean(key, value, exclude) -def logkvs(key_values: Dict) -> None: +def record_dict(key_values: Dict[str, Any]) -> None: """ - Log a dictionary of key-value pairs + Log a dictionary of key-value pairs. :param key_values: (dict) the list of keys and values to save to log """ for key, value in key_values.items(): - logkv(key, value) + record(key, value) -def dumpkvs() -> None: +def dump(step: int = 0) -> None: """ Write all of the diagnostics from the current iteration """ - Logger.CURRENT.dumpkvs() + Logger.CURRENT.dump(step) -def getkvs() -> Dict: +def get_log_dict() -> Dict: """ get the key values logs :return: (dict) the logged values """ - return Logger.CURRENT.name2val + return Logger.CURRENT.name_to_value def log(*args, level: int = INFO) -> None: @@ -363,8 +423,8 @@ def get_dir() -> str: return Logger.CURRENT.get_dir() -record_tabular = logkv -dump_tabular = dumpkvs +record_tabular = record +dump_tabular = dump # ================================================================ @@ -384,50 +444,59 @@ class Logger(object): :param folder: (str) the logging location :param output_formats: ([str]) the list of output format """ - self.name2val = defaultdict(float) # values this iteration - self.name2cnt = defaultdict(int) + self.name_to_value = defaultdict(float) # values this iteration + self.name_to_count = defaultdict(int) + self.name_to_excluded = defaultdict(str) self.level = INFO self.dir = folder self.output_formats = output_formats # Logging API, forwarded # ---------------------------------------- - def logkv(self, key: Any, val: Any) -> None: + def record(self, key: str, value: Any, + exclude: Optional[Union[str, Tuple[str, ...]]] = None) -> None: """ Log a value of some diagnostic Call this once for each diagnostic quantity, each iteration If called many times, last value will be used. :param key: (Any) save to log this key - :param val: (Any) save to log this value + :param value: (Any) save to log this value + :param exclude: (str or tuple) outputs to be excluded """ - self.name2val[key] = val + self.name_to_value[key] = value + self.name_to_excluded[key] = exclude - def logkv_mean(self, key: Any, val: Any) -> None: + def record_mean(self, key: str, value: Any, + exclude: Optional[Union[str, Tuple[str, ...]]] = None) -> None: """ - The same as logkv(), but if called many times, values averaged. + The same as record(), but if called many times, values averaged. :param key: (Any) save to log this key - :param val: (Number) save to log this value + :param value: (Number) save to log this value + :param exclude: (str or tuple) outputs to be excluded """ - if val is None: - self.name2val[key] = None + if value is None: + self.name_to_value[key] = None return - oldval, cnt = self.name2val[key], self.name2cnt[key] - self.name2val[key] = oldval * cnt / (cnt + 1) + val / (cnt + 1) - self.name2cnt[key] = cnt + 1 + old_val, count = self.name_to_value[key], self.name_to_count[key] + self.name_to_value[key] = old_val * count / (count + 1) + value / (count + 1) + self.name_to_count[key] = count + 1 + self.name_to_excluded[key] = exclude - def dumpkvs(self) -> None: + def dump(self, step: int = 0) -> None: """ Write all of the diagnostics from the current iteration """ if self.level == DISABLED: return - for fmt in self.output_formats: - if isinstance(fmt, KVWriter): - fmt.writekvs(self.name2val) - self.name2val.clear() - self.name2cnt.clear() + for _format in self.output_formats: + if isinstance(_format, KVWriter): + _format.write(self.name_to_value, self.name_to_excluded, step) + + self.name_to_value.clear() + self.name_to_count.clear() + self.name_to_excluded.clear() def log(self, *args, level: int = INFO) -> None: """ @@ -466,8 +535,8 @@ class Logger(object): """ closes the file """ - for fmt in self.output_formats: - fmt.close() + for _format in self.output_formats: + _format.close() # Misc # ---------------------------------------- @@ -477,37 +546,37 @@ class Logger(object): :param args: (list) the arguments to log """ - for fmt in self.output_formats: - if isinstance(fmt, SeqWriter): - fmt.writeseq(map(str, args)) + for _format in self.output_formats: + if isinstance(_format, SeqWriter): + _format.write_sequence(map(str, args)) # Initialize logger Logger.DEFAULT = Logger.CURRENT = Logger(folder=None, output_formats=[HumanOutputFormat(sys.stdout)]) -def configure(folder: Optional[str] = None, format_strs: Optional[List[str]] = None) -> None: +def configure(folder: Optional[str] = None, format_strings: Optional[List[str]] = None) -> None: """ configure the current logger :param folder: (Optional[str]) the save location - (if None, $BASELINES_LOGDIR, if still None, tempdir/baselines-[date & time]) - :param format_strs: (Optional[List[str]]) the output logging format - (if None, $BASELINES_LOG_FORMAT, if still None, ['stdout', 'log', 'csv']) + (if None, $SB3_LOGDIR, if still None, tempdir/baselines-[date & time]) + :param format_strings: (Optional[List[str]]) the output logging format + (if None, $SB3_LOG_FORMAT, if still None, ['stdout', 'log', 'csv']) """ if folder is None: - folder = os.getenv('BASELINES_LOGDIR') + folder = os.getenv('SB3_LOGDIR') if folder is None: - folder = os.path.join(tempfile.gettempdir(), datetime.datetime.now().strftime("baselines-%Y-%m-%d-%H-%M-%S-%f")) + folder = os.path.join(tempfile.gettempdir(), datetime.datetime.now().strftime("SB3-%Y-%m-%d-%H-%M-%S-%f")) assert isinstance(folder, str) os.makedirs(folder, exist_ok=True) log_suffix = '' - if format_strs is None: - format_strs = os.getenv('BASELINES_LOG_FORMAT', 'stdout,log,csv').split(',') + if format_strings is None: + format_strings = os.getenv('SB3_LOG_FORMAT', 'stdout,log,csv').split(',') - format_strs = filter(None, format_strs) - output_formats = [make_output_format(f, folder, log_suffix) for f in format_strs] + format_strings = filter(None, format_strings) + output_formats = [make_output_format(f, folder, log_suffix) for f in format_strings] Logger.CURRENT = Logger(folder=folder, output_formats=output_formats) log(f'Logging to {folder}') @@ -524,28 +593,28 @@ def reset() -> None: class ScopedConfigure(object): - def __init__(self, folder: Optional[str] = None, format_strs: Optional[List[str]] = None): + def __init__(self, folder: Optional[str] = None, format_strings: Optional[List[str]] = None): """ Class for using context manager while logging usage: - with ScopedConfigure(folder=None, format_strs=None): + with ScopedConfigure(folder=None, format_strings=None): {code} :param folder: (str) the logging folder - :param format_strs: ([str]) the list of output logging format + :param format_strings: ([str]) the list of output logging format """ self.dir = folder - self.format_strs = format_strs - self.prevlogger = None + self.format_strings = format_strings + self.prev_logger = None def __enter__(self) -> None: - self.prevlogger = Logger.CURRENT - configure(folder=self.dir, format_strs=self.format_strs) + self.prev_logger = Logger.CURRENT + configure(folder=self.dir, format_strings=self.format_strings) def __exit__(self, *args) -> None: Logger.CURRENT.close() - Logger.CURRENT = self.prevlogger + Logger.CURRENT = self.prev_logger # ================================================================ diff --git a/stable_baselines3/common/utils.py b/stable_baselines3/common/utils.py index 7a5b676..482efc1 100644 --- a/stable_baselines3/common/utils.py +++ b/stable_baselines3/common/utils.py @@ -1,8 +1,17 @@ -from typing import Callable, Union +from typing import Callable, Union, Optional import random +import os +import glob import numpy as np import torch as th +# Check if tensorboard is available for pytorch +try: + from torch.utils.tensorboard import SummaryWriter +except ImportError: + SummaryWriter = None + +from stable_baselines3.common import logger def set_random_seed(seed: int, using_cuda: bool = False) -> None: @@ -110,3 +119,42 @@ def get_device(device: Union[th.device, str] = 'auto') -> th.device: return th.device('cpu') return device + + +def get_latest_run_id(log_path: Optional[str] = None, log_name: str = '') -> int: + """ + Returns the latest run number for the given log name and log path, + by finding the greatest number in the directories. + + :return: (int) latest run number + """ + max_run_id = 0 + for path in glob.glob(f"{log_path}/{log_name}_[0-9]*"): + file_name = path.split(os.sep)[-1] + ext = file_name.split("_")[-1] + if log_name == "_".join(file_name.split("_")[:-1]) and ext.isdigit() and int(ext) > max_run_id: + max_run_id = int(ext) + return max_run_id + + +def configure_logger(verbose: int = 0, tensorboard_log: Optional[str] = None, + tb_log_name: str = '', reset_num_timesteps: bool = True) -> None: + """ + Configure the logger's outputs. + + :param verbose: (int) the verbosity level: 0 no output, 1 info, 2 debug + :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) + :param tb_log_name: (str) tensorboard log + """ + if tensorboard_log is not None and SummaryWriter is not None: + latest_run_id = get_latest_run_id(tensorboard_log, tb_log_name) + if not reset_num_timesteps: + # Continue training in the same directory + latest_run_id -= 1 + save_path = os.path.join(tensorboard_log, f"{tb_log_name}_{latest_run_id + 1}") + if verbose >= 1: + logger.configure(save_path, ["stdout", "tensorboard"]) + else: + logger.configure(save_path, ["tensorboard"]) + elif verbose == 0: + logger.configure(format_strings=[""]) diff --git a/stable_baselines3/ppo/ppo.py b/stable_baselines3/ppo/ppo.py index c5ca153..9a0ad88 100644 --- a/stable_baselines3/ppo/ppo.py +++ b/stable_baselines3/ppo/ppo.py @@ -5,13 +5,6 @@ import gym from gym import spaces import torch as th import torch.nn.functional as F - -# Check if tensorboard is available for pytorch -# TODO: finish tensorboard integration -# try: -# from torch.utils.tensorboard import SummaryWriter -# except ImportError: -# SummaryWriter = None import numpy as np from stable_baselines3.common import logger @@ -95,10 +88,11 @@ class PPO(BaseRLModel): policy_kwargs: Optional[Dict[str, Any]] = None, verbose: int = 0, seed: Optional[int] = None, - device: Union[th.device, str] = 'auto', + device: Union[th.device, str] = "auto", _init_setup_model: bool = True): - super(PPO, self).__init__(policy, env, PPOPolicy, learning_rate, policy_kwargs=policy_kwargs, + super(PPO, self).__init__(policy, env, PPOPolicy, learning_rate, + policy_kwargs=policy_kwargs, tensorboard_log=tensorboard_log, verbose=verbose, device=device, use_sde=use_sde, sde_sample_freq=sde_sample_freq, create_eval_env=create_eval_env, support_multi_env=True, seed=seed) @@ -114,7 +108,6 @@ class PPO(BaseRLModel): self.max_grad_norm = max_grad_norm self.rollout_buffer = None self.target_kl = target_kl - self.tensorboard_log = tensorboard_log self.tb_writer = None if _init_setup_model: @@ -136,8 +129,8 @@ class PPO(BaseRLModel): 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') + 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) @@ -231,6 +224,7 @@ class PPO(BaseRLModel): # 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) @@ -282,19 +276,21 @@ class PPO(BaseRLModel): explained_var = explained_variance(self.rollout_buffer.returns.flatten(), self.rollout_buffer.values.flatten()) - logger.logkv("n_updates", self._n_updates) - logger.logkv("clip_fraction", np.mean(clip_fraction)) - logger.logkv("clip_range", clip_range) - if self.clip_range_vf is not None: - logger.logkv("clip_range_vf", clip_range_vf) + # Logs + logger.record("train/entropy_loss", np.mean(entropy_losses)) + logger.record("train/policy_gradient_loss", np.mean(pg_losses)) + logger.record("train/value_loss", np.mean(value_losses)) + logger.record("train/approx_kl", np.mean(approx_kl_divs)) + logger.record("train/clip_fraction", np.mean(clip_fraction)) + logger.record("train/loss", loss.item()) + logger.record("train/explained_variance", explained_var) + if hasattr(self.policy, "log_std"): + logger.record("train/std", th.exp(self.policy.log_std).mean().item()) - logger.logkv("approx_kl", np.mean(approx_kl_divs)) - logger.logkv("explained_variance", explained_var) - logger.logkv("entropy_loss", np.mean(entropy_losses)) - logger.logkv("policy_gradient_loss", np.mean(pg_losses)) - logger.logkv("value_loss", np.mean(value_losses)) - if hasattr(self.policy, 'log_std'): - logger.logkv("std", th.exp(self.policy.log_std).mean().item()) + logger.record("train/n_updates", self._n_updates, exclude="tensorboard") + logger.record("train/clip_range", clip_range) + if self.clip_range_vf is not None: + logger.record("train/clip_range_vf", clip_range_vf) def learn(self, total_timesteps: int, @@ -305,15 +301,12 @@ class PPO(BaseRLModel): n_eval_episodes: int = 5, tb_log_name: str = "PPO", eval_log_path: Optional[str] = None, - reset_num_timesteps: bool = True) -> 'PPO': + reset_num_timesteps: bool = True) -> "PPO": iteration = 0 - callback = self._setup_learn(eval_env, callback, eval_freq, - n_eval_episodes, eval_log_path, reset_num_timesteps) - - # if self.tensorboard_log is not None and SummaryWriter is not None: - # self.tb_writer = SummaryWriter(log_dir=os.path.join(self.tensorboard_log, tb_log_name)) - + 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) callback.on_training_start(locals(), globals()) while self.num_timesteps < total_timesteps: @@ -328,24 +321,22 @@ class PPO(BaseRLModel): iteration += 1 self._update_current_progress(self.num_timesteps, total_timesteps) - # Display training infos - if self.verbose >= 1 and log_interval is not None and iteration % log_interval == 0: + # Log training infos + if log_interval is not None and iteration % log_interval == 0: fps = int(self.num_timesteps / (time.time() - self.start_time)) - logger.logkv("iterations", iteration) + logger.record("time/iterations", iteration, exclude="tensorboard") if len(self.ep_info_buffer) > 0 and len(self.ep_info_buffer[0]) > 0: - logger.logkv('ep_rew_mean', self.safe_mean([ep_info['r'] for ep_info in self.ep_info_buffer])) - logger.logkv('ep_len_mean', self.safe_mean([ep_info['l'] for ep_info in self.ep_info_buffer])) - logger.logkv("fps", fps) - logger.logkv('time_elapsed', int(time.time() - self.start_time)) - logger.logkv("total timesteps", self.num_timesteps) - logger.dumpkvs() + logger.record("rollout/ep_rew_mean", + self.safe_mean([ep_info["r"] for ep_info in self.ep_info_buffer])) + logger.record("rollout/ep_len_mean", + self.safe_mean([ep_info["l"] for ep_info in self.ep_info_buffer])) + logger.record("time/fps", fps) + logger.record("time/time_elapsed", int(time.time() - self.start_time), exclude="tensorboard") + logger.record("time/total timesteps", self.num_timesteps, exclude="tensorboard") + logger.dump(step=self.num_timesteps) self.train(self.n_epochs, batch_size=self.batch_size) - # For tensorboard integration - # if self.tb_writer is not None: - # self.tb_writer.add_scalar('Eval/reward', mean_reward, self.num_timesteps) - callback.on_training_end() return self diff --git a/stable_baselines3/sac/sac.py b/stable_baselines3/sac/sac.py index 7d0592f..aab48d1 100644 --- a/stable_baselines3/sac/sac.py +++ b/stable_baselines3/sac/sac.py @@ -1,5 +1,4 @@ from typing import List, Tuple, Type, Union, Callable, Optional, Dict, Any - import torch as th import torch.nn.functional as F import numpy as np @@ -90,7 +89,7 @@ class SAC(OffPolicyRLModel): super(SAC, self).__init__(policy, env, SACPolicy, learning_rate, buffer_size, learning_starts, batch_size, - policy_kwargs, verbose, device, + policy_kwargs, tensorboard_log, verbose, device, create_eval_env=create_eval_env, seed=seed, use_sde=use_sde, sde_sample_freq=sde_sample_freq, use_sde_at_warmup=use_sde_at_warmup) @@ -237,12 +236,12 @@ class SAC(OffPolicyRLModel): self._n_updates += gradient_steps - logger.logkv("n_updates", self._n_updates) - logger.logkv("ent_coef", np.mean(ent_coefs)) - logger.logkv("actor_loss", np.mean(actor_losses)) - logger.logkv("critic_loss", np.mean(critic_losses)) + logger.record("train/n_updates", self._n_updates, exclude='tensorboard') + logger.record("train/ent_coef", np.mean(ent_coefs)) + logger.record("train/actor_loss", np.mean(actor_losses)) + logger.record("train/critic_loss", np.mean(critic_losses)) if len(ent_coef_losses) > 0: - logger.logkv("ent_coef_loss", np.mean(ent_coef_losses)) + logger.record("train/ent_coef_loss", np.mean(ent_coef_losses)) def learn(self, total_timesteps: int, @@ -255,8 +254,9 @@ class SAC(OffPolicyRLModel): eval_log_path: Optional[str] = None, reset_num_timesteps: bool = True) -> OffPolicyRLModel: - callback = self._setup_learn(eval_env, callback, eval_freq, - n_eval_episodes, eval_log_path, reset_num_timesteps) + 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) callback.on_training_start(locals(), globals()) while self.num_timesteps < total_timesteps: diff --git a/stable_baselines3/td3/td3.py b/stable_baselines3/td3/td3.py index ae9edce..3935023 100644 --- a/stable_baselines3/td3/td3.py +++ b/stable_baselines3/td3/td3.py @@ -74,7 +74,7 @@ class TD3(OffPolicyRLModel): super(TD3, self).__init__(policy, env, TD3Policy, learning_rate, buffer_size, learning_starts, batch_size, - policy_kwargs, verbose, device, + policy_kwargs, tensorboard_log, verbose, device, create_eval_env=create_eval_env, seed=seed, sde_support=False) @@ -152,7 +152,7 @@ class TD3(OffPolicyRLModel): target_param.data.copy_(self.tau * param.data + (1 - self.tau) * target_param.data) self._n_updates += gradient_steps - logger.logkv("n_updates", self._n_updates) + logger.record("train/n_updates", self._n_updates, exclude='tensorboard') def learn(self, total_timesteps: int, @@ -165,9 +165,9 @@ class TD3(OffPolicyRLModel): eval_log_path: Optional[str] = None, reset_num_timesteps: bool = True) -> OffPolicyRLModel: - callback = self._setup_learn(eval_env, callback, eval_freq, - n_eval_episodes, eval_log_path, reset_num_timesteps) - + 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) callback.on_training_start(locals(), globals()) while self.num_timesteps < total_timesteps: diff --git a/stable_baselines3/version.txt b/stable_baselines3/version.txt index e2e4bb2..62dbca2 100644 --- a/stable_baselines3/version.txt +++ b/stable_baselines3/version.txt @@ -1 +1 @@ -0.6.0a10 +0.6.0a11 diff --git a/tests/test_logger.py b/tests/test_logger.py index 1276d84..6975ce5 100644 --- a/tests/test_logger.py +++ b/tests/test_logger.py @@ -1,12 +1,9 @@ -import os -import shutil - import pytest import numpy as np from stable_baselines3.common.logger import (make_output_format, read_csv, read_json, DEBUG, ScopedConfigure, - info, debug, set_level, configure, logkv, logkvs, - dumpkvs, logkv_mean, warn, error, reset) + info, debug, set_level, configure, record, record_dict, + dump, record_mean, warn, error, reset) KEY_VALUES = { "test": 1, @@ -18,10 +15,12 @@ KEY_VALUES = { "g": np.array([[[1]]]), } -LOG_DIR = '/tmp/stable_baselines3/' +KEY_EXCLUDED = {} +for key in KEY_VALUES.keys(): + KEY_EXCLUDED[key] = None -def test_main(): +def test_main(tmp_path): """ tests for the logger module """ @@ -29,55 +28,56 @@ def test_main(): debug("shouldn't appear") set_level(DEBUG) debug("should appear") - folder = "/tmp/testlogging" - if os.path.exists(folder): - shutil.rmtree(folder) - configure(folder=folder) - logkv("a", 3) - logkv("b", 2.5) - dumpkvs() - logkv("b", -2.5) - logkv("a", 5.5) - dumpkvs() + configure(folder=str(tmp_path)) + record("a", 3) + record("b", 2.5) + dump() + record("b", -2.5) + record("a", 5.5) + dump() info("^^^ should see a = 5.5") - logkv_mean("b", -22.5) - logkv_mean("b", -44.4) - logkv("a", 5.5) - dumpkvs() + record_mean("b", -22.5) + record_mean("b", -44.4) + record("a", 5.5) + dump() with ScopedConfigure(None, None): info("^^^ should see b = 33.3") - with ScopedConfigure("/tmp/test-logger/", ["json"]): - logkv("b", -2.5) - dumpkvs() + with ScopedConfigure(str(tmp_path / "test-logger"), ["json"]): + record("b", -2.5) + dump() reset() - logkv("a", "longasslongasslongasslongasslongasslongassvalue") - dumpkvs() + record("a", "longasslongasslongasslongasslongasslongassvalue") + dump() warn("hey") error("oh") - logkvs({"test": 1}) + record_dict({"test": 1}) -@pytest.mark.parametrize('_format', ['stdout', 'log', 'json', 'csv']) -def test_make_output(_format): +@pytest.mark.parametrize('_format', ['stdout', 'log', 'json', 'csv', 'tensorboard']) +def test_make_output(tmp_path, _format): """ test make output :param _format: (str) output format """ - writer = make_output_format(_format, LOG_DIR) - writer.writekvs(KEY_VALUES) + if _format == 'tensorboard': + # Skip if no tensorboard installed + pytest.importorskip("tensorboard") + + writer = make_output_format(_format, tmp_path) + writer.write(KEY_VALUES, KEY_EXCLUDED) if _format == "csv": - read_csv(LOG_DIR + 'progress.csv') + read_csv(tmp_path / 'progress.csv') elif _format == 'json': - read_json(LOG_DIR + 'progress.json') + read_json(tmp_path / 'progress.json') writer.close() -def test_make_output_fail(): +def test_make_output_fail(tmp_path): """ test value error on logger """ with pytest.raises(ValueError): - make_output_format('dummy_format', LOG_DIR) + make_output_format('dummy_format', tmp_path) diff --git a/tests/test_tensorboard.py b/tests/test_tensorboard.py new file mode 100644 index 0000000..e5441a8 --- /dev/null +++ b/tests/test_tensorboard.py @@ -0,0 +1,36 @@ +import os +import pytest + +from stable_baselines3 import A2C, PPO, SAC, TD3 + +MODEL_DICT = { + 'a2c': (A2C, 'CartPole-v1'), + 'ppo': (PPO, 'CartPole-v1'), + 'sac': (SAC, 'Pendulum-v0'), + 'td3': (TD3, 'Pendulum-v0'), +} + +N_STEPS = 100 + + +@pytest.mark.parametrize("model_name", MODEL_DICT.keys()) +def test_tensorboard(tmp_path, model_name): + # Skip if no tensorboard installed + pytest.importorskip("tensorboard") + + logname = model_name.upper() + algo, env_id = MODEL_DICT[model_name] + model = algo('MlpPolicy', env_id, verbose=1, tensorboard_log=tmp_path) + model.learn(N_STEPS) + model.learn(N_STEPS, reset_num_timesteps=False) + + assert os.path.isdir(tmp_path / str(logname + "_1")) + assert not os.path.isdir(tmp_path / str(logname + "_2")) + + logname = "tb_multiple_runs_" + model_name + model.learn(N_STEPS, tb_log_name=logname) + model.learn(N_STEPS, tb_log_name=logname) + + assert os.path.isdir(tmp_path / str(logname + "_1")) + # Check that the log dir name increments correctly + assert os.path.isdir(tmp_path / str(logname + "_2")) From 403fff5d5063c31368098502f3cc66f20b6e956f Mon Sep 17 00:00:00 2001 From: Antonin RAFFIN Date: Mon, 1 Jun 2020 13:09:47 +0200 Subject: [PATCH 4/4] Pre-Release v0.6.0 (#39) * Prepare release * Update docker images --- .gitlab-ci.yml | 3 +-- Dockerfile | 1 + README.md | 3 --- docs/misc/changelog.rst | 5 ++++- stable_baselines3/common/base_class.py | 12 ++++++++++++ stable_baselines3/version.txt | 2 +- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f4798b..0b89d41 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: stablebaselines/stable-baselines3-cpu:0.6.0a7 +image: stablebaselines/stable-baselines3-cpu:0.6.0 type-check: script: @@ -15,5 +15,4 @@ doc-build: lint-check: script: - - pip install flake8 # TODO: remove when new version on Pypi - make lint diff --git a/Dockerfile b/Dockerfile index be8eb57..0b30e6d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,7 @@ RUN \ cd ${CODE_DIR}/stable-baselines3 3&& \ pip install -e .[extra,tests,docs] && \ # Use headless version for docker + pip uninstall -y opencv-python && \ pip install opencv-python-headless && \ rm -rf $HOME/.cache/pip diff --git a/README.md b/README.md index 402d556..b6716c9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ **WARNING: Stable Baselines3 is currently in a beta version, breaking changes may occur before 1.0 is released** -Note: most of the documentation of [Stable Baselines](https://github.com/hill-a/stable-baselines) should be still valid though. # Stable Baselines3 @@ -35,7 +34,6 @@ These algorithms will make it easier for the research community and industry to | High code coverage | :heavy_check_mark: | | Type hints | :heavy_check_mark: | - ### Roadmap to V1.0 @@ -45,7 +43,6 @@ Planned features: - [ ] DQN (almost ready, currently in testing phase) - [ ] DDPG (you can use its successor TD3 for now) - [ ] HER -- [ ] Support for MultiDiscrete and MultiBinary action spaces ### Planned features (v1.1+) diff --git a/docs/misc/changelog.rst b/docs/misc/changelog.rst index 8df8ef8..d01cdaa 100644 --- a/docs/misc/changelog.rst +++ b/docs/misc/changelog.rst @@ -3,9 +3,11 @@ Changelog ========== -Pre-Release 0.6.0a11 (WIP) +Pre-Release 0.6.0 (2020-06-01) ------------------------------ +**Tensorboard support, refactored logger** + Breaking Changes: ^^^^^^^^^^^^^^^^^ - Remove State-Dependent Exploration (SDE) support for ``TD3`` @@ -47,6 +49,7 @@ Others: - Added ``.readthedoc.yml`` file - Added ``flake8`` and ``make lint`` command - Added Github workflow +- Added warning when passing both ``train_freq`` and ``n_episodes_rollout`` to Off-Policy Algorithms Documentation: ^^^^^^^^^^^^^^ diff --git a/stable_baselines3/common/base_class.py b/stable_baselines3/common/base_class.py index e24bd2c..e64243c 100644 --- a/stable_baselines3/common/base_class.py +++ b/stable_baselines3/common/base_class.py @@ -3,6 +3,7 @@ import os import io import zipfile import pickle +import warnings from typing import Union, Type, Optional, Dict, Any, List, Tuple, Callable from abc import ABC, abstractmethod from collections import deque @@ -800,6 +801,17 @@ class OffPolicyRLModel(BaseRLModel): assert isinstance(env, VecEnv), "You must pass a VecEnv" assert env.num_envs == 1, "OffPolicyRLModel only support single environment" + if n_episodes > 0 and n_steps > 0: + # Note we are refering to the constructor arguments + # that are named `train_freq` and `n_episodes_rollout` + # but correspond to `n_steps` and `n_episodes` here + warnings.warn("You passed a positive value for `train_freq` and `n_episodes_rollout`." + "Please make sure this is intended. " + "The agent will collect data by stepping in the environment " + "until both conditions are true: " + "`number of steps in the env` >= `train_freq` and " + "`number of episodes` > `n_episodes_rollout`") + if self.use_sde: self.actor.reset_noise() diff --git a/stable_baselines3/version.txt b/stable_baselines3/version.txt index 62dbca2..a918a2a 100644 --- a/stable_baselines3/version.txt +++ b/stable_baselines3/version.txt @@ -1 +1 @@ -0.6.0a11 +0.6.0