From 6e89a5c997aa3a26c2faaff78ce77ad17794174c Mon Sep 17 00:00:00 2001 From: roger-creus Date: Wed, 17 Jul 2024 12:32:26 -0400 Subject: [PATCH 1/9] wip --- cleanrl/dqn.py | 4 +- cleanrl/pqn.py | 277 ++++++++++++++++++++++++++++++++++++++++++ cleanrl/pqn_atari.py | 279 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 559 insertions(+), 1 deletion(-) create mode 100644 cleanrl/pqn.py create mode 100644 cleanrl/pqn_atari.py diff --git a/cleanrl/dqn.py b/cleanrl/dqn.py index e74e289c3..7ca633a44 100644 --- a/cleanrl/dqn.py +++ b/cleanrl/dqn.py @@ -69,6 +69,8 @@ class Args: """timestep to start learning""" train_frequency: int = 10 """the frequency of training""" + rew_scale: float = 0.1 + """the reward scaling factor""" def make_env(env_id, seed, idx, capture_video, run_name): @@ -193,7 +195,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): for idx, trunc in enumerate(truncations): if trunc: real_next_obs[idx] = infos["final_observation"][idx] - rb.add(obs, real_next_obs, actions, rewards, terminations, infos) + rb.add(obs, real_next_obs, actions, rewards * args.rew_scale, terminations, infos) # TRY NOT TO MODIFY: CRUCIAL step easy to overlook obs = next_obs diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py new file mode 100644 index 000000000..4814e6ba1 --- /dev/null +++ b/cleanrl/pqn.py @@ -0,0 +1,277 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/dqn/#dqnpy +import os +import random +import time +from dataclasses import dataclass + +import envpool +import gym +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import tyro +from stable_baselines3.common.buffers import ReplayBuffer +from torch.utils.tensorboard import SummaryWriter +from collections import deque +from IPython import embed + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + + # Algorithm specific arguments + env_id: str = "CartPole-v1" + """the id of the environment""" + total_timesteps: int = 500000 + """total timesteps of the experiments""" + learning_rate: float = 2.5e-4 + """the learning rate of the optimizer""" + num_envs: int = 32 + """the number of parallel game environments""" + num_steps: int = 64 + """the number of steps to run for each environment per update""" + num_minibatches: int = 16 + """the number of mini-batches""" + update_epochs: int = 2 + """the K epochs to update the policy""" + anneal_lr: bool = True + """Toggle learning rate annealing""" + gamma: float = 0.99 + """the discount factor gamma""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.05 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.5 + """the fraction of `total_timesteps` it takes from start_e to end_e""" + max_grad_norm: float = 10.0 + """the maximum norm for the gradient clipping""" + rew_scale: float = 0.1 + """the reward scaling factor""" + q_lambda: float = 0.65 + """the lambda for Q(lambda)""" + +class RecordEpisodeStatistics(gym.Wrapper): + def __init__(self, env, deque_size=100): + super().__init__(env) + self.num_envs = getattr(env, "num_envs", 1) + self.episode_returns = None + self.episode_lengths = None + + def reset(self, **kwargs): + observations = super().reset(**kwargs) + self.episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + self.lives = np.zeros(self.num_envs, dtype=np.int32) + self.returned_episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.returned_episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + return observations + + def step(self, action): + observations, rewards, dones, infos = super().step(action) + self.episode_returns += rewards + self.episode_lengths += 1 + self.returned_episode_returns[:] = self.episode_returns + self.returned_episode_lengths[:] = self.episode_lengths + self.episode_returns *= 1 - dones + self.episode_lengths *= 1 - dones + infos["r"] = self.returned_episode_returns + infos["l"] = self.returned_episode_lengths + return ( + observations, + rewards, + dones, + infos, + ) + +# ALGO LOGIC: initialize agent here: +class QNetwork(nn.Module): + def __init__(self, env, norm_type="layer_norm", norm_input=False): + super().__init__() + + # wether to normalize the input or not + if norm_input: + self.norm_in = nn.BatchNorm1d(np.array(env.single_observation_space.shape).prod()) + + # wether to use layer norm or batch norm for internal layers + if norm_type == "layer_norm": + self.norm = nn.LayerNorm + elif norm_type == "batch_norm": + self.norm = nn.BatchNorm1d + else: + self.norm = lambda x: x + + self.network = nn.Sequential( + nn.Linear(np.array(env.single_observation_space.shape).prod(), 120), + self.norm(120), + nn.ReLU(), + nn.Linear(120, 84), + self.norm(84), + nn.ReLU(), + nn.Linear(84, env.single_action_space.n), + ) + + def forward(self, x): + return self.network(x) + + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = envpool.make( + args.env_id, + env_type="gym", + num_envs=args.num_envs, + seed=args.seed, + ) + envs.num_envs = args.num_envs + envs.single_action_space = envs.action_space + envs.single_observation_space = envs.observation_space + envs = RecordEpisodeStatistics(envs) + assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" + + # agent setup + q_network = QNetwork(envs).to(device) + optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + + # storage setup + obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) + actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) + rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) + dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + avg_returns = deque(maxlen=20) + + global_step = 0 + start_time = time.time() + + # TRY NOT TO MODIFY: start the game + next_obs = torch.Tensor(envs.reset()).to(device) + next_done = torch.zeros(args.num_envs).to(device) + + for iteration in range(1, args.num_iterations + 1): + # Annealing the rate if instructed to do so. + if args.anneal_lr: + frac = 1.0 - (iteration - 1.0) / args.num_iterations + lrnow = frac * args.learning_rate + optimizer.param_groups[0]["lr"] = lrnow + + for step in range(0, args.num_steps): + global_step += args.num_envs + obs[step] = next_obs + dones[step] = next_done + + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + if random.random() < epsilon: + action = torch.randint(0, envs.single_action_space.n, (envs.num_envs,)) + else: + q_values = q_network(next_obs) + action = torch.argmax(q_values, dim=1) + actions[step] = action + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) + rewards[step] = torch.tensor(reward).to(device).view(-1) * args.rew_scale + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + # TRY NOT TO MODIFY: record rewards for plotting purposes + for idx, d in enumerate(next_done): + if d: + print(f"global_step={global_step}, episodic_return={info['r'][idx]}") + avg_returns.append(info["r"][idx]) + writer.add_scalar("charts/avg_episodic_return", np.average(avg_returns), global_step) + writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) + writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) + + # bootstrap value if not done + with torch.no_grad(): + returns = torch.zeros_like(rewards).to(device) + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + next_value, _ = torch.max(q_network(next_obs), dim=-1) + nextnonterminal = 1.0 - next_done + returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal + else: + nextnonterminal = 1.0 - dones[t + 1] + next_value, _ = torch.max(q_network(obs[t + 1]), dim=-1) + returns[t] = rewards[t] + args.gamma * (args.q_lambda * returns[t+1] + (1-args.q_lambda) * next_value * nextnonterminal) + + # flatten the batch + b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) + b_actions = actions.reshape((-1,) + envs.single_action_space.shape) + b_returns = returns.reshape(-1) + + # Optimizing the Q-network + b_inds = np.arange(args.batch_size) + for epoch in range(args.update_epochs): + np.random.shuffle(b_inds) + for start in range(0, args.batch_size, args.minibatch_size): + end = start + args.minibatch_size + mb_inds = b_inds[start:end] + + old_val = q_network(b_obs[mb_inds]).gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() + loss = F.mse_loss(b_returns[mb_inds], old_val) + + # optimize the model + optimizer.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(q_network.parameters(), args.max_grad_norm) + optimizer.step() + + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + envs.close() + writer.close() diff --git a/cleanrl/pqn_atari.py b/cleanrl/pqn_atari.py new file mode 100644 index 000000000..a23b84391 --- /dev/null +++ b/cleanrl/pqn_atari.py @@ -0,0 +1,279 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/dqn/#dqn_ataripy +import os +import random +import time +from dataclasses import dataclass + +import gymnasium as gym +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import tyro +from stable_baselines3.common.atari_wrappers import ( + ClipRewardEnv, + EpisodicLifeEnv, + FireResetEnv, + MaxAndSkipEnv, + NoopResetEnv, +) +from stable_baselines3.common.buffers import ReplayBuffer +from torch.utils.tensorboard import SummaryWriter + + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + save_model: bool = False + """whether to save model into the `runs/{run_name}` folder""" + upload_model: bool = False + """whether to upload the saved model to huggingface""" + hf_entity: str = "" + """the user or org name of the model repository from the Hugging Face Hub""" + + # Algorithm specific arguments + env_id: str = "BreakoutNoFrameskip-v4" + """the id of the environment""" + total_timesteps: int = 10000000 + """total timesteps of the experiments""" + learning_rate: float = 1e-4 + """the learning rate of the optimizer""" + num_envs: int = 1 + """the number of parallel game environments""" + buffer_size: int = 1000000 + """the replay memory buffer size""" + gamma: float = 0.99 + """the discount factor gamma""" + tau: float = 1.0 + """the target network update rate""" + target_network_frequency: int = 1000 + """the timesteps it takes to update the target network""" + batch_size: int = 32 + """the batch size of sample from the reply memory""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.01 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.10 + """the fraction of `total-timesteps` it takes from start-e to go end-e""" + learning_starts: int = 80000 + """timestep to start learning""" + train_frequency: int = 4 + """the frequency of training""" + + +def make_env(env_id, seed, idx, capture_video, run_name): + def thunk(): + if capture_video and idx == 0: + env = gym.make(env_id, render_mode="rgb_array") + env = gym.wrappers.RecordVideo(env, f"videos/{run_name}") + else: + env = gym.make(env_id) + env = gym.wrappers.RecordEpisodeStatistics(env) + + env = NoopResetEnv(env, noop_max=30) + env = MaxAndSkipEnv(env, skip=4) + env = EpisodicLifeEnv(env) + if "FIRE" in env.unwrapped.get_action_meanings(): + env = FireResetEnv(env) + env = ClipRewardEnv(env) + env = gym.wrappers.ResizeObservation(env, (84, 84)) + env = gym.wrappers.GrayScaleObservation(env) + env = gym.wrappers.FrameStack(env, 4) + + env.action_space.seed(seed) + return env + + return thunk + + +# ALGO LOGIC: initialize agent here: +class QNetwork(nn.Module): + def __init__(self, env): + super().__init__() + self.network = nn.Sequential( + nn.Conv2d(4, 32, 8, stride=4), + nn.ReLU(), + nn.Conv2d(32, 64, 4, stride=2), + nn.ReLU(), + nn.Conv2d(64, 64, 3, stride=1), + nn.ReLU(), + nn.Flatten(), + nn.Linear(3136, 512), + nn.ReLU(), + nn.Linear(512, env.single_action_space.n), + ) + + def forward(self, x): + return self.network(x / 255.0) + + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + + +if __name__ == "__main__": + import stable_baselines3 as sb3 + + if sb3.__version__ < "2.0": + raise ValueError( + """Ongoing migration: run the following command to install the new dependencies: + +poetry run pip install "stable_baselines3==2.0.0a1" "gymnasium[atari,accept-rom-license]==0.28.1" "ale-py==0.8.1" +""" + ) + args = tyro.cli(Args) + assert args.num_envs == 1, "vectorized envs are not supported at the moment" + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = gym.vector.SyncVectorEnv( + [make_env(args.env_id, args.seed + i, i, args.capture_video, run_name) for i in range(args.num_envs)] + ) + assert isinstance(envs.single_action_space, gym.spaces.Discrete), "only discrete action space is supported" + + q_network = QNetwork(envs).to(device) + optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + target_network = QNetwork(envs).to(device) + target_network.load_state_dict(q_network.state_dict()) + + rb = ReplayBuffer( + args.buffer_size, + envs.single_observation_space, + envs.single_action_space, + device, + optimize_memory_usage=True, + handle_timeout_termination=False, + ) + start_time = time.time() + + # TRY NOT TO MODIFY: start the game + obs, _ = envs.reset(seed=args.seed) + for global_step in range(args.total_timesteps): + # ALGO LOGIC: put action logic here + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + if random.random() < epsilon: + actions = np.array([envs.single_action_space.sample() for _ in range(envs.num_envs)]) + else: + q_values = q_network(torch.Tensor(obs).to(device)) + actions = torch.argmax(q_values, dim=1).cpu().numpy() + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, rewards, terminations, truncations, infos = envs.step(actions) + + # TRY NOT TO MODIFY: record rewards for plotting purposes + if "final_info" in infos: + for info in infos["final_info"]: + if info and "episode" in info: + print(f"global_step={global_step}, episodic_return={info['episode']['r']}") + writer.add_scalar("charts/episodic_return", info["episode"]["r"], global_step) + writer.add_scalar("charts/episodic_length", info["episode"]["l"], global_step) + + # TRY NOT TO MODIFY: save data to reply buffer; handle `final_observation` + real_next_obs = next_obs.copy() + for idx, trunc in enumerate(truncations): + if trunc: + real_next_obs[idx] = infos["final_observation"][idx] + rb.add(obs, real_next_obs, actions, rewards, terminations, infos) + + # TRY NOT TO MODIFY: CRUCIAL step easy to overlook + obs = next_obs + + # ALGO LOGIC: training. + if global_step > args.learning_starts: + if global_step % args.train_frequency == 0: + data = rb.sample(args.batch_size) + with torch.no_grad(): + target_max, _ = target_network(data.next_observations).max(dim=1) + td_target = data.rewards.flatten() + args.gamma * target_max * (1 - data.dones.flatten()) + old_val = q_network(data.observations).gather(1, data.actions).squeeze() + loss = F.mse_loss(td_target, old_val) + + if global_step % 100 == 0: + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + # optimize the model + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # update target network + if global_step % args.target_network_frequency == 0: + for target_network_param, q_network_param in zip(target_network.parameters(), q_network.parameters()): + target_network_param.data.copy_( + args.tau * q_network_param.data + (1.0 - args.tau) * target_network_param.data + ) + + if args.save_model: + model_path = f"runs/{run_name}/{args.exp_name}.cleanrl_model" + torch.save(q_network.state_dict(), model_path) + print(f"model saved to {model_path}") + from cleanrl_utils.evals.dqn_eval import evaluate + + episodic_returns = evaluate( + model_path, + make_env, + args.env_id, + eval_episodes=10, + run_name=f"{run_name}-eval", + Model=QNetwork, + device=device, + epsilon=0.05, + ) + for idx, episodic_return in enumerate(episodic_returns): + writer.add_scalar("eval/episodic_return", episodic_return, idx) + + if args.upload_model: + from cleanrl_utils.huggingface import push_to_hub + + repo_name = f"{args.env_id}-{args.exp_name}-seed{args.seed}" + repo_id = f"{args.hf_entity}/{repo_name}" if args.hf_entity else repo_name + push_to_hub(args, episodic_returns, repo_id, "DQN", f"runs/{run_name}", f"videos/{run_name}-eval") + + envs.close() + writer.close() From e9f158f4c825d6ddb21cd233f2a2efa4ef58e4df Mon Sep 17 00:00:00 2001 From: roger-creus Date: Wed, 17 Jul 2024 12:45:30 -0400 Subject: [PATCH 2/9] wip --- cleanrl/pqn.py | 26 +--- cleanrl/pqn_atari.py | 279 ----------------------------------- cleanrl/pqn_atari_envpool.py | 275 ++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+), 298 deletions(-) delete mode 100644 cleanrl/pqn_atari.py create mode 100644 cleanrl/pqn_atari_envpool.py diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py index 4814e6ba1..1b9b3b7bc 100644 --- a/cleanrl/pqn.py +++ b/cleanrl/pqn.py @@ -15,7 +15,6 @@ from stable_baselines3.common.buffers import ReplayBuffer from torch.utils.tensorboard import SummaryWriter from collections import deque -from IPython import embed @dataclass class Args: @@ -103,27 +102,15 @@ def step(self, action): # ALGO LOGIC: initialize agent here: class QNetwork(nn.Module): - def __init__(self, env, norm_type="layer_norm", norm_input=False): + def __init__(self, env): super().__init__() - # wether to normalize the input or not - if norm_input: - self.norm_in = nn.BatchNorm1d(np.array(env.single_observation_space.shape).prod()) - - # wether to use layer norm or batch norm for internal layers - if norm_type == "layer_norm": - self.norm = nn.LayerNorm - elif norm_type == "batch_norm": - self.norm = nn.BatchNorm1d - else: - self.norm = lambda x: x - self.network = nn.Sequential( nn.Linear(np.array(env.single_observation_space.shape).prod(), 120), - self.norm(120), + nn.LayerNorm(120), nn.ReLU(), nn.Linear(120, 84), - self.norm(84), + nn.LayerNorm(84), nn.ReLU(), nn.Linear(84, env.single_action_space.n), ) @@ -215,8 +202,9 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): if random.random() < epsilon: action = torch.randint(0, envs.single_action_space.n, (envs.num_envs,)) else: - q_values = q_network(next_obs) - action = torch.argmax(q_values, dim=1) + with torch.no_grad(): + q_values = q_network(next_obs) + action = torch.argmax(q_values, dim=1) actions[step] = action # TRY NOT TO MODIFY: execute the game and log data. @@ -233,7 +221,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) - # bootstrap value if not done + # Compute Q(lambda) targets with torch.no_grad(): returns = torch.zeros_like(rewards).to(device) for t in reversed(range(args.num_steps)): diff --git a/cleanrl/pqn_atari.py b/cleanrl/pqn_atari.py deleted file mode 100644 index a23b84391..000000000 --- a/cleanrl/pqn_atari.py +++ /dev/null @@ -1,279 +0,0 @@ -# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/dqn/#dqn_ataripy -import os -import random -import time -from dataclasses import dataclass - -import gymnasium as gym -import numpy as np -import torch -import torch.nn as nn -import torch.nn.functional as F -import torch.optim as optim -import tyro -from stable_baselines3.common.atari_wrappers import ( - ClipRewardEnv, - EpisodicLifeEnv, - FireResetEnv, - MaxAndSkipEnv, - NoopResetEnv, -) -from stable_baselines3.common.buffers import ReplayBuffer -from torch.utils.tensorboard import SummaryWriter - - -@dataclass -class Args: - exp_name: str = os.path.basename(__file__)[: -len(".py")] - """the name of this experiment""" - seed: int = 1 - """seed of the experiment""" - torch_deterministic: bool = True - """if toggled, `torch.backends.cudnn.deterministic=False`""" - cuda: bool = True - """if toggled, cuda will be enabled by default""" - track: bool = False - """if toggled, this experiment will be tracked with Weights and Biases""" - wandb_project_name: str = "cleanRL" - """the wandb's project name""" - wandb_entity: str = None - """the entity (team) of wandb's project""" - capture_video: bool = False - """whether to capture videos of the agent performances (check out `videos` folder)""" - save_model: bool = False - """whether to save model into the `runs/{run_name}` folder""" - upload_model: bool = False - """whether to upload the saved model to huggingface""" - hf_entity: str = "" - """the user or org name of the model repository from the Hugging Face Hub""" - - # Algorithm specific arguments - env_id: str = "BreakoutNoFrameskip-v4" - """the id of the environment""" - total_timesteps: int = 10000000 - """total timesteps of the experiments""" - learning_rate: float = 1e-4 - """the learning rate of the optimizer""" - num_envs: int = 1 - """the number of parallel game environments""" - buffer_size: int = 1000000 - """the replay memory buffer size""" - gamma: float = 0.99 - """the discount factor gamma""" - tau: float = 1.0 - """the target network update rate""" - target_network_frequency: int = 1000 - """the timesteps it takes to update the target network""" - batch_size: int = 32 - """the batch size of sample from the reply memory""" - start_e: float = 1 - """the starting epsilon for exploration""" - end_e: float = 0.01 - """the ending epsilon for exploration""" - exploration_fraction: float = 0.10 - """the fraction of `total-timesteps` it takes from start-e to go end-e""" - learning_starts: int = 80000 - """timestep to start learning""" - train_frequency: int = 4 - """the frequency of training""" - - -def make_env(env_id, seed, idx, capture_video, run_name): - def thunk(): - if capture_video and idx == 0: - env = gym.make(env_id, render_mode="rgb_array") - env = gym.wrappers.RecordVideo(env, f"videos/{run_name}") - else: - env = gym.make(env_id) - env = gym.wrappers.RecordEpisodeStatistics(env) - - env = NoopResetEnv(env, noop_max=30) - env = MaxAndSkipEnv(env, skip=4) - env = EpisodicLifeEnv(env) - if "FIRE" in env.unwrapped.get_action_meanings(): - env = FireResetEnv(env) - env = ClipRewardEnv(env) - env = gym.wrappers.ResizeObservation(env, (84, 84)) - env = gym.wrappers.GrayScaleObservation(env) - env = gym.wrappers.FrameStack(env, 4) - - env.action_space.seed(seed) - return env - - return thunk - - -# ALGO LOGIC: initialize agent here: -class QNetwork(nn.Module): - def __init__(self, env): - super().__init__() - self.network = nn.Sequential( - nn.Conv2d(4, 32, 8, stride=4), - nn.ReLU(), - nn.Conv2d(32, 64, 4, stride=2), - nn.ReLU(), - nn.Conv2d(64, 64, 3, stride=1), - nn.ReLU(), - nn.Flatten(), - nn.Linear(3136, 512), - nn.ReLU(), - nn.Linear(512, env.single_action_space.n), - ) - - def forward(self, x): - return self.network(x / 255.0) - - -def linear_schedule(start_e: float, end_e: float, duration: int, t: int): - slope = (end_e - start_e) / duration - return max(slope * t + start_e, end_e) - - -if __name__ == "__main__": - import stable_baselines3 as sb3 - - if sb3.__version__ < "2.0": - raise ValueError( - """Ongoing migration: run the following command to install the new dependencies: - -poetry run pip install "stable_baselines3==2.0.0a1" "gymnasium[atari,accept-rom-license]==0.28.1" "ale-py==0.8.1" -""" - ) - args = tyro.cli(Args) - assert args.num_envs == 1, "vectorized envs are not supported at the moment" - run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" - if args.track: - import wandb - - wandb.init( - project=args.wandb_project_name, - entity=args.wandb_entity, - sync_tensorboard=True, - config=vars(args), - name=run_name, - monitor_gym=True, - save_code=True, - ) - writer = SummaryWriter(f"runs/{run_name}") - writer.add_text( - "hyperparameters", - "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), - ) - - # TRY NOT TO MODIFY: seeding - random.seed(args.seed) - np.random.seed(args.seed) - torch.manual_seed(args.seed) - torch.backends.cudnn.deterministic = args.torch_deterministic - - device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") - - # env setup - envs = gym.vector.SyncVectorEnv( - [make_env(args.env_id, args.seed + i, i, args.capture_video, run_name) for i in range(args.num_envs)] - ) - assert isinstance(envs.single_action_space, gym.spaces.Discrete), "only discrete action space is supported" - - q_network = QNetwork(envs).to(device) - optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) - target_network = QNetwork(envs).to(device) - target_network.load_state_dict(q_network.state_dict()) - - rb = ReplayBuffer( - args.buffer_size, - envs.single_observation_space, - envs.single_action_space, - device, - optimize_memory_usage=True, - handle_timeout_termination=False, - ) - start_time = time.time() - - # TRY NOT TO MODIFY: start the game - obs, _ = envs.reset(seed=args.seed) - for global_step in range(args.total_timesteps): - # ALGO LOGIC: put action logic here - epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) - if random.random() < epsilon: - actions = np.array([envs.single_action_space.sample() for _ in range(envs.num_envs)]) - else: - q_values = q_network(torch.Tensor(obs).to(device)) - actions = torch.argmax(q_values, dim=1).cpu().numpy() - - # TRY NOT TO MODIFY: execute the game and log data. - next_obs, rewards, terminations, truncations, infos = envs.step(actions) - - # TRY NOT TO MODIFY: record rewards for plotting purposes - if "final_info" in infos: - for info in infos["final_info"]: - if info and "episode" in info: - print(f"global_step={global_step}, episodic_return={info['episode']['r']}") - writer.add_scalar("charts/episodic_return", info["episode"]["r"], global_step) - writer.add_scalar("charts/episodic_length", info["episode"]["l"], global_step) - - # TRY NOT TO MODIFY: save data to reply buffer; handle `final_observation` - real_next_obs = next_obs.copy() - for idx, trunc in enumerate(truncations): - if trunc: - real_next_obs[idx] = infos["final_observation"][idx] - rb.add(obs, real_next_obs, actions, rewards, terminations, infos) - - # TRY NOT TO MODIFY: CRUCIAL step easy to overlook - obs = next_obs - - # ALGO LOGIC: training. - if global_step > args.learning_starts: - if global_step % args.train_frequency == 0: - data = rb.sample(args.batch_size) - with torch.no_grad(): - target_max, _ = target_network(data.next_observations).max(dim=1) - td_target = data.rewards.flatten() + args.gamma * target_max * (1 - data.dones.flatten()) - old_val = q_network(data.observations).gather(1, data.actions).squeeze() - loss = F.mse_loss(td_target, old_val) - - if global_step % 100 == 0: - writer.add_scalar("losses/td_loss", loss, global_step) - writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) - print("SPS:", int(global_step / (time.time() - start_time))) - writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) - - # optimize the model - optimizer.zero_grad() - loss.backward() - optimizer.step() - - # update target network - if global_step % args.target_network_frequency == 0: - for target_network_param, q_network_param in zip(target_network.parameters(), q_network.parameters()): - target_network_param.data.copy_( - args.tau * q_network_param.data + (1.0 - args.tau) * target_network_param.data - ) - - if args.save_model: - model_path = f"runs/{run_name}/{args.exp_name}.cleanrl_model" - torch.save(q_network.state_dict(), model_path) - print(f"model saved to {model_path}") - from cleanrl_utils.evals.dqn_eval import evaluate - - episodic_returns = evaluate( - model_path, - make_env, - args.env_id, - eval_episodes=10, - run_name=f"{run_name}-eval", - Model=QNetwork, - device=device, - epsilon=0.05, - ) - for idx, episodic_return in enumerate(episodic_returns): - writer.add_scalar("eval/episodic_return", episodic_return, idx) - - if args.upload_model: - from cleanrl_utils.huggingface import push_to_hub - - repo_name = f"{args.env_id}-{args.exp_name}-seed{args.seed}" - repo_id = f"{args.hf_entity}/{repo_name}" if args.hf_entity else repo_name - push_to_hub(args, episodic_returns, repo_id, "DQN", f"runs/{run_name}", f"videos/{run_name}-eval") - - envs.close() - writer.close() diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py new file mode 100644 index 000000000..e8ddc8e8e --- /dev/null +++ b/cleanrl/pqn_atari_envpool.py @@ -0,0 +1,275 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_atari_envpoolpy +import os +import random +import time +from collections import deque +from dataclasses import dataclass + +import envpool +import gym +import numpy as np +import torch +import torch.nn as nn +import torch.optim as optim +import tyro +from torch.utils.tensorboard import SummaryWriter +import torch.nn.functional as F + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + + # Algorithm specific arguments + env_id: str = "Breakout-v5" + """the id of the environment""" + total_timesteps: int = 10000000 + """total timesteps of the experiments""" + learning_rate: float = 2.5e-4 + """the learning rate of the optimizer""" + num_envs: int = 128 + """the number of parallel game environments""" + num_steps: int = 32 + """the number of steps to run in each environment per policy rollout""" + anneal_lr: bool = True + """Toggle learning rate annealing for policy and value networks""" + gamma: float = 0.99 + """the discount factor gamma""" + num_minibatches: int = 32 + """the number of mini-batches""" + update_epochs: int = 2 + """the K epochs to update the policy""" + max_grad_norm: float = 10.0 + """the maximum norm for the gradient clipping""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.01 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.10 + """the fraction of `total_timesteps` it takes from start_e to end_e""" + q_lambda: float = 0.65 + """the lambda for the Q-Learning algorithm""" + + # to be filled in runtime + batch_size: int = 0 + """the batch size (computed in runtime)""" + minibatch_size: int = 0 + """the mini-batch size (computed in runtime)""" + num_iterations: int = 0 + """the number of iterations (computed in runtime)""" + + +class RecordEpisodeStatistics(gym.Wrapper): + def __init__(self, env, deque_size=100): + super().__init__(env) + self.num_envs = getattr(env, "num_envs", 1) + self.episode_returns = None + self.episode_lengths = None + + def reset(self, **kwargs): + observations = super().reset(**kwargs) + self.episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + self.lives = np.zeros(self.num_envs, dtype=np.int32) + self.returned_episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.returned_episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + return observations + + def step(self, action): + observations, rewards, dones, infos = super().step(action) + self.episode_returns += infos["reward"] + self.episode_lengths += 1 + self.returned_episode_returns[:] = self.episode_returns + self.returned_episode_lengths[:] = self.episode_lengths + self.episode_returns *= 1 - infos["terminated"] + self.episode_lengths *= 1 - infos["terminated"] + infos["r"] = self.returned_episode_returns + infos["l"] = self.returned_episode_lengths + return ( + observations, + rewards, + dones, + infos, + ) + +# ALGO LOGIC: initialize agent here: +class QNetwork(nn.Module): + def __init__(self, env): + super().__init__() + self.network = nn.Sequential( + nn.Conv2d(4, 32, 8, stride=4), + nn.LayerNorm([32, 20, 20]), + nn.ReLU(), + nn.Conv2d(32, 64, 4, stride=2), + nn.LayerNorm([64, 9, 9]), + nn.ReLU(), + nn.Conv2d(64, 64, 3, stride=1), + nn.LayerNorm([64, 7, 7]), + nn.ReLU(), + nn.Flatten(), + nn.Linear(3136, 512), + nn.LayerNorm(512), + nn.ReLU(), + nn.Linear(512, env.single_action_space.n), + ) + + def forward(self, x): + return self.network(x / 255.0) + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = envpool.make( + args.env_id, + env_type="gym", + num_envs=args.num_envs, + episodic_life=True, + reward_clip=True, + seed=args.seed, + ) + envs.num_envs = args.num_envs + envs.single_action_space = envs.action_space + envs.single_observation_space = envs.observation_space + envs = RecordEpisodeStatistics(envs) + assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" + + q_network = QNetwork(envs).to(device) + optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + + # ALGO Logic: Storage setup + obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) + actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) + rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) + dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + avg_returns = deque(maxlen=20) + + # TRY NOT TO MODIFY: start the game + global_step = 0 + start_time = time.time() + next_obs = torch.Tensor(envs.reset()).to(device) + next_done = torch.zeros(args.num_envs).to(device) + + for iteration in range(1, args.num_iterations + 1): + # Annealing the rate if instructed to do so. + if args.anneal_lr: + frac = 1.0 - (iteration - 1.0) / args.num_iterations + lrnow = frac * args.learning_rate + optimizer.param_groups[0]["lr"] = lrnow + + for step in range(0, args.num_steps): + global_step += args.num_envs + obs[step] = next_obs + dones[step] = next_done + + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + if random.random() < epsilon: + action = torch.randint(0, envs.single_action_space.n, (envs.num_envs,)) + else: + with torch.no_grad(): + q_values = q_network(next_obs) + action = torch.argmax(q_values, dim=1) + actions[step] = action + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) + rewards[step] = torch.tensor(reward).to(device).view(-1) + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + for idx, d in enumerate(next_done): + if d and info["lives"][idx] == 0: + print(f"global_step={global_step}, episodic_return={info['r'][idx]}") + avg_returns.append(info["r"][idx]) + writer.add_scalar("charts/avg_episodic_return", np.average(avg_returns), global_step) + writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) + writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) + + # Compute Q(lambda) targets + with torch.no_grad(): + returns = torch.zeros_like(rewards).to(device) + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + next_value, _ = torch.max(q_network(next_obs), dim=-1) + nextnonterminal = 1.0 - next_done + returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal + else: + nextnonterminal = 1.0 - dones[t + 1] + next_value, _ = torch.max(q_network(obs[t + 1]), dim=-1) + returns[t] = rewards[t] + args.gamma * (args.q_lambda * returns[t+1] + (1-args.q_lambda) * next_value * nextnonterminal) + + # flatten the batch + b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) + b_actions = actions.reshape((-1,) + envs.single_action_space.shape) + b_returns = returns.reshape(-1) + + # Optimizing the Q-network + b_inds = np.arange(args.batch_size) + for epoch in range(args.update_epochs): + np.random.shuffle(b_inds) + for start in range(0, args.batch_size, args.minibatch_size): + end = start + args.minibatch_size + mb_inds = b_inds[start:end] + + old_val = q_network(b_obs[mb_inds]).gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() + loss = F.mse_loss(b_returns[mb_inds], old_val) + + # optimize the model + optimizer.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(q_network.parameters(), args.max_grad_norm) + optimizer.step() + + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + envs.close() + writer.close() From 21226d78941b583fc7941a10c469c4f78769d011 Mon Sep 17 00:00:00 2001 From: roger-creus Date: Wed, 17 Jul 2024 14:37:19 -0400 Subject: [PATCH 3/9] Run pre-commit run --all-files --- cleanrl/pqn.py | 25 +++++++++++++++---------- cleanrl/pqn_atari_envpool.py | 14 ++++++++++---- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py index 1b9b3b7bc..f29060e01 100644 --- a/cleanrl/pqn.py +++ b/cleanrl/pqn.py @@ -2,6 +2,7 @@ import os import random import time +from collections import deque from dataclasses import dataclass import envpool @@ -12,9 +13,8 @@ import torch.nn.functional as F import torch.optim as optim import tyro -from stable_baselines3.common.buffers import ReplayBuffer from torch.utils.tensorboard import SummaryWriter -from collections import deque + @dataclass class Args: @@ -34,7 +34,7 @@ class Args: """the entity (team) of wandb's project""" capture_video: bool = False """whether to capture videos of the agent performances (check out `videos` folder)""" - + # Algorithm specific arguments env_id: str = "CartPole-v1" """the id of the environment""" @@ -66,7 +66,8 @@ class Args: """the reward scaling factor""" q_lambda: float = 0.65 """the lambda for Q(lambda)""" - + + class RecordEpisodeStatistics(gym.Wrapper): def __init__(self, env, deque_size=100): super().__init__(env) @@ -100,11 +101,12 @@ def step(self, action): infos, ) + # ALGO LOGIC: initialize agent here: class QNetwork(nn.Module): def __init__(self, env): super().__init__() - + self.network = nn.Sequential( nn.Linear(np.array(env.single_observation_space.shape).prod(), 120), nn.LayerNorm(120), @@ -123,6 +125,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): slope = (end_e - start_e) / duration return max(slope * t + start_e, end_e) + if __name__ == "__main__": args = tyro.cli(Args) args.batch_size = int(args.num_envs * args.num_steps) @@ -178,14 +181,14 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) dones = torch.zeros((args.num_steps, args.num_envs)).to(device) avg_returns = deque(maxlen=20) - + global_step = 0 start_time = time.time() # TRY NOT TO MODIFY: start the game next_obs = torch.Tensor(envs.reset()).to(device) next_done = torch.zeros(args.num_envs).to(device) - + for iteration in range(1, args.num_iterations + 1): # Annealing the rate if instructed to do so. if args.anneal_lr: @@ -196,7 +199,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): for step in range(0, args.num_steps): global_step += args.num_envs obs[step] = next_obs - dones[step] = next_done + dones[step] = next_done epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) if random.random() < epsilon: @@ -211,7 +214,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) rewards[step] = torch.tensor(reward).to(device).view(-1) * args.rew_scale next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) - + # TRY NOT TO MODIFY: record rewards for plotting purposes for idx, d in enumerate(next_done): if d: @@ -232,7 +235,9 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): else: nextnonterminal = 1.0 - dones[t + 1] next_value, _ = torch.max(q_network(obs[t + 1]), dim=-1) - returns[t] = rewards[t] + args.gamma * (args.q_lambda * returns[t+1] + (1-args.q_lambda) * next_value * nextnonterminal) + returns[t] = rewards[t] + args.gamma * ( + args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal + ) # flatten the batch b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py index e8ddc8e8e..79b2541d6 100644 --- a/cleanrl/pqn_atari_envpool.py +++ b/cleanrl/pqn_atari_envpool.py @@ -10,10 +10,11 @@ import numpy as np import torch import torch.nn as nn +import torch.nn.functional as F import torch.optim as optim import tyro from torch.utils.tensorboard import SummaryWriter -import torch.nn.functional as F + @dataclass class Args: @@ -106,6 +107,7 @@ def step(self, action): infos, ) + # ALGO LOGIC: initialize agent here: class QNetwork(nn.Module): def __init__(self, env): @@ -129,11 +131,13 @@ def __init__(self, env): def forward(self, x): return self.network(x / 255.0) - + + def linear_schedule(start_e: float, end_e: float, duration: int, t: int): slope = (end_e - start_e) / duration return max(slope * t + start_e, end_e) + if __name__ == "__main__": args = tyro.cli(Args) args.batch_size = int(args.num_envs * args.num_steps) @@ -217,7 +221,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): q_values = q_network(next_obs) action = torch.argmax(q_values, dim=1) actions[step] = action - + # TRY NOT TO MODIFY: execute the game and log data. next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) rewards[step] = torch.tensor(reward).to(device).view(-1) @@ -242,7 +246,9 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): else: nextnonterminal = 1.0 - dones[t + 1] next_value, _ = torch.max(q_network(obs[t + 1]), dim=-1) - returns[t] = rewards[t] + args.gamma * (args.q_lambda * returns[t+1] + (1-args.q_lambda) * next_value * nextnonterminal) + returns[t] = rewards[t] + args.gamma * ( + args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal + ) # flatten the batch b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) From fba899485fd0c5d6eccffd922f3d925e6d9d58f1 Mon Sep 17 00:00:00 2001 From: roger-creus Date: Wed, 17 Jul 2024 23:52:40 -0400 Subject: [PATCH 4/9] each env has its own probability of random.random() < epsilon -- i.e. some envs can explore and some exploit, like in the official implementation --- cleanrl/pqn.py | 14 ++++++++------ cleanrl/pqn_atari_envpool.py | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py index f29060e01..a4947afd5 100644 --- a/cleanrl/pqn.py +++ b/cleanrl/pqn.py @@ -202,12 +202,14 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): dones[step] = next_done epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) - if random.random() < epsilon: - action = torch.randint(0, envs.single_action_space.n, (envs.num_envs,)) - else: - with torch.no_grad(): - q_values = q_network(next_obs) - action = torch.argmax(q_values, dim=1) + + random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) + with torch.no_grad(): + q_values = q_network(next_obs) + max_actions = torch.argmax(q_values, dim=1) + + explore = (torch.rand((args.num_envs,)).to(device) < epsilon) + action = torch.where(explore, random_actions, max_actions) actions[step] = action # TRY NOT TO MODIFY: execute the game and log data. diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py index 79b2541d6..06277d730 100644 --- a/cleanrl/pqn_atari_envpool.py +++ b/cleanrl/pqn_atari_envpool.py @@ -214,12 +214,14 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): dones[step] = next_done epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) - if random.random() < epsilon: - action = torch.randint(0, envs.single_action_space.n, (envs.num_envs,)) - else: - with torch.no_grad(): - q_values = q_network(next_obs) - action = torch.argmax(q_values, dim=1) + + random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) + with torch.no_grad(): + q_values = q_network(next_obs) + max_actions = torch.argmax(q_values, dim=1) + + explore = (torch.rand((args.num_envs,)).to(device) < epsilon) + action = torch.where(explore, random_actions, max_actions) actions[step] = action # TRY NOT TO MODIFY: execute the game and log data. From b6a12c1255d4f3bc86a59f59ee40e8195060317c Mon Sep 17 00:00:00 2001 From: roger-creus Date: Thu, 25 Jul 2024 18:28:19 -0400 Subject: [PATCH 5/9] added pqn with lstm. works on breakout :) --- cleanrl/pqn_atari_lstm_envpool.py | 329 ++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 cleanrl/pqn_atari_lstm_envpool.py diff --git a/cleanrl/pqn_atari_lstm_envpool.py b/cleanrl/pqn_atari_lstm_envpool.py new file mode 100644 index 000000000..d7d3be28e --- /dev/null +++ b/cleanrl/pqn_atari_lstm_envpool.py @@ -0,0 +1,329 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_atari_envpoolpy +import os +import random +import time +from collections import deque +from dataclasses import dataclass + +import envpool +import gym +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import tyro +from torch.utils.tensorboard import SummaryWriter + + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + + # Algorithm specific arguments + env_id: str = "Breakout-v5" + """the id of the environment""" + total_timesteps: int = 10000000 + """total timesteps of the experiments""" + learning_rate: float = 2.5e-4 + """the learning rate of the optimizer""" + num_envs: int = 8 + """the number of parallel game environments""" + num_steps: int = 128 + """the number of steps to run in each environment per policy rollout""" + anneal_lr: bool = True + """Toggle learning rate annealing for policy and value networks""" + gamma: float = 0.99 + """the discount factor gamma""" + num_minibatches: int = 4 + """the number of mini-batches""" + update_epochs: int = 2 + """the K epochs to update the policy""" + max_grad_norm: float = 0.5 + """the maximum norm for the gradient clipping""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.01 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.10 + """the fraction of `total_timesteps` it takes from start_e to end_e""" + q_lambda: float = 0.65 + """the lambda for the Q-Learning algorithm""" + + # to be filled in runtime + batch_size: int = 0 + """the batch size (computed in runtime)""" + minibatch_size: int = 0 + """the mini-batch size (computed in runtime)""" + num_iterations: int = 0 + """the number of iterations (computed in runtime)""" + + +class RecordEpisodeStatistics(gym.Wrapper): + def __init__(self, env, deque_size=100): + super().__init__(env) + self.num_envs = getattr(env, "num_envs", 1) + self.episode_returns = None + self.episode_lengths = None + + def reset(self, **kwargs): + observations = super().reset(**kwargs) + self.episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + self.lives = np.zeros(self.num_envs, dtype=np.int32) + self.returned_episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.returned_episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + return observations + + def step(self, action): + observations, rewards, dones, infos = super().step(action) + self.episode_returns += infos["reward"] + self.episode_lengths += 1 + self.returned_episode_returns[:] = self.episode_returns + self.returned_episode_lengths[:] = self.episode_lengths + self.episode_returns *= 1 - infos["terminated"] + self.episode_lengths *= 1 - infos["terminated"] + infos["r"] = self.returned_episode_returns + infos["l"] = self.returned_episode_lengths + return ( + observations, + rewards, + dones, + infos, + ) + + +# ALGO LOGIC: initialize agent here: +class QNetwork(nn.Module): + def __init__(self, env): + super().__init__() + self.network = nn.Sequential( + nn.Conv2d(1, 32, 8, stride=4), + nn.LayerNorm([32, 20, 20]), + nn.ReLU(), + nn.Conv2d(32, 64, 4, stride=2), + nn.LayerNorm([64, 9, 9]), + nn.ReLU(), + nn.Conv2d(64, 64, 3, stride=1), + nn.LayerNorm([64, 7, 7]), + nn.ReLU(), + nn.Flatten(), + nn.Linear(3136, 512), + nn.LayerNorm(512), + nn.ReLU(), + ) + self.lstm = nn.LSTM(512, 128) + self.head = nn.Linear(128, env.single_action_space.n) + + + def get_states(self, x, lstm_state, done): + hidden = self.network(x / 255.0) + + # LSTM logic + batch_size = lstm_state[0].shape[1] + hidden = hidden.reshape((-1, batch_size, self.lstm.input_size)) + done = done.reshape((-1, batch_size)) + new_hidden = [] + for h, d in zip(hidden, done): + h, lstm_state = self.lstm( + h.unsqueeze(0), + ( + (1.0 - d).view(1, -1, 1) * lstm_state[0], + (1.0 - d).view(1, -1, 1) * lstm_state[1], + ), + ) + new_hidden += [h] + new_hidden = torch.flatten(torch.cat(new_hidden), 0, 1) + return new_hidden, lstm_state + + def forward(self, x, lstm_state, done): + hidden, lstm_state = self.get_states(x, lstm_state, done) + return self.head(hidden), lstm_state + + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = envpool.make( + args.env_id, + env_type="gym", + num_envs=args.num_envs, + episodic_life=True, + reward_clip=True, + seed=args.seed, + stack_num=1, + ) + envs.num_envs = args.num_envs + envs.single_action_space = envs.action_space + envs.single_observation_space = envs.observation_space + envs = RecordEpisodeStatistics(envs) + assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" + + q_network = QNetwork(envs).to(device) + optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + + # ALGO Logic: Storage setup + obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) + actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) + rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) + dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + values = torch.zeros((args.num_steps, args.num_envs)).to(device) + avg_returns = deque(maxlen=20) + + + # TRY NOT TO MODIFY: start the game + global_step = 0 + start_time = time.time() + next_obs = torch.Tensor(envs.reset()).to(device) + next_done = torch.zeros(args.num_envs).to(device) + + next_lstm_state = ( + torch.zeros(q_network.lstm.num_layers, args.num_envs, q_network.lstm.hidden_size).to(device), + torch.zeros(q_network.lstm.num_layers, args.num_envs, q_network.lstm.hidden_size).to(device), + ) # hidden and cell states (see https://youtu.be/8HyCNIVRbSU) + + for iteration in range(1, args.num_iterations + 1): + initial_lstm_state = (next_lstm_state[0].clone(), next_lstm_state[1].clone()) + + # Annealing the rate if instructed to do so. + if args.anneal_lr: + frac = 1.0 - (iteration - 1.0) / args.num_iterations + lrnow = frac * args.learning_rate + optimizer.param_groups[0]["lr"] = lrnow + + for step in range(0, args.num_steps): + global_step += args.num_envs + obs[step] = next_obs + dones[step] = next_done + + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + + random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) + with torch.no_grad(): + q_values, next_lstm_state = q_network(next_obs, next_lstm_state, next_done) + max_actions = torch.argmax(q_values, dim=1) + values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() + + explore = (torch.rand((args.num_envs,)).to(device) < epsilon) + action = torch.where(explore, random_actions, max_actions) + actions[step] = action + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) + rewards[step] = torch.tensor(reward).to(device).view(-1) + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + for idx, d in enumerate(next_done): + if d and info["lives"][idx] == 0: + print(f"global_step={global_step}, episodic_return={info['r'][idx]}") + avg_returns.append(info["r"][idx]) + writer.add_scalar("charts/avg_episodic_return", np.average(avg_returns), global_step) + writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) + writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) + + # Compute Q(lambda) targets + with torch.no_grad(): + returns = torch.zeros_like(rewards).to(device) + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + next_value, _ = torch.max(q_network(next_obs, next_lstm_state, next_done)[0], dim=-1) + nextnonterminal = 1.0 - next_done + returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal + else: + nextnonterminal = 1.0 - dones[t + 1] + next_value = values[t + 1] + returns[t] = rewards[t] + args.gamma * ( + args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal + ) + + # flatten the batch + b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) + b_actions = actions.reshape((-1,) + envs.single_action_space.shape) + b_returns = returns.reshape(-1) + b_dones = dones.reshape(-1) + + assert args.num_envs % args.num_minibatches == 0 + envsperbatch = args.num_envs // args.num_minibatches + envinds = np.arange(args.num_envs) + flatinds = np.arange(args.batch_size).reshape(args.num_steps, args.num_envs) + + # Optimizing the Q-network + b_inds = np.arange(args.batch_size) + for epoch in range(args.update_epochs): + np.random.shuffle(envinds) + for start in range(0, args.num_envs, envsperbatch): + end = start + envsperbatch + mbenvinds = envinds[start:end] + mb_inds = flatinds[:, mbenvinds].ravel() # be really careful about the index + + old_val, _ = q_network( + b_obs[mb_inds], + (initial_lstm_state[0][:, mbenvinds], initial_lstm_state[1][:, mbenvinds]), + b_dones[mb_inds] + ) + old_val = old_val.gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() + + loss = F.mse_loss(b_returns[mb_inds], old_val) + + # optimize the model + optimizer.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(q_network.parameters(), args.max_grad_norm) + optimizer.step() + + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + envs.close() + writer.close() From bfe1205136458601438f94e74214625340c7cd99 Mon Sep 17 00:00:00 2001 From: roger-creus Date: Fri, 26 Jul 2024 09:23:43 -0400 Subject: [PATCH 6/9] Use buffer for values instead of re-computing in Q(lambda). Speed up 150% --- cleanrl/pqn.py | 6 ++++-- cleanrl/pqn_atari_envpool.py | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py index a4947afd5..30e346f2a 100644 --- a/cleanrl/pqn.py +++ b/cleanrl/pqn.py @@ -180,6 +180,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + values = torch.zeros((args.num_steps, args.num_envs)).to(device) avg_returns = deque(maxlen=20) global_step = 0 @@ -207,6 +208,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): with torch.no_grad(): q_values = q_network(next_obs) max_actions = torch.argmax(q_values, dim=1) + values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() explore = (torch.rand((args.num_envs,)).to(device) < epsilon) action = torch.where(explore, random_actions, max_actions) @@ -236,11 +238,11 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal else: nextnonterminal = 1.0 - dones[t + 1] - next_value, _ = torch.max(q_network(obs[t + 1]), dim=-1) + next_value = values[t + 1] returns[t] = rewards[t] + args.gamma * ( args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal ) - + # flatten the batch b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) b_actions = actions.reshape((-1,) + envs.single_action_space.shape) diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py index 06277d730..55166e507 100644 --- a/cleanrl/pqn_atari_envpool.py +++ b/cleanrl/pqn_atari_envpool.py @@ -107,7 +107,6 @@ def step(self, action): infos, ) - # ALGO LOGIC: initialize agent here: class QNetwork(nn.Module): def __init__(self, env): @@ -193,6 +192,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + values = torch.zeros((args.num_steps, args.num_envs)).to(device) avg_returns = deque(maxlen=20) # TRY NOT TO MODIFY: start the game @@ -219,6 +219,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): with torch.no_grad(): q_values = q_network(next_obs) max_actions = torch.argmax(q_values, dim=1) + values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() explore = (torch.rand((args.num_envs,)).to(device) < epsilon) action = torch.where(explore, random_actions, max_actions) @@ -247,7 +248,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal else: nextnonterminal = 1.0 - dones[t + 1] - next_value, _ = torch.max(q_network(obs[t + 1]), dim=-1) + next_value = values[t + 1] returns[t] = rewards[t] + args.gamma * ( args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal ) From 10334fa9125c3ba8ba8f9feca462b3ef83f80060 Mon Sep 17 00:00:00 2001 From: roger-creus Date: Fri, 25 Oct 2024 11:32:49 -0400 Subject: [PATCH 7/9] default rollout hyperparameters in PQN are now equal to PPO. same for PQN Lstm. Ran validation experiments. Reverting undesired changes in DQN. WIP documentation --- cleanrl/dqn.py | 4 +- cleanrl/pqn.py | 117 ++++----- cleanrl/pqn_atari_envpool.py | 30 ++- ...m_envpool.py => pqn_atari_envpool_lstm.py} | 31 ++- docs/rl-algorithms/pqn.md | 236 ++++++++++++++++++ 5 files changed, 319 insertions(+), 99 deletions(-) rename cleanrl/{pqn_atari_lstm_envpool.py => pqn_atari_envpool_lstm.py} (93%) create mode 100644 docs/rl-algorithms/pqn.md diff --git a/cleanrl/dqn.py b/cleanrl/dqn.py index 7ca633a44..e74e289c3 100644 --- a/cleanrl/dqn.py +++ b/cleanrl/dqn.py @@ -69,8 +69,6 @@ class Args: """timestep to start learning""" train_frequency: int = 10 """the frequency of training""" - rew_scale: float = 0.1 - """the reward scaling factor""" def make_env(env_id, seed, idx, capture_video, run_name): @@ -195,7 +193,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): for idx, trunc in enumerate(truncations): if trunc: real_next_obs[idx] = infos["final_observation"][idx] - rb.add(obs, real_next_obs, actions, rewards * args.rew_scale, terminations, infos) + rb.add(obs, real_next_obs, actions, rewards, terminations, infos) # TRY NOT TO MODIFY: CRUCIAL step easy to overlook obs = next_obs diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py index 30e346f2a..2f9874803 100644 --- a/cleanrl/pqn.py +++ b/cleanrl/pqn.py @@ -2,11 +2,9 @@ import os import random import time -from collections import deque from dataclasses import dataclass -import envpool -import gym +import gymnasium as gym import numpy as np import torch import torch.nn as nn @@ -42,13 +40,13 @@ class Args: """total timesteps of the experiments""" learning_rate: float = 2.5e-4 """the learning rate of the optimizer""" - num_envs: int = 32 + num_envs: int = 4 """the number of parallel game environments""" - num_steps: int = 64 + num_steps: int = 128 """the number of steps to run for each environment per update""" - num_minibatches: int = 16 + num_minibatches: int = 4 """the number of mini-batches""" - update_epochs: int = 2 + update_epochs: int = 4 """the K epochs to update the policy""" anneal_lr: bool = True """Toggle learning rate annealing""" @@ -62,44 +60,29 @@ class Args: """the fraction of `total_timesteps` it takes from start_e to end_e""" max_grad_norm: float = 10.0 """the maximum norm for the gradient clipping""" - rew_scale: float = 0.1 - """the reward scaling factor""" q_lambda: float = 0.65 """the lambda for Q(lambda)""" -class RecordEpisodeStatistics(gym.Wrapper): - def __init__(self, env, deque_size=100): - super().__init__(env) - self.num_envs = getattr(env, "num_envs", 1) - self.episode_returns = None - self.episode_lengths = None - - def reset(self, **kwargs): - observations = super().reset(**kwargs) - self.episode_returns = np.zeros(self.num_envs, dtype=np.float32) - self.episode_lengths = np.zeros(self.num_envs, dtype=np.int32) - self.lives = np.zeros(self.num_envs, dtype=np.int32) - self.returned_episode_returns = np.zeros(self.num_envs, dtype=np.float32) - self.returned_episode_lengths = np.zeros(self.num_envs, dtype=np.int32) - return observations - - def step(self, action): - observations, rewards, dones, infos = super().step(action) - self.episode_returns += rewards - self.episode_lengths += 1 - self.returned_episode_returns[:] = self.episode_returns - self.returned_episode_lengths[:] = self.episode_lengths - self.episode_returns *= 1 - dones - self.episode_lengths *= 1 - dones - infos["r"] = self.returned_episode_returns - infos["l"] = self.returned_episode_lengths - return ( - observations, - rewards, - dones, - infos, - ) +def make_env(env_id, seed, idx, capture_video, run_name): + def thunk(): + if capture_video and idx == 0: + env = gym.make(env_id, render_mode="rgb_array") + env = gym.wrappers.RecordVideo(env, f"videos/{run_name}") + else: + env = gym.make(env_id) + env = gym.wrappers.RecordEpisodeStatistics(env) + env.action_space.seed(seed) + + return env + + return thunk + + +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + torch.nn.init.constant_(layer.bias, bias_const) + return layer # ALGO LOGIC: initialize agent here: @@ -108,13 +91,13 @@ def __init__(self, env): super().__init__() self.network = nn.Sequential( - nn.Linear(np.array(env.single_observation_space.shape).prod(), 120), + layer_init(nn.Linear(np.array(env.single_observation_space.shape).prod(), 120)), nn.LayerNorm(120), nn.ReLU(), - nn.Linear(120, 84), + layer_init(nn.Linear(120, 84)), nn.LayerNorm(84), nn.ReLU(), - nn.Linear(84, env.single_action_space.n), + layer_init(nn.Linear(84, env.single_action_space.n)), ) def forward(self, x): @@ -159,21 +142,14 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") # env setup - envs = envpool.make( - args.env_id, - env_type="gym", - num_envs=args.num_envs, - seed=args.seed, + envs = gym.vector.SyncVectorEnv( + [make_env(args.env_id, args.seed + i, i, args.capture_video, run_name) for i in range(args.num_envs)] ) - envs.num_envs = args.num_envs - envs.single_action_space = envs.action_space - envs.single_observation_space = envs.observation_space - envs = RecordEpisodeStatistics(envs) - assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" + assert isinstance(envs.single_action_space, gym.spaces.Discrete), "only discrete action space is supported" # agent setup q_network = QNetwork(envs).to(device) - optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + optimizer = optim.RAdam(q_network.parameters(), lr=args.learning_rate) # storage setup obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) @@ -181,13 +157,12 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) dones = torch.zeros((args.num_steps, args.num_envs)).to(device) values = torch.zeros((args.num_steps, args.num_envs)).to(device) - avg_returns = deque(maxlen=20) + # TRY NOT TO MODIFY: start the game global_step = 0 start_time = time.time() - - # TRY NOT TO MODIFY: start the game - next_obs = torch.Tensor(envs.reset()).to(device) + next_obs, _ = envs.reset(seed=args.seed) + next_obs = torch.Tensor(next_obs).to(device) next_done = torch.zeros(args.num_envs).to(device) for iteration in range(1, args.num_iterations + 1): @@ -203,30 +178,28 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): dones[step] = next_done epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) - random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) with torch.no_grad(): q_values = q_network(next_obs) max_actions = torch.argmax(q_values, dim=1) values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() - explore = (torch.rand((args.num_envs,)).to(device) < epsilon) + explore = torch.rand((args.num_envs,)).to(device) < epsilon action = torch.where(explore, random_actions, max_actions) actions[step] = action # TRY NOT TO MODIFY: execute the game and log data. - next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) - rewards[step] = torch.tensor(reward).to(device).view(-1) * args.rew_scale + next_obs, reward, terminations, truncations, infos = envs.step(action.cpu().numpy()) + next_done = np.logical_or(terminations, truncations) + rewards[step] = torch.tensor(reward).to(device).view(-1) next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) - # TRY NOT TO MODIFY: record rewards for plotting purposes - for idx, d in enumerate(next_done): - if d: - print(f"global_step={global_step}, episodic_return={info['r'][idx]}") - avg_returns.append(info["r"][idx]) - writer.add_scalar("charts/avg_episodic_return", np.average(avg_returns), global_step) - writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) - writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) + if "final_info" in infos: + for info in infos["final_info"]: + if info and "episode" in info: + print(f"global_step={global_step}, episodic_return={info['episode']['r']}") + writer.add_scalar("charts/episodic_return", info["episode"]["r"], global_step) + writer.add_scalar("charts/episodic_length", info["episode"]["l"], global_step) # Compute Q(lambda) targets with torch.no_grad(): @@ -242,7 +215,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): returns[t] = rewards[t] + args.gamma * ( args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal ) - + # flatten the batch b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) b_actions = actions.reshape((-1,) + envs.single_action_space.shape) diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py index 55166e507..f1d7deb3d 100644 --- a/cleanrl/pqn_atari_envpool.py +++ b/cleanrl/pqn_atari_envpool.py @@ -42,17 +42,17 @@ class Args: """total timesteps of the experiments""" learning_rate: float = 2.5e-4 """the learning rate of the optimizer""" - num_envs: int = 128 + num_envs: int = 8 """the number of parallel game environments""" - num_steps: int = 32 + num_steps: int = 128 """the number of steps to run in each environment per policy rollout""" anneal_lr: bool = True """Toggle learning rate annealing for policy and value networks""" gamma: float = 0.99 """the discount factor gamma""" - num_minibatches: int = 32 + num_minibatches: int = 4 """the number of mini-batches""" - update_epochs: int = 2 + update_epochs: int = 4 """the K epochs to update the policy""" max_grad_norm: float = 10.0 """the maximum norm for the gradient clipping""" @@ -107,25 +107,31 @@ def step(self, action): infos, ) -# ALGO LOGIC: initialize agent here: + +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + torch.nn.init.constant_(layer.bias, bias_const) + return layer + + class QNetwork(nn.Module): def __init__(self, env): super().__init__() self.network = nn.Sequential( - nn.Conv2d(4, 32, 8, stride=4), + layer_init(nn.Conv2d(4, 32, 8, stride=4)), nn.LayerNorm([32, 20, 20]), nn.ReLU(), - nn.Conv2d(32, 64, 4, stride=2), + layer_init(nn.Conv2d(32, 64, 4, stride=2)), nn.LayerNorm([64, 9, 9]), nn.ReLU(), - nn.Conv2d(64, 64, 3, stride=1), + layer_init(nn.Conv2d(64, 64, 3, stride=1)), nn.LayerNorm([64, 7, 7]), nn.ReLU(), nn.Flatten(), - nn.Linear(3136, 512), + layer_init(nn.Linear(3136, 512)), nn.LayerNorm(512), nn.ReLU(), - nn.Linear(512, env.single_action_space.n), + layer_init(nn.Linear(512, env.single_action_space.n)), ) def forward(self, x): @@ -185,7 +191,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" q_network = QNetwork(envs).to(device) - optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + optimizer = optim.RAdam(q_network.parameters(), lr=args.learning_rate) # ALGO Logic: Storage setup obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) @@ -221,7 +227,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): max_actions = torch.argmax(q_values, dim=1) values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() - explore = (torch.rand((args.num_envs,)).to(device) < epsilon) + explore = torch.rand((args.num_envs,)).to(device) < epsilon action = torch.where(explore, random_actions, max_actions) actions[step] = action diff --git a/cleanrl/pqn_atari_lstm_envpool.py b/cleanrl/pqn_atari_envpool_lstm.py similarity index 93% rename from cleanrl/pqn_atari_lstm_envpool.py rename to cleanrl/pqn_atari_envpool_lstm.py index d7d3be28e..3b21d5cff 100644 --- a/cleanrl/pqn_atari_lstm_envpool.py +++ b/cleanrl/pqn_atari_envpool_lstm.py @@ -15,7 +15,6 @@ import tyro from torch.utils.tensorboard import SummaryWriter - @dataclass class Args: exp_name: str = os.path.basename(__file__)[: -len(".py")] @@ -52,7 +51,7 @@ class Args: """the discount factor gamma""" num_minibatches: int = 4 """the number of mini-batches""" - update_epochs: int = 2 + update_epochs: int = 4 """the K epochs to update the policy""" max_grad_norm: float = 0.5 """the maximum norm for the gradient clipping""" @@ -108,29 +107,38 @@ def step(self, action): ) -# ALGO LOGIC: initialize agent here: +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + torch.nn.init.constant_(layer.bias, bias_const) + return layer + + class QNetwork(nn.Module): def __init__(self, env): super().__init__() self.network = nn.Sequential( - nn.Conv2d(1, 32, 8, stride=4), + layer_init(nn.Conv2d(1, 32, 8, stride=4)), nn.LayerNorm([32, 20, 20]), nn.ReLU(), - nn.Conv2d(32, 64, 4, stride=2), + layer_init(nn.Conv2d(32, 64, 4, stride=2)), nn.LayerNorm([64, 9, 9]), nn.ReLU(), - nn.Conv2d(64, 64, 3, stride=1), + layer_init(nn.Conv2d(64, 64, 3, stride=1)), nn.LayerNorm([64, 7, 7]), nn.ReLU(), nn.Flatten(), - nn.Linear(3136, 512), + layer_init(nn.Linear(3136, 512)), nn.LayerNorm(512), nn.ReLU(), ) self.lstm = nn.LSTM(512, 128) - self.head = nn.Linear(128, env.single_action_space.n) + for name, param in self.lstm.named_parameters(): + if "bias" in name: + nn.init.constant_(param, 0) + elif "weight" in name: + nn.init.orthogonal_(param, 1.0) + self.q_func = layer_init(nn.Linear(128, env.single_action_space.n)) - def get_states(self, x, lstm_state, done): hidden = self.network(x / 255.0) @@ -153,7 +161,7 @@ def get_states(self, x, lstm_state, done): def forward(self, x, lstm_state, done): hidden, lstm_state = self.get_states(x, lstm_state, done) - return self.head(hidden), lstm_state + return self.q_func(hidden), lstm_state def linear_schedule(start_e: float, end_e: float, duration: int, t: int): @@ -209,7 +217,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" q_network = QNetwork(envs).to(device) - optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate) + optimizer = optim.RAdam(q_network.parameters(), lr=args.learning_rate) # ALGO Logic: Storage setup obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) @@ -219,7 +227,6 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): values = torch.zeros((args.num_steps, args.num_envs)).to(device) avg_returns = deque(maxlen=20) - # TRY NOT TO MODIFY: start the game global_step = 0 start_time = time.time() diff --git a/docs/rl-algorithms/pqn.md b/docs/rl-algorithms/pqn.md new file mode 100644 index 000000000..56de552e2 --- /dev/null +++ b/docs/rl-algorithms/pqn.md @@ -0,0 +1,236 @@ +# Parallel Q Network (PQN) + + +## Overview + +PQN is a parallelized version of the Deep Q-learning algorithm. It is designed to be more efficient than DQN by using multiple agents to interact with the environment in parallel. PQN can be thought of as DQN (1) without replay buffer and target networks, and (2) with layer normalizations and parallel environments. + +Original paper: + +* [Simplifying Deep Temporal Difference Learning](https://arxiv.org/html/2407.04811v2) + +Reference resources: + +* :material-github: [purejaxql](https://github.com/mttga/purejaxql) + +## Implemented Variants + + +| Variants Implemented | Description | +| ----------- | ----------- | +| :material-github: [`pqn.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn.py), :material-file-document: [docs](/rl-algorithms/pqn/#pqnpy) | For classic control tasks like `CartPole-v1`. | +| :material-github: [`pqn_atari_envpool.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool.py), :material-file-document: [docs](/rl-algorithms/pqn/#pqn_atari_envpoolpy) | For Atari games. Uses the blazing fast Envpool Atari vectorized environment. It uses convolutional layers and common atari-based pre-processing techniques. | +| :material-github: [`pqn_atari_envpool_lstm.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool_lstm.py), :material-file-document: [docs](/rl-algorithms/pqn/#pqn_atari_envpool_lstmpy) | For Atari games. Uses the blazing fast Envpool Atari vectorized environment. Using LSTM without stacked frames. | + +Below are our single-file implementations of PQN: + +## `pqn.py` + +The [pqn.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn.py) has the following features: + +* Works with the `Box` observation space of low-level features +* Works with the `Discrete` action space +* Works with envs like `CartPole-v1` + +### Usage + +=== "poetry" + + ```bash + poetry install + poetry run python cleanrl/pqn.py --help + poetry run python cleanrl/pqn.py --env-id CartPole-v1 + ``` + +=== "pip" + + ```bash + python cleanrl/pqn.py --help + python cleanrl/pqn.py --env-id CartPole-v1 + ``` + +### Explanation of the logged metrics + +Running `python cleanrl/pqn.py` will automatically record various metrics such as actor or value losses in Tensorboard. Below is the documentation for these metrics: + +* `charts/episodic_return`: episodic return of the game +* `charts/episodic_length`: episodic length of the game +* `charts/SPS`: number of steps per second +* `charts/learning_rate`: the current learning rate +* `losses/td_loss`: the mean squared error (MSE) between the Q values at timestep $t$ and the Bellman update target estimated using the $Q(\lambda)$ returns. +* `losses/q_values`: implemented as `qf1(data.observations, data.actions).view(-1)`, it is the average Q values of the sampled data in the replay buffer; useful when gauging if under or over estimation happens. + +### Implementation details + +1. Vectorized architecture (:material-github: [common/cmd_util.py#L22](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/cmd_util.py#L22)) +2. Orthogonal Initialization of Weights and Constant Initialization of biases (:material-github: [a2c/utils.py#L58)](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L58)) +3. Normalized Q Network (:material-github: [purejaxql/pqn_atari.py#L200](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L200)) +4. Uses the RAdam Optimizer with the default epsilon parameter(:material-github: [purejaxql/pqn_atari.py#L362](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L362)) +5. Adam Learning Rate Annealing (:material-github: [pqn2/pqn2.py#L133-L135](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/pqn2/pqn2.py#L133-L135)) +6. Q Lambda Returns (:material-github: [purejaxql/pqn_atari.py#L446](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L446)) +7. Mini-batch Updates (:material-github: [pqn2/pqn2.py#L157-L166](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/pqn2/pqn2.py#L157-L166)) +8. Global Gradient Clipping (:material-github: [purejaxql/pqn_atari.py#L360](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L360)) + +### Experiment results + +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:3:8" +``` + +# TODO + +Learning curves: + +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh::9" +``` + +# TODO + +## `pqn_atari_envpool.py` + +The [pqn_atari_envpool.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool.py) has the following features: + +* Uses the blazing fast [Envpool](https://github.com/sail-sg/envpool) vectorized environment. +* For Atari games. It uses convolutional layers and common atari-based pre-processing techniques. +* Works with the Atari's pixel `Box` observation space of shape `(210, 160, 3)` +* Works with the `Discrete` action space + +???+ warning + + Note that `pqn_atari_envpool.py` does not work in Windows :fontawesome-brands-windows: and MacOs :fontawesome-brands-apple:. See envpool's built wheels here: [https://pypi.org/project/envpool/#files](https://pypi.org/project/envpool/#files) + +???+ bug + + EnvPool's vectorized environment **does not behave the same** as gym's vectorized environment, which causes a compatibility bug in our PQN implementation. When an action $a$ results in an episode termination or truncation, the environment generates $s_{last}$ as the terminated or truncated state; we then use $s_{new}$ to denote the initial state of the new episodes. Here is how the bahviors differ: + + * Under the vectorized environment of `envpool<=0.6.4`, the `obs` in `obs, reward, done, info = env.step(action)` is the truncated state $s_{last}$ + * Under the vectorized environment of `gym==0.23.1`, the `obs` in `obs, reward, done, info = env.step(action)` is the initial state $s_{new}$. + + This causes the $s_{last}$ to be off by one. + See [:material-github: sail-sg/envpool#194](https://github.com/sail-sg/envpool/issues/194) for more detail. However, it does not seem to impact performance, so we take a note here and await for the upstream fix. + + +### Usage + +=== "poetry" + + ```bash + poetry install -E envpool + poetry run python cleanrl/pqn_atari_envpool.py --help + poetry run python cleanrl/pqn_atari_envpool.py --env-id Breakout-v5 + ``` + +=== "pip" + + ```bash + pip install -r requirements/requirements-envpool.txt + python cleanrl/pqn_atari_envpool.py --help + python cleanrl/pqn_atari_envpool.py --env-id Breakout-v5 + ``` + +### Explanation of the logged metrics + +See [related docs](/rl-algorithms/pqn/#explanation-of-the-logged-metrics) for `pqn.py`. + +### Implementation details + +[pqn_atari_envpool.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool.py) uses a customized `RecordEpisodeStatistics` to work with envpool but has the same other implementation details as `ppo_atari.py`. + +### Experiment results + +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:58:63" +``` + +# TODO + + +Learning curves: + +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:51:62" +``` +# TODO + +## `pqn_atari_envpool_lstm.py` + +The [pqn_atari_envpool_lstm.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool_lstm.py) has the following features: + +* Uses the blazing fast [Envpool](https://github.com/sail-sg/envpool) vectorized environment. +* For Atari games using LSTM without stacked frames. It uses convolutional layers and common atari-based pre-processing techniques. +* Works with the Atari's pixel `Box` observation space of shape `(210, 160, 3)` +* Works with the `Discrete` action space + +???+ warning + + Note that `pqn_atari_envpool.py` does not work in Windows :fontawesome-brands-windows: and MacOs :fontawesome-brands-apple:. See envpool's built wheels here: [https://pypi.org/project/envpool/#files](https://pypi.org/project/envpool/#files) + +???+ bug + + EnvPool's vectorized environment **does not behave the same** as gym's vectorized environment, which causes a compatibility bug in our PQN implementation. When an action $a$ results in an episode termination or truncation, the environment generates $s_{last}$ as the terminated or truncated state; we then use $s_{new}$ to denote the initial state of the new episodes. Here is how the bahviors differ: + + * Under the vectorized environment of `envpool<=0.6.4`, the `obs` in `obs, reward, done, info = env.step(action)` is the truncated state $s_{last}$ + * Under the vectorized environment of `gym==0.23.1`, the `obs` in `obs, reward, done, info = env.step(action)` is the initial state $s_{new}$. + + This causes the $s_{last}$ to be off by one. + See [:material-github: sail-sg/envpool#194](https://github.com/sail-sg/envpool/issues/194) for more detail. However, it does not seem to impact performance, so we take a note here and await for the upstream fix. + +### Usage + + +=== "poetry" + + ```bash + poetry install -E atari + poetry run python cleanrl/pqn_atari_envpool_lstm.py --help + poetry run python cleanrl/pqn_atari_envpool_lstm.py --env-id Breakout-v5 + ``` + +=== "pip" + + ```bash + pip install -r requirements/requirements-atari.txt + python cleanrl/pqn_atari_envpool_lstm.py --help + python cleanrl/pqn_atari_envpool_lstm.py --env-id Breakout-v5 + ``` + + +### Explanation of the logged metrics + +See [related docs](/rl-algorithms/pqn/#explanation-of-the-logged-metrics) for `pqn.py`. + +### Implementation details + +[pqn_atari_envpool_lstm.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool_lstm.py) is based on the "5 LSTM implementation details" in [The 37 Implementation Details of Proximal Policy Optimization](https://iclr-blog-track.github.io/2022/03/25/pqn-implementation-details/), which are as follows: + +1. Layer initialization for LSTM layers (:material-github: [a2c/utils.py#L84-L86](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L84-L86)) +2. Initialize the LSTM states to be zeros (:material-github: [common/models.py#L179](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/models.py#L179)) +3. Reset LSTM states at the end of the episode (:material-github: [common/models.py#L141](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/models.py#L141)) +4. Prepare sequential rollouts in mini-batches (:material-github: [a2c/utils.py#L81](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L81)) +5. Reconstruct LSTM states during training (:material-github: [a2c/utils.py#L81](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L81)) + +To help test out the memory, we remove the 4 stacked frames from the observation (i.e., using `env = gym.wrappers.FrameStack(env, 1)` instead of `env = gym.wrappers.FrameStack(env, 4)` like in `ppo_atari.py` ) + +### Experiment results + +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:47:52" +``` + +# TODO + +Learning curves: + +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:11:19" +``` + +# TODO \ No newline at end of file From c8acf70b4887914741e487a1de517795d6fd323b Mon Sep 17 00:00:00 2001 From: roger-creus Date: Thu, 31 Oct 2024 12:46:26 -0400 Subject: [PATCH 8/9] Added coumentation. Fixed links to the docs for PQN --- cleanrl/pqn.py | 2 +- cleanrl/pqn_atari_envpool.py | 2 +- cleanrl/pqn_atari_envpool_lstm.py | 10 ++-- docs/rl-algorithms/pqn.md | 86 ++++++++++++++++++--------- docs/rl-algorithms/pqn/pqn.png | Bin 0 -> 137314 bytes docs/rl-algorithms/pqn/pqn_lstm.png | Bin 0 -> 126701 bytes docs/rl-algorithms/pqn/pqn_state.png | Bin 0 -> 61105 bytes mkdocs.yml | 1 + 8 files changed, 67 insertions(+), 34 deletions(-) create mode 100644 docs/rl-algorithms/pqn/pqn.png create mode 100644 docs/rl-algorithms/pqn/pqn_lstm.png create mode 100644 docs/rl-algorithms/pqn/pqn_state.png diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py index 2f9874803..6ed6e205d 100644 --- a/cleanrl/pqn.py +++ b/cleanrl/pqn.py @@ -1,4 +1,4 @@ -# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/dqn/#dqnpy +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/pqn/#pqnpy import os import random import time diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py index f1d7deb3d..45fd5a4cf 100644 --- a/cleanrl/pqn_atari_envpool.py +++ b/cleanrl/pqn_atari_envpool.py @@ -1,4 +1,4 @@ -# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_atari_envpoolpy +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/pqn/#pqn_atari_envpoolpy import os import random import time diff --git a/cleanrl/pqn_atari_envpool_lstm.py b/cleanrl/pqn_atari_envpool_lstm.py index 3b21d5cff..6b348b0af 100644 --- a/cleanrl/pqn_atari_envpool_lstm.py +++ b/cleanrl/pqn_atari_envpool_lstm.py @@ -1,4 +1,4 @@ -# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_atari_envpoolpy +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/pqn/#pqn_atari_envpool_lstmpy import os import random import time @@ -15,6 +15,7 @@ import tyro from torch.utils.tensorboard import SummaryWriter + @dataclass class Args: exp_name: str = os.path.basename(__file__)[: -len(".py")] @@ -168,6 +169,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): slope = (end_e - start_e) / duration return max(slope * t + start_e, end_e) + if __name__ == "__main__": args = tyro.cli(Args) args.batch_size = int(args.num_envs * args.num_steps) @@ -232,7 +234,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): start_time = time.time() next_obs = torch.Tensor(envs.reset()).to(device) next_done = torch.zeros(args.num_envs).to(device) - + next_lstm_state = ( torch.zeros(q_network.lstm.num_layers, args.num_envs, q_network.lstm.hidden_size).to(device), torch.zeros(q_network.lstm.num_layers, args.num_envs, q_network.lstm.hidden_size).to(device), @@ -260,7 +262,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): max_actions = torch.argmax(q_values, dim=1) values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() - explore = (torch.rand((args.num_envs,)).to(device) < epsilon) + explore = torch.rand((args.num_envs,)).to(device) < epsilon action = torch.where(explore, random_actions, max_actions) actions[step] = action @@ -315,7 +317,7 @@ def linear_schedule(start_e: float, end_e: float, duration: int, t: int): old_val, _ = q_network( b_obs[mb_inds], (initial_lstm_state[0][:, mbenvinds], initial_lstm_state[1][:, mbenvinds]), - b_dones[mb_inds] + b_dones[mb_inds], ) old_val = old_val.gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() diff --git a/docs/rl-algorithms/pqn.md b/docs/rl-algorithms/pqn.md index 56de552e2..3f8fafb46 100644 --- a/docs/rl-algorithms/pqn.md +++ b/docs/rl-algorithms/pqn.md @@ -58,7 +58,7 @@ Running `python cleanrl/pqn.py` will automatically record various metrics such a * `charts/SPS`: number of steps per second * `charts/learning_rate`: the current learning rate * `losses/td_loss`: the mean squared error (MSE) between the Q values at timestep $t$ and the Bellman update target estimated using the $Q(\lambda)$ returns. -* `losses/q_values`: implemented as `qf1(data.observations, data.actions).view(-1)`, it is the average Q values of the sampled data in the replay buffer; useful when gauging if under or over estimation happens. +* `losses/q_values`: it is the average Q values of the sampled data in the replay buffer; useful when gauging if under or over estimation happens. ### Implementation details @@ -73,21 +73,29 @@ Running `python cleanrl/pqn.py` will automatically record various metrics such a ### Experiment results -To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: +Episode Rewards: -``` title="benchmark/pqn.sh" linenums="1" ---8<-- "benchmark/pqn.sh:3:8" -``` +| Environment | CleanRL PQN | +|------------------|-------------------| +| CartPole-v1 | 408.14 ± 128.42 | +| Acrobot-v1 | -93.71 ± 2.94 | +| MountainCar-v0 | -200.00 ± 0.00 | -# TODO +Runtime: + +| Environment | CleanRL PQN | +|------------------|----------------------| +| CartPole-v1 | 3.619667511995135 | +| Acrobot-v1 | 4.264845468334595 | +| MountainCar-v0 | 3.99800178870078 | Learning curves: -``` title="benchmark/pqn_plot.sh" linenums="1" ---8<-- "benchmark/pqn_plot.sh::9" -``` + + +Tracked experiments: -# TODO + ## `pqn_atari_envpool.py` @@ -141,22 +149,34 @@ See [related docs](/rl-algorithms/pqn/#explanation-of-the-logged-metrics) for `p ### Experiment results -To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: +Episode Rewards: +| Environment | CleanRL PQN | +|-------------------|--------------------| +| Breakout-v5 | 356.93 ± 7.48 | +| SpaceInvaders-v5 | 900.07 ± 107.95 | +| BeamRider-v5 | 1987.97 ± 24.47 | +| Pong-v5 | 20.44 ± 0.11 | +| MsPacman-v5 | 2437.57 ± 215.01 | -``` title="benchmark/pqn.sh" linenums="1" ---8<-- "benchmark/pqn.sh:58:63" -``` +Runtime: -# TODO +| Environment | CleanRL PQN | +|-------------------|-----------------------| +| Breakout-v5 | 41.27235000576079 | +| SpaceInvaders-v5 | 42.191246278536035 | +| BeamRider-v5 | 42.66799268151052 | +| Pong-v5 | 39.35770012905844 | +| MsPacman-v5 | 43.22808379473344 | Learning curves: -``` title="benchmark/pqn_plot.sh" linenums="1" ---8<-- "benchmark/pqn_plot.sh:51:62" -``` -# TODO + + +Tracked experiments: + + ## `pqn_atari_envpool_lstm.py` @@ -219,18 +239,28 @@ To help test out the memory, we remove the 4 stacked frames from the observation ### Experiment results -To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: +Episode Rewards: + +| Environment | CleanRL PQN | +|-------------------|--------------------| +| Breakout-v5 | 366.47 ± 2.72 | +| SpaceInvaders-v5 | 681.92 ± 40.15 | +| BeamRider-v5 | 2050.85 ± 38.58 | +| MsPacman-v5 | 1815.20 ± 183.03 | -``` title="benchmark/pqn.sh" linenums="1" ---8<-- "benchmark/pqn.sh:47:52" -``` +Runtime: -# TODO +| Environment | CleanRL PQN | +|-------------------|-----------------------| +| Breakout-v5 | 170.30230232607076 | +| SpaceInvaders-v5 | 168.45747969698144 | +| BeamRider-v5 | 172.11561139317593 | +| MsPacman-v5 | 171.66131707108408 | Learning curves: -``` title="benchmark/pqn_plot.sh" linenums="1" ---8<-- "benchmark/pqn_plot.sh:11:19" -``` + + +Tracked experiments: -# TODO \ No newline at end of file + \ No newline at end of file diff --git a/docs/rl-algorithms/pqn/pqn.png b/docs/rl-algorithms/pqn/pqn.png new file mode 100644 index 0000000000000000000000000000000000000000..df72dbdb9c6921e344ef63acf0ef9ff046d43d3f GIT binary patch literal 137314 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 He2)GTZj83r literal 0 HcmV?d00001 diff --git a/docs/rl-algorithms/pqn/pqn_lstm.png b/docs/rl-algorithms/pqn/pqn_lstm.png new file mode 100644 index 0000000000000000000000000000000000000000..b97946e3eb84ae561ef084133033892cdc9dd6b0 GIT binary patch literal 126701 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/rl-algorithms/pqn/pqn_state.png b/docs/rl-algorithms/pqn/pqn_state.png new file mode 100644 index 0000000000000000000000000000000000000000..743d08790c015eacf590e78138961a3aad8ffd65 GIT binary patch literal 61105 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

