From 2c0a728e867d0a03056dbf546d71f06b39c6d7e0 Mon Sep 17 00:00:00 2001 From: OrangeX4 Date: Tue, 10 Dec 2024 16:15:01 +0800 Subject: [PATCH 01/17] feat: add rpl config for bt iql --- scripts/configs/bt_iql/gym/default.yaml | 2 +- scripts/configs/bt_iql/rpl/gravity-10-10.yaml | 110 +++++++++++ .../configs/bt_iql/rpl/gravity-150-10.yaml | 110 +++++++++++ .../configs/bt_iql/rpl/gravity-50-150.yaml | 110 +++++++++++ scripts/configs/bt_iql/rpl/gravity-50-50.yaml | 110 +++++++++++ scripts/main.py | 5 +- scripts/rmb_main.py | 5 +- wiserl/dataset/__init__.py | 4 + wiserl/dataset/rpl_dataset.py | 184 ++++++++++++++++++ 9 files changed, 637 insertions(+), 3 deletions(-) create mode 100644 scripts/configs/bt_iql/rpl/gravity-10-10.yaml create mode 100644 scripts/configs/bt_iql/rpl/gravity-150-10.yaml create mode 100644 scripts/configs/bt_iql/rpl/gravity-50-150.yaml create mode 100644 scripts/configs/bt_iql/rpl/gravity-50-50.yaml create mode 100644 wiserl/dataset/rpl_dataset.py diff --git a/scripts/configs/bt_iql/gym/default.yaml b/scripts/configs/bt_iql/gym/default.yaml index 8184f90..e3894c5 100644 --- a/scripts/configs/bt_iql/gym/default.yaml +++ b/scripts/configs/bt_iql/gym/default.yaml @@ -49,7 +49,7 @@ network: hidden_dims: [256, 256] rm_dataset: - - class: IPLComparisonOfflineDataset + - class: RPLComparisonOfflineDataset env: batch_size: 8 segment_length: null diff --git a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml new file mode 100644 index 0000000..3d6c6ea --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml @@ -0,0 +1,110 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + mode: qv + variant: gravity-10 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-10 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + mode: qv + variant: gravity-10 + eval: false +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml new file mode 100644 index 0000000..004d663 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml @@ -0,0 +1,110 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + mode: qv + variant: gravity-150 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-10 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + mode: qv + variant: gravity-150 + eval: false +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml new file mode 100644 index 0000000..1a0e6cd --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml @@ -0,0 +1,110 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + mode: qv + variant: gravity-50 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + mode: qv + variant: gravity-50 + eval: false +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml new file mode 100644 index 0000000..21cfe9f --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml @@ -0,0 +1,110 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + mode: qv + variant: gravity-50 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + mode: qv + variant: gravity-50 + eval: false +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/main.py b/scripts/main.py index dbaaf2d..ec70994 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -31,7 +31,10 @@ # process the environment env_fn = functools.partial(get_env, args["env"], args["env_kwargs"], args["env_wrapper"], args["env_wrapper_kwargs"]) - eval_env_fn = functools.partial(get_env, args["env"], args["env_kwargs"], args["env_wrapper"], args["env_wrapper_kwargs"]) + if "eval_env" in args: + eval_env_fn = functools.partial(get_env, args["eval_env"], args["eval_env_kwargs"], args["eval_env_wrapper"], args["eval_env_wrapper_kwargs"]) + else: + eval_env_fn = functools.partial(get_env, args["env"], args["env_kwargs"], args["env_wrapper"], args["env_wrapper_kwargs"]) env = env_fn() # define the algorithm diff --git a/scripts/rmb_main.py b/scripts/rmb_main.py index a1f8068..21d5df5 100644 --- a/scripts/rmb_main.py +++ b/scripts/rmb_main.py @@ -31,7 +31,10 @@ # process the environment env_fn = functools.partial(get_env, args["env"], args["env_kwargs"], args["env_wrapper"], args["env_wrapper_kwargs"]) - eval_env_fn = functools.partial(get_env, args["env"], args["env_kwargs"], args["env_wrapper"], args["env_wrapper_kwargs"]) + if "eval_env" in args: + eval_env_fn = functools.partial(get_env, args["eval_env"], args["eval_env_kwargs"], args["eval_env_wrapper"], args["eval_env_wrapper_kwargs"]) + else: + eval_env_fn = functools.partial(get_env, args["env"], args["env_kwargs"], args["env_wrapper"], args["env_wrapper_kwargs"]) env = env_fn() # define the algorithm diff --git a/wiserl/dataset/__init__.py b/wiserl/dataset/__init__.py index 195da3f..b6f3dd4 100644 --- a/wiserl/dataset/__init__.py +++ b/wiserl/dataset/__init__.py @@ -11,6 +11,10 @@ MetaworldComparisonDataset, MetaworldOfflineDataset, ) +from wiserl.dataset.rpl_dataset import ( + RPLComparisonDataset, + RPLOfflineDataset, +) from wiserl.dataset.mismatched_mujoco_dataset import ( MismatchedComparisonDataset, MismatchedOfflineDataset, diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py new file mode 100644 index 0000000..225d65f --- /dev/null +++ b/wiserl/dataset/rpl_dataset.py @@ -0,0 +1,184 @@ +import os +import pickle +from typing import Dict, Optional, Union + +import d4rl +import gym +import numpy as np +import torch + +from wiserl.utils import utils + +prefix = "datasets/rpl" + +class RPLComparisonDataset(torch.utils.data.IterableDataset): + def __init__( + self, + observation_space, + action_space, + env: str, + segment_length: Optional[int] = None, + batch_size: Optional[int] = None, + capacity: Optional[int] = None, + mode: str = "qv", + variant: str = "gravity-50", + eval: bool = False, + ): + super().__init__() + assert mode in {"qv", "vv"}, "Supported modes for IPLComparisonOfflineDataset: {qv, vv}" + + self.env_name = env + self.mode = mode + self.batch_size = 1 if batch_size is None else batch_size + self.segment_length = segment_length + self.eval = eval + train_or_eval = "eval" if eval else "train" + path = f"{prefix}/{variant}/{self.env_name}/preference_adv_{self.mode}_{train_or_eval}_data.npz" + with open(path, "rb") as f: + data = np.load(f) + data = utils.nest_dict(data) + if capacity is not None: + data = utils.get_from_batch(data, 0, capacity) + data = utils.remove_float64(data) + lim = 1 - 1e-8 + data["action_1"] = np.clip(data["action_1"], a_min=-lim, a_max=lim) + data["action_2"] = np.clip(data["action_2"], a_min=-lim, a_max=lim) + + self.data = data + self.data_size, self.data_segment_length = data["action_1"].shape[:2] + + def __len__(self): + return self.data_size + + def sample_idx(self, idx): + idx = np.squeeze(idx) + is_batch = len(idx.shape) > 0 + if self.segment_length is not None: + start_idx = np.random.randint(self.data_segment_length - self.segment_length) + end_idx = start_idx + self.segment_length + else: + start_idx, end_idx = 0, self.data_segment_length + batch = { + "obs_1": self.data["obs_1"][idx, start_idx:end_idx], + "obs_2": self.data["obs_2"][idx, start_idx:end_idx], + "action_1": self.data["action_1"][idx, start_idx:end_idx], + "action_2": self.data["action_2"][idx, start_idx:end_idx], + "label": self.data["label"][idx][:, None], + "terminal_1": np.zeros([len(idx), end_idx-start_idx, 1], dtype=np.float32) \ + if is_batch else np.zeros([end_idx-start_idx, 1], dtype=np.float32), + "terminal_2": np.zeros([len(idx), end_idx-start_idx, 1], dtype=np.float32) \ + if is_batch else np.zeros([end_idx-start_idx, 1], dtype=np.float32) + } + return batch + + def __iter__(self): + while True: + idxs = np.random.randint(0, len(self), size=self.batch_size) + yield self.sample_idx(idxs) + + def create_sequential_iter(self): + start, end = 0, min(self.batch_size, self.data_size) + while start < self.data_size: + idxs = list(range(start, min(end, self.data_size))) + yield self.sample_idx(idxs) + start += self.batch_size + end += self.batch_size + + +class RPLOfflineDataset(torch.utils.data.IterableDataset): + def __init__( + self, + observation_space, + action_space, + env: str, + batch_size: Optional[int] = None, + capacity: Optional[int] = None, + mode: str = "transition", + variant: str = "gravity-50", + eval: bool = False, + ): + super().__init__() + assert mode in {"transition", "trajectory"} + + self.env_name = env + self.batch_size = 1 if batch_size is None else batch_size + self.capacity = capacity + self.eval = eval + + train_or_eval = "eval" if eval else "train" + path = f"{prefix}/{variant}/{self.env_name}/offline_{train_or_eval}_data.npz" + + self.path = path + self.load_dataset() + + def __len__(self): + return self.data_size + + def __iter__(self): + while True: + idxs = np.random.randint(0, self.data_size, self.batch_size) + idxs = np.squeeze(idxs) + traj_len = self.data["obs"].shape[1] + mask = np.ones([self.batch_size, traj_len, 1], dtype=np.float32) + timestep = np.stack([np.arange(traj_len) for _ in idxs], axis=0) + yield { + "obs": self.data["obs"][idxs], + "next_obs": self.data["next_obs"][idxs], + "action": self.data["action"][idxs], + "reward": self.data["reward"][idxs], + "terminal": self.data["terminal"][idxs], + "mask": mask, + "timestep": timestep, + } + + def load_dataset(self): + with open(self.path, "rb") as f: + data = np.load(f) + data = utils.nest_dict(data) + if self.capacity is not None: + data = utils.get_from_batch(data, 0, self.capacity) + data = utils.remove_float64(data) + lim = 1 - 1e-8 + data["action"] = np.clip(data["action"], a_min=-lim, a_max=lim) + N, L = data["obs"].shape[:2] + + data["terminal"] = np.zeros([N, L, 1], dtype=np.bool_) + data["reward"] = np.zeros([N, L, 1], dtype=np.float32) + data["mask"] = np.ones([N, L, 1], dtype=np.float32) + + self.traj_len = np.full(N, L) + self.data_size = N + if self.capacity is not None and self.capacity < self.data_size: + data = {k: data[k][:self.capacity] for k in data} + self.traj_len = self.traj_len[:self.capacity] + self.data_size = self.capacity + self.data = data + + @torch.no_grad() + def relabel_reward(self, agent): + assert hasattr(agent, "select_reward"), f"Agent {agent} must support relabel_reward!" + bs = 256 + for i_batch in range((self.data_size-1) // bs + 1): + idx = np.arange(i_batch*bs, min((i_batch+1)*bs, self.data_size)) + batch = { + "obs": self.data["obs"][idx], + "action": self.data["action"][idx], + "next_obs": self.data["next_obs"][idx], + "mask": self.data["mask"][idx] + } + batch = agent.format_batch(batch) + reward = agent.select_reward(batch).detach().cpu().numpy() + reward = reward * self.data["mask"][idx] + self.data["reward"][idx] = reward + + return_ = self.data["reward"].sum(1) + max_return = max( + abs(return_.max()), + abs(return_.min()), + return_.max() - return_.min(), + 1.0 + ) + norm = 500. / max_return + self.data["reward"] *= norm + print(f"[RPLOfflineDataset]: return range: [{return_.min()}, {return_.max()}], multiplying norm factor {norm}.") + From 51738e02b6c636c49f2431fcdf20c4bf852de0b7 Mon Sep 17 00:00:00 2001 From: OrangeX4 Date: Thu, 12 Dec 2024 15:04:03 +0800 Subject: [PATCH 02/17] fix: use ipl-metaworld format for rpl_dataset --- scripts/configs/bt_iql/rpl/gravity-10-10.yaml | 9 +- .../configs/bt_iql/rpl/gravity-150-10.yaml | 9 +- .../configs/bt_iql/rpl/gravity-150-150.yaml | 113 ++++++++++++++++++ .../configs/bt_iql/rpl/gravity-50-150.yaml | 9 +- scripts/configs/bt_iql/rpl/gravity-50-50.yaml | 9 +- .../configs/oracle_iql/rpl/gravity-10.yaml | 75 ++++++++++++ .../configs/oracle_iql/rpl/gravity-150.yaml | 75 ++++++++++++ .../configs/oracle_iql/rpl/gravity-50.yaml | 75 ++++++++++++ wiserl/algorithm/oracle_iql.py | 14 ++- wiserl/dataset/rpl_dataset.py | 63 ++++++---- 10 files changed, 409 insertions(+), 42 deletions(-) create mode 100644 scripts/configs/bt_iql/rpl/gravity-150-150.yaml create mode 100644 scripts/configs/oracle_iql/rpl/gravity-10.yaml create mode 100644 scripts/configs/oracle_iql/rpl/gravity-150.yaml create mode 100644 scripts/configs/oracle_iql/rpl/gravity-50.yaml diff --git a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml index 3d6c6ea..e6e6a7e 100644 --- a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml @@ -64,8 +64,9 @@ rm_dataset: env: batch_size: 8 segment_length: null - mode: qv + label_key: rl_sum variant: gravity-10 + capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -75,6 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-10 + capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -94,9 +96,10 @@ rm_eval: class: RPLComparisonDataset env: batch_size: 32 - mode: qv + label_key: rl_sum variant: gravity-10 - eval: false + eval: true + capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml index 004d663..8363e14 100644 --- a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml @@ -64,8 +64,9 @@ rm_dataset: env: batch_size: 8 segment_length: null - mode: qv + label_key: rl_sum variant: gravity-150 + capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -75,6 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-10 + capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -94,9 +96,10 @@ rm_eval: class: RPLComparisonDataset env: batch_size: 32 - mode: qv + label_key: rl_sum variant: gravity-150 - eval: false + eval: true + capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-150-150.yaml b/scripts/configs/bt_iql/rpl/gravity-150-150.yaml new file mode 100644 index 0000000..09edabf --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-150-150.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml index 1a0e6cd..6043aea 100644 --- a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml @@ -64,8 +64,9 @@ rm_dataset: env: batch_size: 8 segment_length: null - mode: qv + label_key: rl_sum variant: gravity-50 + capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -75,6 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-150 + capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -94,9 +96,10 @@ rm_eval: class: RPLComparisonDataset env: batch_size: 32 - mode: qv + label_key: rl_sum variant: gravity-50 - eval: false + eval: true + capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml index 21cfe9f..4836030 100644 --- a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml @@ -64,8 +64,9 @@ rm_dataset: env: batch_size: 8 segment_length: null - mode: qv + label_key: rl_sum variant: gravity-50 + capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -75,6 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-50 + capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -94,9 +96,10 @@ rm_eval: class: RPLComparisonDataset env: batch_size: 32 - mode: qv + label_key: rl_sum variant: gravity-50 - eval: false + eval: true + capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/oracle_iql/rpl/gravity-10.yaml b/scripts/configs/oracle_iql/rpl/gravity-10.yaml new file mode 100644 index 0000000..7bb1ebd --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/gravity-10.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-10 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 500000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-150.yaml b/scripts/configs/oracle_iql/rpl/gravity-150.yaml new file mode 100644 index 0000000..52e84d7 --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/gravity-150.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 500000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-50.yaml b/scripts/configs/oracle_iql/rpl/gravity-50.yaml new file mode 100644 index 0000000..df3a16a --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/gravity-50.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 500000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/wiserl/algorithm/oracle_iql.py b/wiserl/algorithm/oracle_iql.py index 27eb81c..0c66ec7 100644 --- a/wiserl/algorithm/oracle_iql.py +++ b/wiserl/algorithm/oracle_iql.py @@ -109,10 +109,16 @@ def q_loss(self, encoded_obs, action, next_encoded_obs, reward, terminal, reduce def train_step(self, batches, step:int, total_steps: int): batch, *_ = batches - obs = torch.cat([batch["obs_1"], batch["obs_2"]], dim=0) # (B, S+1) - action = torch.cat([batch["action_1"], batch["action_2"]], dim=0) # (B, S+1) - reward = torch.cat([batch["reward_1"], batch["reward_2"]], dim=0) - terminal = torch.cat([batch["terminal_1"], batch["terminal_2"]], dim=0) + if "obs_1" in batch: + obs = torch.cat([batch["obs_1"], batch["obs_2"]], dim=0) # (B, S+1) + action = torch.cat([batch["action_1"], batch["action_2"]], dim=0) # (B, S+1) + reward = torch.cat([batch["reward_1"], batch["reward_2"]], dim=0) + terminal = torch.cat([batch["terminal_1"], batch["terminal_2"]], dim=0) + else: + obs = batch["obs"] + action = batch["action"] + reward = batch["reward"] + terminal = batch["terminal"].float() encoded_obs = self.network.encoder(obs) diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index 225d65f..c298cb0 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -20,20 +20,20 @@ def __init__( segment_length: Optional[int] = None, batch_size: Optional[int] = None, capacity: Optional[int] = None, - mode: str = "qv", + label_key: str="rl_sum", variant: str = "gravity-50", eval: bool = False, ): super().__init__() - assert mode in {"qv", "vv"}, "Supported modes for IPLComparisonOfflineDataset: {qv, vv}" self.env_name = env - self.mode = mode self.batch_size = 1 if batch_size is None else batch_size self.segment_length = segment_length + self.label_key = label_key + '_label' + self.variant = variant self.eval = eval train_or_eval = "eval" if eval else "train" - path = f"{prefix}/{variant}/{self.env_name}/preference_adv_{self.mode}_{train_or_eval}_data.npz" + path = f"{prefix}/{variant}/{self.env_name}/preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -63,7 +63,7 @@ def sample_idx(self, idx): "obs_2": self.data["obs_2"][idx, start_idx:end_idx], "action_1": self.data["action_1"][idx, start_idx:end_idx], "action_2": self.data["action_2"][idx, start_idx:end_idx], - "label": self.data["label"][idx][:, None], + "label": self.data[self.label_key][idx][:, None], "terminal_1": np.zeros([len(idx), end_idx-start_idx, 1], dtype=np.float32) \ if is_batch else np.zeros([end_idx-start_idx, 1], dtype=np.float32), "terminal_2": np.zeros([len(idx), end_idx-start_idx, 1], dtype=np.float32) \ @@ -88,9 +88,10 @@ def create_sequential_iter(self): class RPLOfflineDataset(torch.utils.data.IterableDataset): def __init__( self, - observation_space, - action_space, + observation_space: gym.Space, + action_space: gym.Space, env: str, + # segment_length: Optional[int] = None, batch_size: Optional[int] = None, capacity: Optional[int] = None, mode: str = "transition", @@ -102,13 +103,11 @@ def __init__( self.env_name = env self.batch_size = 1 if batch_size is None else batch_size + # self.segment_length = segment_length self.capacity = capacity + self.variant = variant self.eval = eval - train_or_eval = "eval" if eval else "train" - path = f"{prefix}/{variant}/{self.env_name}/offline_{train_or_eval}_data.npz" - - self.path = path self.load_dataset() def __len__(self): @@ -118,7 +117,7 @@ def __iter__(self): while True: idxs = np.random.randint(0, self.data_size, self.batch_size) idxs = np.squeeze(idxs) - traj_len = self.data["obs"].shape[1] + traj_len = self.data["obs"][0].shape[0] mask = np.ones([self.batch_size, traj_len, 1], dtype=np.float32) timestep = np.stack([np.arange(traj_len) for _ in idxs], axis=0) yield { @@ -132,26 +131,38 @@ def __iter__(self): } def load_dataset(self): - with open(self.path, "rb") as f: + train_or_eval = "eval" if self.eval else "train" + path = f"{prefix}/{self.variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) if self.capacity is not None: data = utils.get_from_batch(data, 0, self.capacity) data = utils.remove_float64(data) lim = 1 - 1e-8 - data["action"] = np.clip(data["action"], a_min=-lim, a_max=lim) - N, L = data["obs"].shape[:2] - - data["terminal"] = np.zeros([N, L, 1], dtype=np.bool_) - data["reward"] = np.zeros([N, L, 1], dtype=np.float32) - data["mask"] = np.ones([N, L, 1], dtype=np.float32) - - self.traj_len = np.full(N, L) - self.data_size = N - if self.capacity is not None and self.capacity < self.data_size: - data = {k: data[k][:self.capacity] for k in data} - self.traj_len = self.traj_len[:self.capacity] - self.data_size = self.capacity + data["action_1"] = np.clip(data["action_1"], a_min=-lim, a_max=lim) + data["action_2"] = np.clip(data["action_2"], a_min=-lim, a_max=lim) + N, L = data["obs_1"].shape[:2] + + data = { + "obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1)[:, :-1], + "next_obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1)[:, 1:], + "action": np.stack([data["action_1"], data["action_2"]], axis=0).reshape(2*N, L, -1)[:, :-1], + } + data["terminal"] = np.zeros([2*N, L-1, 1], dtype=np.bool_) + data["reward"] = np.zeros([2*N, L-1, 1], dtype=np.float32) + data["mask"] = np.ones([2*N, L-1, 1], dtype=np.float32) + + self.traj_len = np.asarray([o.shape[0] for o in data["obs"]]) + self.data_size = len(self.traj_len) + if self.capacity is not None: + if self.capacity > self.data_size: + print(f"[Warning]: capacity {self.capacity} exceeds dataset size {self.data_size}") + self.data_size = min(self.data_size, self.capacity) + data = { + k: data[k][:self.data_size] for k in data + } + self.traj_len = self.traj_len[:self.data_size] self.data = data @torch.no_grad() From f26837aba97a4ba9f51f979ab51c510bdcfb8f35 Mon Sep 17 00:00:00 2001 From: OrangeX4 Date: Thu, 12 Dec 2024 22:26:09 +0800 Subject: [PATCH 03/17] fix: fix bug of RPLOfflineDataset --- wiserl/dataset/rpl_dataset.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index c298cb0..81e481e 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -145,13 +145,13 @@ def load_dataset(self): N, L = data["obs_1"].shape[:2] data = { - "obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1)[:, :-1], - "next_obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1)[:, 1:], - "action": np.stack([data["action_1"], data["action_2"]], axis=0).reshape(2*N, L, -1)[:, :-1], + "obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1), + "next_obs": np.stack([data["next_obs_1"], data["next_obs_2"]], axis=0).reshape(2*N, L, -1), + "action": np.stack([data["action_1"], data["action_2"]], axis=0).reshape(2*N, L, -1), + "reward": np.stack([data["reward_1"], data["reward_2"]], axis=0).reshape(2*N, L, -1), } - data["terminal"] = np.zeros([2*N, L-1, 1], dtype=np.bool_) - data["reward"] = np.zeros([2*N, L-1, 1], dtype=np.float32) - data["mask"] = np.ones([2*N, L-1, 1], dtype=np.float32) + data["terminal"] = np.zeros([2*N, L, 1], dtype=np.bool_) + data["mask"] = np.ones([2*N, L, 1], dtype=np.float32) self.traj_len = np.asarray([o.shape[0] for o in data["obs"]]) self.data_size = len(self.traj_len) From acdbe6162ede5eaa095eac6596ca4765a1584ef6 Mon Sep 17 00:00:00 2001 From: OrangeX4 Date: Sat, 14 Dec 2024 15:40:58 +0800 Subject: [PATCH 04/17] fix: update configs and add terminal --- scripts/configs/bt_iql/rpl/gravity-10-10.yaml | 6 +- .../configs/bt_iql/rpl/gravity-10-150.yaml | 113 ++++++++++++++++++ .../configs/bt_iql/rpl/gravity-150-10.yaml | 8 +- .../configs/bt_iql/rpl/gravity-150-150.yaml | 6 +- .../configs/bt_iql/rpl/gravity-150-50.yaml | 113 ++++++++++++++++++ .../configs/bt_iql/rpl/gravity-50-150.yaml | 8 +- scripts/configs/bt_iql/rpl/gravity-50-50.yaml | 6 +- .../configs/oracle_iql/rpl/gravity-10.yaml | 2 +- .../configs/oracle_iql/rpl/gravity-150.yaml | 2 +- .../configs/oracle_iql/rpl/gravity-50.yaml | 2 +- wiserl/dataset/rpl_dataset.py | 2 +- 11 files changed, 247 insertions(+), 21 deletions(-) create mode 100644 scripts/configs/bt_iql/rpl/gravity-10-150.yaml create mode 100644 scripts/configs/bt_iql/rpl/gravity-150-50.yaml diff --git a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml index e6e6a7e..9c92afb 100644 --- a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml @@ -66,7 +66,7 @@ rm_dataset: segment_length: null label_key: rl_sum variant: gravity-10 - capacity: 500 + # capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -76,7 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-10 - capacity: 5000 + # capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -99,7 +99,7 @@ rm_eval: label_key: rl_sum variant: gravity-10 eval: true - capacity: 500 + # capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-10-150.yaml b/scripts/configs/bt_iql/rpl/gravity-10-150.yaml new file mode 100644 index 0000000..945a3e8 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-10-150.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-10 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml index 8363e14..c74542b 100644 --- a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml @@ -66,7 +66,7 @@ rm_dataset: segment_length: null label_key: rl_sum variant: gravity-150 - capacity: 500 + # capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -76,7 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-10 - capacity: 5000 + # capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -97,9 +97,9 @@ rm_eval: env: batch_size: 32 label_key: rl_sum - variant: gravity-150 + variant: gravity-10 eval: true - capacity: 500 + # capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-150-150.yaml b/scripts/configs/bt_iql/rpl/gravity-150-150.yaml index 09edabf..439e7f3 100644 --- a/scripts/configs/bt_iql/rpl/gravity-150-150.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-150-150.yaml @@ -66,7 +66,7 @@ rm_dataset: segment_length: null label_key: rl_sum variant: gravity-150 - capacity: 500 + # capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -76,7 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-150 - capacity: 5000 + # capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -99,7 +99,7 @@ rm_eval: label_key: rl_sum variant: gravity-150 eval: true - capacity: 500 + # capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-150-50.yaml b/scripts/configs/bt_iql/rpl/gravity-150-50.yaml new file mode 100644 index 0000000..e475736 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-150-50.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-50 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml index 6043aea..b3b6794 100644 --- a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml @@ -66,7 +66,7 @@ rm_dataset: segment_length: null label_key: rl_sum variant: gravity-50 - capacity: 500 + # capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -76,7 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-150 - capacity: 5000 + # capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -97,9 +97,9 @@ rm_eval: env: batch_size: 32 label_key: rl_sum - variant: gravity-50 + variant: gravity-150 eval: true - capacity: 500 + # capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml index 4836030..bf0abf0 100644 --- a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml @@ -66,7 +66,7 @@ rm_dataset: segment_length: null label_key: rl_sum variant: gravity-50 - capacity: 500 + # capacity: 500 rm_dataloader: num_workers: 2 batch_size: null @@ -76,7 +76,7 @@ rl_dataset: env: batch_size: 16 variant: gravity-50 - capacity: 5000 + # capacity: 5000 rl_dataloader: num_workers: 2 batch_size: null @@ -99,7 +99,7 @@ rm_eval: label_key: rl_sum variant: gravity-50 eval: true - capacity: 500 + # capacity: 500 rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/oracle_iql/rpl/gravity-10.yaml b/scripts/configs/oracle_iql/rpl/gravity-10.yaml index 7bb1ebd..6b039b8 100644 --- a/scripts/configs/oracle_iql/rpl/gravity-10.yaml +++ b/scripts/configs/oracle_iql/rpl/gravity-10.yaml @@ -49,7 +49,7 @@ dataset: env: batch_size: 16 variant: gravity-10 - capacity: 5000 + # capacity: 5000 dataloader: num_workers: 2 batch_size: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-150.yaml b/scripts/configs/oracle_iql/rpl/gravity-150.yaml index 52e84d7..8d5b160 100644 --- a/scripts/configs/oracle_iql/rpl/gravity-150.yaml +++ b/scripts/configs/oracle_iql/rpl/gravity-150.yaml @@ -49,7 +49,7 @@ dataset: env: batch_size: 16 variant: gravity-150 - capacity: 5000 + # capacity: 5000 dataloader: num_workers: 2 batch_size: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-50.yaml b/scripts/configs/oracle_iql/rpl/gravity-50.yaml index df3a16a..51bb9a4 100644 --- a/scripts/configs/oracle_iql/rpl/gravity-50.yaml +++ b/scripts/configs/oracle_iql/rpl/gravity-50.yaml @@ -49,7 +49,7 @@ dataset: env: batch_size: 16 variant: gravity-50 - capacity: 5000 + # capacity: 5000 dataloader: num_workers: 2 batch_size: null diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index 81e481e..c6bf696 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -149,8 +149,8 @@ def load_dataset(self): "next_obs": np.stack([data["next_obs_1"], data["next_obs_2"]], axis=0).reshape(2*N, L, -1), "action": np.stack([data["action_1"], data["action_2"]], axis=0).reshape(2*N, L, -1), "reward": np.stack([data["reward_1"], data["reward_2"]], axis=0).reshape(2*N, L, -1), + "terminal": np.stack([data["terminal_1"], data["terminal_2"]], axis=0).reshape(2*N, L, -1), } - data["terminal"] = np.zeros([2*N, L, 1], dtype=np.bool_) data["mask"] = np.ones([2*N, L, 1], dtype=np.float32) self.traj_len = np.asarray([o.shape[0] for o in data["obs"]]) From 787c5e2a5056c50d51bf02d29d9723a79c4b2ca4 Mon Sep 17 00:00:00 2001 From: qisia <2912364482@qq.com> Date: Fri, 20 Dec 2024 20:13:00 +0000 Subject: [PATCH 05/17] update configs and dataset --- .gitignore | 2 + .../configs/bt_awac/rpl/gravity-10-10.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-10-150.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-100-100.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-150-10.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-150-150.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-150-50.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-50-100.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-50-150.yaml | 112 +++++++++++++++ .../configs/bt_awac/rpl/gravity-50-50.yaml | 112 +++++++++++++++ .../rpl/halfcheetah-gravity-150-150.yaml | 112 +++++++++++++++ .../rpl/halfcheetah-gravity-50-150.yaml | 112 +++++++++++++++ .../rpl/halfcheetah-gravity-50-50.yaml | 112 +++++++++++++++ .../rpl/halfcheetah-gravity-50-80.yaml | 112 +++++++++++++++ .../rpl/halfcheetah-gravity-80-150.yaml | 112 +++++++++++++++ .../rpl/halfcheetah-gravity-80-80.yaml | 112 +++++++++++++++ scripts/configs/bt_iql/rpl/gravity-10-10.yaml | 2 +- .../configs/bt_iql/rpl/gravity-10-150.yaml | 2 +- .../bt_iql/rpl/gravity-100-100-b1-e9.yaml | 113 +++++++++++++++ .../configs/bt_iql/rpl/gravity-100-100.yaml | 113 +++++++++++++++ .../configs/bt_iql/rpl/gravity-150-10.yaml | 2 +- .../configs/bt_iql/rpl/gravity-150-50.yaml | 2 +- .../configs/bt_iql/rpl/gravity-50-150.yaml | 2 +- scripts/configs/bt_iql/rpl/gravity-50-50.yaml | 2 +- .../rpl/halfcheetah-gravity-150-150.yaml | 113 +++++++++++++++ .../rpl/halfcheetah-gravity-50-150.yaml | 113 +++++++++++++++ .../bt_iql/rpl/halfcheetah-gravity-50-50.yaml | 113 +++++++++++++++ .../bt_iql/rpl/halfcheetah-gravity-50-80.yaml | 113 +++++++++++++++ .../rpl/halfcheetah-gravity-80-150.yaml | 113 +++++++++++++++ .../bt_iql/rpl/halfcheetah-gravity-80-80.yaml | 113 +++++++++++++++ .../configs/oracle_awac/rpl/gravity-10.yaml | 74 ++++++++++ .../configs/oracle_awac/rpl/gravity-100.yaml | 74 ++++++++++ .../configs/oracle_awac/rpl/gravity-150.yaml | 74 ++++++++++ .../configs/oracle_awac/rpl/gravity-50.yaml | 74 ++++++++++ .../rpl/halfcheetah-gravity-150.yaml | 74 ++++++++++ .../rpl/halfcheetah-gravity-50.yaml | 74 ++++++++++ .../rpl/halfcheetah-gravity-80.yaml | 74 ++++++++++ .../configs/oracle_iql/rpl/gravity-10.yaml | 2 +- .../oracle_iql/rpl/gravity-100-test.yaml | 74 ++++++++++ .../configs/oracle_iql/rpl/gravity-100.yaml | 75 ++++++++++ .../configs/oracle_iql/rpl/gravity-150.yaml | 3 +- .../configs/oracle_iql/rpl/gravity-50.yaml | 5 +- .../rpl/halfcheetah-gravity-150.yaml | 75 ++++++++++ .../rpl/halfcheetah-gravity-50.yaml | 75 ++++++++++ .../rpl/halfcheetah-gravity-80.yaml | 75 ++++++++++ scripts/main.py | 17 +++ scripts/rmb_main.py | 23 +++ wiserl/algorithm/bt/bt_iql.py | 3 +- wiserl/algorithm/oracle_awac.py | 41 ++++-- wiserl/algorithm/oracle_iql.py | 24 ++-- wiserl/algorithm/rpl/rpl_iql.py | 3 +- wiserl/dataset/rpl_dataset.py | 132 +++++++++++++----- 52 files changed, 3673 insertions(+), 70 deletions(-) create mode 100644 scripts/configs/bt_awac/rpl/gravity-10-10.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-10-150.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-100-100.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-150-10.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-150-150.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-150-50.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-50-100.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-50-150.yaml create mode 100644 scripts/configs/bt_awac/rpl/gravity-50-50.yaml create mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml create mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml create mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml create mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml create mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml create mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml create mode 100644 scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml create mode 100644 scripts/configs/bt_iql/rpl/gravity-100-100.yaml create mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml create mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml create mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml create mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml create mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml create mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml create mode 100644 scripts/configs/oracle_awac/rpl/gravity-10.yaml create mode 100644 scripts/configs/oracle_awac/rpl/gravity-100.yaml create mode 100644 scripts/configs/oracle_awac/rpl/gravity-150.yaml create mode 100644 scripts/configs/oracle_awac/rpl/gravity-50.yaml create mode 100644 scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml create mode 100644 scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml create mode 100644 scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml create mode 100644 scripts/configs/oracle_iql/rpl/gravity-100-test.yaml create mode 100644 scripts/configs/oracle_iql/rpl/gravity-100.yaml create mode 100644 scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml create mode 100644 scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml create mode 100644 scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml diff --git a/.gitignore b/.gitignore index 080a77b..bff5224 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ datasets/ shells/ ckpts log_bkp/ +scripts/main.py +scripts/rmb_main.py \ No newline at end of file diff --git a/scripts/configs/bt_awac/rpl/gravity-10-10.yaml b/scripts/configs/bt_awac/rpl/gravity-10-10.yaml new file mode 100644 index 0000000..e57c8e8 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-10-10.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-10 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-10 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-10 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-10-150.yaml b/scripts/configs/bt_awac/rpl/gravity-10-150.yaml new file mode 100644 index 0000000..82069ac --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-10-150.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-10 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-150 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-100-100.yaml b/scripts/configs/bt_awac/rpl/gravity-100-100.yaml new file mode 100644 index 0000000..3ff7798 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-100-100.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-100 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-100 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-100 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-150-10.yaml b/scripts/configs/bt_awac/rpl/gravity-150-10.yaml new file mode 100644 index 0000000..58dbfcf --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-150-10.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-10 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-10 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-150-150.yaml b/scripts/configs/bt_awac/rpl/gravity-150-150.yaml new file mode 100644 index 0000000..00f57f6 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-150-150.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-150 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 50000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-150-50.yaml b/scripts/configs/bt_awac/rpl/gravity-150-50.yaml new file mode 100644 index 0000000..bc5b845 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-150-50.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-50 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-50 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-50-100.yaml b/scripts/configs/bt_awac/rpl/gravity-50-100.yaml new file mode 100644 index 0000000..8c6f07b --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-50-100.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-100 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-100 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-50-150.yaml b/scripts/configs/bt_awac/rpl/gravity-50-150.yaml new file mode 100644 index 0000000..cc4d6ea --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-50-150.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-150 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-50-50.yaml b/scripts/configs/bt_awac/rpl/gravity-50-50.yaml new file mode 100644 index 0000000..4625214 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/gravity-50-50.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-50 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-50 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml new file mode 100644 index 0000000..896501b --- /dev/null +++ b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml new file mode 100644 index 0000000..8c86b8a --- /dev/null +++ b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml new file mode 100644 index 0000000..4651f21 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-50 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-50 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml new file mode 100644 index 0000000..011c846 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-80 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-80 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml new file mode 100644 index 0000000..9a57724 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-80 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml new file mode 100644 index 0000000..b1bb2d0 --- /dev/null +++ b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml @@ -0,0 +1,112 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-80 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 64 + variant: gravity-80 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-80 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml index 9c92afb..d0351af 100644 --- a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml @@ -84,7 +84,7 @@ rl_dataloader: trainer: env_freq: null rm_label: true - rm_steps: 50000 + rm_steps: 100000 rl_steps: 1000000 log_freq: 500 profile_freq: 500 diff --git a/scripts/configs/bt_iql/rpl/gravity-10-150.yaml b/scripts/configs/bt_iql/rpl/gravity-10-150.yaml index 945a3e8..361f770 100644 --- a/scripts/configs/bt_iql/rpl/gravity-10-150.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-10-150.yaml @@ -84,7 +84,7 @@ rl_dataloader: trainer: env_freq: null rm_label: true - rm_steps: 50000 + rm_steps: 100000 rl_steps: 1000000 log_freq: 500 profile_freq: 500 diff --git a/scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml b/scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml new file mode 100644 index 0000000..14d43f4 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.1 + expectile: 0.9 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-100 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-100 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-100 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-100-100.yaml b/scripts/configs/bt_iql/rpl/gravity-100-100.yaml new file mode 100644 index 0000000..36a64be --- /dev/null +++ b/scripts/configs/bt_iql/rpl/gravity-100-100.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-100 + # capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-100 + # capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-100 + eval: true + # capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml index c74542b..2d98024 100644 --- a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml @@ -84,7 +84,7 @@ rl_dataloader: trainer: env_freq: null rm_label: true - rm_steps: 50000 + rm_steps: 100000 rl_steps: 1000000 log_freq: 500 profile_freq: 500 diff --git a/scripts/configs/bt_iql/rpl/gravity-150-50.yaml b/scripts/configs/bt_iql/rpl/gravity-150-50.yaml index e475736..483b9bc 100644 --- a/scripts/configs/bt_iql/rpl/gravity-150-50.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-150-50.yaml @@ -84,7 +84,7 @@ rl_dataloader: trainer: env_freq: null rm_label: true - rm_steps: 50000 + rm_steps: 100000 rl_steps: 1000000 log_freq: 500 profile_freq: 500 diff --git a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml index b3b6794..89bf1d3 100644 --- a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml @@ -84,7 +84,7 @@ rl_dataloader: trainer: env_freq: null rm_label: true - rm_steps: 50000 + rm_steps: 100000 rl_steps: 1000000 log_freq: 500 profile_freq: 500 diff --git a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml index bf0abf0..8ae39e7 100644 --- a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml +++ b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml @@ -84,7 +84,7 @@ rl_dataloader: trainer: env_freq: null rm_label: true - rm_steps: 50000 + rm_steps: 100000 rl_steps: 1000000 log_freq: 500 profile_freq: 500 diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml new file mode 100644 index 0000000..53b82fd --- /dev/null +++ b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-150 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml new file mode 100644 index 0000000..067acb0 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml new file mode 100644 index 0000000..0adf564 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-50 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml new file mode 100644 index 0000000..af3b84f --- /dev/null +++ b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-50 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-80 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-80 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml new file mode 100644 index 0000000..90ec5f7 --- /dev/null +++ b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-80 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-150 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml new file mode 100644 index 0000000..2fd1b6e --- /dev/null +++ b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml @@ -0,0 +1,113 @@ +algorithm: + class: BTIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +eval_env: +eval_env_kwargs: +eval_env_wrapper: MujocoParamOverWrite +eval_env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + variant: gravity-80 + capacity: 500 +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-80 + capacity: 5000 +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + variant: gravity-80 + eval: true + capacity: 500 +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-10.yaml b/scripts/configs/oracle_awac/rpl/gravity-10.yaml new file mode 100644 index 0000000..4986943 --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/gravity-10.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.1 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256, 256] + reparameterize: false + conditioned_logstd: true + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 512 + variant: gravity-10 + # capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-100.yaml b/scripts/configs/oracle_awac/rpl/gravity-100.yaml new file mode 100644 index 0000000..64aaf64 --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/gravity-100.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-100 + # capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-150.yaml b/scripts/configs/oracle_awac/rpl/gravity-150.yaml new file mode 100644 index 0000000..74bb5ba --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/gravity-150.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + # capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-50.yaml b/scripts/configs/oracle_awac/rpl/gravity-50.yaml new file mode 100644 index 0000000..872f296 --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/gravity-50.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-50 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 + # capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml new file mode 100644 index 0000000..13c1b92 --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml new file mode 100644 index 0000000..8280982 --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml new file mode 100644 index 0000000..ac60af0 --- /dev/null +++ b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleAWAC + beta: 0.3333 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-80 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-10.yaml b/scripts/configs/oracle_iql/rpl/gravity-10.yaml index 6b039b8..fda2f9a 100644 --- a/scripts/configs/oracle_iql/rpl/gravity-10.yaml +++ b/scripts/configs/oracle_iql/rpl/gravity-10.yaml @@ -57,7 +57,7 @@ dataloader: trainer: env_freq: null - total_steps: 500000 + total_steps: 1000000 log_freq: 500 profile_freq: 500 eval_freq: 5000 diff --git a/scripts/configs/oracle_iql/rpl/gravity-100-test.yaml b/scripts/configs/oracle_iql/rpl/gravity-100-test.yaml new file mode 100644 index 0000000..c75e011 --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/gravity-100-test.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256, 256] + reparameterize: false + conditioned_logstd: true + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256, 256] + +dataset: + - class: D4RLOfflineDataset + env: walker2d-medium + batch_size: 512 + # capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-100.yaml b/scripts/configs/oracle_iql/rpl/gravity-100.yaml new file mode 100644 index 0000000..73eb028 --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/gravity-100.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: Walker2d-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.0 # gravity-10 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-100 + # capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-150.yaml b/scripts/configs/oracle_iql/rpl/gravity-150.yaml index 8d5b160..befa191 100644 --- a/scripts/configs/oracle_iql/rpl/gravity-150.yaml +++ b/scripts/configs/oracle_iql/rpl/gravity-150.yaml @@ -49,6 +49,7 @@ dataset: env: batch_size: 16 variant: gravity-150 + mode: "trajectory" # capacity: 5000 dataloader: num_workers: 2 @@ -57,7 +58,7 @@ dataloader: trainer: env_freq: null - total_steps: 500000 + total_steps: 1000000 log_freq: 500 profile_freq: 500 eval_freq: 5000 diff --git a/scripts/configs/oracle_iql/rpl/gravity-50.yaml b/scripts/configs/oracle_iql/rpl/gravity-50.yaml index 51bb9a4..c03de7f 100644 --- a/scripts/configs/oracle_iql/rpl/gravity-50.yaml +++ b/scripts/configs/oracle_iql/rpl/gravity-50.yaml @@ -47,8 +47,9 @@ network: dataset: - class: RPLOfflineDataset env: - batch_size: 16 + batch_size: 16 #16 variant: gravity-50 + mode: "trajectory" #"transition" # capacity: 5000 dataloader: num_workers: 2 @@ -57,7 +58,7 @@ dataloader: trainer: env_freq: null - total_steps: 500000 + total_steps: 1000000 log_freq: 500 profile_freq: 500 eval_freq: 5000 diff --git a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml new file mode 100644 index 0000000..519e928 --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 1.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-150 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml new file mode 100644 index 0000000..ca11f8c --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.5 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-50 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml new file mode 100644 index 0000000..f653674 --- /dev/null +++ b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml @@ -0,0 +1,75 @@ +algorithm: + class: OracleIQL + beta: 0.3333 + expectile: 0.7 + max_exp_clip: 100.0 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: 0.8 # gravity-150 + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + value: + class: Critic + ensemble_size: 1 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 16 + variant: gravity-80 + capacity: 5000 +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/scripts/main.py b/scripts/main.py index ec70994..4c43e01 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -12,6 +12,23 @@ from wiserl.trainer.offline_trainer import OfflineTrainer from wiserl.utils.utils import use_placeholder +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml --name halfcheetah-gravity-150-oracle-iql-rpl +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml --name halfcheetah-gravity-80-oracle-iql-rpl +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml --name halfcheetah-gravity-50-oracle-iql-rpl + + +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-10.yaml --name Walker2d-v3-gravity-10-oracle-iql-rpl +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-50.yaml --name Walker2d-v3-gravity-50-oracle-iql-rpl +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-100.yaml --name Walker2d-v3-gravity-100-oracle-iql-rpl +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-150.yaml --name Walker2d-v3-gravity-150-oracle-iql-rpl + +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/gravity-10.yaml --name Walker2d-v3-gravity-10-oracle-awac-rpl +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/gravity-50.yaml --name Walker2d-v3-gravity-50-oracle-awac-rpl +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/gravity-100.yaml --name Walker2d-v3-gravity-100-oracle-awac-rpl +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/gravity-150.yaml --name Walker2d-v3-gravity-150-oracle-awac-rpl + +#python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-100-test.yaml --name Walker2d-medium-gravity-100-test-oracle-iql + if __name__ == "__main__": args = parse_args(convert=False, post_init=use_placeholder) name_prefix = f"{args['algorithm']['class']}/{args['name']}/{args['env']}" diff --git a/scripts/rmb_main.py b/scripts/rmb_main.py index 21d5df5..8c94915 100644 --- a/scripts/rmb_main.py +++ b/scripts/rmb_main.py @@ -12,6 +12,29 @@ from wiserl.trainer.rmb_offline_trainer import RewardModelBasedOfflineTrainer from wiserl.utils.utils import use_placeholder +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml --name halfcheetah-gravity-80-150-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml --name halfcheetah-gravity-80-80-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml --name halfcheetah-gravity-150-150-bt-iql-rpl + +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-50-50.yaml --name Walker2d-v3-gravity-50-50-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-100-100.yaml --name Walker2d-v3-gravity-100-100-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-150-150.yaml --name Walker2d-v3-gravity-150-150-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-50-100.yaml --name Walker2d-v3-gravity-50-100-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-50-150.yaml --name Walker2d-v3-gravity-50-150-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-150-50.yaml --name Walker2d-v3-gravity-150-50-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-150-100.yaml --name Walker2d-v3-gravity-150-100-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml --name Walker2d-v3-gravity-100-100-bt-iql-rpl-b1-e9 + + +# python scripts/rmb_main.py --config scripts/configs/bt_awac/rpl/gravity-50-50.yaml --name Walker2d-v3-gravity-50-50-bt-awac-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_awac/rpl/gravity-100-100.yaml --name Walker2d-v3-gravity-100-100-bt-awac-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_awac/rpl/gravity-150-150.yaml --name Walker2d-v3-gravity-150-150-bt-awac-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_awac/rpl/gravity-50-100.yaml --name Walker2d-v3-gravity-50-100-bt-awac-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_awac/rpl/gravity-50-150.yaml --name Walker2d-v3-gravity-50-150-bt-awac-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_awac/rpl/gravity-150-50.yaml --name Walker2d-v3-gravity-150-50-bt-awac-rpl + + + if __name__ == "__main__": args = parse_args(convert=False, post_init=use_placeholder) name_prefix = f"{args['algorithm']['class']}/{args['name']}/{args['env']}" diff --git a/wiserl/algorithm/bt/bt_iql.py b/wiserl/algorithm/bt/bt_iql.py index 17e8c52..b4b37e0 100644 --- a/wiserl/algorithm/bt/bt_iql.py +++ b/wiserl/algorithm/bt/bt_iql.py @@ -122,7 +122,8 @@ def train_step(self, batches, step: int, total_steps: int) -> Dict: with torch.no_grad(): self.target_network.eval() q_old = self.target_network.critic(obs, action) - q_old = torch.min(q_old, dim=0)[0] + # q_old = torch.min(q_old, dim=0)[0] + q_old = torch.mean(q_old, dim=0)[0] # compute the loss for value network v_loss, v_pred = self.v_loss(obs.detach(), q_old) diff --git a/wiserl/algorithm/oracle_awac.py b/wiserl/algorithm/oracle_awac.py index b9a0e8e..6e6ebdb 100644 --- a/wiserl/algorithm/oracle_awac.py +++ b/wiserl/algorithm/oracle_awac.py @@ -97,20 +97,33 @@ def q_loss(self, encoded_obs, action, next_encoded_obs, reward, terminal, reduce def train_step(self, batches, step:int, total_steps: int): batch, *_ = batches - obs = torch.cat([batch["obs_1"], batch["obs_2"]], dim=0) # (B, S+1) - action = torch.cat([batch["action_1"], batch["action_2"]], dim=0) # (B, S+1) - reward = torch.cat([batch["reward_1"], batch["reward_2"]], dim=0) - terminal = torch.cat([batch["terminal_1"], batch["terminal_2"]], dim=0) - - encoded_obs = self.network.encoder(obs) - - q_loss, q_pred = self.q_loss( - encoded_obs[:, :-1].detach(), - action[:, :-1], - encoded_obs[:, 1:].detach(), - reward[:, :-1], - terminal[:, :-1] - ) + if "obs_1" in batch: + obs = torch.cat([batch["obs_1"], batch["obs_2"]], dim=0) # (B, S+1) + action = torch.cat([batch["action_1"], batch["action_2"]], dim=0) # (B, S+1) + reward = torch.cat([batch["reward_1"], batch["reward_2"]], dim=0) + terminal = torch.cat([batch["terminal_1"], batch["terminal_2"]], dim=0) + + encoded_obs = self.network.encoder(obs) + + q_loss, q_pred = self.q_loss( + encoded_obs[:, :-1].detach(), + action[:, :-1], + encoded_obs[:, 1:].detach(), + reward[:, :-1], + terminal[:, :-1] + ) + else: + obs = batch["obs"] + action = batch["action"] + reward = batch["reward"] + terminal = batch["terminal"].float() + next_obs = batch["next_obs"] + + encoded_obs = self.network.encoder(obs) + next_encoded_obs = self.network.encoder(next_obs) + + q_loss, q_pred = self.q_loss(encoded_obs, action, next_encoded_obs, reward, terminal) + self.optim["critic"].zero_grad() q_loss.backward() self.optim["critic"].step() diff --git a/wiserl/algorithm/oracle_iql.py b/wiserl/algorithm/oracle_iql.py index 0c66ec7..a08cbd6 100644 --- a/wiserl/algorithm/oracle_iql.py +++ b/wiserl/algorithm/oracle_iql.py @@ -125,7 +125,8 @@ def train_step(self, batches, step:int, total_steps: int): with torch.no_grad(): self.target_network.eval() q_old = self.target_network.critic(encoded_obs, action) - q_old = torch.min(q_old, dim=0)[0] + # q_old = torch.min(q_old, dim=0)[0] + q_old = torch.mean(q_old, dim=0)[0] # compute the loss for value network v_loss, v_pred = self.v_loss(encoded_obs.detach(), q_old) @@ -140,13 +141,20 @@ def train_step(self, batches, step:int, total_steps: int): self.optim["actor"].step() # compute the loss for q, offset by 1 - q_loss, q_pred = self.q_loss( - encoded_obs[:, :-1].detach(), - action[:, :-1], - encoded_obs[:, 1:].detach(), - reward[:, :-1], - terminal[:, :-1] - ) + # Using trajectory + # q_loss, q_pred = self.q_loss( + # encoded_obs[:, :-1].detach(), + # action[:, :-1], + # encoded_obs[:, 1:].detach(), + # reward[:, :-1], + # terminal[:, :-1] + # ) + + # Using transition + next_obs = batch["next_obs"] + next_encoded_obs = self.network.encoder(next_obs) + q_loss, q_pred = self.q_loss(encoded_obs, action, next_encoded_obs, reward, terminal) + self.optim["critic"].zero_grad() q_loss.backward() self.optim["critic"].step() diff --git a/wiserl/algorithm/rpl/rpl_iql.py b/wiserl/algorithm/rpl/rpl_iql.py index 019af3f..bb66c75 100644 --- a/wiserl/algorithm/rpl/rpl_iql.py +++ b/wiserl/algorithm/rpl/rpl_iql.py @@ -173,7 +173,8 @@ def train_step(self, batches, step: int, total_steps: int) -> Dict: with torch.no_grad(): self.target_network.eval() q_old = self.target_network.critic(obs, action) - q_old = torch.min(q_old, dim=0)[0] + # q_old = torch.min(q_old, dim=0)[0] + q_old = torch.mean(q_old, dim=0)[0] # compute the loss for value network v_loss, v_pred = self.v_loss(obs.detach(), q_old) diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index c6bf696..ab7d728 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -33,7 +33,7 @@ def __init__( self.variant = variant self.eval = eval train_or_eval = "eval" if eval else "train" - path = f"{prefix}/{variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + path = f"{prefix}/{self.env_name}-{variant}/preference_{train_or_eval}_data.npz" #f"{prefix}/{variant}/{self.env_name}/preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -100,7 +100,7 @@ def __init__( ): super().__init__() assert mode in {"transition", "trajectory"} - + self.mode = mode self.env_name = env self.batch_size = 1 if batch_size is None else batch_size # self.segment_length = segment_length @@ -131,30 +131,75 @@ def __iter__(self): } def load_dataset(self): - train_or_eval = "eval" if self.eval else "train" - path = f"{prefix}/{self.variant}/{self.env_name}/preference_{train_or_eval}_data.npz" - with open(path, "rb") as f: - data = np.load(f) - data = utils.nest_dict(data) - if self.capacity is not None: - data = utils.get_from_batch(data, 0, self.capacity) - data = utils.remove_float64(data) - lim = 1 - 1e-8 - data["action_1"] = np.clip(data["action_1"], a_min=-lim, a_max=lim) - data["action_2"] = np.clip(data["action_2"], a_min=-lim, a_max=lim) - N, L = data["obs_1"].shape[:2] - - data = { - "obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1), - "next_obs": np.stack([data["next_obs_1"], data["next_obs_2"]], axis=0).reshape(2*N, L, -1), - "action": np.stack([data["action_1"], data["action_2"]], axis=0).reshape(2*N, L, -1), - "reward": np.stack([data["reward_1"], data["reward_2"]], axis=0).reshape(2*N, L, -1), - "terminal": np.stack([data["terminal_1"], data["terminal_2"]], axis=0).reshape(2*N, L, -1), - } - data["mask"] = np.ones([2*N, L, 1], dtype=np.float32) + # Using preference datasets + if self.mode == "trajectory": + train_or_eval = "eval" if self.eval else "train" + path = f"{prefix}/{self.env_name}-{self.variant}/preference_{train_or_eval}_data.npz" #f"{prefix}/{self.variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + with open(path, "rb") as f: + data = np.load(f) + data = utils.nest_dict(data) + if self.capacity is not None: + data = utils.get_from_batch(data, 0, self.capacity) + data = utils.remove_float64(data) + lim = 1 - 1e-8 + data["action_1"] = np.clip(data["action_1"], a_min=-lim, a_max=lim) + data["action_2"] = np.clip(data["action_2"], a_min=-lim, a_max=lim) + N, L = data["obs_1"].shape[:2] + + data = { + "obs": np.stack([data["obs_1"], data["obs_2"]], axis=0).reshape(2*N, L, -1), + "next_obs": np.stack([data["next_obs_1"], data["next_obs_2"]], axis=0).reshape(2*N, L, -1), + "action": np.stack([data["action_1"], data["action_2"]], axis=0).reshape(2*N, L, -1), + "reward": np.stack([data["reward_1"], data["reward_2"]], axis=0).reshape(2*N, L, -1), + "terminal": np.stack([data["terminal_1"], data["terminal_2"]], axis=0).reshape(2*N, L, -1), + } + + data = { + "obs": data["obs"], + "next_obs":data["next_obs"], + "action": data["action"], + "reward": data["reward"], + "terminal": data["terminal"], + } + data["mask"] = np.ones([2*N, L, 1], dtype=np.float32) + + self.traj_len = np.asarray([o.shape[0] for o in data["obs"]]) + self.data_size = len(self.traj_len) + else: + # Using offline datasets + path = f"{prefix}/{self.env_name}-{self.variant}/data.npz" + with open(path, "rb") as f: + data = np.load(f) + data = utils.nest_dict(data) + if self.capacity is not None: + data = utils.get_from_batch(data, 0, self.capacity) + data = utils.remove_float64(data) + self.traj_len = np.sum(data['mask'],axis=-1) + obs_ = [] + next_obs_ = [] + action_ = [] + reward_ = [] + terminal_ = [] + lim = 1 - 1e-8 + data["action"] = np.clip(data["action"], a_min=-lim, a_max=lim) + for i in range(data['obs'].shape[0]): + obs_.extend(data['obs'][i][:int(self.traj_len[i])]) + next_obs_.extend(data['next_obs'][i][:int(self.traj_len[i])]) + action_.extend(data['action'][i][:int(self.traj_len[i])]) + reward_.extend(data['reward'][i][:int(self.traj_len[i])]) + terminal_.extend(data['terminal'][i][:int(self.traj_len[i])]) + + + data = { + "obs": np.asarray(obs_), + "action": np.asarray(action_), + "next_obs": np.asarray(next_obs_), + "reward": np.asarray(reward_), + "terminal": np.asarray(terminal_), + "mask": np.ones([len(obs_), 1], dtype=np.float32), + } + self.data_size = data["obs"].shape[0] - self.traj_len = np.asarray([o.shape[0] for o in data["obs"]]) - self.data_size = len(self.traj_len) if self.capacity is not None: if self.capacity > self.data_size: print(f"[Warning]: capacity {self.capacity} exceeds dataset size {self.data_size}") @@ -181,15 +226,30 @@ def relabel_reward(self, agent): reward = agent.select_reward(batch).detach().cpu().numpy() reward = reward * self.data["mask"][idx] self.data["reward"][idx] = reward - - return_ = self.data["reward"].sum(1) - max_return = max( - abs(return_.max()), - abs(return_.min()), - return_.max() - return_.min(), - 1.0 - ) - norm = 500. / max_return - self.data["reward"] *= norm - print(f"[RPLOfflineDataset]: return range: [{return_.min()}, {return_.max()}], multiplying norm factor {norm}.") + if self.mode == "trajectory": + return_ = self.data["reward"].sum(1) + max_return = max( + abs(return_.max()), + abs(return_.min()), + return_.max() - return_.min(), + 1.0 + ) + # norm = 500. / max_return + # #print(f"norm: {norm} ") + # self.data["reward"] *= norm + # print(f"[RPLOfflineDataset]: return range: [{return_.min()}, {return_.max()}], multiplying norm factor {norm}.") + print(f"[RPLOfflineDataset]: return range: [{return_.min()}, {return_.max()}].") + else: + ep_reward_ = [] + episode_reward = 0 + N = self.data["reward"].shape[0] + for i in range(N): + episode_reward += self.data["reward"][i] + if self.data["terminal"][i]: + ep_reward_.append(episode_reward) + episode_reward = 0 + max_return = max(abs(min(ep_reward_)).item(), abs(max(ep_reward_)).item(), (max(ep_reward_)-min(ep_reward_)).item(), 1.0) + norm = 1000 / max_return + self.data["reward"] *= norm + print(f"[D4RLOfflineDataset]: return range: [{min(ep_reward_)}, {max(ep_reward_)}], multiplying norm factor {norm}.") From 67c29695bb93966d9856791950ea5fb922ddfc48 Mon Sep 17 00:00:00 2001 From: OrangeX4 Date: Thu, 26 Dec 2024 17:47:54 +0800 Subject: [PATCH 06/17] feat: add replay parameter for rpl_dataset --- wiserl/dataset/rpl_dataset.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index ab7d728..115d512 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -23,6 +23,7 @@ def __init__( label_key: str="rl_sum", variant: str = "gravity-50", eval: bool = False, + replay: bool = False, ): super().__init__() @@ -33,7 +34,8 @@ def __init__( self.variant = variant self.eval = eval train_or_eval = "eval" if eval else "train" - path = f"{prefix}/{self.env_name}-{variant}/preference_{train_or_eval}_data.npz" #f"{prefix}/{variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + replay_or_none = "replay_" if replay else "" + path = f"{prefix}/{self.env_name}-{variant}/{replay_or_none}preference_{train_or_eval}_data.npz" #f"{prefix}/{variant}/{self.env_name}/preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -97,6 +99,7 @@ def __init__( mode: str = "transition", variant: str = "gravity-50", eval: bool = False, + replay: bool = False, ): super().__init__() assert mode in {"transition", "trajectory"} @@ -107,6 +110,7 @@ def __init__( self.capacity = capacity self.variant = variant self.eval = eval + self.replay = replay self.load_dataset() @@ -134,7 +138,8 @@ def load_dataset(self): # Using preference datasets if self.mode == "trajectory": train_or_eval = "eval" if self.eval else "train" - path = f"{prefix}/{self.env_name}-{self.variant}/preference_{train_or_eval}_data.npz" #f"{prefix}/{self.variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + replay_or_none = "replay_" if self.replay else "" + path = f"{prefix}/{self.env_name}-{self.variant}/{replay_or_none}preference_{train_or_eval}_data.npz" #f"{prefix}/{self.variant}/{self.env_name}/preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) From 71d161f392b185f6f8a987dae45020a68ee3f2c6 Mon Sep 17 00:00:00 2001 From: qisia <2912364482@qq.com> Date: Thu, 2 Jan 2025 14:09:25 +0000 Subject: [PATCH 07/17] update configs and rpl-dataset --- .gitignore | 3 +- .../configs/bt_awac/rpl/gravity-10-10.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-10-150.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-100-100.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-150-10.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-150-150.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-150-50.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-50-100.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-50-150.yaml | 112 ----------------- .../configs/bt_awac/rpl/gravity-50-50.yaml | 112 ----------------- .../rpl/halfcheetah-gravity-150-150.yaml | 112 ----------------- .../rpl/halfcheetah-gravity-50-150.yaml | 112 ----------------- .../rpl/halfcheetah-gravity-50-50.yaml | 112 ----------------- .../rpl/halfcheetah-gravity-50-80.yaml | 112 ----------------- .../rpl/halfcheetah-gravity-80-150.yaml | 112 ----------------- .../rpl/halfcheetah-gravity-80-80.yaml | 112 ----------------- scripts/configs/bt_iql/rpl/gravity-10-10.yaml | 113 ------------------ .../configs/bt_iql/rpl/gravity-10-150.yaml | 113 ------------------ .../bt_iql/rpl/gravity-100-100-b1-e9.yaml | 113 ------------------ .../configs/bt_iql/rpl/gravity-100-100.yaml | 113 ------------------ .../configs/bt_iql/rpl/gravity-150-10.yaml | 113 ------------------ .../configs/bt_iql/rpl/gravity-150-150.yaml | 113 ------------------ .../configs/bt_iql/rpl/gravity-150-50.yaml | 113 ------------------ .../configs/bt_iql/rpl/gravity-50-150.yaml | 113 ------------------ scripts/configs/bt_iql/rpl/gravity-50-50.yaml | 113 ------------------ .../rpl/halfcheetah-gravity-50-150.yaml | 113 ------------------ .../bt_iql/rpl/halfcheetah-gravity-50-50.yaml | 113 ------------------ .../bt_iql/rpl/halfcheetah-gravity-50-80.yaml | 113 ------------------ .../rpl/halfcheetah-gravity-80-150.yaml | 113 ------------------ .../bt_iql/rpl/halfcheetah-gravity-80-80.yaml | 113 ------------------ ...fcheetah-gravity-150-150.yaml => rpl.yaml} | 27 +++-- .../configs/oracle_awac/rpl/gravity-10.yaml | 74 ------------ .../configs/oracle_awac/rpl/gravity-100.yaml | 74 ------------ .../configs/oracle_awac/rpl/gravity-150.yaml | 74 ------------ .../configs/oracle_awac/rpl/gravity-50.yaml | 74 ------------ .../rpl/halfcheetah-gravity-150.yaml | 74 ------------ .../rpl/halfcheetah-gravity-50.yaml | 74 ------------ .../{halfcheetah-gravity-80.yaml => rpl.yaml} | 17 ++- .../configs/oracle_iql/rpl/gravity-10.yaml | 75 ------------ .../oracle_iql/rpl/gravity-100-test.yaml | 74 ------------ .../configs/oracle_iql/rpl/gravity-100.yaml | 75 ------------ .../configs/oracle_iql/rpl/gravity-150.yaml | 76 ------------ .../configs/oracle_iql/rpl/gravity-50.yaml | 76 ------------ .../rpl/halfcheetah-gravity-50.yaml | 75 ------------ .../rpl/halfcheetah-gravity-80.yaml | 75 ------------ ...{halfcheetah-gravity-150.yaml => rpl.yaml} | 9 +- scripts/main.py | 15 ++- scripts/rmb_main.py | 1 + scripts/run_main.sh | 28 +++++ scripts/run_main_replay.sh | 28 +++++ scripts/run_rmb_main.sh | 39 ++++++ scripts/run_rmb_main_replay.sh | 40 +++++++ wiserl/algorithm/bt/bt_iql.py | 4 +- wiserl/algorithm/oracle_iql.py | 5 +- wiserl/algorithm/rpl/rpl_iql.py | 4 +- wiserl/dataset/rpl_dataset.py | 28 +++-- 56 files changed, 211 insertions(+), 4269 deletions(-) delete mode 100644 scripts/configs/bt_awac/rpl/gravity-10-10.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-10-150.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-100-100.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-150-10.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-150-150.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-150-50.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-50-100.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-50-150.yaml delete mode 100644 scripts/configs/bt_awac/rpl/gravity-50-50.yaml delete mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml delete mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml delete mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml delete mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml delete mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml delete mode 100644 scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-10-10.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-10-150.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-100-100.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-150-10.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-150-150.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-150-50.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-50-150.yaml delete mode 100644 scripts/configs/bt_iql/rpl/gravity-50-50.yaml delete mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml delete mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml delete mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml delete mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml delete mode 100644 scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml rename scripts/configs/bt_iql/rpl/{halfcheetah-gravity-150-150.yaml => rpl.yaml} (83%) delete mode 100644 scripts/configs/oracle_awac/rpl/gravity-10.yaml delete mode 100644 scripts/configs/oracle_awac/rpl/gravity-100.yaml delete mode 100644 scripts/configs/oracle_awac/rpl/gravity-150.yaml delete mode 100644 scripts/configs/oracle_awac/rpl/gravity-50.yaml delete mode 100644 scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml delete mode 100644 scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml rename scripts/configs/oracle_awac/rpl/{halfcheetah-gravity-80.yaml => rpl.yaml} (85%) delete mode 100644 scripts/configs/oracle_iql/rpl/gravity-10.yaml delete mode 100644 scripts/configs/oracle_iql/rpl/gravity-100-test.yaml delete mode 100644 scripts/configs/oracle_iql/rpl/gravity-100.yaml delete mode 100644 scripts/configs/oracle_iql/rpl/gravity-150.yaml delete mode 100644 scripts/configs/oracle_iql/rpl/gravity-50.yaml delete mode 100644 scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml delete mode 100644 scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml rename scripts/configs/oracle_iql/rpl/{halfcheetah-gravity-150.yaml => rpl.yaml} (91%) create mode 100755 scripts/run_main.sh create mode 100755 scripts/run_main_replay.sh create mode 100755 scripts/run_rmb_main.sh create mode 100755 scripts/run_rmb_main_replay.sh diff --git a/.gitignore b/.gitignore index bff5224..ba0adef 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ shells/ ckpts log_bkp/ scripts/main.py -scripts/rmb_main.py \ No newline at end of file +scripts/rmb_main.py +output.txt \ No newline at end of file diff --git a/scripts/configs/bt_awac/rpl/gravity-10-10.yaml b/scripts/configs/bt_awac/rpl/gravity-10-10.yaml deleted file mode 100644 index e57c8e8..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-10-10.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-10 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-10 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-10 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-10-150.yaml b/scripts/configs/bt_awac/rpl/gravity-10-150.yaml deleted file mode 100644 index 82069ac..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-10-150.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-10 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-150 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-100-100.yaml b/scripts/configs/bt_awac/rpl/gravity-100-100.yaml deleted file mode 100644 index 3ff7798..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-100-100.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-100 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-100 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-100 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-150-10.yaml b/scripts/configs/bt_awac/rpl/gravity-150-10.yaml deleted file mode 100644 index 58dbfcf..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-150-10.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-10 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-10 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-150-150.yaml b/scripts/configs/bt_awac/rpl/gravity-150-150.yaml deleted file mode 100644 index 00f57f6..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-150-150.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-150 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 50000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-150-50.yaml b/scripts/configs/bt_awac/rpl/gravity-150-50.yaml deleted file mode 100644 index bc5b845..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-150-50.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-50 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-50 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-50-100.yaml b/scripts/configs/bt_awac/rpl/gravity-50-100.yaml deleted file mode 100644 index 8c6f07b..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-50-100.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-100 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-100 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-50-150.yaml b/scripts/configs/bt_awac/rpl/gravity-50-150.yaml deleted file mode 100644 index cc4d6ea..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-50-150.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-150 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/gravity-50-50.yaml b/scripts/configs/bt_awac/rpl/gravity-50-50.yaml deleted file mode 100644 index 4625214..0000000 --- a/scripts/configs/bt_awac/rpl/gravity-50-50.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-50 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-50 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml deleted file mode 100644 index 896501b..0000000 --- a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-150-150.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-150 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml deleted file mode 100644 index 8c86b8a..0000000 --- a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-150.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-150 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml deleted file mode 100644 index 4651f21..0000000 --- a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-50.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-50 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-50 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml deleted file mode 100644 index 011c846..0000000 --- a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-50-80.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-80 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-80 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml deleted file mode 100644 index 9a57724..0000000 --- a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-150.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-80 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-150 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml b/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml deleted file mode 100644 index b1bb2d0..0000000 --- a/scripts/configs/bt_awac/rpl/halfcheetah-gravity-80-80.yaml +++ /dev/null @@ -1,112 +0,0 @@ -algorithm: - class: BTAWAC - beta: 0.3333 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-80 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 64 - variant: gravity-80 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-80 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml b/scripts/configs/bt_iql/rpl/gravity-10-10.yaml deleted file mode 100644 index d0351af..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-10-10.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-10 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-10 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-10 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-10-150.yaml b/scripts/configs/bt_iql/rpl/gravity-10-150.yaml deleted file mode 100644 index 361f770..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-10-150.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-10 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml b/scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml deleted file mode 100644 index 14d43f4..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.1 - expectile: 0.9 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-100 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-100 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-100 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-100-100.yaml b/scripts/configs/bt_iql/rpl/gravity-100-100.yaml deleted file mode 100644 index 36a64be..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-100-100.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-100 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-100 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-100 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml b/scripts/configs/bt_iql/rpl/gravity-150-10.yaml deleted file mode 100644 index 2d98024..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-150-10.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-10 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-10 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-150-150.yaml b/scripts/configs/bt_iql/rpl/gravity-150-150.yaml deleted file mode 100644 index 439e7f3..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-150-150.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 50000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-150-50.yaml b/scripts/configs/bt_iql/rpl/gravity-150-50.yaml deleted file mode 100644 index 483b9bc..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-150-50.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-150 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-50 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-50 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/gravity-50-150.yaml deleted file mode 100644 index 89bf1d3..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-50-150.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/gravity-50-50.yaml deleted file mode 100644 index 8ae39e7..0000000 --- a/scripts/configs/bt_iql/rpl/gravity-50-50.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - # capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-50 - # capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-50 - eval: true - # capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml deleted file mode 100644 index 067acb0..0000000 --- a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-150.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml deleted file mode 100644 index 0adf564..0000000 --- a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-50.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-50 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-50 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml deleted file mode 100644 index af3b84f..0000000 --- a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-50-80.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-50 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-80 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-80 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml deleted file mode 100644 index 90ec5f7..0000000 --- a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-150.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-80 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-150 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml b/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml deleted file mode 100644 index 2fd1b6e..0000000 --- a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-80-80.yaml +++ /dev/null @@ -1,113 +0,0 @@ -algorithm: - class: BTIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - reward_reg: 0.0 - rm_label: true - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -eval_env: -eval_env_kwargs: -eval_env_wrapper: MujocoParamOverWrite -eval_env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - reward: - class: EnsembleMLP - ensemble_size: 1 - hidden_dims: [256, 256] - reward_act: sigmoid - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -rm_dataset: - - class: RPLComparisonDataset - env: - batch_size: 8 - segment_length: null - label_key: rl_sum - variant: gravity-80 - capacity: 500 -rm_dataloader: - num_workers: 2 - batch_size: null - -rl_dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-80 - capacity: 5000 -rl_dataloader: - num_workers: 2 - batch_size: null - -trainer: - env_freq: null - rm_label: true - rm_steps: 100000 - rl_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -rm_eval: - function: eval_reward_model - eval_dataset_kwargs: - class: RPLComparisonDataset - env: - batch_size: 32 - label_key: rl_sum - variant: gravity-80 - eval: true - capacity: 500 -rl_eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 1000000 - -processor: null diff --git a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml b/scripts/configs/bt_iql/rpl/rpl.yaml similarity index 83% rename from scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml rename to scripts/configs/bt_iql/rpl/rpl.yaml index 53b82fd..772b47a 100644 --- a/scripts/configs/bt_iql/rpl/halfcheetah-gravity-150-150.yaml +++ b/scripts/configs/bt_iql/rpl/rpl.yaml @@ -16,12 +16,18 @@ wandb: entity: null project: null +src_gravity: 0.5 +src_variant: gravity-50 +tgt_gravity: 1.5 +tgt_variant: gravity-150 +replay: false + env: HalfCheetah-v3 env_kwargs: env_wrapper: MujocoParamOverWrite env_wrapper_kwargs: overwrite_args: - gravity: 1.5 # gravity-150 + gravity: # gravity-150 do_scale: True eval_env: @@ -29,7 +35,7 @@ eval_env_kwargs: eval_env_wrapper: MujocoParamOverWrite eval_env_wrapper_kwargs: overwrite_args: - gravity: 1.5 # gravity-150 + gravity: # gravity-150 do_scale: True optim: @@ -65,8 +71,9 @@ rm_dataset: batch_size: 8 segment_length: null label_key: rl_sum - variant: gravity-150 - capacity: 500 + variant: + replay: + rm_dataloader: num_workers: 2 batch_size: null @@ -74,9 +81,10 @@ rm_dataloader: rl_dataset: - class: RPLOfflineDataset env: - batch_size: 16 - variant: gravity-150 - capacity: 5000 + batch_size: 256 + variant: + replay: + rl_dataloader: num_workers: 2 batch_size: null @@ -97,9 +105,10 @@ rm_eval: env: batch_size: 32 label_key: rl_sum - variant: gravity-150 + variant: eval: true - capacity: 500 + replay: + rl_eval: function: eval_offline num_ep: 10 diff --git a/scripts/configs/oracle_awac/rpl/gravity-10.yaml b/scripts/configs/oracle_awac/rpl/gravity-10.yaml deleted file mode 100644 index 4986943..0000000 --- a/scripts/configs/oracle_awac/rpl/gravity-10.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleAWAC - beta: 0.3333 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256, 256] - reparameterize: false - conditioned_logstd: true - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 512 - variant: gravity-10 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-100.yaml b/scripts/configs/oracle_awac/rpl/gravity-100.yaml deleted file mode 100644 index 64aaf64..0000000 --- a/scripts/configs/oracle_awac/rpl/gravity-100.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleAWAC - beta: 0.3333 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-100 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-150.yaml b/scripts/configs/oracle_awac/rpl/gravity-150.yaml deleted file mode 100644 index 74bb5ba..0000000 --- a/scripts/configs/oracle_awac/rpl/gravity-150.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleAWAC - beta: 0.3333 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_awac/rpl/gravity-50.yaml b/scripts/configs/oracle_awac/rpl/gravity-50.yaml deleted file mode 100644 index 872f296..0000000 --- a/scripts/configs/oracle_awac/rpl/gravity-50.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleAWAC - beta: 0.3333 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-50 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml deleted file mode 100644 index 13c1b92..0000000 --- a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleAWAC - beta: 0.3333 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml b/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml deleted file mode 100644 index 8280982..0000000 --- a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleAWAC - beta: 0.3333 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-50 - capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml b/scripts/configs/oracle_awac/rpl/rpl.yaml similarity index 85% rename from scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml rename to scripts/configs/oracle_awac/rpl/rpl.yaml index ac60af0..093a87f 100644 --- a/scripts/configs/oracle_awac/rpl/halfcheetah-gravity-80.yaml +++ b/scripts/configs/oracle_awac/rpl/rpl.yaml @@ -13,12 +13,15 @@ wandb: entity: null project: null +gravity: 1.0 +variant: gravity-100 + env: HalfCheetah-v3 env_kwargs: env_wrapper: MujocoParamOverWrite env_wrapper_kwargs: overwrite_args: - gravity: 0.8 # gravity-150 + gravity: do_scale: True optim: @@ -38,17 +41,13 @@ network: class: Critic ensemble_size: 2 hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - + dataset: - class: RPLOfflineDataset env: - batch_size: 16 - variant: gravity-80 - capacity: 5000 + batch_size: 256 + variant: + dataloader: num_workers: 2 batch_size: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-10.yaml b/scripts/configs/oracle_iql/rpl/gravity-10.yaml deleted file mode 100644 index fda2f9a..0000000 --- a/scripts/configs/oracle_iql/rpl/gravity-10.yaml +++ /dev/null @@ -1,75 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.1 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-10 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-100-test.yaml b/scripts/configs/oracle_iql/rpl/gravity-100-test.yaml deleted file mode 100644 index c75e011..0000000 --- a/scripts/configs/oracle_iql/rpl/gravity-100-test.yaml +++ /dev/null @@ -1,74 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256, 256] - reparameterize: false - conditioned_logstd: true - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256, 256] - -dataset: - - class: D4RLOfflineDataset - env: walker2d-medium - batch_size: 512 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-100.yaml b/scripts/configs/oracle_iql/rpl/gravity-100.yaml deleted file mode 100644 index 73eb028..0000000 --- a/scripts/configs/oracle_iql/rpl/gravity-100.yaml +++ /dev/null @@ -1,75 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.0 # gravity-10 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-100 - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-150.yaml b/scripts/configs/oracle_iql/rpl/gravity-150.yaml deleted file mode 100644 index befa191..0000000 --- a/scripts/configs/oracle_iql/rpl/gravity-150.yaml +++ /dev/null @@ -1,76 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 1.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-150 - mode: "trajectory" - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/gravity-50.yaml b/scripts/configs/oracle_iql/rpl/gravity-50.yaml deleted file mode 100644 index c03de7f..0000000 --- a/scripts/configs/oracle_iql/rpl/gravity-50.yaml +++ /dev/null @@ -1,76 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: Walker2d-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-50 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 #16 - variant: gravity-50 - mode: "trajectory" #"transition" - # capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml deleted file mode 100644 index ca11f8c..0000000 --- a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml +++ /dev/null @@ -1,75 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.5 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-50 - capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml b/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml deleted file mode 100644 index f653674..0000000 --- a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml +++ /dev/null @@ -1,75 +0,0 @@ -algorithm: - class: OracleIQL - beta: 0.3333 - expectile: 0.7 - max_exp_clip: 100.0 - -checkpoint: null -seed: 0 -name: default -debug: false -device: null -wandb: - activate: false - entity: null - project: null - -env: HalfCheetah-v3 -env_kwargs: -env_wrapper: MujocoParamOverWrite -env_wrapper_kwargs: - overwrite_args: - gravity: 0.8 # gravity-150 - do_scale: True - -optim: - default: - class: Adam - lr: 0.0003 - -network: - actor: - class: SquashedGaussianActor - hidden_dims: [256, 256] - reparameterize: false - conditioned_logstd: false - logstd_min: -5 - logstd_max: 2 - critic: - class: Critic - ensemble_size: 2 - hidden_dims: [256, 256] - value: - class: Critic - ensemble_size: 1 - hidden_dims: [256, 256] - -dataset: - - class: RPLOfflineDataset - env: - batch_size: 16 - variant: gravity-80 - capacity: 5000 -dataloader: - num_workers: 2 - batch_size: null - - -trainer: - env_freq: null - total_steps: 1000000 - log_freq: 500 - profile_freq: 500 - eval_freq: 5000 - -eval: - function: eval_offline - num_ep: 10 - deterministic: true - -schedulers: - actor: - class: CosineAnnealingLR - T_max: 500000 - -processor: null diff --git a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml b/scripts/configs/oracle_iql/rpl/rpl.yaml similarity index 91% rename from scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml rename to scripts/configs/oracle_iql/rpl/rpl.yaml index 519e928..bce9b25 100644 --- a/scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml +++ b/scripts/configs/oracle_iql/rpl/rpl.yaml @@ -14,12 +14,15 @@ wandb: entity: null project: null +gravity: 1.0 +variant: gravity-100 + env: HalfCheetah-v3 env_kwargs: env_wrapper: MujocoParamOverWrite env_wrapper_kwargs: overwrite_args: - gravity: 1.5 # gravity-150 + gravity: do_scale: True optim: @@ -47,8 +50,8 @@ network: dataset: - class: RPLOfflineDataset env: - batch_size: 16 - variant: gravity-150 + batch_size: 256 + variant: gravity-100 capacity: 5000 dataloader: num_workers: 2 diff --git a/scripts/main.py b/scripts/main.py index 4c43e01..90fb235 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -13,10 +13,9 @@ from wiserl.utils.utils import use_placeholder # python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-150.yaml --name halfcheetah-gravity-150-oracle-iql-rpl -# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-80.yaml --name halfcheetah-gravity-80-oracle-iql-rpl +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-100.yaml --name halfcheetah-gravity-100-oracle-iql-rpl # python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50.yaml --name halfcheetah-gravity-50-oracle-iql-rpl - # python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-10.yaml --name Walker2d-v3-gravity-10-oracle-iql-rpl # python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-50.yaml --name Walker2d-v3-gravity-50-oracle-iql-rpl # python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-100.yaml --name Walker2d-v3-gravity-100-oracle-iql-rpl @@ -29,7 +28,19 @@ #python scripts/main.py --config scripts/configs/oracle_iql/rpl/gravity-100-test.yaml --name Walker2d-medium-gravity-100-test-oracle-iql +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/halfcheetah-gravity-150.yaml --name halfcheetah-gravity-150-oracle-awac-rpl +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/halfcheetah-gravity-100.yaml --name halfcheetah-gravity-100-oracle-awac-rpl +# python scripts/main.py --config scripts/configs/oracle_awac/rpl/halfcheetah-gravity-50.yaml --name halfcheetah-gravity-50-oracle-awac-rpl + +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-50-tr.yaml --name halfcheetah-gravity-50-oracle-awac-rpl-trajectory +# python scripts/main.py --config scripts/configs/oracle_iql/rpl/halfcheetah-gravity-100-tr.yaml --name halfcheetah-gravity-100-oracle-awac-rpl-trajectory + + if __name__ == "__main__": + # import debugpy + # debugpy.listen(5678) + # debugpy.wait_for_client() + args = parse_args(convert=False, post_init=use_placeholder) name_prefix = f"{args['algorithm']['class']}/{args['name']}/{args['env']}" logger = CompositeLogger( diff --git a/scripts/rmb_main.py b/scripts/rmb_main.py index 8c94915..48aed70 100644 --- a/scripts/rmb_main.py +++ b/scripts/rmb_main.py @@ -21,6 +21,7 @@ # python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-150-150.yaml --name Walker2d-v3-gravity-150-150-bt-iql-rpl # python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-50-100.yaml --name Walker2d-v3-gravity-50-100-bt-iql-rpl # python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-50-150.yaml --name Walker2d-v3-gravity-50-150-bt-iql-rpl +# python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-100-150.yaml --name Walker2d-v3-gravity-100-150-bt-iql-rpl # python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-150-50.yaml --name Walker2d-v3-gravity-150-50-bt-iql-rpl # python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-150-100.yaml --name Walker2d-v3-gravity-150-100-bt-iql-rpl # python scripts/rmb_main.py --config scripts/configs/bt_iql/rpl/gravity-100-100-b1-e9.yaml --name Walker2d-v3-gravity-100-100-bt-iql-rpl-b1-e9 diff --git a/scripts/run_main.sh b/scripts/run_main.sh new file mode 100755 index 0000000..0720d00 --- /dev/null +++ b/scripts/run_main.sh @@ -0,0 +1,28 @@ +envs=("HalfCheetah-v3") +gravity_variant_pairs=( + "0.5:gravity-50" + "1.0:gravity-100" + "1.5:gravity-150" +) +algorithm=("oracle_awac") +info=${1:-""} + +# 遍历参数组合 +for env in "${envs[@]}"; do + for pair in "${gravity_variant_pairs[@]}"; do + # 分割 gravity 和 variant + gravity=$(echo $pair | cut -d':' -f1) + variant=$(echo $pair | cut -d':' -f2) + + # 输出当前组合 + echo "Running with env=$env, gravity=$gravity, variant=$variant" + + # 运行 Python 程序 + python scripts/main.py --config scripts/configs/${algorithm}/rpl/rpl.yaml \ + --name $env-$variant-${algorithm}-rpl-$info\ + --env $env\ + --gravity $gravity \ + --variant $variant + + done +done \ No newline at end of file diff --git a/scripts/run_main_replay.sh b/scripts/run_main_replay.sh new file mode 100755 index 0000000..a7959eb --- /dev/null +++ b/scripts/run_main_replay.sh @@ -0,0 +1,28 @@ +envs=("HalfCheetah-v3") +gravity_variant_pairs=( + "0.5:gravity-50" + "1.0:gravity-100" + "1.5:gravity-150" +) +algorithm=("oracle_awac") +info=${1:-""} +# 遍历参数组合 +for env in "${envs[@]}"; do + for pair in "${gravity_variant_pairs[@]}"; do + # 分割 gravity 和 variant + gravity=$(echo $pair | cut -d':' -f1) + variant=$(echo $pair | cut -d':' -f2) + + # 输出当前组合 + echo "Running with env=$env, gravity=$gravity, variant=$variant" + + # 运行 Python 程序 + python scripts/main.py --config scripts/configs/${algorithm}/rpl/rpl.yaml \ + --name $env-$variant-${algorithm}-rpl-replay-$info\ + --env $env\ + --gravity $gravity \ + --variant $variant\ + --dataset.0.replay true + + done +done \ No newline at end of file diff --git a/scripts/run_rmb_main.sh b/scripts/run_rmb_main.sh new file mode 100755 index 0000000..8548868 --- /dev/null +++ b/scripts/run_rmb_main.sh @@ -0,0 +1,39 @@ +envs=("HalfCheetah-v3") +src_gravity_variant_pairs=( + "0.5:gravity-50" + # "1.0:gravity-100" + # "1.5:gravity-150" +) +tgt_gravity_variant_pairs=( + # "0.5:gravity-50" + "1.0:gravity-100" + "1.5:gravity-150" +) +algorithm=("bt_awac") + +info=${1:-""} + +# 遍历参数组合 +for env in "${envs[@]}"; do + for pair1 in "${src_gravity_variant_pairs[@]}"; do + for pair2 in "${tgt_gravity_variant_pairs[@]}"; do + # 分割 gravity 和 variant + src_gravity=$(echo $pair1 | cut -d':' -f1) + src_variant=$(echo $pair1 | cut -d':' -f2) + tgt_gravity=$(echo $pair2 | cut -d':' -f1) + tgt_variant=$(echo $pair2 | cut -d':' -f2) + + # 输出当前组合 + echo "Running with env=$env, src_gravity=$src_gravity, tgt_gravity=$tgt_gravity" + + # 运行 Python 程序 + python scripts/rmb_main.py --config scripts/configs/${algorithm}/rpl/rpl.yaml \ + --name $env-$src_variant-$tgt_variant-${algorithm}-rpl$info \ + --env $env\ + --src_gravity $src_gravity \ + --src_variant $src_variant \ + --tgt_gravity $tgt_gravity \ + --tgt_variant $tgt_variant + done + done +done \ No newline at end of file diff --git a/scripts/run_rmb_main_replay.sh b/scripts/run_rmb_main_replay.sh new file mode 100755 index 0000000..ff727e6 --- /dev/null +++ b/scripts/run_rmb_main_replay.sh @@ -0,0 +1,40 @@ +envs=("HalfCheetah-v3") +src_gravity_variant_pairs=( + "0.5:gravity-50" + "1.0:gravity-100" + "1.5:gravity-150" +) +tgt_gravity_variant_pairs=( + # "0.5:gravity-50" + # "1.0:gravity-100" + "1.5:gravity-150" +) +algorithm=("bt_awac") +info=${1:-""} + +# 遍历参数组合 +for env in "${envs[@]}"; do + for pair1 in "${src_gravity_variant_pairs[@]}"; do + for pair2 in "${tgt_gravity_variant_pairs[@]}"; do + # 分割 gravity 和 variant + src_gravity=$(echo $pair1 | cut -d':' -f1) + src_variant=$(echo $pair1 | cut -d':' -f2) + tgt_gravity=$(echo $pair2 | cut -d':' -f1) + tgt_variant=$(echo $pair2 | cut -d':' -f2) + + # 输出当前组合 + echo "Running with env=$env, src_gravity=$src_gravity, tgt_gravity=$tgt_gravity" + + # 运行 Python 程序 + python scripts/rmb_main.py --config scripts/configs/${algorithm}/rpl/rpl.yaml \ + --name $env-$src_variant-$tgt_variant-${algorithm}-rpl-replay$info \ + --env $env\ + --src_gravity $src_gravity \ + --src_variant $src_variant \ + --tgt_gravity $tgt_gravity \ + --tgt_variant $tgt_variant \ + --replay true \ + > output.txt + done + done +done \ No newline at end of file diff --git a/wiserl/algorithm/bt/bt_iql.py b/wiserl/algorithm/bt/bt_iql.py index b4b37e0..66c3970 100644 --- a/wiserl/algorithm/bt/bt_iql.py +++ b/wiserl/algorithm/bt/bt_iql.py @@ -122,8 +122,8 @@ def train_step(self, batches, step: int, total_steps: int) -> Dict: with torch.no_grad(): self.target_network.eval() q_old = self.target_network.critic(obs, action) - # q_old = torch.min(q_old, dim=0)[0] - q_old = torch.mean(q_old, dim=0)[0] + q_old = torch.min(q_old, dim=0)[0] + # q_old = torch.mean(q_old, dim=0)[0] # compute the loss for value network v_loss, v_pred = self.v_loss(obs.detach(), q_old) diff --git a/wiserl/algorithm/oracle_iql.py b/wiserl/algorithm/oracle_iql.py index a08cbd6..29a09ca 100644 --- a/wiserl/algorithm/oracle_iql.py +++ b/wiserl/algorithm/oracle_iql.py @@ -97,6 +97,7 @@ def actor_loss(self, encoded_obs, action, q_old, v, reduce=True): elif isinstance(self.network.actor, GaussianActor): policy_out = - self.network.actor.evaluate(encoded_obs, action)[0] actor_loss = (exp_advantage * policy_out) + # actor_loss = policy_out return actor_loss.mean() if reduce else actor_loss, advantage def q_loss(self, encoded_obs, action, next_encoded_obs, reward, terminal, reduce=True): @@ -125,8 +126,8 @@ def train_step(self, batches, step:int, total_steps: int): with torch.no_grad(): self.target_network.eval() q_old = self.target_network.critic(encoded_obs, action) - # q_old = torch.min(q_old, dim=0)[0] - q_old = torch.mean(q_old, dim=0)[0] + q_old = torch.min(q_old, dim=0)[0] + # q_old = torch.mean(q_old, dim=0)[0] # compute the loss for value network v_loss, v_pred = self.v_loss(encoded_obs.detach(), q_old) diff --git a/wiserl/algorithm/rpl/rpl_iql.py b/wiserl/algorithm/rpl/rpl_iql.py index bb66c75..e3a6e13 100644 --- a/wiserl/algorithm/rpl/rpl_iql.py +++ b/wiserl/algorithm/rpl/rpl_iql.py @@ -173,8 +173,8 @@ def train_step(self, batches, step: int, total_steps: int) -> Dict: with torch.no_grad(): self.target_network.eval() q_old = self.target_network.critic(obs, action) - # q_old = torch.min(q_old, dim=0)[0] - q_old = torch.mean(q_old, dim=0)[0] + q_old = torch.min(q_old, dim=0)[0] + # q_old = torch.mean(q_old, dim=0)[0] # compute the loss for value network v_loss, v_pred = self.v_loss(obs.detach(), q_old) diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index ab7d728..923a028 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -23,6 +23,7 @@ def __init__( label_key: str="rl_sum", variant: str = "gravity-50", eval: bool = False, + replay: bool = False, ): super().__init__() @@ -33,7 +34,10 @@ def __init__( self.variant = variant self.eval = eval train_or_eval = "eval" if eval else "train" - path = f"{prefix}/{self.env_name}-{variant}/preference_{train_or_eval}_data.npz" #f"{prefix}/{variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + if replay: + path = f"{prefix}/{self.env_name}/{variant}/replay_preference_{train_or_eval}_data.npz" + else: + path = f"{prefix}/{self.env_name}/{variant}/preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -97,6 +101,7 @@ def __init__( mode: str = "transition", variant: str = "gravity-50", eval: bool = False, + replay: bool = False, ): super().__init__() assert mode in {"transition", "trajectory"} @@ -107,6 +112,7 @@ def __init__( self.capacity = capacity self.variant = variant self.eval = eval + self.replay = replay self.load_dataset() @@ -134,7 +140,9 @@ def load_dataset(self): # Using preference datasets if self.mode == "trajectory": train_or_eval = "eval" if self.eval else "train" - path = f"{prefix}/{self.env_name}-{self.variant}/preference_{train_or_eval}_data.npz" #f"{prefix}/{self.variant}/{self.env_name}/preference_{train_or_eval}_data.npz" + replay_or_none = 'replay_' if self.replay else "" + + path = f"{prefix}/{self.env_name}/{self.variant}/{replay_or_none}preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -167,7 +175,11 @@ def load_dataset(self): self.data_size = len(self.traj_len) else: # Using offline datasets - path = f"{prefix}/{self.env_name}-{self.variant}/data.npz" + if self.replay: + path = f"{prefix}/{self.env_name}/{self.variant}/replay.npz" + else: + path = f"{prefix}/{self.env_name}/{self.variant}/data.npz" + with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -180,15 +192,17 @@ def load_dataset(self): action_ = [] reward_ = [] terminal_ = [] + timeout_ = [] lim = 1 - 1e-8 data["action"] = np.clip(data["action"], a_min=-lim, a_max=lim) + data['timeout'] = np.squeeze(data['timeout']) for i in range(data['obs'].shape[0]): obs_.extend(data['obs'][i][:int(self.traj_len[i])]) next_obs_.extend(data['next_obs'][i][:int(self.traj_len[i])]) action_.extend(data['action'][i][:int(self.traj_len[i])]) reward_.extend(data['reward'][i][:int(self.traj_len[i])]) terminal_.extend(data['terminal'][i][:int(self.traj_len[i])]) - + timeout_.extend(data['timeout'][i][:int(self.traj_len[i])]) data = { "obs": np.asarray(obs_), @@ -196,6 +210,7 @@ def load_dataset(self): "next_obs": np.asarray(next_obs_), "reward": np.asarray(reward_), "terminal": np.asarray(terminal_), + "timeout": np.asarray(timeout_), "mask": np.ones([len(obs_), 1], dtype=np.float32), } self.data_size = data["obs"].shape[0] @@ -245,11 +260,10 @@ def relabel_reward(self, agent): N = self.data["reward"].shape[0] for i in range(N): episode_reward += self.data["reward"][i] - if self.data["terminal"][i]: + if self.data["terminal"][i] or self.data["timeout"][i]: ep_reward_.append(episode_reward) episode_reward = 0 max_return = max(abs(min(ep_reward_)).item(), abs(max(ep_reward_)).item(), (max(ep_reward_)-min(ep_reward_)).item(), 1.0) norm = 1000 / max_return self.data["reward"] *= norm - print(f"[D4RLOfflineDataset]: return range: [{min(ep_reward_)}, {max(ep_reward_)}], multiplying norm factor {norm}.") - + print(f"[D4RLOfflineDataset]: return range: [{min(ep_reward_)}, {max(ep_reward_)}], multiplying norm factor {norm}.") \ No newline at end of file From cbc2ccfe8a7ad53afe42ed11252d6801e564ee32 Mon Sep 17 00:00:00 2001 From: typoverflow Date: Fri, 3 Jan 2025 01:00:46 +0800 Subject: [PATCH 08/17] update: td3bc, possibly with bugs --- scripts/configs/oracle_td3bc/rpl/rpl.yaml | 74 +++++++++++ wiserl/algorithm/td3bc.py | 152 ++++++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 scripts/configs/oracle_td3bc/rpl/rpl.yaml create mode 100644 wiserl/algorithm/td3bc.py diff --git a/scripts/configs/oracle_td3bc/rpl/rpl.yaml b/scripts/configs/oracle_td3bc/rpl/rpl.yaml new file mode 100644 index 0000000..7aff44b --- /dev/null +++ b/scripts/configs/oracle_td3bc/rpl/rpl.yaml @@ -0,0 +1,74 @@ +algorithm: + class: OracleTD3BC + alpha: 0.2 + policy_noise: 0.2 + noise_clip: 0.5 + max_action: 1.0 + discount: 0.99 + tau: 0.005 + actor_update_interval: 2 + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +gravity: 1.0 +variant: gravity-100 + +env: HalfCheetah-v3 +env_kwargs: +env_wrapper: MujocoParamOverWrite +env_wrapper_kwargs: + overwrite_args: + gravity: + do_scale: True + +optim: + default: + class: Adam + lr: 0.0003 + +network: + actor: + class: SquashedDeterministicActor + hidden_dims: [256, 256] + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + +dataset: + - class: RPLOfflineDataset + env: + batch_size: 256 + variant: + +dataloader: + num_workers: 2 + batch_size: null + + +trainer: + env_freq: null + total_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 500000 + +processor: null diff --git a/wiserl/algorithm/td3bc.py b/wiserl/algorithm/td3bc.py new file mode 100644 index 0000000..363521d --- /dev/null +++ b/wiserl/algorithm/td3bc.py @@ -0,0 +1,152 @@ +import itertools +from typing import Any, Dict, Optional, Type + +import torch +import torch.nn as nn + +import wiserl.module +from wiserl.algorithm.base import Algorithm +from wiserl.utils.misc import make_target, sync_target + + +class OracleTD3BC(Algorithm): + def __init__( + self, + *args, + alpha: float = 0.2, + policy_noise: float = 0.2, + noise_clip: float = 0.5, + max_action: float = 1.0, + discount: float = 0.99, + tau: float = 0.005, + actor_udpate_interval: int = 2, + **kwargs + ) -> None: + super().__init__(*args, **kwargs) + self.alpha = alpha + self.policy_noise = policy_noise + self.noise_clip = noise_clip + self.max_action = max_action + self.actor_update_interval = actor_udpate_interval + self.discount = discount + self.tau = tau + + def setup_network(self, network_kwargs): + network = {} + network["actor"] = vars(wiserl.module)[network_kwargs["actor"].pop("class")]( + input_dim=self.observation_space.shape[0], + output_dim=self.action_space.shape[0], + **network_kwargs["actor"] + ) + network["critic"] = vars(wiserl.module)[network_kwargs["critic"].pop("class")]( + input_dim=self.observation_space.shape[0]+self.action_space.shape[0], + output_dim=1, + **network_kwargs["critic"] + ) + if "encoder" in network_kwargs: + network["encoder"] = vars(wiserl.module)[network_kwargs["encoder"].pop("class")]( + input_dim=self.observation_space.shape[0], + output_dim=1, + **network_kwargs["encoder"] + ) + else: + network["encoder"] = nn.Identity() + self.network = nn.ModuleDict(network) + self.target_network = nn.ModuleDict({ + "actor": make_target(self.network.actor), + "critic": make_target(self.network.critic) + }) + + def setup_optimizers(self, optim_kwargs): + self.optim = {} + default_kwargs = optim_kwargs.get("default", {}) + + actor_kwargs = default_kwargs.copy() + actor_kwargs.update(optim_kwargs.get("actor", {})) + actor_params = itertools.chain(self.network.actor.parameters(), self.network.encoder.parameters()) + self.optim["actor"] = vars(torch.optim)[actor_kwargs.pop("class")](actor_params, **actor_kwargs) + + critic_kwargs = default_kwargs.copy() + critic_kwargs.update(optim_kwargs.get("critic", {})) + self.optim["critic"] = vars(torch.optim)[critic_kwargs.pop("class")](self.network.critic.parameters(), **critic_kwargs) + + def select_action(self, batch, deterministic: bool=True): + obs = self.network.encoder(batch["obs"]) + action, *_ = self.network.actor.sample(obs, deterministic=deterministic) + return action.squeeze().cpu().numpy() + + def actor_loss(self, encoded_obs, action, reduce=True): + new_actions = self.network.actor.sample(encoded_obs)[0] + new_q1 = self.network.critic(encoded_obs, new_actions)[0, ...] + bc_loss = torch.nn.functional.mse_loss(new_actions, action, reduce=None) + q_loss = - self.alpha / (new_q1.abs().mean().detach()) * new_q1 + total_loss = bc_loss + q_loss + return total_loss.mean() if reduce else total_loss, { + "loss/q_guide_loss": q_loss.mean().item(), + "loss/bc_loss": bc_loss.mean().item(), + } + + def q_loss(self, encoded_obs, action, next_encoded_obs, reward, terminal, reduce=True): + with torch.no_grad(): + self.target_network.eval() + next_actions = self.target_network.actor.sample(next_encoded_obs)[0] + noise = (torch.randn_like(next_actions) * self.policy_noise).clip(-self.noise_clip, self.noise_clip) + next_actions = (next_actions+noise).clip(-self.max_action, self.max_action) + target_q = self.target_network.critic(next_encoded_obs, next_actions).min(0)[0] + target_q = reward + self.discount * (1-terminal) * target_q + q_pred = self.network.critic(encoded_obs, action) + q_loss = (q_pred - target_q.unsqueeze(0)).pow(2).sum(0) + return q_loss.mean() if reduce else q_loss, { + "loss/critic_loss": q_loss.mean().item(), + "misc/q_pred": q_pred.mean().item(), + } + + def train_step(self, batches, step:int, total_steps: int): + batch, *_ = batches + metrics = {} + if "obs_1" in batch: + obs = torch.cat([batch["obs_1"], batch["obs_2"]], dim=0) # (B, S+1) + action = torch.cat([batch["action_1"], batch["action_2"]], dim=0) # (B, S+1) + reward = torch.cat([batch["reward_1"], batch["reward_2"]], dim=0) + terminal = torch.cat([batch["terminal_1"], batch["terminal_2"]], dim=0) + + encoded_obs = self.network.encoder(obs) + + q_loss, q_pred = self.q_loss( + encoded_obs[:, :-1].detach(), + action[:, :-1], + encoded_obs[:, 1:].detach(), + reward[:, :-1], + terminal[:, :-1] + ) + else: + obs = batch["obs"] + action = batch["action"] + reward = batch["reward"] + terminal = batch["terminal"].float() + next_obs = batch["next_obs"] + + encoded_obs = self.network.encoder(obs) + next_encoded_obs = self.network.encoder(next_obs) + + q_loss, q_metrics = self.q_loss(encoded_obs, action, next_encoded_obs, reward, terminal) + metrics.update(q_metrics) + self.optim["critic"].zero_grad() + q_loss.backward() + self.optim["critic"].step() + + # compute the loss for actor + if step % self.actor_update_interval == 0: + actor_loss, actor_metrics = self.actor_loss(encoded_obs, action) + metrics.update(actor_metrics) + self.optim["actor"].zero_grad() + actor_loss.backward() + self.optim["actor"].step() + + sync_target(self.network.critic, self.target_network.critic, tau=self.tau) + sync_target(self.network.actor, self.target_network.actor, tau=self.tau) + + for _, scheduler in self.schedulers.items(): + scheduler.step() + + return metrics From 68b4c02585a835f0f91e574474deae39f80797f0 Mon Sep 17 00:00:00 2001 From: OrangeX4 Date: Sun, 19 Jan 2025 17:30:52 +0800 Subject: [PATCH 09/17] dev: add odrl datasets --- scripts/configs/bt_awac/rpl/rpl_odrl.yaml | 108 ++++ wiserl/dataset/rpl_dataset.py | 17 +- wiserl/env/__init__.py | 6 +- wiserl/env/odrl_envs/__init__.py | 0 wiserl/env/odrl_envs/adroit/__init__.py | 189 +++++++ wiserl/env/odrl_envs/adroit/assets/adroit.xml | 170 ++++++ .../assets/adroit_broken_joint_easy.xml | 170 ++++++ .../assets/adroit_broken_joint_hard.xml | 170 ++++++ .../assets/adroit_broken_joint_medium.xml | 170 ++++++ .../assets/adroit_shrink_finger_easy.xml | 171 ++++++ .../assets/adroit_shrink_finger_hard.xml | 171 ++++++ .../assets/adroit_shrink_finger_medium.xml | 171 ++++++ wiserl/env/odrl_envs/adroit/assets/assets.xml | 343 ++++++++++++ wiserl/env/odrl_envs/adroit/assets/door.xml | 92 ++++ .../adroit/assets/door_broken_joint_easy.xml | 92 ++++ .../adroit/assets/door_broken_joint_hard.xml | 92 ++++ .../assets/door_broken_joint_medium.xml | 92 ++++ .../adroit/assets/door_shrink_finger_easy.xml | 92 ++++ .../adroit/assets/door_shrink_finger_hard.xml | 92 ++++ .../assets/door_shrink_finger_medium.xml | 92 ++++ wiserl/env/odrl_envs/adroit/assets/hammer.xml | 112 ++++ .../assets/hammer_broken_joint_easy.xml | 112 ++++ .../assets/hammer_broken_joint_hard.xml | 112 ++++ .../assets/hammer_broken_joint_medium.xml | 112 ++++ .../assets/hammer_shrink_finger_easy.xml | 112 ++++ .../assets/hammer_shrink_finger_hard.xml | 112 ++++ .../assets/hammer_shrink_finger_medium.xml | 112 ++++ wiserl/env/odrl_envs/adroit/assets/pen.xml | 90 +++ .../adroit/assets/pen_broken_joint_easy.xml | 90 +++ .../adroit/assets/pen_broken_joint_hard.xml | 90 +++ .../adroit/assets/pen_broken_joint_medium.xml | 90 +++ .../adroit/assets/pen_shrink_finger_easy.xml | 90 +++ .../adroit/assets/pen_shrink_finger_hard.xml | 90 +++ .../assets/pen_shrink_finger_medium.xml | 90 +++ .../env/odrl_envs/adroit/assets/relocate.xml | 88 +++ .../assets/relocate_broken_joint_easy.xml | 88 +++ .../assets/relocate_broken_joint_hard.xml | 88 +++ .../assets/relocate_broken_joint_medium.xml | 88 +++ .../assets/relocate_shrink_finger_easy.xml | 88 +++ .../assets/relocate_shrink_finger_hard.xml | 88 +++ .../assets/relocate_shrink_finger_medium.xml | 88 +++ .../env/odrl_envs/adroit/call_adroit_env.py | 19 + .../Adroit/resources/meshes/F1.stl | Bin 0 -> 17084 bytes .../Adroit/resources/meshes/F2.stl | Bin 0 -> 22884 bytes .../Adroit/resources/meshes/F3.stl | Bin 0 -> 54684 bytes .../Adroit/resources/meshes/TH1_z.stl | Bin 0 -> 6334 bytes .../Adroit/resources/meshes/TH2_z.stl | Bin 0 -> 63184 bytes .../Adroit/resources/meshes/TH3_z.stl | Bin 0 -> 21184 bytes .../resources/meshes/forearm_simple.stl | Bin 0 -> 304184 bytes .../Adroit/resources/meshes/knuckle.stl | Bin 0 -> 30184 bytes .../Adroit/resources/meshes/lfmetacarpal.stl | Bin 0 -> 75084 bytes .../Adroit/resources/meshes/palm.stl | Bin 0 -> 347784 bytes .../Adroit/resources/meshes/wrist.stl | Bin 0 -> 92784 bytes .../Adroit/resources/textures/darkwood.png | Bin 0 -> 740234 bytes .../Adroit/resources/textures/dice.png | Bin 0 -> 33688 bytes .../Adroit/resources/textures/foil.png | Bin 0 -> 375824 bytes .../Adroit/resources/textures/marble.png | Bin 0 -> 388987 bytes .../Adroit/resources/textures/silverRaw.png | Bin 0 -> 530847 bytes .../Adroit/resources/textures/skin.png | Bin 0 -> 1942114 bytes .../Adroit/resources/textures/square.png | Bin 0 -> 343 bytes .../Adroit/resources/textures/wood.png | Bin 0 -> 42036 bytes .../Adroit/resources/textures/woodb.png | Bin 0 -> 38801 bytes wiserl/env/odrl_envs/adroit/door.py | 126 +++++ wiserl/env/odrl_envs/adroit/hammer.py | 132 +++++ wiserl/env/odrl_envs/adroit/mujoco_env.py | 142 +++++ wiserl/env/odrl_envs/adroit/pen.py | 147 +++++ wiserl/env/odrl_envs/adroit/quatmath.py | 164 ++++++ wiserl/env/odrl_envs/adroit/relocate.py | 123 +++++ wiserl/env/odrl_envs/adroit/utils/quatmath.py | 164 ++++++ wiserl/env/odrl_envs/antmaze/__init__.py | 517 ++++++++++++++++++ wiserl/env/odrl_envs/antmaze/ant.py | 213 ++++++++ wiserl/env/odrl_envs/antmaze/assets/ant.xml | 81 +++ wiserl/env/odrl_envs/antmaze/assets/point.xml | 30 + .../env/odrl_envs/antmaze/call_antmaze_env.py | 42 ++ wiserl/env/odrl_envs/antmaze/common.py | 21 + .../odrl_envs/antmaze/goal_reaching_env.py | 58 ++ wiserl/env/odrl_envs/antmaze/maze_env.py | 377 +++++++++++++ .../env/odrl_envs/antmaze/mujoco_goal_env.py | 191 +++++++ wiserl/env/odrl_envs/antmaze/wrappers.py | 168 ++++++ wiserl/env/odrl_envs/infos.py | 256 +++++++++ wiserl/env/odrl_envs/mujoco/__init__.py | 0 wiserl/env/odrl_envs/mujoco/assets/ant.xml | 81 +++ .../mujoco/assets/ant_friction_0.1.xml | 81 +++ .../mujoco/assets/ant_friction_0.5.xml | 81 +++ .../mujoco/assets/ant_friction_2.0.xml | 81 +++ .../mujoco/assets/ant_friction_5.0.xml | 81 +++ .../mujoco/assets/ant_gravity_0.1.xml | 82 +++ .../mujoco/assets/ant_gravity_0.5.xml | 82 +++ .../mujoco/assets/ant_gravity_2.0.xml | 82 +++ .../mujoco/assets/ant_gravity_5.0.xml | 82 +++ .../assets/ant_kinematic_anklejnt_easy.xml | 82 +++ .../assets/ant_kinematic_anklejnt_hard.xml | 82 +++ .../assets/ant_kinematic_anklejnt_medium.xml | 82 +++ .../assets/ant_kinematic_hipjnt_easy.xml | 82 +++ .../assets/ant_kinematic_hipjnt_hard.xml | 82 +++ .../assets/ant_kinematic_hipjnt_medium.xml | 82 +++ .../mujoco/assets/ant_morph_alllegs_easy.xml | 82 +++ .../mujoco/assets/ant_morph_alllegs_hard.xml | 82 +++ .../assets/ant_morph_alllegs_medium.xml | 82 +++ .../mujoco/assets/ant_morph_halflegs_easy.xml | 82 +++ .../mujoco/assets/ant_morph_halflegs_hard.xml | 82 +++ .../assets/ant_morph_halflegs_medium.xml | 82 +++ .../odrl_envs/mujoco/assets/half_cheetah.xml | 96 ++++ .../assets/halfcheetah_friction_0.1.xml | 96 ++++ .../assets/halfcheetah_friction_0.5.xml | 96 ++++ .../assets/halfcheetah_friction_2.0.xml | 96 ++++ .../assets/halfcheetah_friction_5.0.xml | 96 ++++ .../mujoco/assets/halfcheetah_gravity_0.1.xml | 96 ++++ .../mujoco/assets/halfcheetah_gravity_0.5.xml | 96 ++++ .../mujoco/assets/halfcheetah_gravity_2.0.xml | 96 ++++ .../mujoco/assets/halfcheetah_gravity_5.0.xml | 96 ++++ .../halfcheetah_kinematic_footjnt_easy.xml | 96 ++++ .../halfcheetah_kinematic_footjnt_hard.xml | 96 ++++ .../halfcheetah_kinematic_footjnt_medium.xml | 96 ++++ .../halfcheetah_kinematic_thighjnt_easy.xml | 96 ++++ .../halfcheetah_kinematic_thighjnt_hard.xml | 96 ++++ .../halfcheetah_kinematic_thighjnt_medium.xml | 96 ++++ .../assets/halfcheetah_morph_thigh_easy.xml | 104 ++++ .../assets/halfcheetah_morph_thigh_hard.xml | 104 ++++ .../assets/halfcheetah_morph_thigh_medium.xml | 104 ++++ .../assets/halfcheetah_morph_torso_easy.xml | 96 ++++ .../assets/halfcheetah_morph_torso_hard.xml | 96 ++++ .../assets/halfcheetah_morph_torso_medium.xml | 96 ++++ wiserl/env/odrl_envs/mujoco/assets/hopper.xml | 48 ++ .../mujoco/assets/hopper_friction_0.1.xml | 48 ++ .../mujoco/assets/hopper_friction_0.5.xml | 48 ++ .../mujoco/assets/hopper_friction_2.0.xml | 48 ++ .../mujoco/assets/hopper_friction_5.0.xml | 48 ++ .../mujoco/assets/hopper_gravity_0.1.xml | 49 ++ .../mujoco/assets/hopper_gravity_0.5.xml | 49 ++ .../mujoco/assets/hopper_gravity_2.0.xml | 49 ++ .../mujoco/assets/hopper_gravity_5.0.xml | 49 ++ .../assets/hopper_kinematic_footjnt_easy.xml | 48 ++ .../assets/hopper_kinematic_footjnt_hard.xml | 48 ++ .../hopper_kinematic_footjnt_medium.xml | 48 ++ .../assets/hopper_kinematic_legjnt_easy.xml | 48 ++ .../assets/hopper_kinematic_legjnt_hard.xml | 48 ++ .../assets/hopper_kinematic_legjnt_medium.xml | 48 ++ .../mujoco/assets/hopper_morph_foot_easy.xml | 48 ++ .../mujoco/assets/hopper_morph_foot_hard.xml | 48 ++ .../assets/hopper_morph_foot_medium.xml | 48 ++ .../mujoco/assets/hopper_morph_torso_easy.xml | 48 ++ .../mujoco/assets/hopper_morph_torso_hard.xml | 48 ++ .../assets/hopper_morph_torso_medium.xml | 48 ++ .../env/odrl_envs/mujoco/assets/walker2d.xml | 62 +++ .../mujoco/assets/walker2d_friction_0.1.xml | 62 +++ .../mujoco/assets/walker2d_friction_0.5.xml | 62 +++ .../mujoco/assets/walker2d_friction_2.0.xml | 62 +++ .../mujoco/assets/walker2d_friction_5.0.xml | 62 +++ .../mujoco/assets/walker2d_gravity_0.1.xml | 63 +++ .../mujoco/assets/walker2d_gravity_0.5.xml | 63 +++ .../mujoco/assets/walker2d_gravity_2.0.xml | 63 +++ .../mujoco/assets/walker2d_gravity_5.0.xml | 63 +++ .../walker2d_kinematic_footjnt_easy.xml | 62 +++ .../walker2d_kinematic_footjnt_hard.xml | 62 +++ .../walker2d_kinematic_footjnt_medium.xml | 62 +++ .../walker2d_kinematic_thighjnt_easy.xml | 62 +++ .../walker2d_kinematic_thighjnt_hard.xml | 62 +++ .../walker2d_kinematic_thighjnt_medium.xml | 62 +++ .../mujoco/assets/walker2d_morph_leg_easy.xml | 62 +++ .../mujoco/assets/walker2d_morph_leg_hard.xml | 62 +++ .../assets/walker2d_morph_leg_medium.xml | 62 +++ .../assets/walker2d_morph_torso_easy.xml | 62 +++ .../assets/walker2d_morph_torso_hard.xml | 62 +++ .../assets/walker2d_morph_torso_medium.xml | 62 +++ .../env/odrl_envs/mujoco/call_mujoco_env.py | 121 ++++ 166 files changed, 13690 insertions(+), 7 deletions(-) create mode 100644 scripts/configs/bt_awac/rpl/rpl_odrl.yaml create mode 100644 wiserl/env/odrl_envs/__init__.py create mode 100644 wiserl/env/odrl_envs/adroit/__init__.py create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/assets.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door_broken_joint_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door_broken_joint_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door_broken_joint_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_easy.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_hard.xml create mode 100644 wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_medium.xml create mode 100644 wiserl/env/odrl_envs/adroit/call_adroit_env.py create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F1.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F2.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F3.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH1_z.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH2_z.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH3_z.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/forearm_simple.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/knuckle.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/lfmetacarpal.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/palm.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/wrist.stl create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/darkwood.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/dice.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/foil.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/marble.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/silverRaw.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/skin.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/square.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/wood.png create mode 100644 wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/textures/woodb.png create mode 100644 wiserl/env/odrl_envs/adroit/door.py create mode 100644 wiserl/env/odrl_envs/adroit/hammer.py create mode 100644 wiserl/env/odrl_envs/adroit/mujoco_env.py create mode 100644 wiserl/env/odrl_envs/adroit/pen.py create mode 100644 wiserl/env/odrl_envs/adroit/quatmath.py create mode 100644 wiserl/env/odrl_envs/adroit/relocate.py create mode 100644 wiserl/env/odrl_envs/adroit/utils/quatmath.py create mode 100644 wiserl/env/odrl_envs/antmaze/__init__.py create mode 100644 wiserl/env/odrl_envs/antmaze/ant.py create mode 100644 wiserl/env/odrl_envs/antmaze/assets/ant.xml create mode 100644 wiserl/env/odrl_envs/antmaze/assets/point.xml create mode 100644 wiserl/env/odrl_envs/antmaze/call_antmaze_env.py create mode 100644 wiserl/env/odrl_envs/antmaze/common.py create mode 100644 wiserl/env/odrl_envs/antmaze/goal_reaching_env.py create mode 100644 wiserl/env/odrl_envs/antmaze/maze_env.py create mode 100644 wiserl/env/odrl_envs/antmaze/mujoco_goal_env.py create mode 100644 wiserl/env/odrl_envs/antmaze/wrappers.py create mode 100644 wiserl/env/odrl_envs/infos.py create mode 100644 wiserl/env/odrl_envs/mujoco/__init__.py create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_friction_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_friction_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_friction_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_friction_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_gravity_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_gravity_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_gravity_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_gravity_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_kinematic_anklejnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_kinematic_anklejnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_kinematic_anklejnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_kinematic_hipjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_kinematic_hipjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_kinematic_hipjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_morph_alllegs_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_morph_alllegs_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_morph_alllegs_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_morph_halflegs_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_morph_halflegs_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/ant_morph_halflegs_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/half_cheetah.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_friction_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_friction_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_friction_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_friction_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_gravity_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_gravity_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_gravity_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_gravity_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_kinematic_footjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_kinematic_footjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_kinematic_footjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_kinematic_thighjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_kinematic_thighjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_kinematic_thighjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_morph_thigh_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_morph_thigh_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_morph_thigh_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_morph_torso_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_morph_torso_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/halfcheetah_morph_torso_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_friction_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_friction_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_friction_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_friction_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_gravity_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_gravity_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_gravity_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_gravity_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_kinematic_footjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_kinematic_footjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_kinematic_footjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_kinematic_legjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_kinematic_legjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_kinematic_legjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_morph_foot_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_morph_foot_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_morph_foot_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_morph_torso_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_morph_torso_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/hopper_morph_torso_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_friction_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_friction_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_friction_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_friction_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_gravity_0.1.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_gravity_0.5.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_gravity_2.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_gravity_5.0.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_kinematic_footjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_kinematic_footjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_kinematic_footjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_kinematic_thighjnt_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_kinematic_thighjnt_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_kinematic_thighjnt_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_morph_leg_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_morph_leg_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_morph_leg_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_morph_torso_easy.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_morph_torso_hard.xml create mode 100644 wiserl/env/odrl_envs/mujoco/assets/walker2d_morph_torso_medium.xml create mode 100644 wiserl/env/odrl_envs/mujoco/call_mujoco_env.py diff --git a/scripts/configs/bt_awac/rpl/rpl_odrl.yaml b/scripts/configs/bt_awac/rpl/rpl_odrl.yaml new file mode 100644 index 0000000..f0ebdbb --- /dev/null +++ b/scripts/configs/bt_awac/rpl/rpl_odrl.yaml @@ -0,0 +1,108 @@ +algorithm: + class: BTAWAC + beta: 0.3333 + max_exp_clip: 100.0 + reward_reg: 0.0 + rm_label: true + +checkpoint: null +seed: 0 +name: default +debug: false +device: null +wandb: + activate: false + entity: null + project: null + +env: halfcheetah-gravity-5.0 +env_kwargs: +env_wrapper: +env_wrapper_kwargs: + +eval_env: halfcheetah-gravity-0.1 +eval_env_kwargs: +eval_env_wrapper: +eval_env_wrapper_kwargs: + +replay: false + +optim: + default: + class: Adam + lr: 0.0003 + +network: + reward: + class: EnsembleMLP + ensemble_size: 1 + hidden_dims: [256, 256] + reward_act: sigmoid + actor: + class: SquashedGaussianActor + hidden_dims: [256, 256] + reparameterize: false + conditioned_logstd: false + logstd_min: -5 + logstd_max: 2 + critic: + class: Critic + ensemble_size: 2 + hidden_dims: [256, 256] + + +rm_dataset: + - class: RPLComparisonDataset + env: + batch_size: 8 + segment_length: null + label_key: rl_sum + replay: + odrl: true + +rm_dataloader: + num_workers: 2 + batch_size: null + +rl_dataset: + - class: RPLOfflineDataset + env: + batch_size: 256 + replay: + odrl: true + +rl_dataloader: + num_workers: 2 + batch_size: null + +trainer: + env_freq: null + rm_label: true + rm_steps: 100000 + rl_steps: 1000000 + log_freq: 500 + profile_freq: 500 + eval_freq: 5000 + +rm_eval: + function: eval_reward_model + eval_dataset_kwargs: + class: RPLComparisonDataset + env: + batch_size: 32 + label_key: rl_sum + eval: true + replay: + odrl: true + +rl_eval: + function: eval_offline + num_ep: 10 + deterministic: true + +schedulers: + actor: + class: CosineAnnealingLR + T_max: 1000000 + +processor: null diff --git a/wiserl/dataset/rpl_dataset.py b/wiserl/dataset/rpl_dataset.py index 923a028..eb32604 100644 --- a/wiserl/dataset/rpl_dataset.py +++ b/wiserl/dataset/rpl_dataset.py @@ -9,7 +9,7 @@ from wiserl.utils import utils -prefix = "datasets/rpl" +prefix = "/nfs/fsj/WiseRL/datasets/rpl" class RPLComparisonDataset(torch.utils.data.IterableDataset): def __init__( @@ -21,6 +21,7 @@ def __init__( batch_size: Optional[int] = None, capacity: Optional[int] = None, label_key: str="rl_sum", + odrl: bool = False, variant: str = "gravity-50", eval: bool = False, replay: bool = False, @@ -34,10 +35,11 @@ def __init__( self.variant = variant self.eval = eval train_or_eval = "eval" if eval else "train" + mid_name = f"collect_odrl/{self.env_name}" if odrl else f"{self.env_name}/{variant}" if replay: - path = f"{prefix}/{self.env_name}/{variant}/replay_preference_{train_or_eval}_data.npz" + path = f"{prefix}/{mid_name}/replay_preference_{train_or_eval}_data.npz" else: - path = f"{prefix}/{self.env_name}/{variant}/preference_{train_or_eval}_data.npz" + path = f"{prefix}/{mid_name}/preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -99,6 +101,7 @@ def __init__( batch_size: Optional[int] = None, capacity: Optional[int] = None, mode: str = "transition", + odrl: bool = False, variant: str = "gravity-50", eval: bool = False, replay: bool = False, @@ -110,6 +113,7 @@ def __init__( self.batch_size = 1 if batch_size is None else batch_size # self.segment_length = segment_length self.capacity = capacity + self.odrl = odrl self.variant = variant self.eval = eval self.replay = replay @@ -138,11 +142,12 @@ def __iter__(self): def load_dataset(self): # Using preference datasets + mid_name = f"collect_odrl/{self.env_name}" if self.odrl else f"{self.env_name}/{self.variant}" if self.mode == "trajectory": train_or_eval = "eval" if self.eval else "train" replay_or_none = 'replay_' if self.replay else "" - path = f"{prefix}/{self.env_name}/{self.variant}/{replay_or_none}preference_{train_or_eval}_data.npz" + path = f"{prefix}/{mid_name}/{replay_or_none}preference_{train_or_eval}_data.npz" with open(path, "rb") as f: data = np.load(f) data = utils.nest_dict(data) @@ -176,9 +181,9 @@ def load_dataset(self): else: # Using offline datasets if self.replay: - path = f"{prefix}/{self.env_name}/{self.variant}/replay.npz" + path = f"{prefix}/{mid_name}/replay.npz" else: - path = f"{prefix}/{self.env_name}/{self.variant}/data.npz" + path = f"{prefix}/{mid_name}/data.npz" with open(path, "rb") as f: data = np.load(f) diff --git a/wiserl/env/__init__.py b/wiserl/env/__init__.py index a5fa76d..0c7ca59 100644 --- a/wiserl/env/__init__.py +++ b/wiserl/env/__init__.py @@ -5,6 +5,7 @@ import gym import UtilsRL.env.wrapper from gym.envs import register +from wiserl.env.odrl_envs.mujoco.call_mujoco_env import call_mujoco_env from .base import EmptyEnv from .cliffwalking_env import CliffWalkingEnv @@ -53,7 +54,10 @@ def get_env( env_kwargs = env_kwargs or {} env = extra_envs[env](**env_kwargs) except KeyError as e: - env = gym.make(env, **env_kwargs) + try: + env = call_mujoco_env(env) + except Exception as e: + env = gym.make(env, **env_kwargs) if wrapper_class is not None: wrapper_kwargs = wrapper_kwargs or {} env = vars(UtilsRL.env.wrapper)[wrapper_class](env, **wrapper_kwargs) diff --git a/wiserl/env/odrl_envs/__init__.py b/wiserl/env/odrl_envs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/wiserl/env/odrl_envs/adroit/__init__.py b/wiserl/env/odrl_envs/adroit/__init__.py new file mode 100644 index 0000000..ee07d79 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/__init__.py @@ -0,0 +1,189 @@ +from gym.envs.registration import register + +from pathlib import Path +import sys +sys.path.append(str(Path(__file__).parent.absolute())) + +# from door import DoorEnvV0 +# from relocate import RelocateEnvV0 +# from hammer import HammerEnvV0 +# from pen import PenEnvV0 +import door +import pen +import relocate +import hammer + +# no need to register if d4rl is install, else please register the following environments + +# register(id='door-v0', entry_point='DoorEnvV0', max_episode_steps=200, kwargs={}) +# register(id='relocate-v0', entry_point='RelocateEnvV0', max_episode_steps=200, kwargs={}) +# register(id='hammer-v0', entry_point='HammerEnvV0', max_episode_steps=200, kwargs={}) +# register(id='pen-v0', entry_point='PenEnvV0', max_episode_steps=200, kwargs={}) + +register( + id='door-shrink-finger-easy-v0', entry_point='door:DoorEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'door_shrink_finger_easy' + } +) + +register( + id='door-shrink-finger-medium-v0', entry_point='door:DoorEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'door_shrink_finger_medium' + } +) + +register( + id='door-shrink-finger-hard-v0', entry_point='door:DoorEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'door_shrink_finger_hard' + } +) + +register( + id='relocate-shrink-finger-easy-v0', entry_point='relocate:RelocateEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'relocate_shrink_finger_easy' + } +) + +register( + id='relocate-shrink-finger-medium-v0', entry_point='relocate:RelocateEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'relocate_shrink_finger_medium' + } +) + +register( + id='relocate-shrink-finger-hard-v0', entry_point='relocate:RelocateEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'relocate_shrink_finger_hard' + } +) + +register( + id='hammer-shrink-finger-easy-v0', entry_point='hammer:HammerEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'hammer_shrink_finger_easy' + } +) + +register( + id='hammer-shrink-finger-medium-v0', entry_point='hammer:HammerEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'hammer_shrink_finger_medium' + } +) + +register( + id='hammer-shrink-finger-hard-v0', entry_point='hammer:HammerEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'hammer_shrink_finger_hard' + } +) + +register( + id='pen-shrink-finger-easy-v0', entry_point='pen:PenEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'pen_shrink_finger_easy' + } +) + +register( + id='pen-shrink-finger-medium-v0', entry_point='pen:PenEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'pen_shrink_finger_medium' + } +) + +register( + id='pen-shrink-finger-hard-v0', entry_point='pen:PenEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'pen_shrink_finger_hard' + } +) + +register( + id='door-broken-joint-easy-v0', entry_point='door:DoorEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'door_broken_joint_easy' + } +) + +register( + id='door-broken-joint-medium-v0', entry_point='door:DoorEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'door_broken_joint_medium' + } +) + +register( + id='door-broken-joint-hard-v0', entry_point='door:DoorEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'door_broken_joint_hard' + } +) + +register( + id='relocate-broken-joint-easy-v0', entry_point='relocate:RelocateEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'relocate_broken_joint_easy' + } +) + +register( + id='relocate-broken-joint-medium-v0', entry_point='relocate:RelocateEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'relocate_broken_joint_medium' + } +) + +register( + id='relocate-broken-joint-hard-v0', entry_point='relocate:RelocateEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'relocate_broken_joint_hard' + } +) + +register( + id='hammer-broken-joint-easy-v0', entry_point='hammer:HammerEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'hammer_broken_joint_easy' + } +) + +register( + id='hammer-broken-joint-medium-v0', entry_point='hammer:HammerEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'hammer_broken_joint_medium' + } +) + +register( + id='hammer-broken-joint-hard-v0', entry_point='hammer:HammerEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'hammer_broken_joint_hard' + } +) + +register( + id='pen-broken-joint-easy-v0', entry_point='pen:PenEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'pen_broken_joint_easy' + } +) + +register( + id='pen-broken-joint-medium-v0', entry_point='pen:PenEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'pen_broken_joint_medium' + } +) + +register( + id='pen-broken-joint-hard-v0', entry_point='pen:PenEnvV0', max_episode_steps=200, + kwargs={ + 'xml_file': 'pen_broken_joint_hard' + } +) \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit.xml b/wiserl/env/odrl_envs/adroit/assets/adroit.xml new file mode 100644 index 0000000..3d00adc --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_easy.xml b/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_easy.xml new file mode 100644 index 0000000..6d8c834 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_easy.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_hard.xml b/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_hard.xml new file mode 100644 index 0000000..aba6805 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_hard.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_medium.xml b/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_medium.xml new file mode 100644 index 0000000..d6406fc --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit_broken_joint_medium.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_easy.xml b/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_easy.xml new file mode 100644 index 0000000..04b236d --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_easy.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_hard.xml b/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_hard.xml new file mode 100644 index 0000000..847f124 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_hard.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_medium.xml b/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_medium.xml new file mode 100644 index 0000000..6f1349a --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/adroit_shrink_finger_medium.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/assets.xml b/wiserl/env/odrl_envs/adroit/assets/assets.xml new file mode 100644 index 0000000..0899c93 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/assets.xml @@ -0,0 +1,343 @@ + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door.xml b/wiserl/env/odrl_envs/adroit/assets/door.xml new file mode 100644 index 0000000..2fedadc --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_easy.xml b/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_easy.xml new file mode 100644 index 0000000..ffa46e4 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_easy.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_hard.xml b/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_hard.xml new file mode 100644 index 0000000..5579f24 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_hard.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_medium.xml b/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_medium.xml new file mode 100644 index 0000000..595ae07 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door_broken_joint_medium.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_easy.xml b/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_easy.xml new file mode 100644 index 0000000..7d24ed2 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_easy.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_hard.xml b/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_hard.xml new file mode 100644 index 0000000..60318d7 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_hard.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_medium.xml b/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_medium.xml new file mode 100644 index 0000000..c8ac450 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/door_shrink_finger_medium.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer.xml b/wiserl/env/odrl_envs/adroit/assets/hammer.xml new file mode 100644 index 0000000..560cb4b --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_easy.xml b/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_easy.xml new file mode 100644 index 0000000..bc1b196 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_easy.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_hard.xml b/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_hard.xml new file mode 100644 index 0000000..0f60577 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_hard.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_medium.xml b/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_medium.xml new file mode 100644 index 0000000..6461bfa --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer_broken_joint_medium.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_easy.xml b/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_easy.xml new file mode 100644 index 0000000..6bd1bca --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_easy.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_hard.xml b/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_hard.xml new file mode 100644 index 0000000..2550b06 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_hard.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_medium.xml b/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_medium.xml new file mode 100644 index 0000000..84c5a91 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/hammer_shrink_finger_medium.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/pen.xml b/wiserl/env/odrl_envs/adroit/assets/pen.xml new file mode 100644 index 0000000..642e5c0 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_easy.xml b/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_easy.xml new file mode 100644 index 0000000..30c17c4 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_easy.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_hard.xml b/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_hard.xml new file mode 100644 index 0000000..96cb15e --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_hard.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_medium.xml b/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_medium.xml new file mode 100644 index 0000000..72a9b86 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen_broken_joint_medium.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_easy.xml b/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_easy.xml new file mode 100644 index 0000000..d709e4e --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_easy.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_hard.xml b/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_hard.xml new file mode 100644 index 0000000..f0c4fcd --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_hard.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_medium.xml b/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_medium.xml new file mode 100644 index 0000000..7997bf3 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/pen_shrink_finger_medium.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate.xml b/wiserl/env/odrl_envs/adroit/assets/relocate.xml new file mode 100644 index 0000000..189caaa --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_easy.xml b/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_easy.xml new file mode 100644 index 0000000..cf33430 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_easy.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_hard.xml b/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_hard.xml new file mode 100644 index 0000000..e640baf --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_hard.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_medium.xml b/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_medium.xml new file mode 100644 index 0000000..a8d32b3 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate_broken_joint_medium.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_easy.xml b/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_easy.xml new file mode 100644 index 0000000..7a2fcbd --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_easy.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_hard.xml b/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_hard.xml new file mode 100644 index 0000000..03c2ba8 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_hard.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_medium.xml b/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_medium.xml new file mode 100644 index 0000000..cc553f8 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/assets/relocate_shrink_finger_medium.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wiserl/env/odrl_envs/adroit/call_adroit_env.py b/wiserl/env/odrl_envs/adroit/call_adroit_env.py new file mode 100644 index 0000000..5c10969 --- /dev/null +++ b/wiserl/env/odrl_envs/adroit/call_adroit_env.py @@ -0,0 +1,19 @@ +from typing import Dict +import gym + + +def call_adroit_env(env_config: Dict) -> gym.Env: + env_name = env_config['env_name'].lower() # eg. "pen_shrink_finger" + shift_level = env_config['shift_level'] # level(easy/medium/hard) + + if '_' in env_name: + env_name = env_name.replace('_', '-') + # decide which task it is, support the following tasks + # pen/hammer/relocate/door - shrink_finger + # - broken_joint + assert any([env_name.startswith(f'{e}') for e in ['pen', 'hammer', 'relocate', 'door']]) + assert any([env_name.endswith(f'{e}') for e in ['shrink-finger', 'broken-joint']]) + + env_name = env_name + '-' + str(shift_level) + '-v0' + + return gym.make(env_name) \ No newline at end of file diff --git a/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F1.stl b/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F1.stl new file mode 100644 index 0000000000000000000000000000000000000000..515d3c90169fb7b7a5ecb344bb63267d5352ad8c GIT binary patch literal 17084 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 literal 0 HcmV?d00001 diff --git a/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F3.stl b/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/F3.stl new file mode 100644 index 0000000000000000000000000000000000000000..223f06f5bfb8af17e33c6fee5f0fa3d65c76d6bf GIT binary patch literal 54684 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 literal 0 HcmV?d00001 diff --git a/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH1_z.stl b/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH1_z.stl new file mode 100644 index 0000000000000000000000000000000000000000..400ee2d62567af07045150511539919e758c05eb GIT binary patch literal 6334 zcmb`Ldsxlc8pq$tC7P1N=te5aEln2lMLOStuxZ3%PH+9w!Zc;q zMP7wzfRPEAEb3v?k8b9D32u4xfvtXMvX3}DKV8C>07fmyWa@BW^zgpKpejo8QQlNx z8em47wu`tE6tBT87b5NS?>T0OX&=5LVM_qZTD7cn%QxeLe$r_ivh4JqS1eI%Gk6uI z0s3FiQoRtXY1?lq6rVSjl%`GM`AL0fr?!VwUNlymn3p77F6<-O-270fuD7HB_Gh)~ z|B!uc&Je+%nq4$jc~gaHfaY(z2(T)S>>^&<9n{xEx)JCq>RxP-uqA+&mqd17l`yC- z1-dG4sxS@kdGJdgckQ=!5wGoQo)9>F9o;Zrdtt3Xe=^roOEH-OA702@<^+usn zM1YTdzp4DCR?D`p|F34Hi&tfiYNf9&dsk_$A_A|eVd0Kk#@LHjGPfx|;s*4n^ z&)^7b31DIBjfyJ|wRB+3K~1qkmNGfdO$xWzBx0H;4#ap>+2m_!=DopOub!GWRWS>9 zX~azp!Il7~3|vZ+bW6#=OP)eUuir(Vi|t}-VTy!T2EP(}pIJhGJFg>8a#wS!9n(CK zU%P~U)u1E9>r>7L-bHwC0vwM`q+{x2vT1KmZr5HdeI{xvAB$zwmSTSZtA@tV6$v-U zFrPmK=YSHi`S-`77=4Eu2TxoaP(d7aCDK`0xdNUkO!EYdIz^UmN}z?0$}4aS?iG$S zfXlyHNY$}uI#xHcYVV9taq`o_(nq%!Ntot|mHQu&g~8FZC9;l-6{c}-0d~|`lds>& zr2fve8mz*0`BielLp`DWGU%$=#{^7Z74PF@{(3p)P#nG6^d+%bSfqRxS}U&6-{Dp` zUiknAjRWLG_35-pq03_i`F!NbCADmADB*K?v``=1Jk?@^G!G9 z3z@MrVqYb)I7RH#5BMsGo4t0O8`A}G*^iEt-C(1`I_iHB3r^LOanX( zsgzfL9ZP*ImlN#0HR&%!Z*g0kXnsh-5dpBcBr$7uSNg+mQ5tM(`dCZ7ZgI8vEZkMX zz5zCrg|V?MXNg7BIWC`LyVxJV(%b)Jx2)%q`#nD6vNOI7@WjWr(%69TRB|G5y@2yM zR`IR(DM@1^J6n_hlXmI)rMKCGsR2sA zGlu9sk8YEj(>*m2>t|Ekg6Dwm)weqz$iuR(XexHi;qJSb<_S~3^YV;hMYh{9mGgmb z%ec1yEIpLvU+E__#|`A7i(`dpfbZ=$3YOkpLiO8PhR<`Hm+*-SP%w9`oYWr28XxQ+ z_@3}KDN~j;|Ej#d>+TzOhPN&R$(J+IS=*i*VfW5L<>VGSedP`0y58sE+U?#ynKx165K{;}(@#-;I+BCW90e>t~R#41b!TuU0nCb&!NC$HIL z(=Xli5AI)63Innwtm1ps9_hr=2L-U;1?#zSU>f@dDEz>TNrh8bxxX7ZZTnd16?je= zQdh>s2geOy&p>mwIUt=<_ zS2!P-#$y5qc3wm;neLKz#4gYT_}>u!DDJ6eyHll4s++_nrBiA4XeE3d^d4)3u`Df=cpCm%4lRp2!A_-dpNbGfn zgxkk6lhro_tim+zA;98mO+v-AOxFH%KSy8{u1f&g19l2V-(|5qF43+sx-kd9~GE!(>L<4EIq0@<%u&zIkN#yMGbff_sHCDnNLDGipPxkdtoXxL9EopKFWL{zGz4Qx-4w zp?IEgbaC7Oy0zXTuJyfGw?=Qy2UcNPeao1&T{a$>#A*Wvb0-}3hiQOX?;Em%MKD`Z zaEss;oL})-2{1X|gM|)$DA!n9aCZirUwLAOT_gjWZE|2!Bf%-ywhI8 z5%^TYwEFgX%87X;2TBw(6mkcHfW4qS?=D(ny7e{`W( A?f?J) literal 0 HcmV?d00001 diff --git a/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH2_z.stl b/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH2_z.stl new file mode 100644 index 0000000000000000000000000000000000000000..5ace8388b9fad8fc9f4a30d25a00592a312864f1 GIT binary patch literal 63184 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 YVBDJpwJH)+xmgW literal 0 HcmV?d00001 diff --git a/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH3_z.stl b/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/TH3_z.stl new file mode 100644 index 0000000000000000000000000000000000000000..23485abc720951ef1ae56a72aa965e30c3ab8442 GIT binary patch literal 21184 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 v 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

)TAXmVhNR_?4mBke)R?e7kH~*%ByMD1~S} z@^gg9B19A+MtW+x)Slr2)c~asP3%u%=#`~)@FU7DN+DX0<84A5qt){;)x2NZK$qHO z?BC^MF|h4SBbvUb+C#Sn#MGgxeL^4gng@)nsJMR~G;Qiw)-#K2x2!OJA%h%q;axjd?^>y6B}tO}xD)I?ul z_Z-Z>T76B#Q$0`$(f`O5vEi@KuFs!#8Th2$!HzDq^Zs$0kM%vpe{Z8!5li+I?KJk$ zOpQ{AMtj6nD;Up@(N6yYt(LobT?v69ry$h7$0M!-7I12K7ah$_on@u z5Ku2_qM3nMdb1O&%J#kQX5oz>-u2)e5M$>~mzJwWA9jo$*q49uVXWCVXOmP6A!H<= zZN_>`oG6Edd>~w%dW2yXu`{N}F(ocm{^x_|Vou{B7Ei|RJEIh$sqb7rTApk1hj@>; zI4GrfAU0Z$yzpe896?-z9O4?_6UF4P``LON_3A~-1iC3odBLo)r4Wtws2;h2@uuzfX+>-* z^=+5pT%i=AiS@GfiTIGdyIV-PLMg>tveB3Y>MV_0A#PsUB?eAU(6Z~>D$cauM?F`w z);tmW$%at;5|Bc@Xpg=bJ@Z_gTo^0Q6VDQJf}J=$jyEzgMa}FXvKEa*e4@B&;&vk| z)4GkQy*tF`Pm|=q+vyhD(3V0p+GDJ+=NvJhNgKI@;y_)Bt5)?rA1l)sAN{_JwV9$Z zc{QI{tSE(O^pN(6&(FGtPfL}4L+@HFJ=-hvMDP5lS(;dr@=Ib(DyF23K)wG)^lqLc ztCLqKg=q9vS)kv5@dA-WtWrB#ltOe7qVC#2*_fD_D1~S}R|=yLjR=8rJ4zwC$i}(~ z2Sw-In7`HCvF2?ty=6SdbpoXjZP`dGvXrLHyNJd)n0Bwkt(|*#i0n$) z#hfTEul>&JaY$nPzD%R!CcWp1fop$}iBgDW%+q&{v6x2UGGhFq6r%Mw_7G?LIL$tP z)9iyQ3+ly{h!{@93m-tUPx=cUvh6#f(H@Q6)lZDgJ$>cO7d&J;4!qOXy?R8yn?YrF z)5o*g;kN+D*~i;@#>Ot1#`A+JiEit*Y8?}lLNsHIs_ir?%zumS;?lD4J;2DZPK+6C z^Ni;Q66G?V9E}Hn`9U;sap)uwxi>^EIXcn$KFaR6;>{i2ei8SBzWM1(r-^&rioW@= zSz3s|TRg@@U$>~3_L5w9p@Vkoyx1LORtY*~2ESj!qu(c98Bk6vDZfL6HyEegupk0& zbm%5EFjj=^-yxD)j*=*accD6B{-N?>!|6e?^xu!QI~lxH8&P+H=@nPiv-0)>ld;N; zR=Q7jZ7$1h*6)4rPDV!*yO$^4sSqVUJ^G7wlZsMkkFg5JZwdDWhfEiR*4JnDEifYV zo7CH8gsXO(@K2zzWdsj z#kDg0U5Pusb&hH`!&GN#`+IK2Qi%^f|ISxN$%NK!+@G(k)7*8VZno1qXt_|Q7yCC` zF}CDAzh|+frCH9q}}FB)^)s�BwPoVE8g_$PqU|}MU_^M>(y@H?6f^iW3xcYMeA?dQ5i7@MTU;XN?l zS;u*Y7c=}l`hCff=v+=XS;hj%sJE zQNEL!YxgDpMA&1Ru`QFU@aXM_4R797^9m!!`vAropNKJRb{pQ%;{6^npo(@Rt6s3% zkoSgY9kDKIN!HBA+p-e!XJ~sL{KiDz$;_>`Q3R|jbcY6v*S<=@b1j~!sMA0fYxIGQ zr2hs#x7PMF`Ha|Z>Sy{(HwtN#%QW@>>fh;SlKe#d%d_XtTOtCb3X71k7|B_PK&8i< zF4E~=lwSV0NS|d#A-yfhG)_peK~ffivZf(W>b@nJ#$U2LRQgM?A^RAs*b2Qud;dl- zwkyPowfF=PD5d_L{!$Do3*M~M{t|2>*(i#^eu4<}P}MwbFJrYs{)y0~FuNp4xnTRe znN!*Mzq}*Du8(?d*`QkZ?|c4yu!cY>y&j}1rrKq<7x G*#86hDNT$3 literal 0 HcmV?d00001 diff --git a/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/forearm_simple.stl b/wiserl/env/odrl_envs/adroit/dependencies/Adroit/resources/meshes/forearm_simple.stl new file mode 100644 index 0000000000000000000000000000000000000000..888d2d388ce1fcf4bc1e11e85d8d0a343f409a8b GIT binary patch literal 304184 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

@%i(7JSB-D4A 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

YNGI+SoX;*}Z3&Otw}L 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

y+^N|NsVx- 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