Repository navigation
Expand file tree
/
Copy pathmain.py
More file actions
104 lines (82 loc) · 2.83 KB
/
Copy pathmain.py
File metadata and controls
104 lines (82 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os
import yaml
import logging
import argparse
import torch
import numpy as np
from torch.utils.tensorboard import SummaryWriter
import gymnasium as gym
from gymnasium.wrappers import RecordEpisodeStatistics
from utils.logger import configure_logger
from algos.mg_a2c.learning import train_mg_a2c
from algos.rl2_ppo.learning import train_rl2_ppo
from envs.debug.left_right import LeftRightDebugEnv
# from envs.krazy_world.gym_wrapper import initialize_distribution
# KrazyWorld distribution
# envs, test_envs = initialize_distribution(config["max_episode_steps"])
def main(config):
logging.info(f"Start meta-training, experiment name: {config['name']}")
logging.info(f"config: {config}")
envs = [
RecordEpisodeStatistics(
LeftRightDebugEnv(max_episode_steps=config["max_episode_steps"])
),
RecordEpisodeStatistics(
LeftRightDebugEnv(max_episode_steps=config["max_episode_steps"])
),
]
test_envs = [
RecordEpisodeStatistics(
LeftRightDebugEnv(max_episode_steps=config["max_episode_steps"])
),
RecordEpisodeStatistics(
LeftRightDebugEnv(max_episode_steps=config["max_episode_steps"])
),
]
logging.info(
f"Env spaces: {envs[0].observation_space, envs[0].action_space}, "
f"max steps: {config['max_episode_steps']}"
)
writer = SummaryWriter(os.path.join(config["path"], "tb"))
# Temporary interface to allow all agents to run in similar fashion
# train_<meta>_<agent>(config, envs: list[Env], test_envs: list[Env], writer)
train_mg_a2c(config, envs, writer=writer)
# train_rl2_ppo(config, envs, test_envs=test_envs, writer=writer)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-n",
"--name",
type=str,
)
parser.add_argument(
"-d",
"--debug",
action="store_true",
help="run in debug mode",
)
parser.add_argument(
"-c",
"--config",
type=str,
default="configs/rl2_ppo.yml",
)
args = parser.parse_args()
assert args.name is not None, "Pass a name for the experiment"
with open(args.config, "r", encoding="utf-8") as f:
config = yaml.load(f, Loader=yaml.FullLoader)
# Initialize logger
config["name"] = args.name
config["debug"] = args.debug
config["path"] = f"runs/{args.name}"
# TODO: Refactor Logger to not have to import it everywhere
configure_logger(args.name, config["path"])
# CUDA device
config["device"] = torch.device(config["device_id"])
torch.autograd.set_detect_anomaly(True)
# Seed Numpy and Torch
np.random.seed(config["seed"])
torch.manual_seed(config["seed"])
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
main(config)