QdM`Ld;TvOt;_xo5&4&Bd*|d=)qw zQ9{T=Z1&;sFq(PWKo==Bs?0uy!phIDYR@y+d=NL+JIz#$--&wyMalI^JU6)cn%`*! zn`>hdhOzYX=0dtmk;kt;CKKOT92{4F=a4FiG9C_4_dum&&gCpCx$_6C`u<*!#Z1qu zd_KtetAFf!UHg+{eg4H7RYTSx%3HhSM4u#J{kiJhHPzMCmHKjRlZu3xc%W8BU7a*s z(x<$b*t*ZZiQ5$ujf8^M! zkRW{*lnW6@-JQ+Sip-8#h+~uSN3}2{D`lqWE55A0WO4TSXtL07&lfwCY$ST0*Vv4q@Vn*W=j@}U z$$OvtipW44AMKuqemC|wCjKk`is}K&!?xK$s&mM5|SXKK8ZIDL4yE>q&Fl$pzboS1x%_%Jk<1HeWlm^WaBO^OA~ibSGtQF0&sTShT63 z#5gQm%65)$lfuPn*=*<&9Z%7s6k}s%@hTn_2bLJSKc9IuP?f;xI&z|kMblh#586sb zK2{lLgeS6T?qt0h;9w?{G(HWst-;J%b83B#$-Vq=RipkjR}~5E&)8=MJWuq0f36ac z66cwcjY~STq2x5j6$9-!OYf+$!Tdnwwy&&9o1BGe&K8TL=yT_;6TPqX1&{by%RUwv z^902CJ~pw;xY2L(GTT%meLo_fhV-pW=88qyXoQT#$Df1PJ^RqZCJ6bKWBuqU7;Vrr z;z?4GgF+f3bCt3OG`>P0RQzOZAD&!QP#}cno9FFz!#CHSyI0)2iGIH~#Oq~)EW^R6 zy1IfWlf})vm=8xg%Tmd%mSTmof_ukd3}KT;X7+{VXrV_cR96oOteS=D4_!cV4>icq zsywiWk=hWTAFuQM)xEwyUYe$f3R82Y=?oeVW^7d;8d=Bl{yedUK2z|jgoCv|Gt_u^ zHOcbHR}uXZ*V8|lnkPfNlom(kax+;?$05&ljY!_?b?8s<)=E4YidLwZd*b|4qa$eZ z(nhFM*XNh__{$_7eZ(F;SKhcBz86eEA|o|fvf)SN%uSmnp{k9SBC$rbRKiU^wQNmBVeuZYs|Ti=;Ckb@+dqP^(Sup%0J#G_!`b( zU?W5HlM2r)hU86`Lz^{p9F<87qIn7C7XzVFe%9Sw{Zmk9F<|wXChunqTb5aQm9sq(yg*SPCN|IRyW?=;eMSSm0rLm>mYu;)w*}X zcN+6qgh=%Ai_WCNesZb;A{ADgPV3DjK97b_ecr<}%=4%7vd;HIeaVe%qV8IZeE#6} z^hOgVLGMcn;a}aC7z_QUrMtFCLuyy>WbO$ve~cx?r_ijv$?=p~RD`nAq0MLzLu_#C zfp5ZKLH!)`52#Qyu<){a_~S;vAL^}J<<4B_&pzuJbT~uDof?;t&>|Cw zf1i%M?X&gCc3)TVkwv?KEN>pmRs2OsZ3nW4gP*|ETTfzVwHwFjXq6#vebO+S8#blPuTlbtmk9ai2RVE@Hre4%W6L2x6e zwxRQv)Bz_x=Bc*0>V1QVI4V#n?d@1KWzom(^qKTwFgm{AL}8o-=(>_wcj8q&OUE}h zMt7@`HP(-cUBXAV{6yK($5|{VCBiX(K4Ct0j?eb%{gul?rTu3_mfM_5^)>trl^@`# zXC`?3yu`2c1}T4g8gi&B^`gR2J6YZ?py@c-U3HKhycr4}psv#r>k!fk-H0 z9wUML<2E^;LVt@Cu5Hf4*uU&!H7`^YZi)?lF@L7<#i0@C-fC6I96f3;NsZw^lF=U7mPXov!(&YLyFz+zL@nJ|wNL{hJ;Hp|!tW?^;zzHr zo}>u5w}Br9&)+~FnHN0sp8#RF-}mpL=eya$*3cZ}f}RodsKy_<5TYPVjF~)JcSQQ` zkp4^X*fKC&X*Dt+_6Qr*u1}0ld`jCJVXrc_-Nj!qFv+v^^6y(r$T6B_{A@$V{dPYJ zKgcL`T__~ALCrc13#+gO6&$smRIikF|Lq39oKCH9MCoE ze%s!Tdn2Saj>YA-mVpL-wYm^nlf`vf!EU^~<{1?K*86!0ZjMu-CURLVxcmIz+ILQK z$w83|hOG)$&V)F+yA8Ha?CdyLGUxi9agl+JE2}FFYgUrc7rIN^RKU zREuarQAiNJT(`Owm1pY|AKg}pje(bLJ({#7!@x9}Yiq!lBA1=su^Z?!_+XfN)S*%5 zfUBLx6Fo&%zge`2`L~AZ5@y1$_dB?t*To zr_gD91g)a&@Laxwv**(lC|`i_Jd3Rx+&Kj{e!m`=o+i4UQ1GE}YzH6sr5juAlphro zz7c2j3WXsu_>kitYZQRv*3?%=BR`c)9l7As;lD&&qH1BD0$C7qxqVeE^}+2WV-HBk zMrGfsE?Hcc=uc%_rsC&j=Okw#4TeO?n7_jJ)WG*Llntrz`*ipGGbFF=pSW9ah0j(k z*oY0bN!niKX`i+=4j{i(gGoA#_Gi|1$=Kp!_eOsJodqKg_FbrCa+ZpP_3`M9sgrlq zm?iZW$+G4!Q5>7|Ryhyvalw|gDH9z+bz?S=e|(Prsk0q7edYCVN5UNY?Z=PpxOWO` z3U<-LV-tQvlj2|BB#%;U_Cn*06WL(z+vs0jb>;bM@Z{NS%%^KAXJz-4nV(>^Ut=I5 z4bY9|oO_E|-Zbp05~LM_xIAPP`d7Ju=gGpnv6>4-TdCqOx=$T+rx znXynM|ESL>{$%b|KM`u~_3ibK_ziM$46-H<9(mzvU7a&f`C*EykpCz)XZGjEDH-=+ zXoxUi$;5DjWK1t>Uf)aq{`x7MVN$-FO1ikjcF@NrBp8zeXu`;7xZqCf4R@7@r& z)1E~?w617~&71H+N81rRvavEQUM?6@m=mZm6eHTt309g4Yb03EN5#}=U(#{{NhXdy zLyMc}+Hc2LVK+3mPD*7bKYcgjiagE(>WZ|>IE8-uPixtZQnHcU9 zFH$+hcF`L|42Ht=H7%Iayn1oQppAE3=4TPo*tOiBGTr-T)aSsPjW| z_3NV>{iYb>+ok<=F5bS=J&!eBdN$E`77okgH;Cg+4?Hp(GR;`gC`^4R)7}suPsweK zv~y_52!;3zH8sm5q?hKrl*qk1leKCZKR^CW=9j%=R>c~I28wQ~pCLb(5c{yt{@{HU zn;s$luus1G5jQj4+`6r`Gg0aUPPp%tgxzLbp}6Uq!CF#T{F?QqzVS=-zD3UH>3>;Q zO&s?g-YnKE-S?ZNXUeQgyVvd>;rJ~--Qo!g(dGkR5~=3r{sSH5W|dZ`IRh^DvbQ%c zoaRn6M(g+5J2X0FFYI+%@HdtO9fBPB-)3E{d+lvJY!n~UW?+LOPDdx&hnE!mh1&C# z+}r%By>$Sb%BokjLVMY8?nE`Dhb{(O>Ao^<9U+6`a3GW6Q$ZRQENV1~L@Z*+7{ zemVQ$8DHG=olqOYrO}`JF0C?StC9xLFaQbf7Q}+hRJ3H3H{$p$uG8J?-XNB=CrTr0 z`nB8KcWth!>0UhJ6n9Q=d_e9e&I3L1e9E>!O^3qxo88~~I4ut)wMZ00%k0}U>0is= zvN!qj$p$*+SFG=|<1vlWG;PgF9Apg?dC&=vewM=547l%GP5-POqwB+UU@Lm)fnJl8 zqWkM4`AP%ST%U2M-OC>74;MBFW6_m{Qwi2)Gll&yXZ!w+ERI=Y=2iCW;Mfy;wvS11 z;K^_=w_i6oni79Jbua4Bc+G}QY$DiwT7IWu@Ufi@yLUHnBl2flM$!i^WPqN&mSOnQ;=OA^b~n&i3$! zKgv|a{;S$P{5?ALgIlcNYhk=Ly1-9lt)X7C{l#M@NrEI&QV;cBxeuV*twgmiM<O@) zMLJwX(2$!1i6ivh`cQ%vEnQCDGS`ggr{(Vn{bPMe(YMXKo6n}t{&J@j{< z#u4#pD@T{bHEO!y`L}|!nUYtM$8Za4@WXL`KQPRf?x~|A#T6~53Xh!|uwb|2Xe`>N z8vl}sZFO1pIcip3AzEXxw)_{RfhPFeQ#-nJJ#oe~o*D1|{j(kBAKb*?l42-C{jwAY zS#xs&E92vgaRt>6+VF9vpZt`im;YWV=3o=DaiWc5&Tq#=6tN^nYXQucNa3 zqOO0G5RjA-rBo24OHx`XML{Vk38lMRLO~Fa5N=RPx~1W!OF#sqyIUGmO3B~4{JzgS z&U3~&XB@}i4`T@T6?^Zs)|{WohZ*c1O>3XGLfR3kIqA^1PNam-pc7(oM|P14z4hd> zU`LLS%H8=`*+8|K5kEDLnBZPBceR;>SS6jNpjop>SU5?l2M4mVaW4MZd#d904=k2e zVL`8%b?@!1;5eZevS|Bn(lRY71O^;=cTzF?tHNgONW*p#kCYyCFuW9G4r;ovhugqS zqZO;0|DfgIb|R|m^fNP0qvC?ny>fQGL3*LYMCp_x569s^M-0)GHxzM?_^>4X%l#rk zTKlT+Pu;q?Dl^!Wy#Za0@Za>|y7$}i4$A^Xf*u*rdGhDp}yh0gY! zrjok-l&OrYtO23OE(!t;}OpD6R(Tiqx6Xv$U%O zr!^3JB{}QuVj1bY@U=JC*`mKYD#&TJf;$pG8m6Xtt)-M69_yRk$+z!*5q>BH^Oc^h z!SQ@=QECex_;EbOEiRmjHm6+ba=rMM7={!?dN=2U`&^V>!?FRZ<0QjuY`~b3HhOTC zdQIo`^Hr^Ie5^Mb-ADM@e`%h{SSV!R5I^cl%@Btb z1&TFt{shTZrO~NJw=*dPZnVIp);JT7M*QXDizT}v1lGFGCrIWk$72-Pwoe;*SlL4{ zZBwdX6gZh^f7dhxlwEL>X^=&X7W5lYAy@l9hS_ikbQf??l5Aaz6Zoq9d0IWGw{QB< zg-p@=n0F^Vo51LX~IiLSNZK zw5FXh@~Q3#B;UeIL{z_sK`fR_SKh&)MA*eWD$4>Ux^6+Vtg^bM;~*-D{>@G?>1w7q zAgJ`3W-`@^#)9E`|Hn637D|Qn3;Y7scxikTEq$3+t4M3fGNd7g|C*V0 zoZ50#F?{y#A{LmdHm${(eVU(g>TLrAUy*^7qmz@BjT%1&b3jhAD#4_RzEHT07|bR~ z!^UApUQ@l2qvEVIIZwoku%up+nrF%5Gq_Sux)Pp^5>eW52WN?It3~<;iUmCVpAUqS zXbbZ;MCoeU`w79lCDbb2+bn@fBTUy%>{xrM++k=WZ7BS;t2V=HAODXQ6k+4g)@MqG z#fGM1{A*ZIMFKkpw6#`e*rH$6|9+bgo@fTOGN?ziqp_5M9=Hh7>Gy`wq+yYXusDk2 z1`{$UP3r6_3^obS)3xhe5#B=W!#}6tR@snh3ru4N<=1NbSJ(&c>hzt`Ea4`)dei>< z4-br$2tYeevSee#lQ5kfR&jpeOOO30oXY&EJ!y8mlL7 zwqDDGrkjTxo&64a63tluspeih2~_ZC`b5!?X&3|LD6z>s@IXcV7I9@Xw-d{I8aOym zk%@tfPPjr7gzhHyFLmJj+puJ(<5Ba@AXP!ey`Zb?K|psS1+;3;7(R-Jc&|W`iY%N@)=J24MF*0Y_W~`aO^BJti|N^KHY585b;^Ilycgg{^L3pjPxQvm{3FyY@?Zu4Wv5_Kn|cR z2D7%_9b7C?fLRVov${f-Q6+ky^XmJz+WDW}no}3~mecuhWvVnBc^DB^%3mx=k8(-q z6F{kIp~V)>_G=zx277u27QTP~v8vgD(wruclITjBMo9ZVcn>f|s(SVjryW@9IT2_B z7_Jc?BVx9C=6kwdf%XOjfmWkW{UN{eYG2ayOIV$DX-+rB!GQEn^|~ z4kneHT?`W4j|FTg1i1z>ZmH$Z<-3v{Eljn2o_#j{x`0fuK&#|6qJ;q=EWm2yL39q> z2whMzvrT#*Z&lKP)Cs^uAa+6kFP8KhFdfbSA1eGA0{sDfd3AmbgDZmqTi=v5bGt*( zz#YZRmzrz^_CbTNhtw~l(|MhVlZ{32``ML1b^|mce)GN*(a~P8+BN&*A>;z6{#xFW z-9)|tV$KFP$K!D!9-atj#Cu5joTFJB5V^Q`yn2hp=2*!I;1w3Z-)6lHH(-*Z;NA0a z66)uT!d=hgRfHywwSq@;7Mh8?%zdlH z1jJlxW86t4EwzhQCRZF29;RaioQOt;&wj8dYcT3qkBYTH-RE=N)B;AwhQ#)8{*_QF zt_3hn9AYU0B?qW%yG6dIq0%>+K!o4*M=G z7t}=S&$XnCsmeuIV6)~QxPLX=fjDcq6Ab>OwlF4m6%91eGN~NJSvKC=HqH|t zdVbsV4dUa50h*(l{PKT~$CvQ^ifV&oSUEmHldX2f202y$d7^RJC=5Ilz!mv`v}%zi zF7O<|NQM}aR`u>z*v(2Vm(6K59$iMZR?s^Z2+ui#;6Gzi^XXH0@YzF?<`xHsRjtj# zQkw+khp~vxE&yP)ssKi|v1sDz5zaomaWl$KHr`={F`Aww{0AyH(b%jBI{JvQoy zA3(Ktjl^bMNPJqzvlzaXjA`E%a7sNUcFAv;w$tLnWkv~=Z-oNU5g`PWHK{9dsZ1Q-r8&9X14)P5$B^5sR*5m)WW@pZn~xaMMZ| zN8G7o%lvbgAf=*Cm9Dl@NGDMI@S$*S2SVrqSHyyeFeW&b1^_yP+7fl$TrKG8?#=|V zgYHxBgfCyd*hp$RP4(MyxP41;*{fi;gi0Y2WH`k(!cCT|I-Q$NR)oUXDdQT}?9blJ zW>W~;q-FYGoo)HfTM~OuYy9`fJ#Rmn7^%iHjbKA5Ece|hs!@a795Z$6NQZ3d$8OS07zQ>Pw8Ok{L3+aC16RR8zP2P>^w zzWs;mwAXn+7)*^fIQ!?77q?iVhe6?wbJO!jFhmr7baHv4QvFxuhXw|kO3-0ldgdXb zy{6mv(}pd~ap&9{szY|WaZM>ZYxkzyZ__+HUBtHZ<#sG*pkHe^@wjPlQvS+-cy(y$ ztn$`|u%@aymCWe#9osux({w2oZWYk3MMRj?;2H+w%2|)?i?aWFO~+~B%a)91t3-@BcRBi1=hu9Tn-!acO;Rha#3Zr9;3uXCTkz`bo*;`kpa0@+Wg z6dYq~62BX!b;IoTRqs#1sx7YRQN7%Pe>SZ6nbFvnHvbO|AnW&%_)w4!WaLL0^EDg+cMaB)DO3w# z$)qC+D|3v#MaijAt9#duM`7@({U0AMhmolRhySP-#1elyVsPboZ^QB(q}qk{B)Pnz2Av~Rb7%CsYY zr@YL&!u;l?-e;?l?$~F}+pj?7X@Op3@wdeAt_euksuIiN`|lwJ13fiZ-od=8UNF}T zjy1%i231hPgeUBB2+9pC(RK-7Fmr^(+w-^^=C}aU5Plpan{PO7J6*SQJj*M9bv9vO z7gaW7l8M(RK%AUPu}A&qrPsj|b_Q3o|Eum~@t234sZbbudUL!C@%4d4l8E|t00?>; z5y&-Ldo?g5w5uJN!ITJQbAG2EkAR#oq&IR2&Vl*y-uIJ0gfH)ZAyGD=jMhw~es|o` z8c+Jy_6MsmE%i1NiUTWq%)OAe_*E_VWrP0Cw#hy5VV6I%bF#q2f85|?7JA2AnnnKl zRFcVtVsI-b?qP@7Ui0)%T2T-rr7^y^ZJiwcF}9^^hdV2W6UL9q)Z;<^xUP&+EW}EK zyj*VXpSD=@7=O4DzVAJLDTtwPiQ@+4nCJU($@U}@r-#`5nXa*j^H@*leAcUtMcivZ1aSgGU5Ulu$oDE^*8!+lJBD)A z?f^BRYP)9R4@{Cg;9!7I+v;u3e+EhY^W_1!BV24-1i|n$fS6xrT=m7Fi5M87R4oOE zU3%E_-+}2s0eiwEu+JsTzE449slCswakqlhrVZSdagyGi^^-8XESlLzXfogd=pJK- zHH3ILgM+5s!SYlqwhbUEapE4g!OUy~0#vc7s>YLL9%z9(x{1<+Il??N>ca;Gd3js_ zXDAjhP{1U00Yut2=|~0v^L_>ph!@PJ1!Oj%gWtxhQL5^)k2WDNz$Rz_MjA4`iAx`A zrr&LeSU(yP5i5ZmP9%i_ zymfoDk0ci{YFzEret7M~bi=i3*Rgo*dF9~&`P9>>$a0U=@ndH~@l0=no6SU=}%5I*WpIK};jrIOe98>znM8neE~@?~5Sx-s%; zao za4ctHM0Qwz(D|czrNPwcfdKQxUC=_-3E1IdNVX&qTiVYaAh(NW4i)$9HjQKsKVgGz zFK9~Bt2jfjkWEPcFLA;eA);oV@|m|6qEe`P&MRnQav}Gf4h##|B@PybGeMonBPI(X z%n|i`vriws*@v`pvZvo#BR=u62-y$5p$bA~I{rF5*n(#g8(;f2{#EOAl{4Y9J(+C( z<6U!Q4%>YvU$E|Q7!m^LCmONSFRgz~*wrk~E2i`FKiGP!U6MM2E||`E5RKN|z&8Zr zEJ6s|w?&K%;QO6@#6?k{q-{c^@ak!=^pA*!aZx&9s!BeAFlobH5jR43+wPT{ie=h2 z1G}{u3eEAQQ#ibf05l%~sLT&9V6bv=EdwTF2|TuQIqBiQExn+@k_?=u3x3F>0%*PW z=f{ob|5&fUoS6sS>k0r;Z(b{s!oIhuZ4I^qF1x4YfhuFcaX-+YTm~~{Arot+p&RF% zy3Txq@PG_%O;&%|Lm@W<*Q=EQdi?Wv4*%a8Lk-5Oz-H2Cgq|<&|z3i*V_wVM))vPSkmo z4-;Sxhs32vUScx)Li)RtsTg!_TD>}x8of<<*R1n;KS2SS z6zv2EJ_oVBK%4`-IB>%1Ou%`Wty^h}AfWs&Nqz*wFfYJ!L|vympNpA(zls1D5zAB2 zn4wFF);lfE9}>#S=a&B})4Z+!DpO#1ZIYZi`}!)U`$WW=7-zM{wm zZJULx?urPXcj=V0A?$1qFC>C3V&|&=@zSs1w1O6^W0x+QgV9^mtn6$NBVL=yPpj@0 zebOt1f;&^a^T1=A0R#_-qRx;7$C9eRd9ttCTU7hGRQO^f6|eix&K8f&OuIEWGYl&1 zgr#nr95rEGb3d@^%%7Ujx^iwxdb~A#O`+L$*5GSR_hnG)kkC)XnOHsiyV*`mY3mR) zl4S4xI9#k;p~6RK>)9>Y{A^0)G+Se(@bs#c^M*&-uKjkn{%GBqEC0HHV_O1jb9>Oa zsO?#1W@bjo_JIq(7f4-ga7Na*(tG|KvG6A*CZd)RY!s9vlUbg{Y}Jz0 zh1>{}6pnud6)%C8HiOD1UKSw%4i6_V=7L_^7EEvVJqDNOyN?%6a1&^>{!AoUbZ3an z?QZ*xZdz#!5u?>9kFAJvL*s{Jg_m*RtK4Gzvx_7A(0)Yps zts%r@0x4b!VP7gZ98hU#bpc41(DRR(oZN0b?!8S;MgKXWz;+u}#R8jyrDXY3t9Y@5 zEZP4+^sY6xa1z(^3;F@jQV0Y?*h2Uh`QWXm!PFWb9QaXa-$>`jlMFqI;wVx`C$Riz6S7eM~Yd zU+yuSvaJrBl(k=We(Y^ME)=`mm#@iluldOAXFglp8k?+@#$`bVx|rKCdM>lvFEfmXJo!UwGaX#IFHzfr+`x0uD|y>f=by71|IF@7Ow0)h-DM;`~!NV&b>(##27( z{|_Lc<0U0H&6Sg3rQ<)Dvj#yH{eluE*Y!rh+!yi|$K1Ro+=7kKA?O`yE-KJ=wLoZN zBie4ntEI51V0!7Gt6Nr)@T$H6EhEn)7h3NbReD`#!DCbm*`x9Ez5Y|g&70`GDJiz> z((&K|1=yD+#m^RonK6iH`#L7&2g^|nuC~b}O@V3m%gXtwDyx>SCy(gp_wo7bdztJ+ z5$a3u4c#B5J(sj8*s)@`!Iy3xBbL63o+<38vB|zR9E7xvO41Xin4$;&%b0lyQwEE8 zc|cNHSXj6eM#wT+Pm~7(vR!b!3dvP~v#wreDZ0 z(DcCc$oKM(JqF?rMEcnXI;yXkOG_NYq5y-r%4;ZXRLkya#IEwUwgGESP(w}$r8?%K zexZ_HPTV$~yd7;L$7Gp#A(1Y#Pj@ZJsa>V+R|zerGU3rws_(Mxbmo$M+2*^iN#qkI zwQ+CdOjHy*)j|VV=o@DBb$Je4UmN%T9PkVYv}1D#I(D(VGV?>|@15Q@+mObAGFe+&17fpBSFhNPIO4{I zR;L1BwvZzm06kXVVZ;6Zp;8=)YhyZisf>M78J%8iU5Q~MU>iNp`i`cunSRPJI?KY= zKKCmh4aL;NaKj%9Y&b!K{#0cC?F@J}7-4pVQg79&K~ws@nx@q(Q2((H(U&T*- z*Au3rntI3XhaBKHVpM0oJ8e0wlSE-JnO3)hBh<5Tk-p^T2PKTeJ6YG^tkjTH@P;&O zUSvD$m2^{+*-+Ag`g_)@WO0S2kpwJIAs|DSvA^+@_NtTBc|uA~*~Dy~ux-FIucmzG z4Y>V~j_Ks=*^dHYB7g8hB*Ea|Bh;LL&glV~O!XFe(pAw*b|Y)(;9Nf%00cTh&};eb zY*xkZj6LZ1ww2Qj&66oz-NI+BkV-9xr5aqjQg9cB2IVQbC(qd0tgcs&E2Wcc%CCqE zC#*~|CurAocH6EGNG5IW$(xEWV=2>y=GTo6MZHSUV~(3w*S8pnd;S#hg-_49=^vo| zpLe8sWGz!A^j;J${Gs9k9Xy`kQJ4F(C%3LETvQQmS7FV(c(fsD2J^GGRoW55Wlv(# zd5P*rx-THl!o~g*nwKux&~$w8Ao$Q7usuK^%^Pur-4h|PgSWMMq$bN9a9*m{g6=UO z5EcagZLb%F^7ErXeTJ=Uh# zl``q~7w6ArSCdK8ETWpvZ9qT~yJZ_mR!C)kFYx~?4(!AvA`*b4(~phJvUujP9D{th z*yf`adVSBF$^@Rg%~Bmcn~h{p4NsS@=D$`Qr!qW}J7k?}+{9M>Xi$L1aCm@C*(Ao{ z?C<)ev2YMae)aG5-YTHIQ@$aD%_fK~Nc=vUthG;&$8VUMqpFMNN7UWIkhc%CO+LFe zvE4~5{Ir>sG4+`g#NP1M6Nn0VV+CB^n4+FJSnDtBXeYflq{Oy7b1`Sd_MXWL#tSl| z7oQReaLDBsl>KASlw@1jH(7u}7&`VTsD%luqUCq|J@@03NTx!6g02(Ehyvzbe0|A1 zfe=;wVm3Ys*LuqlPeuBW6_VNe%FP8Le;_RPRKAH= zM58rTX1!)X)+X0=ykbLmJUsgLiLfyLx4bWoAzkZ*c*9R<1eNL< zo6KrIb0|glYTJsGtsz*@j5Rqv>GC(hHihw7Udl{azK>8O>`s+Qh!J%CwJUR@qC`#e zI212LObq96ndp#!9cDZ(@WZdj&kr=7H5l;^+b9}qEUzdwJ$U=$2dnT+!DlwEHPCJq zmN?_9$#U4a9HdDol1cJQgMcVl_`i*bT#22=r;DpHL!6t7i}~hF?3OWCZ%PJNL17UT zkvQ9!vP<8}4`L}JPEOF+IDH|jUqyYG`6Dmvze(hFRZp9qf0)@{p;|jv zW*yW4KWS}8bQTB%s+Ial%tWd&vq`EaKV5!&u^)WFLM#Q(43wvwdwWBlQhD)@YFtu$ zb?jkiZS+*^zm=md{-j_7mP11r7eagilDGlmBh0Zn4}Ju#UGQS|-lk=RC5KJWR!)IS zGI`4{7=M5IW~|s6Urf6JHu9-`bj`i?ZR#=Wk)-%P5pb6!%0jhXl>oOU&p8Bi@$a#914T==cDd zmF}YO&%^6Gr!eWr4XN2_wl6;L7JTr37JETh?BfBNA4KnZ6=Jx4R5qS+DgRcaGY9K7 zz}`+^mT!laC+MdP$I^R9bw1;BgEjLkDhu!owz$z2*g!4;ClF6nszoq^8)$vDg}AgM zU4P|~voqcT`Owk+x9RNzWO!b=PuZ95^fWrTwqbnM_08wjpG^azSjruqkGAq~#-jFX zh?E}2mGH#9M}2M{qD&wkSAy2|y;rxG-xDybtBkTq2+pbBeNcVe(EIsjBzM`+e~%9h z?A_DAAcH=PB%%yJVhbupA^^DeFRG80r8WFMRgjH&V01cq=I@Ar@M4E69bKk9>I-_> zPyKdEhDH1_b}Ls<)mqi4G?z2i?p9Pc2GQE&H5t1x-Q!lWdY}$f{oXsZB9<6WVhS3H z8M&&Ojmq=7ueY$%yz;Qyem#=)x1KspTR9qcARkJcK~wLpgzG#-PN!M2#ftFemN*T? zJkXJtD|c1H(It-y+j6q3yF|YtDz!2Ft0&6g9H5?8~J7xFpO)zyK(3oK+6Ev>4S zFp3unOl4uPRnm|;D3UZ|3!B2I_enLtTqI@M9VuVYR7gP&hfl4=fpS^Hflha8fQTiN zl7IH^8>Kcf*j@1bUe!+uyPq$TY;`yU9bCBIp*}TjY-e;|4|I1XwH4Klc_t!kQ*)`Q zR_cweE@e?fX$}cW%w#p?MS9WeW!DM*E_ofAwe}TejIt^wez(taN#zI_v*={6#7%%6 zT1oC0@wF9W0iT0^317_ugmc)U?Bq6a)+YHDgFTNG(`bFPqVVQSeBvqgNMNv*b$ zCu4L+sr5V2tich1!|H`BCC`b%Zt@A3o$C@l{k_~v3k8i_|kxjimO01Qx$fwli4h~`#n_}c`u z@J6C4X_$@gf#9S=9Y)M-wvmny!7|kc2(%f@%`*OF-|kR39iyLEJ9d27r0?-a(&$`t zvMPJmG&ld9*M1y^otDyc^L66J-W!yAWWnPz1IAqWpw94lrmt>Q1Z$Dkxqfv+-N?~^ zY#)d2ZMdpz>+#Ozh4|PQj+R6A1AQ6hRY(!v$~}<5F$n(B-=Kl8pK@qNsFoN=8p;_o zRBl645=fw}$n4`Y@#QqW&isY#C+tcsD&YwQ>b=D^#!1;rNp{Jp(a~f~{B`>;G8?4B z6^A?~V!$-N+?6bhWsex+<7Y`SQ;dFa+q3{RMMdQ@%YdJ>fz$o7Pg5&`^~<#As(sXN zrOLIqR2zI&9JlNK>L^5M!^PTATI?FARvNB;`{JztbA6ZA zggQU9L*?9+rg&=Q_^0hX{}eqhvJnLsVCfg&hc)8d;taasPXoQ7!M?^O3_W zvCtf%+<(%;F%4G{W~7N}glIf~e@sLxLJx^Ox-55Q_@jr^*|Kg3Ht$CmrF zE7SfV^AoX_j@*OV5sFvY@xE}nw4Kggki}rr=6N_O5KcD{WB)Da#YV9NK!1P$L2~nZ zca+~?ID%S6Bw-N01(10pRJIJtS(FVDB#R{O+)E_|$}Xr3B`U&q7eaXk0GtnhhT!{= zw?#vbR4iCEcRWWU_%Jcm>cUG=v#>3Nh#u_|SL<^cv6{P{)hxG=HM+z~Ky+>oUOrwJ zdCmA7+obiIcm50A0Y>L-(5rw=ZS0v1Wm^B{I!>M7Ayyl@l0QRP(B}ShPX=nCL$lHB zXhRBtiL44&{XsQ@1oUFi%f#EIj~@z`Pz^f%JSGAsq0H!d;+l=wPl6y8ELngUP=0_^ z+Od2Y%O~6wO|?HvL^M7`=bWnQT)SyH@%`LY0%MV6k8kfm048q^M$0F;i_D}q&hqApp zeYS~QZpi(gepeXorCbi^lOyzc7*ZU>x~%pgtab{5H~(7cV6*{fEeGV|@LYk{UfH6U zl=yvOD#_G4N`>k;VTd5uj;tLKqT36L(EK@nPdI<^8+HxC@VLdbYV>4B9NIoyV@oO} zVqsgXw<(%$f$xxBu7b==OsUjV6?hs@`pg5LgWRv4&~f8slBJ2ra3pg5RIe?D%5G(W z>{D5^R2U;^_X{T+hk?w1X-hQ>6Lajy4|=1Y-P8EM`n7pl3ps0u_ASwQ;K9eNU}%Q` z=cskj0m2b{$u3?P0~UZbpihCK?sxbXiBm%4OUR53%O2hm;C9ko^WIZI;$0X|$;EmK zDl7LT6299{=tl~BgwM7`2mk9olxq_==p@}XA-L|nM}{ORfG9=;fh$312`zA|UqDX_ zgl~vEw?}k?^JT+`8yV*WN#@kiwPBw7>sR?SjIQfUEA1pdrTq0<-0i9+JQlOp24@r4 ziZsl6S>N>bLFR7bY|3r&$GPdHWyZ{bL&yNyuE$`WOUlW*u_nH1f9IykpouQEa@%FT zwEStp34c7--&h(QMA;d{avCScN|lkd7ZT$&!I}wDthq=TlI9(^^MfnE+C?JnZWLFD z97AKE3g|#=+}yXIBZtsG!Lbf;xDfbS2PpO0(!XhOPy~?+V&5xy|G$64#?j}fIZAeNwM zhiv~bPMarpdR$!$=%Fiu79$dJP%e6BO)N6(_Nmf_R)BbUY%K5BirU}$Z4ZQi1S%dX z{p(O#h$;9N9RSq53v!N=N;&`j0l;gdVYInm)P8dX4OzBlq0Ez^WXy_un7OkG0k0cwUC|Tf!c+1G z{t2kKId%D}9(!?1n%F1FtXV5Ozp5KrXBAA89g-8Aj=FNe>ccW_*oa->-tEo_vuuxc z>al$KR6l@Cmf3+Xm`bB0bEv@TgQksG$?*R>WV5#I6A};Mh{UWxLJ|^64Ve`!pcQLS zo4xeECJe^L0-vQD7ey#9Uq+JToV|lqewYu#gt<^rl{ zO{VouYEk8dulN4OVkj{*j!HZRcJro|0SxW{RgAU+Veb@RgArRW7>AK;JR}bYNs~hn zje@v1_90I_3KEVIAyWxKfEPmU8_K92Ciqj(()kQp)duflM;OvNflzdN9V}t82?KL} z(I(mzuN6DmA;PA664Vp{!Wp(3jKn!CGXXYYTv7AJ<0OrrIdAc>guxyQ)`P?!D-{t_ zp;-<=`%J}zf$4%D3ItWr4e?MNF`0rgy>&qdv`65!07htO>pMpcvgkblU&R{?IovsjpWHBL$;0TKv@r47p++FZAD*8TxRz%`PAj={)T3Iw0 z`n@5qu<_7Z=a8TGcr@o1Clmzm_<2M`pL2sSSo_luNCN1sKaqxI+wCj$8o0a`n0QbZ=K#?j%idPPM#-k`_3Rm*@c>l zY#1kk6{j@WTA?IU7XAZ$c~vG;AfW<6%6uxX%rwSCOkX;WkuM`l#@4;|N_2So#i1Pj z>=uTsp$ulzV%dnDos%G(_?lw;`YQ95?vVmB|`16Q*z6O9IVJaa=%MVo;Q#$qw) zmgkZ>st_aMz_E4!zvoshVT`bA_Eg~ajf zdO#ppvtjXwSt)*Q_$aSDH?jFGLm& zRoB1!OT~3}`2Fzv#DfN~t=n*%NJ?b-M2b;buNa_w%iJj<>WWFb3VksQKq&yns9sx5 z!kog<8D3|w&1GA`8ThAWLaFkgz{^1Sr}B|XZ5kqq;8sBwfaX8dqBytpcdVWFH8*p8 zQ%^tpZv_+@P6eWBIG0#yRN z(TjgyUOn1A)Q5iPQ%HkzRP!=ZV(h0AJjKvYJSI%`sf;f#@Af*mbDvF)NwuQ=5MiGK zp`H;i&Rji8^`17qi;lh7<(gYY|x0g8(y8@a94vctC%?Ps6G7VvW6wU5*METMP% z+ap;7c0I7(dhv`2l>6er$e9Jb^%F2t-#Rb;Zi}D={St@rWKlD5rxLFnypQ&!V(vs%|%j+pOUqW|8f5#8@9C_2lnMh_pB@>q#%J=B3w0iKya9cQ-C;gN*Y?0 zvM+RZq7;m%vP|sCl%MRDKls(^+mOxpVxUCtW9}8Y#Hi;kr>zE<#SX@ov$i&4n{U|% z4W(u_?157w?pl+b^>IMf28{)#e`%)(74S!Z#66iE^wOFw^u^U-)0#3m0M%X%3@@eU z@mHEvZtZXgeKhPb${2T=;yVAcGpXBQYBPL#i@Q7JuK!12yBXI?T5)$?2ylO1KZ%4k z|5|Jp)*O^2~ULH1uZUo4q57c25}>tOkie0i?CcMlA0!+_2I?p?MpG zG!O)Gk~H0Fn!AR_JM%4bN5AV^k4;3@*7(YeOu7&uyEMJy6N#Gtftj-{ld|zxIx971 zjqF-A-065@&OD{Pu5MY!R`To)0bUHNKvLaRyg}!0kBanIa;mMl!+sB^g<&L$*-9%G z=hl#Hx%Ns&v#1Ev{SbWK9k1Kfh)Ypd#FYVPg+*-(!{F;}PL04+3WAzRrchM= zkpi2o&2<+%RMeL3{W(jw6bMDGj2AynCM}S&kejN1pF(-pcZu_~v3UGpk^Y)$*d`Rq(myMo5_ zDfao44SG}h#tkvnZ+VQ2I#;fdJ<<7~;PLq(&Xp63yAD>DE4Vd6(S;hJ6C;^V^Ic@F z%Ux$9;GV-}6r(X#x$(T?(|5-miIv0lr0R~yH^#RaI=-)*dZxxzyKN`($Hhe-*U#=s zNNw83Zf(!<)5;uY+wytiOUu2G%c~CzoO*OAAo8c@!iKoX5%I@ZX^|IqM>UpAJ?Fy; zXR>9_ZzhmASmwP&r?EcKXzO?_df%FXMo+1z;?cvVbgLZO=yVEtan<`{+w1B3Qnjh( zO&z0##4OUIl;+>98P}ial)i0+gE8;(FBc%402k4-)wA8Osd#&VjI83?Iac}*MS`kk z5LWir2vpCoEn9|edk0#s%<{baYnDw9d$_-++q>bei4auq=oeK=oN;RXCDXs_N$Q?N z#DA-OmJ~Eo^K}KZG}5V+yWL3`GSph@UdiY6PblMY%ovYjX$an8&ui%>h^;`;6Hi$r z75Gu~`!FRQmc8o^&97BbL}}iU^X8|~>Lw>1vc8$t1Dg}Q2$b-NmaQy|UPLS`;Z_5IMnORtxBC@!-56i7e%idr5}ia2w8!tN@ByD^VjS zixT=cFUzJ-bDn!SpN(spxB`=fLno)EU?||x%Rl>%G5p^9*Hnz}GWk;zzrGqcGPj4q zeox*v$!esa5hFjDkw>t3`t+mK+eq@jEFrBTj@bF3#6>258$x#?;#g+G@zR-2kB*dk z4pz^}T%MAb5Xooi|IDe%z#V2F3@l93^pT$ua*L72)e9CafE_orxR?|QmQ|?tr_f_< zG~A4LWrrO2=49EjQ#ol(&e=3W_+2{DIA5}el^&kqcQpJaJv&X_`PnAA!k#$V$NSQ7 zG(+lf>09%P{V7hKJQ*rZ-SVoYLR6`q^0t87-3;mn_wIeWbv!h+$Rxwc7~!zI)%y;guHIuZf}y zKBRBq*M!VHvpYx-ojuH}1ZqwZ7sN=^h^!5R=q_V;nh49^l9Yfv5w+}lWE}Bi!*vu< z8nau?QJ1CWckGH}9?0d)92ky$v3bnhq7>m9BA9SkeHcMKL7yGAlWhKhBxG!lLPI5S zxhh4f~XDaWqX{X1?$e1=1 z+qd>DUeJoycB)FgGJ;-=3R3fwt5jqQ2JScAXtArxPhi7%G#F?y-mNpuX*xPHA@?KM zeP8$G@#&|kt^5Wj+w1&w7{dDQls>*~?uiaxny3UDr)7J4DBJJ@F4S>d5_y1u&!aX< z5RxXqlfsf<`>Cv8Yw~)?*pu{Lqg5Iry*GMh?8zpCZaPoWICbgDFCV_0P~_blinjXP zqi+(1kMWJb{YFM~W)5o!+fe@{X}n7Z6l7#%nRx+N%JcSD-`~&Z*b)>J#1{_95oB8D zQpIb!Ll#`1Y`RL5f#P)@j+3M^A$(<@F;8)Nnbyt7WqzjW`0TfijbVkTagCJ0LFn_V zd^xm7RL0CR@BJTb3gdLG2pXER=UFo57bE8n}1(o`U|mA{2TDLXhTGpF@%zL>}%(IzE+lo=YVl-t$G zn|SYUJOytNzP4=*hZL?X{Mx#i>Ng0s$e&>D6RJ{D3$QotR=uYn zH0c6C`Cj_FDAMRXq=mPpLD1QMV42NbkCOPrDfU% zfgm!y3yHPA8CV8GxyL2V<3l=WC^YU;#0Zk9<0u_2^=MNUcxMgKv&tJ2vTS7MewkC` zj~J#=M&r)qQxK_Y;M5eRrLki*Y6i`wx9kjKQcJ9%tydiKUVk>HPx!rlkv%WzJO3c1 zvb;i40}b9Phl&DAK!8o?M6SbeE~}v*HcSnT_w&Lj7J0h8Md_oxH{lgh)WFv} zYd}JbJa$c|Aa5E;X-bjj7$jgwVI@FPWF93;O5_qVTXMgjD=*Y)x`-iZpc`PIO!NAk zd3Sc6;fX+&+Sh~Tg`&hSf1eKqj`kH-e%G!j)HNd(Nu3`p*zVA2GHdD+9138JBfoH*mJ=tg#g@DLD0YTdeaT&Gw-Bs8GWJdeAMps4( za`APFGo_z45o)MJCe6P=Nh^H|D9q*MdIe@~C1*vm)^ai-8{?xeAq%Pg<`;yR4=+|8 z%$%V&ovCau{&62yVjI>aR3jo~V~*m2SJ-Su$_uQbg39vXW~frawxGMewB*Rbd6l-rnxmHlqfe6xtK zem&+Sgvz{ZM2N3vC%UMhF(KK~K}9YZ@neJn8$$^$fqC(p@We+f{tqH>Qz_d5Z8&%Z zZ~z#WllOX)=o0L~GNW^R0>*!cFWjW+%=_{r6?~qPs}Dp~%%0<$Sr%3Hl&^gBJzo*y ze1^V^F}FKpt4Z0`ZAp+IB<^|IP7bS3e{+8x)^+%-U&4fEK7K}%GQUCjLG!Q6YW52i zxi?b~O*B_LNYr(-peOUYTvzQ)5hb@(y8rzhde(w7$S|gNl4o8Erf{E4)wAMkR=?pK% zw}s?X`j{t!I^!=gX8FyU4Y7F^F|xE^7b*Csis7`Eo#1}S3VF*MIqzl}J$~?t@EwJV zx~jl6>2RC`jFgNo)ml&72$Iq;*yF1`nc+i`Rp3+oNkQGrkac(vM$0r&oqdE6VK2Vh zxUoUM($naD?TU5HYI$mv;Q%Q{6TSi+u(=1f**7`dvW8qnXq1CL^JeGvgghyEJ*w!{ zo$K%PdR(jE!zwr4XP!*7L;p|1vDdEyu?+$XQy-$Gwl8RFTwXHv?1!gx$T>unGJCb2 ztb3+U9miu_(ilhlC+)9sHQ6MMEjLB+>edEHOhiwJ~ED${Qn*F5Zdd_g z(PKecxJvzx8ubB6J~VK}rNK{avz7b3^qc7U0CQKBV>1y!S=sCf!EE2WJb}w-%a|vv zuSW-e`#k}f*6kDA(y}^Y<-3gQ)*06BZT;&h)Q8&F`OC%pM90JWEnG^79>LxMfiYn*r@W@*HVhjC;2>&#U`WlnDb{i>ytM90X#8|cu-lzrMN`Gjhcrn;;EO6HB zhPCM6#Wxq~@Nw^!Yfax2adMutiV?-}GdHe9^*qQKNhD&?xT~9(9r%Un_Q^H(kFR8% zrBz3YhAAn!?r+VQG_G~ItoK=jU_G>WL5BJ7=W~LqcnUW8`>S&haq4g{;-)3Oh6ZVg zbxyxYamg%76hEb$acXJZf%&p>^UlqnrP{;&wfRTM6lo>AxRLYxyj5=81itJocD{nR zEx67$CU#K@iotO6zu;$BC7_PS8aCGH*>CY!Z+{Od=Jc-7kau$bogn>zb4U9(rEl*Y7Xc)q&j=9n#{ zBJiy92VN8a zBN-r0fGhDYm9QyTI6ewmQ2}Lvu&WfQWDFrL8n_-3Krz6;fS^hG8PI|w*bm6hYz8;z zui5j{**_q#!oWb=7_ATGg44MP=-S0rqudBRla~k^>1OIo-CFu;x3ji@Q8Fd~*jD0kly{CIb{KR_ry)e^M>jA9cB6 zU5_V-DExoed+VsG)^Klh(Tzw+NGdIeNC`*@h#<`(1qqQxP+CE{R6s#c1nF9IBOxsy z(jYCVbSNny_nGc}?m1taZ+zqaeHnWXgT-3TIp6nv>K97({KH?RFfnv}78s1IKejR9 zlF^ZsxCpxCmXdz1{a2URg&zvyW0t(7SEVj3sg<)Bi%*YH5C=s!`m(${k*P%YvwHcy zml5c=oG#h!zOU49WGI{n3nvFmjyclrHu$=nGJ7qYU07VS1OSRSltWh@E+~UdDUgV#-|5TIW6*5h<|0%zFP`B6pPd zUQJdrE%vGDaZ+u;O?@uQ<+2AJ%})31CM#{ON9X(blQ#74kx4@=eE}I?RH~c~&4H8z zwlt3EjYl|_6S8Cn0XKFtajuT&{hK!8V0+9f=Qv#<8?{)|heC-79*Os?#qnBbsqqBq z98{FW&wqk{2$rH&vE4AH+7W82PefdasN~*Iu$P>PdU|YG-`)U^A934$BF&-{c|IIq zEzB8lI**j;>up%A?v(h3AJPw@G-(QY<3F5wRJfkY!a>p1gcM%;7(^@23QIC=LD`19 z4}3hF0hb}>8Gym?{sB%LBVvP+$Ea^=N{(6@XzRRfSYm;9d$1Ld<5NBW(~W>Rn+2G< zqWmBiM|yBBI%_bAe;yG*oNruJIP91fsi;D9wqP3)-e`KkV)t!nkD~?4qgt7GJ>fc| zsfZVCC_lE7U*nlGZl%E&Xi0C}XdH3f`eJXh^*D)rRlOj#^}Pl)aHpv=ND&6ZFxc>5PsYK)_S~G)u0Hv>?>1uwY2uEN$P6`GU6y`4inpF2(@j4Be^GBoePmg~h0|Hb^P7Wb+ z6an~Vx*Y8-_2U5XYD3yBP_1OW#F30Bw1qI#KJYB)BB2tOy(%56a;7RBZxHs+wY!O~ z_xBo{b)#N^QvP1Z99M?V?*ho^#^Pb+pjc!Pps*$*Wt zir3wZBJPYw_e-z!(qe0W-7Co5FQUelS21v3&7N1d&B$yLJe^nGb(AfVJQ%sfvk!tgf|fq*zo0Bkl)`C>PDsF;OeHwq5toD)h!jhUf7@Yb*@+;7y`6fbd5MGnXnI!a>k zB)6}IZvfr`dL&WccuMK-chxaBD+_;nvA11E<9aaY4HTov-oeobv-W3z9xX?=+eUhA z|Coj84aVd2NB280fF4V;Bw_=r(Eu1E=X8I`S$aO6o(vU|EfF{B*pvx_X)MLV1ai8X zxE0xN^0{SoykJ~w(U_=8@zB5Q%S~)yIV*~*$>8zjvgqqtnZ+Z!t@%opmFq>Zlr-Nn z4{RT|H&`%t<>c~+CA{tjydfr#HU)*|VEEkCMR}O?HHhDaSo34mNrc7C+l(S?B+Ti) z6Bn{%(c$DbK%iA*_fJKzEcykJiH@<)FFVLwFe#rmuWj`>roep%0E4IT=*`%PP09>6Xa!?zIZi%ZlyARmLPa^KQ6=RCGT z%^gpa(X{?VWujR=ZcwrLM9!Rf_R*DDhg$tmC^$diduu))kj5jFk0&S{!&?vf9 ztpzeEpTM*>5S}z0NWi#nUgqYOy+|o%XlQsRP6ym%K_P0==i~9OuIhQ3bLVO&7=%1F zCaYs!!GQroVFDQlVqyJ^qUAJ=&32Qv;6i&)5)b{&2pwAJ1NhZT^21v%emuQq2_a=(gs^? zcBsbwP>=SUvo{!?n6lyej+5_fNT#$9oV{_Dq$Z19W@I{l#z5R6wfZ8ViGIJxL|}oj zukw;d%_*_gdTQ!Ewq~ux-6#Pp&osB#1n<*?xWbwPqs^7Z(ATo3|N1s1JtI-vUx3lplD-&w%ks`(@vs&w~EU#Awe!yW|t#HN!!Y zXGrob9r$#UwlsprxeFM@p-_NK4Fc!@0w6^B!K4XM_GtrUg?=E*pc>N@pG7Any)bVH z5jm(cEjnlV;DkzEZIF^UD+iOXWhogGIHkb@!LEgplCtL!UxXhfcY{SkURhUHQonJ# z)JGFdQ~xU|rd6Y1YMFWUF3Xe9WOx19cbj`CRF9O4X3SGRo(OC-TJo4BLz|cIK&o%| zhflc(Q=c%6X%u-;`x5Y)(KLPKhYc6HX#3pAY6@@UQOVlX6%h-o1!8y${`l}k5GRk= zjEr3EpSCqF{|z0nPvAg4y&%mf>d*+zeSR>C1hoLMWk>Podw2Yl<4MlQt{xd_F)4Yy z-cFk0n0WTwM$}B)!ra4_0xOw$e?REBlv0+1e0hw?=Wy3$GwO|K3ir~>kvg--><5q4 zt}hR0q->k|v9hQ26ri{7_DF5tP6Xe;PCJtO-3h?}R7PCHXaP+znb&vi+O@5t6C^{k ziZ=;?gOnLO-R0cfMG=Vt80;}4GHxg&wWAYtp!40$yE_Y!{Q^uj5EEtdula^#_^)#w zQOGx!2A7dm@|zj<=n{t?VE599oXw6S@LMBYY|S)|ENZg!EyakUhO=+#F;*PUJk+za z|I-?r2n7y5ySL^z?rgk=jQ4k!wIKdg% znN|9D>&9PoJ&!#|vtPhzOM%S1kqx{y{N|+0kZ~d#S-W26SS229Rc0Cu>Mzdu6SK{l zDmzE=OwE5qGnJ!IhVU5ltXa@bXaXK?Ff7^&z)3+W0?6}@g2ok?0{L-ac1FkRkXk*+l@aTLx6;LzG|mT| zm8uY}k@HU{OYrx5@6h6kyQ;~-6mfdOw<7*kCfv6SXpB{i zHCW^MQS!@AGgOA**GPCy6$SFh$glvUh+uLP*jHB(ukZamK)52Nw#W<$QG!Epz1xN9 zL$GavAgMLOci2gY00qz!KO9{$t)m0_K*8gDnEia9FB$ri5vz{RlW|nP;bd=iib;tf zt2pI#iyrtriL{HfLSJqf{;-U?9x~xnO9n!NE?i(xWLOPh8Gz<%v@B)U_$Gcok(L6( za0nD!3{%-iDpc)k{wz6pJc@!cH4Lvo|ADhaP;`&9ohwb+X!tF0ix$kISK4~taT6bw z*u5)X9sOXfu8jso69zltKJk85`kGo%&M9vD&~+~@ zrDXp_m_Qlxg^M$eO+(`77x%?0O0Q>e%=B0Mu-1E-_h9;?OO<6s4D|IDzV6n}1dupG z)iPV!1#=a#sUXO`=3s@jLGN!(+6i=W#FsN-wjd3+fYQYi#*5XOanw@EC>myF>m^I&e>26dr-%`G5ezXW-cj zN;6<_*o+u}+70s}{_D-4)^i0wH3;Um(}^#$_}7Xc#_o13I>dZzS7SFb+AXeLZ*nGs z|K8-STluugPD$+D?K+AYS<-P0^d&wZB-d_eOjNOSLT@-UP5sdYcUDWLO0Ob zb8s(16`jVFc$Abu%w`X9?9s*Ia5iq!LyVQ$V}|Cmrc)$6+H%g6;eF8eCElXX(C{0 z1+(_N43SuE)p~SyMw!veXv&;$*2{b!H?*g`B_ie~3-iMpX|b{Hu1|FNXIs7x*UfnN?x4<-b&5Wwq(1kzl`|G4xe=Cv$AN-mh2NEVvU#YrGGrEmbypnx( z_naEq%!uGy5s!AjnA$A>cAw(o_@yhoXa?ELfd$KK=;eb}W(9gM2QMT4E+fA?8`$RNU?$@_5g4thT*_yxvfqf7Z*v%bgR*=aHCf*8Mk;Y zc6K}XqEh$kUAzGXDqEmja>eNgpzw?LJKO*KenNJc z_lAN(XN+cuj=DN|rPI{-(q4gamFVN&HYzfe(SnYQ%}5m=mD*hDU?8thwd%xX*hqv4 zVvl?L+eimZXnw(Fe9No6+LpRvkbmxK;wN&x#!>SZMYo6hZ}DhRRicO%@LgeA4Py{U z|Hs}k-@{|*SyJKaAO61bDcpi9mA_k9$klo{U*T<~U!i2)gR?JhU~lM}HU7^3l-2X0 z%sl;NmI3R^x<=*9RBvS~Q?{x*4p%tkO#2J&U1Z=cPl&K}=m5!rC345+`czItS7+ zyCu)Fm&j0!Rnwcf9*Lu7u>_Q-wNS@gqO>MGv~!A-ibOkgJS5E-{5~+ zO|{`A!Z|A^w^)CmtT05+0Ru6>M*dCpLBJDmn~csNYK4tLuxdzdxzv|h4KH{#uBk$% ztpc5_ORB6~gR8ew%M!mA*VhoEwV;zq7|L(Z??YyCgWICb>gPea+q=q*eCI$lRI#Hz zhuOUaYg|u^CNNb3nR}w$( z{y<+>7v-$C>)84E5l-Wl1TrK3*Mrl&h=qAD!AM(TF8*>Trn{`xX{&l_EeQ8{@#8siL-y=Y;1*NYI1J!b?OoE^eDc?0s|9T0Jc^MVRu6<518g+;pxj-=giWgCck$a(qtT*^LPa zQ=2KV>3wmS>wl8QT+b9C`<5KDtY)z~q0w4CySoCT)e3P{E~a45z)k+$@MvqUN)qJ~!b%g7F-Tf!Y zs_MBHR&E1m8y}9r^iCg;FI)Ok_h?Za*cey{G!?9qma9)7QP;e4=e)<=HFryqcTnXa z7D}L4s+2svy4$>3@DxjDu$(seIR=x^H!qR?pPPprHjfBw9@o`^DvPmFtAnNVD3o|p z7If8S;RXlAQu-Y2wL#5z1r(Zt7!;F?N6XKW8g_I)#J8QGbz+K~#21PxKhggE@M^sv z|Jid6yvMnu`%>E+sKt!A5=M0;FElRHxDER49dc7!BgUL_!)?>%Gi=wwX}mXBGhzu9 z9h8ag9k_`xJ}1BZ?0vaWrC)nr^t^!(+AOR_7oy{9)}N+`%pZ&!Y@b5&9HNo<$lD+elS*zwMzx5Tu8~SXs_aq(14E?R_-BSTs_Uz+i zHBWj3~pTb&rD4a?9S$Ah3NkmTX6gXuzUk@#z<~DxNb5f&+E-SJ&kSQBDA-c@d<|<-RuR4?C;2Y8vdg z5CS6Ts^X#UxDBJBmFN4=NI5Bj{~~)FnQ}@UFJ;o?hz~MvE(OQO;xZEkF0GMvx9j^@PVpfx61XL`*DYL|S9y*J_KCYH_R$MO=19JsmycsilgpV1x>UiyTw=zu@T_`DIKXe zhXR^rDS;Sj(P7sbI<-gY7K$Vh9fWMDyfeDWY1}*<4imY-S-iwSuF_mEZ7yFjNX*GE z-ILe5G&3Z!*ofC+X&8LmfnW{XE)iv-kOy|qcG-6p|8=CyA5YliO;dk>SYiR<4xP4a zZVXnh*>EqYH@4c_5QgyUhTdMpxKmkUe@B~t@v`ATnVA(i+fHiNvk6z_9hb4T|MXDr%w z3|s!ZI2~U`OmKz*PKmaPK_v|JiBL=W(Ju;Wc{TNDLZW5eUWBitl<{9aYShWfbdBsH zQ+W?c?rKi)(*8c z#LnU{8&7MSmaKFxjdqv_@$qXu)K*a@5+lsxhI(Iz;eNYNUU$D z$Xc)7$9*IB6aRL+xk1ueW=V^8wah+Whf+hp+Qpp|^Pb^-!cy$_)wT=}vJ~A)U;Qer ziQYh@&^`6?#1VsHWZ^qd>DY}A#Lq}ku5u3~|hwfU%gTHU}~ z_4wDbwt5t|RJcZ4zi9q_;F-H*dbkw&>KPsBm zp8F%U6`k11I3eFd&5P4i988+LeFe~G(Uh<{*|{X}+UEN;sY()jCY@UY3hm)9TZb!D zl0_pk6Q&`j9(yp8og@=UHE8VoummetuC-i?xgaV&#$|?tu4F#%n4AMH zW5qdP_gn%7)91$YQn|Ihz}6_{)HSIjU-w*uL9v51O-({E(d_#t!W&ubGLEhjn*!JI z+et6mI8Us{zpzIe8>?thdy;k6KfD|il*Nl&(^a#^zN9F1RcuAL+Ay9Ok#ap6t?a#2 zZgsg|w;TKmKlt7|a2<7D4|mTOc#+1PKdq1y@SJutPP@50sJ8XMA8vOkC$=J9%8Vbq zw!8|V@l5Ty70S;|W(`2xLG0@8HkVpDVNQg(Flzkcc5YXvl=BHEluMm!f1e6@j-gg6 z&|asmjYZ(Uw5a0o!D~^!&Nva*(Y=={VbffWCzRlM_xNPJ!lkNL+Kb}bozk)T>p30* zJ-vIgU2ckWqkN2%jd4jd;@hqM1R}LOm1(ciP)6l4@+z>2oId>I<7^|I5e>DvrnCI3 z)aTZNt4w!b%sztVj@bT2c+#s9IR=7d(LZv zAhE{Ggl;;_b5mKqhwbe;OoV$Yg}a8G2_>dOfua`Ii73Oy=e57RmPeY-ZZyGDi$||6 z5m<-dOPSQmu+<^Iv5u+YIngC>e3RuzTYw(aH6JPZdTus+M6Z2ne{EA84^?;a^GtDY zs~Vh_s6_VJDh<1Iy^(XI#sJ1}Ma$hU|D(%o(X#j`0Dm}QSzS`=^`U;B2%wHJa2nIq zjN5#QiSBtd15Mfc4H<-RX4>;!>N3pbyE@}fO(~t+VdzS11Ue-TcEXv#Q_ zvk?Y_2MO_SF9iir5BMZ+vOGMa=&;6jhFz>H^mYR=k=aBcvB%?|AMHFOl4K6OI=l8# zOFy-KD`gOC;gRW$`k^(MuLG-*eMMY+^F_kF3GAG!irfz4guzL3oe>z;d6a%j!-=m( zz1iUG$@U~wX2Y~Qu$AlRo3mnG&+V@Ws%6uar{)z0E9l7vj?5<#8djDyYu{LO4=HSh zU`=Ek_J&gk2Vc12PdL;@aPSAJ@hIrf(1k=qUGC_&JZ3cKcV~9aRLHyh($d@;o zar~$VOVhXg+|*netSt@SluV?C1rL07USE0Ge<}Ni-a|^aQVAM77m*bCvm}5a4`Qcf z&mub@a~Ly>#A6w`U$!x>ADB?Ab0k3F_|!D++{80pIBY-lTpvc+Wsft3rTNL3A}0ws z_w3d5>yP(lJ~2LMg|m`^5EuRvbQl$!1neodfPnga#$2Y?xM zbbo4CeHo^Hrav~{J3Zg8RN(klb5uTL8YlVY&BnZz{Ic=HLR)oNxe-k!p;Qd9(8=z6 zSwtG^j7L@~?h|~B-531q(QAXM!n6b$SA3($0b4#ZoN5oZX6Of;IcEpm%dV~h&M3V) zg8@LAIYfrh+G(8kEFRcW)T#y+r(tojT?~+;+P-`D#o{-^D2z?zOGZDt5KKz=t}#4a z3G6Ofrl78r+uS{Gie$L6PMmw7?QabZ*=fIvc#b}Go+V?#Uj zIkc27R+P9pw?%Z0%ct?u`P1r|15CVCskJ;sn8KMCM)UfAwwZd~dD2P$xle!z=m~$` zn?BogjZ5^}ZXt&X-;FJXgvX`q8LmIvxNW`)jSsU?)f6_Zy68RUD}34qw)e0=EU&VUEf-Z@PTsQ!J1ElhEC>edlSDmO<$+u1h8#a8`Yt z^;pRi8qRH(CSlJ$YdGxpd0%)!s1k7odlY4N3{^ zz`=|HxD7M%djxg^Y~z?nw?SpO3OCtu)VQncUmLj0B6`vs7C(LNs# zrm4wl6m}$>9ZK%%*^))mh>_S1d({4n@))UY_gTt({pR%0PFF9Ok@ViM)dV(_&3Nwd z5^iy~Rn1ggC{l~b*svxj4|XP!45}UYq7Lb9b0%7fOC3itOpP!Vb6ubK=1a^Tkq_b*r4&5+KI*aK5& zpc5q966xxOYEhM%8Hrv*nV>1II4)s`ja7gj#Hw&i)JbsHp`}53bZF+vsrZrgE!%fi zB#_)gpB2!o)NOA+n%nS_-UuwjQl7@=SZHR>Jx!ix;MMG{a{-N%;%O zW7_*>Z0{F$EcQ<_==;SuX3ENiOt+-qYLWb{G=bPWH35UIjb4Dtyb-pgh+4TnGYi3qV`vFW2u-BDx#-cRrNr+@J9+pS$_x>4`D7 zGcD`EQ|lM9zNV-IY=<$l|2f*iPz*P4Lj-@1`i_36Vo=pPCS>FAcI#?gZr^RMG?AO! zk1CpvWF$2lbZl_{;SxzX~)Yg9+ClJ2BKf7 zH=5Qp_&x090KgR~T}OaQdHjC5`~3C$o>(7$JDowXa@A0p_$JZFK6dMBT#t{EoLQZ{ z7lY|Hqq=}Vj1-vE1xSa~sBrsFPLmefXvQ|>4$~%cY=L&_ud(yLF zJSM8Bp{SAR@^N;jr8@J-nW)neC;mrG&Ce^&^Hf>d&$+TH%qtseED9 z5x}g;$j@#}RT<5+)qFR5)G0qw=dEp1o;^{KXDs~|D_x}~Re1^qu(R;6Oaq%Z)8amV z{wxno=)einCqESx*w0FBf4K@x0y^m@;@}Pv42NO|nfUepGvw!M)V<%+8osivt^s4S zrL5onxROLN>!D5D24d#U5~XZ1vtig9?1YtjzrHX2E)l62pN#(KCB7ef!)3GVZkn?-MbV{0a>;$Y zb{ghWJD)2xi`S-4udh7E@gcFp3H9o?eH6Oe)dn#Pl5XeD-q5DSYg@@&2^fjNWoo>9 z`oBo8p9uM6Z`>Z4H_WCz6To-~6+@2=l;c^T^W!Kqev?4!mLi?`AT%CU)gGWIs@Ria zDNm1nfAc=NNQO%CQt>Z)BJ-^f|5K}10Tp^Yp7VOpSi2Kx@^bM(1cj~ab^a!nl=>Yh@}9;g2e zUZ_3sU%b!{$0BmWgOX~>h?Sw+ue6m`=bDl}8XrAMI>I$m4eyqDZLWdfA|j=)m(J|3 z9GKs{MvYf}{QT^}s9|O-=Aez z;)@OBiv1t$)*$ZQI6cJIW_JR_eFA1C=mL4uzDyi8ihTLK|Ba)Cxw*m6ITjKzi_XtX z8y`ph{8Ik%)JH^xSKf2Bo($zz_@Tm5MQ&t#M#o*a<(3Zmi&WWfL+eTkO?0L^vGC&1 z-==^#bhU#hI=*~q1#L1HKs8!|wE)TwXrRnsqtyt1$rjWIUStc>N?O#&{pz$8;TVR{ z6Xd5;)af8Tsv93mIU;j-tNsWGxbsSTxD-$EYBM2hYtm$AX`9BKkyn9(5eO0^ebMyJ z>Y7iO`6W&Y_7pCNbp=MO5C%j9B&6V}5-wpPJ|~1patO{`WysH7xKf^R+h?00!FWwn zbURwrovPxC$jF_*^hgO}0E9FFOji)v)@$PxT}=7_{tz^4^s8?Fi+YZWj}L`5-TucK z1V$usSO>7^S?AGu6Rp{MJEN6kAY1d;;QT~oiGvBfw5R!_vb_i4P4$nQ*TR@RSLeG& zO&D4y8=m}dS{>uZ0j}LeCtnL7EnE|c^L1%Pk*>cBm8q|${En^|Q^R?@C`;(S;pMxq zc(_&8f4$^)_CpxDXW&+DU}UH8#2nd5?tRzTSciqc8q^qmbEkQH)7{J}wXAe9r^)1s zowNRVnHnzX;~MuaY#6qozxSa#sqW!2v9mXoB%l^)A z*7oJB;{<%v;(f6TR_!I~q#<<>1sov4h1%$a%)z359U^b!1c6y&?uCdqqR_v9;z1#; z%f5ZZR`~wm^;p^fFHZ24=Ab6$#`9dtgXkntV=h}X{Y zKK%3vm4BMJ;XBhCO+hc;9@rkyCW=c@of=xD*;o2E{pQ40;fZ943*4Q^W6MxDW%j+- zp?zFk(CoO~s^xo|ZlkVH8~gjP;enYIkJ3(WW8XKdOQz@uc=gMe)O3J3dRytu1Fr%4 zh%skiwDr=bBwH%L=^FEK^*TYK_)sI;H9UjLkLOdvWTT$5`cCcz9zD6>jTO4zA>SWa zpzfGWd!KtuUOv1Mtwp1|rrMK6t#(#EB_jhDNX(i#QuZ)yN)R}~H5wWD3u&Z*PH_zo zFO4f5Zn;Y?v6eab|H2Rkm{Vo(N55MR=2w`+$esn0(=-**jU=3|I0KVv0sx^*RL|eJ z?ntdfYWKVRT9r0XA=y5XD1Pt$OEWxAZCgt)s z7124}gxb_L{pcTiv3RMxjjh;b14P7tn4f&!SO1+2=0cs<{laB*UM`DiYBL95cn^|! ze4=A!6+@7nFJ_;G%s6wh_4lkT;={4n+TYbq{AMci~xxMxIkVNO3RXRX*r z+JMzndbR}jaF59^)f7jBjmnS8b@LmE_{qI9>{$wmZsJav+Qx)KxcrNA0nwT?c$k%Y zVazse5{>j%r9yrTb?WH4b~#F16{B~UPy#y%{4>lT>AH@-Iha|5K-=7WURZep=BPqf z-g*S4v8u@9icm|Zn!dmE-S$$ggk z1x9#i^b{Tsn7>2;nvo{UwplQ-clUq7Oo7z{MijSkYzk5jiykdbi<%AgMrpi3o-ztRM&$fsk_$)j?$9xVK`I=hpd4zEyy7 z?cBZ2&s*$#7kp1o8s_~+*@+}{+msp~unsO>R{Yhjz?;e=V&cVLgHK+Qz|6Y@f<(VRV^5b5&|{oAh5^1DE;i5Zdd?q@;JZL zJeR@zzg%HU+dYmZ1hEQ$Pmc%jv9YWagl52;+1)d#bf6dbu<&Z3Jo*);j`#WBc14Z{ zd+8$$bXkB}@02uA@1$tSSTFS9p~uUU`L1GN*JjHb2=ilDTyv-n1Rh_#Hcre<(muWZXx!-&q%2MKf=8FkB9pt z7!*I7H89$9}3H&DQ4ZJomYn2OiK(`|KUnFdL9w?5j!?ve$b< z+`@9Ln0a^4HUgeb=xs=JN-=_eVIjZ|mP7X`xHsakS*3GHkQH#=RLETi@1q z5cGnEbZ&#ieG`Pg1JnFh!{xCtHc8h+7`RIv8QTa9f_2a|aK$+}#Oa(4Y+@~pRW;l* zL))tf^PyS16qGsSZ;KtUqKuxB3Oa`0Y3T9$Tip`GPZDpvbQf$cSW@i*tfS}6HeYN3z5wZs6` zyL$*%4KXwMXFGXFdP)wY80td4=6^v)rKZjjx%uIyJd6-Vs`t=#KOHV>65tyuj8aon z`t{}kj)cN|kVy2q)ipj`H2wvY-}Lnl=i4|$T-vMWf4OiMkfv)yU4lH0$|lgyN)@uM z+a>IU^5XPrz+tw*Q0i;I_8EAV#=Z1vUD8bJVdL8nu1wdg&6^IM*FpUNf(G$S#x*3N z)(ZWa<~InTu>{lrQLOP!nk*5Jv=mntp9B7{AMS*X5j{|j1ckF3^Rgr>54N2&J5$)kHblupuqwg9IjLZzwt@N||_CD)H>(IUS5;2Zi@P zLaWkGqo|7E9R=k}n-dNb9q4|-D6n|V20tc9@YBaF6 zm*h5((i*5HpOyxo8ZC;FOE5Y`hKz+Qz+j=JOu(4ILXcPXbR+W`%O8O|!k^Aftc#Yr z=+MF<7(F`zLBiC+nakXUWdj5%*LXbnn@t0Id;ohi9!T3@1oWL_m z$dVtS7JIXBkCX`2LyfJ5244_(9c9Is1#u#JQToLFTyxfoIUf=3Ztd1U}yP zES5hrZ80z~zj=fWLo=K`ITa#f@$W`__KD*f5oxkI)b|cZml7h1bJJ81X1x=wj>F0w z_YkqeryBK{MX(adp+RnqmPAPxg@CGnpv48cI8BjEL$?%UpXK~PCXG2#wR|F7$3j&vEVjIR@}#vC9*(Y}oS*|6 zbxBH|-Oi}GA8#e88%QbG+vMaEr8ehXkWBYQb@idY+CxuW4@jN?Y+d!vsW-3Ml9`zM zQfVcO*0}K@{3pcJj+>WP9!P3PsGUX7;O+CrWDLZ?&fo=V0g{)a#pXD^FoCyh3c%Zq ztN`sr1ifTX<-`P58=2!*Gl5*hRhXY^^?zijt8#ev$kI}=jHT+4hTF6E*$?Ds z0nOg@Gu=BC_PyuIr7KJ%LL!RF;lD6~C~I3=lMxE?cNG0Jex*33Hby&Vo~QxS>xME> za`xW(tL6P-^>dK#z4hz$vsGP6c!Z@es9PPgEdGZgGZ;8;@`V1`@4blw3C?^1GaUpK zp{uVy54L(Jz}bRgZIpfC2mB(i%L;4<+z<(pAt1ypDBTeJ@pEW9o`;D;>q2MDnfvi@ z>=5Iq-x|uk$qDQal<0$r7Xu89n<9|lQoD9Rx&uH|nf1Z|3d%8hW`{|=h~qmlq$Y}b zAp{)X+3w+!a-)1{O|BPe?B6EjfeD9FW1i*0jFTF^w}LCZEq_8Pb%_I{3?4?NYk&Mk z{IYm9Sbhz>l_OBZf-y^9+CIdK3IZ5E$W)0M>!A~$T~sMg5kH&x5hycepJRD8)9D? z1DXzSNR+W9{F+ZAp0SDIjv!XVaxhkk_tdkyAnClq&UQ#pjv4xzLDBE0C2oNgfz5W2 zyz?9&O3x04z;IL;5B8z93gPmQiT3Mp)GMoZD3r+v=rvXEw8TqWWb|3aGcJUMuZ)>iTHCXSI*f^Pi!eVHo9 z2{2Dwx{`$cub4p2!*EuUS7qhLQLKKw> z*_*O#^;-qd(NS)s#HI|>xcaK{D6}FAP)an~%F3uXeu_wCs93y(4=&#2|G6eDH5v$Gp0Nszi^qWt{!kMpoBPih}GYa3Q zC*$e=OG!P}%O50r>lP6Z#!@l4KB;2=6r7_Yy0JDgc^C|(_s3W=@p_8&G3WQ41q^F)#XSG%aMQFUFKt@+LnwmJI|o<8g0GR;ocusV z#d*6CK~sX0b4^>XKKP2w&COLGMLc`Qu*_pHe8|DqKz18=8<|0H2QX;_*t0v6jePf{bAG2-0~qg zm*byjHIQ9YuxyQK5QR|g`%fu2o$rI(E+Q&UGr&1|LM)|9SV6Q5FWspY-1rD&8FQei z@k`U5Ju7lo1wV0bV~PY?V2OG4F7uzfkGSk3MH}G*xc}=1q-~c&ka=bG9};p!cV+&S zkc+AOhqnDap0~c!|6avF{3j<}FK*DSS*3d<<|2$r7?e#Pw@8 zhNIuy>*>cA-@i)p&jXM>+!5*b%{p9#RFY{L1pUYjR*6tR8SrlOK~R4nkStd4fEw+>$9dw1Md2`(7o*wmOF}vFU zLRU^kK*jz$%k}_8U*sFRQb2!Z;QI+4pssoUS&-t)$%H6q3B->+8@SlJi1z3ai8RdQz6d!m-d5#9-T46y0`c_w518H1}m zAG5Ol!SX5>eRLOI-WkvSfA=N1yNpha&EEtNd4HxSUm#Td^Ocri@jrYP0x$dfrNRq` z*}q@hxpdBU!9XX%2BKbQ?_vwg#<#x5->sQIINCRvy;|$}Gh0E%C~R%b0nA1hX2dG7 z;KpA8`sv*i{UTEU!9wpnY(gNjb-ijj5;(-ooBNhvn~m6W&+qZ@@H7RVGev%S;m40T zAc);SqhHthfaC-GBuHg!_(*zev;uF-1(4~Zb?LZ^}KY%`^f&lw<@mXF3^QDd5Fk_jruid4x=aS*R78Dn?9K zzs2+V)Nl7lrgE!HHX!HygidC1655)D02PVnmic*+$D|z_b_VYbfE?B=`tam-OSrD44GaH_`bA+%eB#KiPz&z)1{$y^&LN=A~%%vf!sIF8F7 z7AW5)Ctq%Wi01C#RtJ>d&(JJGe*`%dN!yG~u`Hk?tA2sWS~SoJ zqMOY6rmP{!c?fa+7mVWLlb`$wKQHB3j9BJPtpoD?B`z!AUg4u?X=y)W;ox_GpUvll zgoMC;wQCSFe}lNlXW;F928YQ`P*yP6Tc6MeE&#sFvLRn_FfXTqd6K;T<6^U!bvnovAP`3{PK4G zTQWQb*d+_ljQI{PntTep$Xg$L-Ia0$$(1`x{4C`b*BAeYGiNBtNapF%Q4Ls0MGN_S z!i^+2e`dTk88Wveuz`LFXyAtrCMx+K@2+qxcE97w%xBV-PmPv3S}U`HNWB1VniF{+ z2+B`W*n^_Mx#X9|)5Dm@cMT2S?s(V#x_f#UAFKU&cXdP+^((LF3$9C-*wxE^%#iD8h`n& zK&C6c85(V+rS-D57qU?+clS!t&=z>JGv5J@Z*~8E*75p-r;nq(hpT}q@*6P*<2ZsD zIu9fYnjdWX*}VpCaecs1;oaQ@t(|BPTz7Id=G`s3s#4)1s}hNqd+eq1y##(okUP}d z!#n&b$d%zt#_ggj{_}E+n-8oR&WL9UV7*kv1ud0EL;~bU7u^QGmVopCRJIu2+es2M zt0P72pr{hUb|a+x<|8T?XwgCn*|vKH2j8uqXzCP*m zpPC~A8waquIFZ@|shAM{h_Oeu7NGNCcPRnc7~0CouTBy{HUeJ5Fv7*U>zfU3Dc8Ms zSAro0nrkMx+zQJXE5lSqGRBn-*}E`+Acc$?1L`+zTw(K%eK1;B_Dm z&wIXdwI&iSullGp(PwW=e6wzQ3nbU8%=6CNCiJ&2s;6ydc`Bv!oDQpTIkbH~SL~+S z=||BWqt?nc2+IibvHE+QvGbssScSO;L)HCm282wWs!0gcA4F2`3Lv_`5|cOc@HaFm zEx&($eE=E&D~_s})62;54SqZ39nox~753*K-hEg>1Zo0n1OW?)VpXuxM;We@jW;ky%BX}KzfOg99hmb2XpiB zwKRaeK!&u&gt9J(t}aOl1&sy~{5e>{F7B?9=j zNzf}Ac>J$I#YA@EL*j4VtNc;`mIq2y5Ax(%5BqglNQjAx0gzD*r&%ia6K}Yo{E(6u z;i0>X+h)%K7tyIDPRt276`tV9gD6xX&QcpEu+t&2bjhvRm!V=P5B&I1vF~2~Zelrh0Kn}h3t)3C#!nvA+7Ooo9xbpltUX-~p z;s!_f1*^lF27tqycONweme=jvXIop+v1ce-J5+Sa1RN5|5r~%8{ zGoFn}LNl=__*4+8FoOeo!$+PFp`*{YM@3C|fE2+2C`sKthF)45%%~p~ze^~F zSdfyE!de&ws2pU9Fex1g%MC&^i0uT|_JR`*Asa57jORS06txfr^E|SjfV>?ETKjOu zH5xX%A@>GW=Fizs77IiSW1{^zJx+_@+#y2h1*xX%g+&1J31?I|2RseP1%PmIX~Po) zCmz)O#781M)C3n#h~-s@*eJ+Dbuh`u(*l8nKv+K?P9vocZSDX$a-%nQVB`b{^5#%5 zE`gPi%89z9`07VY4s}(sOCPgRgc;YT)uZ+F{)RMPxGD&~z{p$>n|^Wu z%4<&KJ-WNQUxN@t+?{&w3IsaCc;|4Z<3dy{*ark3!!7!r8p=GrFpw=z=micuoggtT z16Z2Cf!@5r8kHXl3mqWV(aO(c=&?Ku?G$Y!*7`ys@Hf1|ql$lfgVx2kfQT7dU~`<R7`2$CmPKHlQ9OUB(EW_VFun5l5TiZt;^(q6mrx3 zd-pov3>eWSbcr@LzPm>9^z!&f__}QzyK` zT`+n63@gK{lOrCI{LkLKXBl-Z+LJ`=<4AF_e*sI)VcS=9=qBnHvyD`f8kr*xbS1kTsc<43)cx*)*&*jpd)7 z3v8k1*^xgR8W=1&X}tDz*Guv_AN|S_t39A+qW6=t)Y9b1+82qVH_-y~{;|tfIg#?F z@7sxPMr^6oH7#U5^Y`n8CE0(Qj{irR{(qgn|NlSmAJq(0RR5>jnig9O!8Gyl#)qYm zA{Nk9Bfqvlk?6gWi*&*!eg1Nip;5a&q71h*O*mDV$Lg^ds3nEvh=8m^2%J$VAbf#{ z`vDVk3*y2YEZlYgh5-2#w3Y#v1n0^#s5%OL7;nRKj-A`tb3!3ypZyeYl@X;FF!l+a zoSdw71RSzcvJz6WWnKaHCw!jz131+Hfah6nMukGk9u(*VLlONGkdQaDsJSBoKmxD& zXdU>nphLssy|aW>H1Z6bV&>mkzYmxE3X*y71EyZzX(k_b@q<91tdbJ`|5Mx9{xo?; zarkLmF-!&3Z3N_H>B1sPNQQ<&$rN8e5ESqw76ieBnGnq! zF%i%#tO+u3s2I(*7+LrrlnS~9tHCM?3(|U>2fy$K*pJPV_U`@ke(rOA_c_<^FXOO} zc(Ph1Ik+7+!dXd7Occ(Xz2o3;edn7{dbexr#qxVkl~0$+jS%4aNfoaM!aHwNdX4XY zcr-8%YR51!^!54QrfU@4${+j{Dk*e=xFJ^pQ78?W5KH{(zuy~VFc|VcT-?$-$*SPl z+D0xmu*aGsU))}Lmhezi7_?<*V{G$in1X!X938EZRzqpLWbeujDVL+b zJqJ!K`1FtLU(R_c#(&Rd64iX{s7+3|e#AQrX7zb9YaZE!3$v%tM-uy_ zcpU~lcA771>*~}(U#xp!WL-4qQIJ3`&r`R*q{^;~qO7CZphuF7n z4W!M}ioVY|pGF~9>_VKhc1}IZ73W5YvdR8SUkSZ=c}}Z3(?8E6fS{6C8tsfvTf6gk zCOb%6Zt4sA?>XEtP&K4elz48n?eC_f3*YshqKnj@ql_+LRZ&Wy5L@`NFepdhY$;Gb*7w~C8oglM5VO(Qcw?8rm#%uHs=E3xtR`F0%5SvRgb6eV!SxGszmerKn-El*G=yU(JcB6D|9^my-UU#p;y21SYQtE^(a~@=EFT*!8(B3wkNI~ZlMya3ZAzeK# zxflX)4DhzW-;31PmO0%>#-dRKT*1mdj0@L?sPdxa@%NhD73Slf9P}*0pe;hgdxRIC z#T!Dzni7@TyD`Es)>1q*N2=!sJ??^(w6vj4x3lv(PZlj3yH*jt9CR8#;X&!w?UfP^ z!dn~UBmvg^dUv;Mhd+Lf6^0D?>nkPqWu$!dZygQP(QNA7F}?U%2Xp6!&Yz{$Q_Hor uDeB@--%r{$ Date: Thu, 14 Nov 2024 10:08:41 -0500 Subject: [PATCH 9/9] Finished PQN documentation by adding commands to run the benchmarks ad plotting the results --- benchmark/pqn.sh | 32 +++++++++++++++++++++++++ benchmark/pqn_plot.sh | 50 +++++++++++++++++++++++++++++++++++++++ docs/rl-algorithms/pqn.md | 31 ++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 benchmark/pqn.sh create mode 100644 benchmark/pqn_plot.sh diff --git a/benchmark/pqn.sh b/benchmark/pqn.sh new file mode 100644 index 000000000..1aed60bf4 --- /dev/null +++ b/benchmark/pqn.sh @@ -0,0 +1,32 @@ +poetry install +OMP_NUM_THREADS=1 xvfb-run -a poetry run python -m cleanrl_utils.benchmark \ + --env-ids CartPole-v1 Acrobot-v1 MountainCar-v0 \ + --command "poetry run python cleanrl/pqn.py --no_cuda --track" \ + --num-seeds 3 \ + --workers 9 \ + --slurm-gpus-per-task 1 \ + --slurm-ntasks 1 \ + --slurm-total-cpus 10 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +poetry install -E envpool +poetry run python -m cleanrl_utils.benchmark \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 Pong-v5 MsPacman-v5 \ + --command "poetry run python cleanrl/pqn_atari_envpool.py --track" \ + --num-seeds 3 \ + --workers 9 \ + --slurm-gpus-per-task 1 \ + --slurm-ntasks 1 \ + --slurm-total-cpus 10 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +poetry install -E envpool +poetry run python -m cleanrl_utils.benchmark \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 Pong-v5 MsPacman-v5 \ + --command "poetry run python cleanrl/pqn_atari_envpool_lstm.py --track" \ + --num-seeds 3 \ + --workers 9 \ + --slurm-gpus-per-task 1 \ + --slurm-ntasks 1 \ + --slurm-total-cpus 10 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template \ No newline at end of file diff --git a/benchmark/pqn_plot.sh b/benchmark/pqn_plot.sh new file mode 100644 index 000000000..1c9237d22 --- /dev/null +++ b/benchmark/pqn_plot.sh @@ -0,0 +1,50 @@ + +python -m openrlbenchmark.rlops \ + --filters '?we=rogercreus&wpn=cleanRL&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \ + 'pqn?tag=pr-472&cl=CleanRL PQN' \ + --env-ids CartPole-v1 Acrobot-v1 MountainCar-v0 \ + --no-check-empty-runs \ + --pc.ncols 3 \ + --pc.ncols-legend 2 \ + --output-filename benchmark/cleanrl/pqn \ + --scan-history + +python -m openrlbenchmark.rlops \ + --filters '?we=rogercreus&wpn=cleanRL&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \ + 'pqn_atari_envpool?tag=pr-472&cl=CleanRL PQN' \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 Pong-v5 MsPacman-v5 \ + --no-check-empty-runs \ + --pc.ncols 3 \ + --pc.ncols-legend 3 \ + --rliable \ + --rc.score_normalization_method maxmin \ + --rc.normalized_score_threshold 1.0 \ + --rc.sample_efficiency_plots \ + --rc.sample_efficiency_and_walltime_efficiency_method Median \ + --rc.performance_profile_plots \ + --rc.aggregate_metrics_plots \ + --rc.sample_efficiency_num_bootstrap_reps 10 \ + --rc.performance_profile_num_bootstrap_reps 10 \ + --rc.interval_estimates_num_bootstrap_reps 10 \ + --output-filename static/0compare \ + --scan-history + +python -m openrlbenchmark.rlops \ + --filters '?we=rogercreus&wpn=cleanRL&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \ + 'pqn_atari_envpool_lstm?tag=pr-472&cl=CleanRL PQN' \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 MsPacman-v5 \ + --no-check-empty-runs \ + --pc.ncols 3 \ + --pc.ncols-legend 3 \ + --rliable \ + --rc.score_normalization_method maxmin \ + --rc.normalized_score_threshold 1.0 \ + --rc.sample_efficiency_plots \ + --rc.sample_efficiency_and_walltime_efficiency_method Median \ + --rc.performance_profile_plots \ + --rc.aggregate_metrics_plots \ + --rc.sample_efficiency_num_bootstrap_reps 10 \ + --rc.performance_profile_num_bootstrap_reps 10 \ + --rc.interval_estimates_num_bootstrap_reps 10 \ + --output-filename static/0compare \ + --scan-history \ No newline at end of file diff --git a/docs/rl-algorithms/pqn.md b/docs/rl-algorithms/pqn.md index 3f8fafb46..c6c86e76b 100644 --- a/docs/rl-algorithms/pqn.md +++ b/docs/rl-algorithms/pqn.md @@ -73,6 +73,12 @@ Running `python cleanrl/pqn.py` will automatically record various metrics such a ### Experiment results +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:0:6" +``` + Episode Rewards: | Environment | CleanRL PQN | @@ -91,6 +97,10 @@ Runtime: Learning curves: +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:1:9" +``` + Tracked experiments: @@ -149,6 +159,12 @@ See [related docs](/rl-algorithms/pqn/#explanation-of-the-logged-metrics) for `p ### Experiment results +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:12:17" +``` + Episode Rewards: | Environment | CleanRL PQN | @@ -172,6 +188,10 @@ Runtime: Learning curves: +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:11:29" +``` + Tracked experiments: @@ -239,6 +259,13 @@ To help test out the memory, we remove the 4 stacked frames from the observation ### Experiment results +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:23:28" +``` + + Episode Rewards: | Environment | CleanRL PQN | @@ -259,6 +286,10 @@ Runtime: Learning curves: +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:32:50" +``` + Tracked experiments: