def test_initialize_invalid_trainer_raises_exception(BrainParametersMock, dummy_bad_config): run_id = "testrun" output_path = "results_dir" keep_checkpoints = 1 train_model = True load_model = False seed = 11 bad_config = dummy_bad_config BrainParametersMock.return_value.brain_name = "testbrain" external_brains = {"testbrain": BrainParametersMock()} with pytest.raises(TrainerConfigError): trainer_factory = trainer_util.TrainerFactory( trainer_config=bad_config, run_id=run_id, output_path=output_path, keep_checkpoints=keep_checkpoints, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for brain_name, brain_parameters in external_brains.items(): trainers[brain_name] = trainer_factory.generate( brain_parameters.brain_name) # Test no trainer specified del bad_config["default"]["trainer"] with pytest.raises(TrainerConfigError): trainer_factory = trainer_util.TrainerFactory( trainer_config=bad_config, run_id=run_id, output_path=output_path, keep_checkpoints=keep_checkpoints, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for brain_name, brain_parameters in external_brains.items(): trainers[brain_name] = trainer_factory.generate( brain_parameters.brain_name) # Test BC trainer specified bad_config["default"]["trainer"] = "offline_bc" with pytest.raises(UnityTrainerException): trainer_factory = trainer_util.TrainerFactory( trainer_config=bad_config, run_id=run_id, output_path=output_path, keep_checkpoints=keep_checkpoints, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for brain_name, brain_parameters in external_brains.items(): trainers[brain_name] = trainer_factory.generate( brain_parameters.brain_name)
def test_raise_if_no_config_for_brain(dummy_config): """ Make sure the trainer setup raises a friendlier exception if both "default" and the brain name are missing from the config. """ brain_name = "testbrain" bad_config = {"some_other_brain": dummy_config["default"]} brain_parameters = BrainParameters( brain_name=brain_name, vector_observation_space_size=1, camera_resolutions=[], vector_action_space_size=[2], vector_action_descriptions=[], vector_action_space_type=0, ) trainer_factory = trainer_util.TrainerFactory( trainer_config=bad_config, summaries_dir="test_dir", run_id="testrun", model_path="model_dir", keep_checkpoints=1, train_model=True, load_model=False, seed=42, ) with pytest.raises(TrainerConfigError): trainer_factory.generate(brain_parameters)
def test_handles_no_default_section(dummy_config): """ Make sure the trainer setup handles a missing "default" in the config. """ brain_name = "testbrain" no_default_config = {brain_name: dummy_config["default"]} brain_parameters = BrainParameters( brain_name=brain_name, vector_observation_space_size=1, camera_resolutions=[], vector_action_space_size=[2], vector_action_descriptions=[], vector_action_space_type=0, ) trainer_factory = trainer_util.TrainerFactory( trainer_config=no_default_config, summaries_dir="test_dir", run_id="testrun", model_path="model_dir", keep_checkpoints=1, train_model=True, load_model=False, seed=42, ) trainer_factory.generate(brain_parameters.brain_name)
def test_initialize_invalid_trainer_raises_exception(BrainParametersMock, dummy_bad_config): summaries_dir = "test_dir" run_id = "testrun" model_path = "model_dir" keep_checkpoints = 1 train_model = True load_model = False seed = 11 bad_config = dummy_bad_config BrainParametersMock.return_value.brain_name = "testbrain" external_brains = {"testbrain": BrainParametersMock()} with pytest.raises(TrainerConfigError): trainer_factory = trainer_util.TrainerFactory( trainer_config=bad_config, summaries_dir=summaries_dir, run_id=run_id, model_path=model_path, keep_checkpoints=keep_checkpoints, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for brain_name, brain_parameters in external_brains.items(): trainers[brain_name] = trainer_factory.generate( brain_parameters.brain_name)
def test_initialize_trainer_parameters_override_defaults( BrainParametersMock, dummy_config_with_override): summaries_dir = "test_dir" run_id = "testrun" model_path = "model_dir" keep_checkpoints = 1 train_model = True load_model = False seed = 11 expected_reward_buff_cap = 1 base_config = dummy_config_with_override expected_config = base_config["default"] expected_config["summary_path"] = f"{run_id}_testbrain" expected_config["model_path"] = model_path + "/testbrain" expected_config["keep_checkpoints"] = keep_checkpoints # Override value from specific brain config expected_config["normalize"] = False brain_params_mock = BrainParametersMock() BrainParametersMock.return_value.brain_name = "testbrain" external_brains = {"testbrain": brain_params_mock} def mock_constructor( self, brain, reward_buff_cap, trainer_parameters, training, load, seed, run_id, multi_gpu, ): assert brain == brain_params_mock assert trainer_parameters == expected_config assert reward_buff_cap == expected_reward_buff_cap assert training == train_model assert load == load_model assert seed == seed assert run_id == run_id assert multi_gpu == multi_gpu with patch.object(PPOTrainer, "__init__", mock_constructor): trainer_factory = trainer_util.TrainerFactory( trainer_config=base_config, summaries_dir=summaries_dir, run_id=run_id, model_path=model_path, keep_checkpoints=keep_checkpoints, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for _, brain_parameters in external_brains.items(): trainers["testbrain"] = trainer_factory.generate(brain_parameters) assert "testbrain" in trainers assert isinstance(trainers["testbrain"], PPOTrainer)
def test_handles_no_config_provided(): """ Make sure the trainer setup handles no configs provided at all. """ brain_name = "testbrain" no_default_config = RunOptions().behaviors trainer_factory = trainer_util.TrainerFactory( trainer_config=no_default_config, output_path="output_path", train_model=True, load_model=False, seed=42, ) trainer_factory.generate(brain_name)
def test_initialize_ppo_trainer(BrainParametersMock, dummy_config): brain_params_mock = BrainParametersMock() BrainParametersMock.return_value.brain_name = "testbrain" external_brains = {"testbrain": BrainParametersMock()} summaries_dir = "test_dir" run_id = "testrun" model_path = "model_dir" keep_checkpoints = 1 train_model = True load_model = False seed = 11 expected_reward_buff_cap = 1 base_config = dummy_config expected_config = base_config["default"] expected_config["summary_path"] = f"{run_id}_testbrain" expected_config["model_path"] = model_path + "/testbrain" expected_config["keep_checkpoints"] = keep_checkpoints def mock_constructor(self, brain, reward_buff_cap, trainer_parameters, training, load, seed, run_id): assert brain == brain_params_mock.brain_name assert trainer_parameters == expected_config assert reward_buff_cap == expected_reward_buff_cap assert training == train_model assert load == load_model assert seed == seed assert run_id == run_id with patch.object(PPOTrainer, "__init__", mock_constructor): trainer_factory = trainer_util.TrainerFactory( trainer_config=base_config, summaries_dir=summaries_dir, run_id=run_id, model_path=model_path, keep_checkpoints=keep_checkpoints, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for brain_name, brain_parameters in external_brains.items(): trainers[brain_name] = trainer_factory.generate( brain_parameters.brain_name) assert "testbrain" in trainers assert isinstance(trainers["testbrain"], PPOTrainer)
def test_initialize_ppo_trainer(BrainParametersMock, dummy_config): brain_params_mock = BrainParametersMock() BrainParametersMock.return_value.brain_name = "testbrain" external_brains = {"testbrain": BrainParametersMock()} output_path = "results_dir" train_model = True load_model = False seed = 11 expected_reward_buff_cap = 1 base_config = dummy_config.behaviors expected_config = PPO_CONFIG def mock_constructor( self, brain, reward_buff_cap, trainer_settings, training, load, seed, artifact_path, ): assert brain == brain_params_mock.brain_name assert trainer_settings == expected_config assert reward_buff_cap == expected_reward_buff_cap assert training == train_model assert load == load_model assert seed == seed assert artifact_path == os.path.join(output_path, brain_name) with patch.object(PPOTrainer, "__init__", mock_constructor): trainer_factory = trainer_util.TrainerFactory( trainer_config=base_config, output_path=output_path, train_model=train_model, load_model=load_model, seed=seed, ) trainers = {} for brain_name, brain_parameters in external_brains.items(): trainers[brain_name] = trainer_factory.generate( brain_parameters.brain_name) assert "testbrain" in trainers assert isinstance(trainers["testbrain"], PPOTrainer)
def test_initialize_ppo_trainer(BehaviorSpecMock, dummy_config): brain_name = "testbrain" training_behaviors = {"testbrain": BehaviorSpecMock()} output_path = "results_dir" train_model = True load_model = False seed = 11 expected_reward_buff_cap = 1 base_config = dummy_config.behaviors expected_config = ppo_dummy_config() def mock_constructor( self, brain, reward_buff_cap, trainer_settings, training, load, seed, artifact_path, ): assert brain == brain_name assert trainer_settings == expected_config assert reward_buff_cap == expected_reward_buff_cap assert training == train_model assert load == load_model assert seed == seed assert artifact_path == os.path.join(output_path, brain_name) with patch.object(PPOTrainer, "__init__", mock_constructor): trainer_factory = trainer_util.TrainerFactory( trainer_config=base_config, output_path=output_path, train_model=train_model, load_model=load_model, seed=seed, param_manager=EnvironmentParameterManager(), ) trainers = {} for brain_name in training_behaviors.keys(): trainers[brain_name] = trainer_factory.generate(brain_name) assert "testbrain" in trainers assert isinstance(trainers["testbrain"], PPOTrainer)
def test_handles_no_config_provided(BrainParametersMock): """ Make sure the trainer setup handles no configs provided at all. """ brain_name = "testbrain" no_default_config = RunOptions().behaviors brain_parameters = BrainParameters( brain_name=brain_name, vector_observation_space_size=1, camera_resolutions=[], vector_action_space_size=[2], vector_action_descriptions=[], vector_action_space_type=0, ) trainer_factory = trainer_util.TrainerFactory( trainer_config=no_default_config, output_path="output_path", train_model=True, load_model=False, seed=42, ) trainer_factory.generate(brain_parameters.brain_name)