chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
|
||||
parser = add_rllib_example_script_args(
|
||||
default_reward=450.0,
|
||||
default_timesteps=2000000,
|
||||
)
|
||||
# Use `parser` to add your own custom command line options to this script
|
||||
# and (if needed) use their values to set up `config` below.
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment("CartPole-v1")
|
||||
.training(
|
||||
circular_buffer_iterations_per_batch=2,
|
||||
vf_loss_coeff=0.05,
|
||||
entropy_coeff=0.0,
|
||||
)
|
||||
.rl_module(
|
||||
model_config=DefaultModelConfig(vf_share_layers=True),
|
||||
)
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args)
|
||||
@@ -0,0 +1,49 @@
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.examples.envs.classes.multi_agent import MultiAgentCartPole
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
from ray.rllib.utils.metrics import (
|
||||
ENV_RUNNER_RESULTS,
|
||||
EPISODE_RETURN_MEAN,
|
||||
NUM_ENV_STEPS_SAMPLED_LIFETIME,
|
||||
)
|
||||
from ray.tune.registry import register_env
|
||||
|
||||
parser = add_rllib_example_script_args(default_timesteps=2000000)
|
||||
parser.set_defaults(
|
||||
num_agents=2,
|
||||
)
|
||||
# Use `parser` to add your own custom command line options to this script
|
||||
# and (if needed) use their values to set up `config` below.
|
||||
args = parser.parse_args()
|
||||
|
||||
register_env("env", lambda cfg: MultiAgentCartPole(config=cfg))
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment("env", env_config={"num_agents": args.num_agents})
|
||||
.training(
|
||||
vf_loss_coeff=0.005,
|
||||
entropy_coeff=0.0,
|
||||
)
|
||||
.rl_module(
|
||||
model_config=DefaultModelConfig(vf_share_layers=True),
|
||||
)
|
||||
.multi_agent(
|
||||
policy_mapping_fn=(lambda agent_id, episode, **kwargs: f"p{agent_id}"),
|
||||
policies={f"p{i}" for i in range(args.num_agents)},
|
||||
)
|
||||
)
|
||||
|
||||
stop = {
|
||||
f"{ENV_RUNNER_RESULTS}/{EPISODE_RETURN_MEAN}": 350.0 * args.num_agents,
|
||||
f"{NUM_ENV_STEPS_SAMPLED_LIFETIME}": args.stop_timesteps,
|
||||
}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args, stop=stop)
|
||||
@@ -0,0 +1,254 @@
|
||||
"""
|
||||
Multi-agent RLlib Footsies Example (APPO)
|
||||
|
||||
About:
|
||||
- Example is based on the Footsies environment (https://github.com/chasemcd/FootsiesGym).
|
||||
- Footsies is a two-player fighting game where each player controls a character and tries to hit the opponent while avoiding being hit.
|
||||
- Footsies is a zero-sum game, when one player wins (+1 reward) the other loses (-1 reward).
|
||||
|
||||
Summary:
|
||||
- Main policy is an LSTM-based policy.
|
||||
- Training algorithm is APPO.
|
||||
|
||||
Training:
|
||||
- Training is governed by adding new, more complex opponents to the mix as the main policy reaches a certain win rate threshold against the current opponent.
|
||||
- Current opponent is always the newest opponent added to the mix.
|
||||
- Training starts with a very simple opponent: "noop" (does nothing), then progresses to "back" (only moves backwards). These are the fixed (very simple) policies that are used to kick off the training.
|
||||
- New opponents are frozen copies of the main policy at different training stages. They will be added to the mix as "lstm_v0", "lstm_v1", etc.
|
||||
- In this way - after kick-starting the training with fixed simple opponents - the main policy will play against a version of itself from an earlier training stage.
|
||||
- The main policy has to achieve the win rate threshold against the current opponent to add a new opponent to the mix.
|
||||
- Training concludes when the target mix size is reached.
|
||||
|
||||
Evaluation:
|
||||
- Evaluation is performed against the current (newest) opponent.
|
||||
- Evaluation runs for a fixed number of episodes at the end of each training iteration.
|
||||
|
||||
"""
|
||||
import functools
|
||||
from pathlib import Path
|
||||
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.core.rl_module import MultiRLModuleSpec, RLModuleSpec
|
||||
from ray.rllib.env.multi_agent_env_runner import MultiAgentEnvRunner
|
||||
from ray.rllib.examples.envs.classes.multi_agent.footsies.fixed_rlmodules import (
|
||||
BackFixedRLModule,
|
||||
NoopFixedRLModule,
|
||||
)
|
||||
from ray.rllib.examples.envs.classes.multi_agent.footsies.footsies_env import (
|
||||
env_creator,
|
||||
)
|
||||
from ray.rllib.examples.envs.classes.multi_agent.footsies.utils import (
|
||||
Matchmaker,
|
||||
Matchup,
|
||||
MetricsLoggerCallback,
|
||||
MixManagerCallback,
|
||||
platform_for_binary_to_download,
|
||||
)
|
||||
from ray.rllib.examples.rl_modules.classes.lstm_containing_rlm import (
|
||||
LSTMContainingRLModuleWithTargetNetwork,
|
||||
)
|
||||
from ray.rllib.utils.metrics import NUM_ENV_STEPS_SAMPLED_LIFETIME
|
||||
from ray.rllib.utils.test_utils import (
|
||||
add_rllib_example_script_args,
|
||||
)
|
||||
from ray.tune.registry import register_env
|
||||
from ray.tune.result import TRAINING_ITERATION
|
||||
|
||||
parser = add_rllib_example_script_args(
|
||||
default_iters=500,
|
||||
default_timesteps=5_000_000,
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--train-start-port",
|
||||
type=int,
|
||||
default=45001,
|
||||
help="First port number for the Footsies training environment server (default: 45001). Each server gets its own port.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--eval-start-port",
|
||||
type=int,
|
||||
default=55001,
|
||||
help="First port number for the Footsies evaluation environment server (default: 55001) Each server gets its own port.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--binary-download-dir",
|
||||
type=Path,
|
||||
default="/tmp/ray/binaries/footsies",
|
||||
help="Directory to download Footsies binaries (default: /tmp/ray/binaries/footsies)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--binary-extract-dir",
|
||||
type=Path,
|
||||
default="/tmp/ray/binaries/footsies",
|
||||
help="Directory to extract Footsies binaries (default: /tmp/ray/binaries/footsies)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--win-rate-threshold",
|
||||
type=float,
|
||||
default=0.8,
|
||||
help="The main policy should have at least 'win-rate-threshold' win rate against the "
|
||||
"other policy to advance to the next level. Moving to the next level "
|
||||
"means adding a new policy to the mix.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--target-mix-size",
|
||||
type=int,
|
||||
default=5,
|
||||
help="Target number of policies (RLModules) in the mix to consider the test passed. "
|
||||
"The initial mix size is 2: 'main policy' vs. 'other'. "
|
||||
"`--target-mix-size=5` means that 3 new policies will be added to the mix. "
|
||||
"Whether to add new policy is decided by checking the '--win-rate-threshold' condition. ",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--rollout-fragment-length",
|
||||
type=int,
|
||||
default=256,
|
||||
help="The length of each rollout fragment to be collected by the EnvRunners when sampling.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--log-unity-output",
|
||||
action="store_true",
|
||||
help="Whether to log Unity output (from the game engine). Default is False.",
|
||||
default=False,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--render",
|
||||
action="store_true",
|
||||
default=False,
|
||||
help="Whether to render the Footsies environment. Default is False.",
|
||||
)
|
||||
|
||||
main_policy = "lstm"
|
||||
args = parser.parse_args()
|
||||
register_env(name="FootsiesEnv", env_creator=env_creator)
|
||||
|
||||
# Detect platform and choose appropriate binary
|
||||
binary_to_download = platform_for_binary_to_download(args.render)
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.reporting(
|
||||
min_time_s_per_iteration=30,
|
||||
)
|
||||
.environment(
|
||||
env="FootsiesEnv",
|
||||
env_config={
|
||||
"max_t": 1000,
|
||||
"frame_skip": 4,
|
||||
"observation_delay": 16,
|
||||
"train_start_port": args.train_start_port,
|
||||
"eval_start_port": args.eval_start_port,
|
||||
"host": "localhost",
|
||||
"binary_download_dir": args.binary_download_dir,
|
||||
"binary_extract_dir": args.binary_extract_dir,
|
||||
"binary_to_download": binary_to_download,
|
||||
"log_unity_output": args.log_unity_output,
|
||||
},
|
||||
)
|
||||
.learners(
|
||||
num_learners=1,
|
||||
num_cpus_per_learner=1,
|
||||
num_gpus_per_learner=0,
|
||||
num_aggregator_actors_per_learner=2,
|
||||
)
|
||||
.env_runners(
|
||||
env_runner_cls=MultiAgentEnvRunner,
|
||||
num_env_runners=args.num_env_runners or 1,
|
||||
num_cpus_per_env_runner=1,
|
||||
num_envs_per_env_runner=1,
|
||||
batch_mode="truncate_episodes",
|
||||
rollout_fragment_length=args.rollout_fragment_length,
|
||||
episodes_to_numpy=True,
|
||||
create_env_on_local_worker=False,
|
||||
)
|
||||
.training(
|
||||
train_batch_size_per_learner=4096 * (args.num_env_runners or 1),
|
||||
lr=1e-4,
|
||||
entropy_coeff=0.01,
|
||||
)
|
||||
.multi_agent(
|
||||
policies={
|
||||
main_policy,
|
||||
"noop",
|
||||
"back",
|
||||
},
|
||||
# this is a starting policy_mapping_fn
|
||||
# It will be updated by the MixManagerCallback during training.
|
||||
policy_mapping_fn=Matchmaker(
|
||||
[Matchup(main_policy, "noop", 1.0)]
|
||||
).agent_to_module_mapping_fn,
|
||||
# we only train the main policy, this doesn't change during training.
|
||||
policies_to_train=[main_policy],
|
||||
)
|
||||
.rl_module(
|
||||
rl_module_spec=MultiRLModuleSpec(
|
||||
rl_module_specs={
|
||||
main_policy: RLModuleSpec(
|
||||
module_class=LSTMContainingRLModuleWithTargetNetwork,
|
||||
model_config={
|
||||
"lstm_cell_size": 128,
|
||||
"dense_layers": [128, 128],
|
||||
"max_seq_len": 64,
|
||||
},
|
||||
),
|
||||
# for simplicity, all fixed RLModules are added to the config at the start.
|
||||
# However, only "noop" is used at the start of training,
|
||||
# the others are added to the mix later by the MixManagerCallback.
|
||||
"noop": RLModuleSpec(module_class=NoopFixedRLModule),
|
||||
"back": RLModuleSpec(module_class=BackFixedRLModule),
|
||||
},
|
||||
)
|
||||
)
|
||||
.evaluation(
|
||||
evaluation_num_env_runners=args.evaluation_num_env_runners or 1,
|
||||
evaluation_sample_timeout_s=120,
|
||||
evaluation_interval=1,
|
||||
evaluation_duration=10, # 10 episodes is enough to get a good win rate estimate
|
||||
evaluation_duration_unit="episodes",
|
||||
evaluation_parallel_to_training=False,
|
||||
# we may add new RLModules to the mix at the end of the evaluation stage.
|
||||
# Running evaluation in parallel may result in training for one more iteration on the old mix.
|
||||
evaluation_force_reset_envs_before_iteration=True,
|
||||
evaluation_config={
|
||||
"env_config": {"env-for-evaluation": True},
|
||||
}, # evaluation_config is used to add an argument to the env creator.
|
||||
)
|
||||
.callbacks(
|
||||
[
|
||||
functools.partial(
|
||||
MetricsLoggerCallback,
|
||||
main_policy=main_policy,
|
||||
),
|
||||
functools.partial(
|
||||
MixManagerCallback,
|
||||
win_rate_threshold=args.win_rate_threshold,
|
||||
main_policy=main_policy,
|
||||
target_mix_size=args.target_mix_size,
|
||||
starting_modules=[main_policy, "noop"],
|
||||
fixed_modules_progression_sequence=(
|
||||
"noop",
|
||||
"back",
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
stop = {
|
||||
NUM_ENV_STEPS_SAMPLED_LIFETIME: args.stop_timesteps,
|
||||
TRAINING_ITERATION: args.stop_iters,
|
||||
"mix_size": args.target_mix_size,
|
||||
}
|
||||
if __name__ == "__main__":
|
||||
from ray.rllib.utils.test_utils import run_rllib_example_script_experiment
|
||||
|
||||
results = run_rllib_example_script_experiment(
|
||||
base_config=config,
|
||||
args=args,
|
||||
stop=stop,
|
||||
success_metric={
|
||||
"mix_size": args.target_mix_size
|
||||
}, # pass the success metric for RLlib's testing framework
|
||||
)
|
||||
@@ -0,0 +1,110 @@
|
||||
import random
|
||||
|
||||
import gymnasium as gym
|
||||
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.connectors.env_to_module.frame_stacking import FrameStackingEnvToModule
|
||||
from ray.rllib.connectors.learner.frame_stacking import FrameStackingLearner
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.core.rl_module.multi_rl_module import MultiRLModuleSpec
|
||||
from ray.rllib.core.rl_module.rl_module import RLModuleSpec
|
||||
from ray.rllib.env.multi_agent_env import make_multi_agent
|
||||
from ray.rllib.env.wrappers.atari_wrappers import wrap_atari_for_new_api_stack
|
||||
from ray.rllib.examples.rl_modules.classes.random_rlm import RandomRLModule
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
|
||||
parser = add_rllib_example_script_args(
|
||||
default_reward=0.0,
|
||||
default_timesteps=20000000,
|
||||
default_iters=400,
|
||||
)
|
||||
parser.set_defaults(
|
||||
env="ale_py:ALE/Pong-v5",
|
||||
num_agents=2,
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
def _make_env_to_module_connector(env, spaces, device):
|
||||
return FrameStackingEnvToModule(num_frames=4, multi_agent=True)
|
||||
|
||||
|
||||
def _make_learner_connector(input_observation_space, input_action_space):
|
||||
return FrameStackingLearner(num_frames=4, multi_agent=True)
|
||||
|
||||
|
||||
def _env_creator(cfg):
|
||||
return wrap_atari_for_new_api_stack(
|
||||
gym.make(args.env, **cfg, **{"render_mode": "rgb_array"}),
|
||||
dim=64,
|
||||
framestack=None,
|
||||
)
|
||||
|
||||
|
||||
MultiAgentPong = make_multi_agent(_env_creator)
|
||||
NUM_POLICIES = 5
|
||||
main_spec = RLModuleSpec(
|
||||
model_config=DefaultModelConfig(
|
||||
vf_share_layers=True,
|
||||
conv_filters=[(16, 4, 2), (32, 4, 2), (64, 4, 2), (128, 4, 2)],
|
||||
conv_activation="relu",
|
||||
head_fcnet_hiddens=[256],
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment(
|
||||
MultiAgentPong,
|
||||
env_config={
|
||||
"num_agents": args.num_agents,
|
||||
# Make analogous to old v4 + NoFrameskip.
|
||||
"frameskip": 1,
|
||||
"full_action_space": False,
|
||||
"repeat_action_probability": 0.0,
|
||||
},
|
||||
clip_rewards=True,
|
||||
)
|
||||
.env_runners(
|
||||
env_to_module_connector=_make_env_to_module_connector,
|
||||
)
|
||||
.learners(
|
||||
num_aggregator_actors_per_learner=2,
|
||||
)
|
||||
.training(
|
||||
learner_connector=_make_learner_connector,
|
||||
train_batch_size_per_learner=500,
|
||||
target_network_update_freq=2,
|
||||
lr=0.0005 * ((args.num_learners or 1) ** 0.5),
|
||||
vf_loss_coeff=1.0,
|
||||
entropy_coeff=[[0, 0.01], [3000000, 0.0]], # <- crucial parameter to finetune
|
||||
# Only update connector states and model weights every n training_step calls.
|
||||
broadcast_interval=5,
|
||||
# learner_queue_size=1,
|
||||
circular_buffer_num_batches=4,
|
||||
circular_buffer_iterations_per_batch=2,
|
||||
)
|
||||
.rl_module(
|
||||
rl_module_spec=MultiRLModuleSpec(
|
||||
rl_module_specs=(
|
||||
{f"p{i}": main_spec for i in range(NUM_POLICIES)}
|
||||
| {"random": RLModuleSpec(module_class=RandomRLModule)}
|
||||
),
|
||||
),
|
||||
)
|
||||
.multi_agent(
|
||||
policies={f"p{i}" for i in range(NUM_POLICIES)} | {"random"},
|
||||
policy_mapping_fn=lambda aid, eps, **kw: (
|
||||
random.choice([f"p{i}" for i in range(NUM_POLICIES)] + ["random"])
|
||||
),
|
||||
policies_to_train=[f"p{i}" for i in range(NUM_POLICIES)],
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args)
|
||||
@@ -0,0 +1,61 @@
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.examples.envs.classes.multi_agent import MultiAgentStatelessCartPole
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
from ray.rllib.utils.metrics import (
|
||||
ENV_RUNNER_RESULTS,
|
||||
EPISODE_RETURN_MEAN,
|
||||
NUM_ENV_STEPS_SAMPLED_LIFETIME,
|
||||
)
|
||||
from ray.tune.registry import register_env
|
||||
|
||||
parser = add_rllib_example_script_args(default_timesteps=2000000)
|
||||
parser.set_defaults(
|
||||
num_agents=2,
|
||||
num_env_runners=6,
|
||||
)
|
||||
# Use `parser` to add your own custom command line options to this script
|
||||
# and (if needed) use their values to set up `config` below.
|
||||
args = parser.parse_args()
|
||||
|
||||
register_env("env", lambda cfg: MultiAgentStatelessCartPole(config=cfg))
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment("env", env_config={"num_agents": args.num_agents})
|
||||
# TODO (sven): Need to fix the MeanStdFilter(). It seems to cause NaNs when
|
||||
# training.
|
||||
# .env_runners(
|
||||
# env_to_module_connector=lambda env, spaces, device: MeanStdFilter(multi_agent=True),
|
||||
# )
|
||||
.training(
|
||||
train_batch_size_per_learner=600,
|
||||
lr=0.0005 * ((args.num_learners or 1) ** 0.5),
|
||||
num_epochs=1,
|
||||
vf_loss_coeff=0.05,
|
||||
entropy_coeff=0.005,
|
||||
)
|
||||
.rl_module(
|
||||
model_config=DefaultModelConfig(
|
||||
vf_share_layers=True,
|
||||
use_lstm=True,
|
||||
max_seq_len=20,
|
||||
),
|
||||
)
|
||||
.multi_agent(
|
||||
policy_mapping_fn=(lambda agent_id, episode, **kwargs: f"p{agent_id}"),
|
||||
policies={f"p{i}" for i in range(args.num_agents)},
|
||||
)
|
||||
)
|
||||
|
||||
stop = {
|
||||
f"{ENV_RUNNER_RESULTS}/{EPISODE_RETURN_MEAN}": 150.0 * args.num_agents,
|
||||
NUM_ENV_STEPS_SAMPLED_LIFETIME: args.stop_timesteps,
|
||||
}
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args, stop=stop)
|
||||
@@ -0,0 +1,48 @@
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
|
||||
parser = add_rllib_example_script_args(
|
||||
default_reward=-300.0,
|
||||
default_timesteps=100000000,
|
||||
)
|
||||
parser.set_defaults(
|
||||
num_env_runners=4,
|
||||
)
|
||||
# Use `parser` to add your own custom command line options to this script
|
||||
# and (if needed) use their values to set up `config` below.
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment("Pendulum-v1")
|
||||
.env_runners(
|
||||
num_envs_per_env_runner=20,
|
||||
)
|
||||
.learners(num_learners=1)
|
||||
.training(
|
||||
train_batch_size_per_learner=500,
|
||||
circular_buffer_num_batches=16,
|
||||
circular_buffer_iterations_per_batch=10,
|
||||
target_network_update_freq=2,
|
||||
clip_param=0.4,
|
||||
lr=0.0003,
|
||||
gamma=0.95,
|
||||
lambda_=0.5,
|
||||
entropy_coeff=0.0,
|
||||
use_kl_loss=True,
|
||||
kl_coeff=1.0,
|
||||
kl_target=0.04,
|
||||
)
|
||||
.rl_module(
|
||||
model_config=DefaultModelConfig(fcnet_activation="relu"),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args)
|
||||
@@ -0,0 +1,87 @@
|
||||
import gymnasium as gym
|
||||
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.connectors.env_to_module.frame_stacking import FrameStackingEnvToModule
|
||||
from ray.rllib.connectors.learner.frame_stacking import FrameStackingLearner
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.env.wrappers.atari_wrappers import wrap_atari_for_new_api_stack
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
from ray.tune.registry import register_env
|
||||
|
||||
parser = add_rllib_example_script_args(
|
||||
default_reward=20.0,
|
||||
default_timesteps=10_000_000,
|
||||
)
|
||||
parser.set_defaults(
|
||||
env="ale_py:ALE/Pong-v5",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
def _make_env_to_module_connector(env, spaces, device):
|
||||
return FrameStackingEnvToModule(num_frames=4)
|
||||
|
||||
|
||||
def _make_learner_connector(input_observation_space, input_action_space):
|
||||
return FrameStackingLearner(num_frames=4)
|
||||
|
||||
|
||||
def _env_creator(cfg):
|
||||
return wrap_atari_for_new_api_stack(
|
||||
gym.make(args.env, **cfg, **{"render_mode": "rgb_array"}),
|
||||
dim=64,
|
||||
framestack=None,
|
||||
)
|
||||
|
||||
|
||||
register_env("env", _env_creator)
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment(
|
||||
"env",
|
||||
env_config={
|
||||
# Make analogous to old v4 + NoFrameskip.
|
||||
"frameskip": 1,
|
||||
"full_action_space": False,
|
||||
"repeat_action_probability": 0.0,
|
||||
},
|
||||
clip_rewards=True,
|
||||
)
|
||||
.env_runners(
|
||||
env_to_module_connector=_make_env_to_module_connector,
|
||||
num_envs_per_env_runner=2,
|
||||
)
|
||||
.learners(
|
||||
num_aggregator_actors_per_learner=2,
|
||||
)
|
||||
.training(
|
||||
learner_connector=_make_learner_connector,
|
||||
train_batch_size_per_learner=500,
|
||||
target_network_update_freq=2,
|
||||
lr=0.0005 * ((args.num_learners or 1) ** 0.5),
|
||||
vf_loss_coeff=1.0,
|
||||
entropy_coeff=[[0, 0.01], [3000000, 0.0]], # <- crucial parameter to finetune
|
||||
# Only update connector states and model weights every n training_step calls.
|
||||
broadcast_interval=5,
|
||||
# learner_queue_size=1,
|
||||
circular_buffer_num_batches=4,
|
||||
circular_buffer_iterations_per_batch=2,
|
||||
)
|
||||
.rl_module(
|
||||
model_config=DefaultModelConfig(
|
||||
vf_share_layers=True,
|
||||
conv_filters=[(16, 4, 2), (32, 4, 2), (64, 4, 2), (128, 4, 2)],
|
||||
conv_activation="relu",
|
||||
head_fcnet_hiddens=[256],
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args)
|
||||
@@ -0,0 +1,47 @@
|
||||
from ray.rllib.algorithms.appo import APPOConfig
|
||||
from ray.rllib.connectors.env_to_module.mean_std_filter import MeanStdFilter
|
||||
from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig
|
||||
from ray.rllib.examples.envs.classes.stateless_cartpole import StatelessCartPole
|
||||
from ray.rllib.examples.utils import (
|
||||
add_rllib_example_script_args,
|
||||
run_rllib_example_script_experiment,
|
||||
)
|
||||
|
||||
parser = add_rllib_example_script_args(
|
||||
default_timesteps=2000000,
|
||||
default_reward=300.0,
|
||||
)
|
||||
parser.set_defaults(
|
||||
num_env_runners=3,
|
||||
)
|
||||
# Use `parser` to add your own custom command line options to this script
|
||||
# and (if needed) use their values to set up `config` below.
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
config = (
|
||||
APPOConfig()
|
||||
.environment(StatelessCartPole)
|
||||
.env_runners(
|
||||
env_to_module_connector=lambda env, spaces, device: MeanStdFilter(),
|
||||
)
|
||||
.training(
|
||||
lr=0.0005 * ((args.num_learners or 1) ** 0.5),
|
||||
num_epochs=1,
|
||||
vf_loss_coeff=0.05,
|
||||
entropy_coeff=0.005,
|
||||
use_circular_buffer=False,
|
||||
broadcast_interval=10,
|
||||
)
|
||||
.rl_module(
|
||||
model_config=DefaultModelConfig(
|
||||
vf_share_layers=True,
|
||||
use_lstm=True,
|
||||
max_seq_len=20,
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_rllib_example_script_experiment(config, args)
|
||||
Reference in New Issue
Block a user