コード例 #1
0
ファイル: regevo.py プロジェクト: bigwater/deephyper
    def __init__(self,
                 problem,
                 run,
                 evaluator,
                 population_size=100,
                 sample_size=10,
                 **kwargs):

        super().__init__(problem=problem,
                         run=run,
                         evaluator=evaluator,
                         **kwargs)

        self.free_workers = self.evaluator.num_workers

        print('population_size = ', population_size)

        dhlogger.info(
            jm(
                type="start_infos",
                alg="aging-evolution",
                nworkers=self.evaluator.num_workers,
                encoded_space=json.dumps(self.problem.space, cls=Encoder),
            ))

        # Setup
        self.pb_dict = self.problem.space
        search_space = self.problem.build_search_space()

        self.space_list = [(0, vnode.num_ops - 1)
                           for vnode in search_space.variable_nodes]
        self.population_size = int(population_size)
        self.sample_size = int(sample_size)
コード例 #2
0
    def __init__(self, problem, run, evaluator, **kwargs):

        super().__init__(problem=problem, run=run, evaluator=evaluator, **kwargs)

        seed(self.problem.seed)

        if evaluator == "balsam":
            balsam_launcher_nodes = int(os.environ.get("BALSAM_LAUNCHER_NODES", 1))
            deephyper_workers_per_node = int(
                os.environ.get("DEEPHYPER_WORKERS_PER_NODE", 1)
            )
            n_free_nodes = balsam_launcher_nodes - 1  # Number of free nodes
            self.free_workers = (
                n_free_nodes * deephyper_workers_per_node
            )  # Number of free workers
        else:
            self.free_workers = 1

        dhlogger.info(
            jm(
                type="start_infos",
                alg="rtg_pg",
                nworkers=self.free_workers,
                encoded_space=json.dumps(self.problem.space, cls=Encoder),
            )
        )
コード例 #3
0
ファイル: full_random.py プロジェクト: stjordanis/deephyper
    def __init__(self, problem, run, evaluator, **kwargs):

        super().__init__(problem=problem,
                         run=run,
                         evaluator=evaluator,
                         **kwargs)

        seed(self.problem.seed)

        if evaluator == 'balsam':
            balsam_launcher_nodes = int(
                os.environ.get('BALSAM_LAUNCHER_NODES', 1))
            deephyper_workers_per_node = int(
                os.environ.get('DEEPHYPER_WORKERS_PER_NODE', 1))
            n_free_nodes = balsam_launcher_nodes - 1  # Number of free nodes
            self.free_workers = n_free_nodes * \
                deephyper_workers_per_node  # Number of free workers
        else:
            self.free_workers = 1

        dhlogger.info(
            jm(type='start_infos',
               alg='random',
               nworkers=self.free_workers,
               encoded_space=json.dumps(self.problem.space, cls=Encoder)))
コード例 #4
0
ファイル: ambs.py プロジェクト: bigwater/deephyper
    def __init__(
        self,
        problem,
        run,
        evaluator,
        surrogate_model="RF",
        acq_func="LCB",
        kappa=1.96,
        xi=0.001,
        liar_strategy="cl_min",
        n_jobs=1,
        **kwargs,
    ):
        super().__init__(problem, run, evaluator, **kwargs)
        dhlogger.info("Initializing AMBNAS")

        dhlogger.info(
            jm(
                type="start_infos",
                alg="ambs",
                nworkers=self.evaluator.num_workers,
                encoded_space=json.dumps(self.problem.space, cls=Encoder),
            )
        )
        dhlogger.info(f"kappa={kappa}, xi={xi}")

        self.n_initial_points = self.evaluator.num_workers
        self.liar_strategy = liar_strategy

        # Building search space for SkOptimizer using ConfigSpace
        search_space = self.problem.build_search_space()

        # print('ambs.py .....................', self.problem)


        skopt_space = cs.ConfigurationSpace(seed=self.problem.seed)
        for i, vnode in enumerate(search_space.variable_nodes):
            print(f'vnode{i}.num_ops ==== {vnode.num_ops}')

            hp = csh.UniformIntegerHyperparameter(
                name=f"vnode_{i:05d}", lower=0, upper=(vnode.num_ops - 1)
            )
            skopt_space.add_hyperparameter(hp)
        

        # dhlogger.info(f'hyliu --------------------------- {skopt_space}')

        self.opt = skopt.Optimizer(
            dimensions=skopt_space,
            base_estimator=self.get_surrogate_model(surrogate_model, n_jobs),
            acq_func=acq_func,
            acq_optimizer="sampling",
            acq_func_kwargs={"xi": xi, "kappa": kappa},
            n_initial_points=self.n_initial_points,
            random_state=self.problem.seed,
        )
コード例 #5
0
ファイル: ambs.py プロジェクト: bigwater/deephyper
    def main(self):
        # timer = util.DelayTimer(max_minutes=None, period=SERVICE_PERIOD)
        # chkpoint_counter = 0

        num_evals_done = 0

        # Filling available nodes at start
        dhlogger.info(f"Generating {self.evaluator.num_workers} initial points...")
        self.evaluator.add_eval_batch(self.get_random_batch(size=self.n_initial_points))
        
        dhlogger.info(f'max eval = {self.max_evals}')

        print(self.problem.space)

        # Main loop
        while num_evals_done < self.max_evals:

            # Collecting finished evaluations
            new_results = list(self.evaluator.get_finished_evals())

            if len(new_results) > 0:
                stats = {"num_cache_used": self.evaluator.stats["num_cache_used"]}
                dhlogger.info(jm(type="env_stats", **stats))
                self.evaluator.dump_evals(saved_key="arch_seq")

                num_received = len(new_results)
                num_evals_done += num_received

                # Transform configurations to list to fit optimizer
                opt_X = []
                opt_y = []
                for cfg, obj_dict in new_results:
                    x = replace_nan(cfg["arch_seq"])
                    opt_X.append(x)
                    # assert('result' in obj_dict)

                    if type(obj_dict) is dict:
                        obj = obj_dict['result']
                    else:
                        obj = obj_dict
                    
                    opt_y.append(-obj)  #! maximizing

                self.opt.tell(opt_X, opt_y)  #! fit: costly
                new_X = self.opt.ask(
                    n_points=len(new_results), strategy=self.liar_strategy
                )

                new_batch = []
                for x in new_X:
                    new_cfg = self.to_dict(x)
                    new_batch.append(new_cfg)

                # submit_childs
                if len(new_results) > 0:
                    self.evaluator.add_eval_batch(new_batch)
コード例 #6
0
    def main(self):

        num_evals_done = 0

        # Filling available nodes at start
        self.evaluator.add_eval_batch(
            self.gen_random_batch(size=self.free_workers))

        # Main loop
        while num_evals_done < self.max_evals:

            # Collecting finished evaluations
            new_results = list(self.evaluator.get_finished_evals())

            if len(new_results) > 0:
                stats = {
                    "num_cache_used": self.evaluator.stats["num_cache_used"]
                }
                dhlogger.info(jm(type="env_stats", **stats))
                self.evaluator.dump_evals(saved_keys=self.saved_keys)

                num_received = len(new_results)
                num_evals_done += num_received

                # Transform configurations to list to fit optimizer
                opt_X = []
                opt_y = []
                for cfg, obj in new_results:
                    h = [
                        cfg["hyperparameters"]["learning_rate"],
                        cfg["hyperparameters"]["batch_size"],
                        cfg["hyperparameters"]["ranks_per_node"],
                    ]
                    h.extend(cfg["arch_seq"])
                    opt_X.append(h)
                    opt_y.append(-obj)

                self.opt.tell(opt_X, opt_y)  #! fit: costly
                new_X = self.opt.ask(n_points=len(new_results))

                new_batch = []
                for x in new_X:
                    new_cfg = copy.deepcopy(self.pb_dict)

                    new_cfg["hyperparameters"]["learning_rate"] = x[0]
                    new_cfg["hyperparameters"]["batch_size"] = x[1]
                    new_cfg["hyperparameters"]["ranks_per_node"] = x[2]

                    new_cfg["arch_seq"] = x[self.size_ha:]

                    new_batch.append(new_cfg)

                # submit_childs
                if len(new_results) > 0:
                    self.evaluator.add_eval_batch(new_batch)
コード例 #7
0
    def main(self):

        num_evals_done = 0
        population = collections.deque(maxlen=self.population_size)

        # Filling available nodes at start
        self.evaluator.add_eval_batch(
            self.gen_random_batch(size=self.free_workers))

        # Main loop
        while num_evals_done < self.max_evals:

            # Collecting finished evaluations
            new_results = list(self.evaluator.get_finished_evals())

            if len(new_results) > 0:
                population.extend(new_results)
                stats = {
                    "num_cache_used": self.evaluator.stats["num_cache_used"]
                }
                dhlogger.info(jm(type="env_stats", **stats))
                self.evaluator.dump_evals(saved_keys=self.saved_keys)

                num_received = len(new_results)
                num_evals_done += num_received

                # If the population is big enough evolve the population
                if len(population) == self.population_size:
                    children_batch = []

                    # For each new parent/result we create a child from it
                    for _ in range(len(new_results)):
                        # select_sample
                        indexes = np.random.choice(self.population_size,
                                                   self.sample_size,
                                                   replace=False)
                        sample = [population[i] for i in indexes]

                        # select_parent
                        parent = self.select_parent(sample)

                        # copy_mutate_parent
                        child = self.copy_mutate_arch(parent)
                        # add child to batch
                        children_batch.append(child)

                    # submit_childs
                    if len(new_results) > 0:
                        self.evaluator.add_eval_batch(children_batch)
                else:  # If the population is too small keep increasing it

                    new_batch = self.gen_random_batch(size=len(new_results))

                    self.evaluator.add_eval_batch(new_batch)
コード例 #8
0
    def __init__(self, problem, run, evaluator, **kwargs):
        super().__init__(problem=problem,
                         run=run,
                         evaluator=evaluator,
                         **kwargs)

        self.free_workers = self.evaluator.num_workers

        dhlogger.info(
            jm(
                type="start_infos",
                alg="bayesian-optimization-for-hpo-nas",
                nworkers=self.evaluator.num_workers,
                encoded_space=json.dumps(self.problem.space, cls=Encoder),
            ))

        # Setup
        self.pb_dict = self.problem.space
        cs_kwargs = self.pb_dict["create_search_space"].get("kwargs")
        if cs_kwargs is None:
            search_space = self.pb_dict["create_search_space"]["func"]()
        else:
            search_space = self.pb_dict["create_search_space"]["func"](
                **cs_kwargs)

        self.space_list = [(0, vnode.num_ops - 1)
                           for vnode in search_space.variable_nodes]

        # Initialize Hyperaparameter space
        self.dimensions = []
        self.size_ha = None  # Number of algorithm hyperparameters in the dimension list
        self.add_ha_dimensions()
        self.add_hm_dimensions()

        # Initialize opitmizer of hyperparameter space
        # acq_func_kwargs = {"xi": 0.000001, "kappa": 0.001}  # tiny exploration
        acq_func_kwargs = {"xi": 0.000001, "kappa": 1.96}  # tiny exploration
        self.n_initial_points = self.free_workers

        self.opt = SkOptimizer(
            dimensions=self.dimensions,
            base_estimator=RandomForestRegressor(n_jobs=32),
            # base_estimator=RandomForestRegressor(n_jobs=4),
            acq_func="LCB",
            acq_optimizer="sampling",
            acq_func_kwargs=acq_func_kwargs,
            n_initial_points=self.n_initial_points,
            # model_queue_size=100,
        )
コード例 #9
0
ファイル: ambsmixed.py プロジェクト: lkampoli/deephyper
    def main(self):

        num_evals_done = 0

        # Filling available nodes at start
        dhlogger.info(
            f"Generating {self.evaluator.num_workers} initial points...")
        self.evaluator.add_eval_batch(
            self.get_random_batch(size=self.n_initial_points))

        # Main loop
        while num_evals_done < self.max_evals:

            # Collecting finished evaluations
            new_results = list(self.evaluator.get_finished_evals())

            if len(new_results) > 0:
                stats = {
                    "num_cache_used": self.evaluator.stats["num_cache_used"]
                }
                dhlogger.info(jm(type="env_stats", **stats))
                self.evaluator.dump_evals(saved_keys=self.saved_keys)

                num_received = len(new_results)
                num_evals_done += num_received

                # Transform configurations to list to fit optimizer
                opt_X = []
                opt_y = []
                for cfg, obj in new_results:
                    arch_seq = cfg["arch_seq"]
                    hp_val = self.problem.extract_hp_values(cfg)
                    x = replace_nan(hp_val + arch_seq)
                    opt_X.append(x)
                    opt_y.append(-obj)  #! maximizing

                self.opt.tell(opt_X, opt_y)  #! fit: costly
                new_X = self.opt.ask(n_points=len(new_results),
                                     strategy=self.liar_strategy)

                new_batch = []
                for x in new_X:
                    new_cfg = self.problem.gen_config(x[self.hp_size:],
                                                      x[:self.hp_size])
                    new_batch.append(new_cfg)

                # submit_childs
                if len(new_results) > 0:
                    self.evaluator.add_eval_batch(new_batch)
コード例 #10
0
ファイル: full_random.py プロジェクト: xclmj/deephyper
    def __init__(self, problem, run, evaluator, **kwargs):

        super().__init__(problem=problem, run=run, evaluator=evaluator, **kwargs)

        seed(self.problem.seed)

        self.free_workers = self.evaluator.num_workers

        dhlogger.info(
            jm(
                type="start_infos",
                alg="random",
                nworkers=self.evaluator.num_workers,
                encoded_space=json.dumps(self.problem.space, cls=Encoder),
            )
        )
コード例 #11
0
    def step_wait(self):
        obs = [
            np.array([float(action_seq[-1])])
            for action_seq in self.action_buffers
        ]

        if len(self.action_buffers[0]) < self.num_actions_per_env:
            # Results are already known here...
            rews = [0 for _ in self.action_buffers]
            dones = [False for _ in self.action_buffers]
            infos = {}
        else:
            # Waiting results from balsam
            results = self.evaluator.await_evals(
                self.eval_uids)  # Not blocking
            rews = [rew for cfg, rew in results]  # Blocking generator

            self.stats["batch_computation"] = (time.time() -
                                               self.stats["batch_computation"])
            self.stats["num_cache_used"] = self.evaluator.stats[
                "num_cache_used"]
            self.stats["rank"] = MPI.COMM_WORLD.Get_rank(
            ) if MPI is not None else 0

            dones = [True for _ in rews]
            infos = [{
                "episode": {
                    "r": r,
                    "l": self.num_actions_per_env
                }
                for r in rews
            }]  # TODO

            self.stats["rewards"] = rews
            self.stats["arch_seq"] = (np.array(self.action_buffers) /
                                      self.structure.max_num_ops).tolist()

            dhlogger.info(jm(type="env_stats", **self.stats))

            self.reset()

        return np.stack(obs), np.array(rews), np.array(dones), infos
コード例 #12
0
    def __init__(self,
                 problem,
                 run,
                 evaluator,
                 surrogate_model="RF",
                 liar_strategy="cl_max",
                 acq_func="gp_hedge",
                 n_jobs=-1,
                 **kwargs):

        super().__init__(problem=problem,
                         run=run,
                         evaluator=evaluator,
                         **kwargs)

        if evaluator == 'balsam':
            balsam_launcher_nodes = int(
                os.environ.get('BALSAM_LAUNCHER_NODES', 1))
            deephyper_workers_per_node = int(
                os.environ.get('DEEPHYPER_WORKERS_PER_NODE', 1))
            n_free_nodes = balsam_launcher_nodes - 1  # Number of free nodes
            self.free_workers = n_free_nodes * \
                deephyper_workers_per_node  # Number of free workers
        else:
            self.free_workers = 1

        dhlogger.info(
            jm(type='start_infos',
               alg='ambs-nas',
               nworkers=self.free_workers,
               encoded_space=json.dumps(self.problem.space, cls=Encoder)))

        dhlogger.info("Initializing AMBS")
        self.optimizer = Optimizer(self.problem,
                                   self.num_workers,
                                   surrogate_model=surrogate_model,
                                   liar_strategy=liar_strategy,
                                   acq_func=acq_func,
                                   n_jobs=n_jobs,
                                   **kwargs)
コード例 #13
0
    def step_wait(self):
        obs = [np.array([float(action_seq[-1])])
                for action_seq in self.action_buffers]

        if len(self.action_buffers[0]) < self.num_actions_per_env:
            # Results are already known here...
            rews = [0 for _ in self.action_buffers]
            dones = [False for _ in self.action_buffers]
            infos = {}
        else:
            # Waiting results from balsam
            results = self.evaluator.await_evals(
                self.eval_uids)  # Not blocking
            rews = [rew for cfg, rew in results]  # Blocking generator

            self.stats['batch_computation'] = time.time() - \
                self.stats['batch_computation']
            self.stats['num_cache_used'] = self.evaluator.stats['num_cache_used']
            self.stats['rank'] = MPI.COMM_WORLD.Get_rank(
            ) if MPI is not None else 0

            dones = [True for _ in rews]
            infos = [{
                'episode': {
                    'r': r,
                    'l': self.num_actions_per_env
                } for r in rews}]  # TODO

            self.stats['rewards'] = rews
            self.stats['arch_seq'] = self.action_buffers

            dhlogger.info(jm(type='env_stats', **self.stats))

            self.reset()

        return np.stack(obs), np.array(rews), np.array(dones), infos
コード例 #14
0
ファイル: regevo.py プロジェクト: xclmj/deephyper
    def __init__(self,
                 problem,
                 run,
                 evaluator,
                 population_size=100,
                 sample_size=10,
                 **kwargs):

        super().__init__(problem=problem,
                         run=run,
                         evaluator=evaluator,
                         **kwargs)

        self.free_workers = self.evaluator.num_workers

        dhlogger.info(
            jm(
                type="start_infos",
                alg="aging-evolution",
                nworkers=self.evaluator.num_workers,
                encoded_space=json.dumps(self.problem.space, cls=Encoder),
            ))

        # Setup
        self.pb_dict = self.problem.space
        cs_kwargs = self.pb_dict["create_search_space"].get("kwargs")
        if cs_kwargs is None:
            search_space = self.pb_dict["create_search_space"]["func"]()
        else:
            search_space = self.pb_dict["create_search_space"]["func"](
                **cs_kwargs)

        self.space_list = [(0, vnode.num_ops - 1)
                           for vnode in search_space.variable_nodes]
        self.population_size = population_size
        self.sample_size = sample_size
コード例 #15
0
ファイル: regevo.py プロジェクト: stjordanis/deephyper
    def __init__(self, problem, run, evaluator,
        population_size=100,
        sample_size=10,
        **kwargs):

        if evaluator == 'balsam':  # TODO: async is a kw
            balsam_launcher_nodes = int(
                os.environ.get('BALSAM_LAUNCHER_NODES', 1))
            deephyper_workers_per_node = int(
                os.environ.get('DEEPHYPER_WORKERS_PER_NODE', 1))
            n_free_nodes = balsam_launcher_nodes - 1  # Number of free nodes
            self.free_workers = n_free_nodes * \
                deephyper_workers_per_node  # Number of free workers
        else:
            self.free_workers = 1

        super().__init__(problem=problem, run=run, evaluator=evaluator, **kwargs)

        dhlogger.info(jm(
            type='start_infos',
            alg='aging-evolution',
            nworkers=self.free_workers,
            encoded_space=json.dumps(self.problem.space, cls=Encoder)
            ))

        # Setup
        self.pb_dict = self.problem.space
        cs_kwargs = self.pb_dict['create_search_space'].get('kwargs')
        if cs_kwargs is None:
            search_space = self.pb_dict['create_search_space']['func']()
        else:
            search_space = self.pb_dict['create_search_space']['func'](**cs_kwargs)

        self.space_list = [(0, vnode.num_ops-1) for vnode in search_space.variable_nodes]
        self.population_size = population_size
        self.sample_size = sample_size
コード例 #16
0
    def __init__(self, problem, run, evaluator, alg, network, num_envs,
                 **kwargs):

        self.kwargs = kwargs

        if evaluator == 'balsam':
            balsam_launcher_nodes = int(
                os.environ.get('BALSAM_LAUNCHER_NODES', 1))
            deephyper_workers_per_node = int(
                os.environ.get('DEEPHYPER_WORKERS_PER_NODE', 1))
            nworkers = balsam_launcher_nodes * deephyper_workers_per_node
        else:
            nworkers = 1

        if MPI is None:
            self.rank = 0
            super().__init__(problem=problem,
                             run=run,
                             evaluator=evaluator,
                             **kwargs)
            dhlogger.info(
                jm(type='start_infos',
                   seed=self.problem.seed,
                   alg=alg,
                   network=network,
                   num_envs_per_agent=num_envs,
                   nagents=1,
                   nworkers=nworkers,
                   encoded_space=json.dumps(self.problem.space, cls=Encoder)))
        else:
            self.rank = MPI.COMM_WORLD.Get_rank()
            if self.rank == 0:
                super().__init__(problem=problem,
                                 run=run,
                                 evaluator=evaluator,
                                 **kwargs)
                dhlogger.info(
                    jm(type='start_infos',
                       seed=self.problem.seed,
                       alg=alg,
                       network=network,
                       num_envs_per_agent=num_envs,
                       nagents=MPI.COMM_WORLD.Get_size(),
                       nworkers=nworkers,
                       encoded_space=json.dumps(self.problem.space,
                                                cls=Encoder)))
            MPI.COMM_WORLD.Barrier()
            if self.rank != 0:
                super().__init__(problem=problem,
                                 run=run,
                                 evaluator=evaluator,
                                 **kwargs)
        # set in super : self.problem, self.run_func, self.evaluator

        if self.problem.seed is not None:
            tf.random.set_random_seed(self.problem.seed)

        self.num_evals = self.max_evals
        if self.num_evals is None:
            self.num_evals = math.inf

        self.space = self.problem.space

        dhlogger.info(f'evaluator: {type(self.evaluator)}')
        dhlogger.info(f'rank: {self.rank}')
        dhlogger.info(f'alg: {alg}')
        dhlogger.info(f'network: {network}')
        dhlogger.info(f'num_envs_per_agent: {num_envs}')

        self.alg = alg
        self.network = network
        self.num_envs_per_agent = num_envs
コード例 #17
0
ファイル: agebo.py プロジェクト: xiaming9880/deephyper
    def main(self):

        num_evals_done = 0
        population = collections.deque(maxlen=self.population_size)

        # Filling available nodes at start
        self.evaluator.add_eval_batch(
            self.gen_random_batch(size=self.free_workers))

        # Main loop
        while num_evals_done < self.max_evals:

            # Collecting finished evaluations
            new_results = list(self.evaluator.get_finished_evals())

            if len(new_results) > 0:
                population.extend(new_results)
                stats = {
                    "num_cache_used": self.evaluator.stats["num_cache_used"]
                }
                dhlogger.info(jm(type="env_stats", **stats))
                self.evaluator.dump_evals(saved_keys=self.saved_keys)

                num_received = len(new_results)
                num_evals_done += num_received

                hp_results_X, hp_results_y = [], []

                # If the population is big enough evolve the population
                if len(population) == self.population_size:
                    children_batch = []

                    # For each new parent/result we create a child from it
                    for new_i in range(len(new_results)):
                        # select_sample
                        indexes = np.random.choice(self.population_size,
                                                   self.sample_size,
                                                   replace=False)
                        sample = [population[i] for i in indexes]

                        # select_parent
                        parent = self.select_parent(sample)

                        # copy_mutate_parent
                        child = self.copy_mutate_arch(parent)
                        # add child to batch
                        children_batch.append(child)

                        # collect infos for hp optimization
                        new_i_hps = new_results[new_i][0]["hyperparameters"]
                        new_i_y = new_results[new_i][1]
                        hp_new_i = [
                            new_i_hps["learning_rate"],
                            new_i_hps["batch_size"],
                            new_i_hps["ranks_per_node"],
                        ]
                        hp_results_X.append(hp_new_i)
                        hp_results_y.append(-new_i_y)

                    self.hp_opt.tell(hp_results_X,
                                     hp_results_y)  #! fit: costly
                    new_hps = self.hp_opt.ask(n_points=len(new_results))

                    for hps, child in zip(new_hps, children_batch):
                        child["hyperparameters"]["learning_rate"] = hps[0]
                        child["hyperparameters"]["batch_size"] = hps[1]
                        child["hyperparameters"]["ranks_per_node"] = hps[2]

                    # submit_childs
                    if len(new_results) > 0:
                        self.evaluator.add_eval_batch(children_batch)
                else:  # If the population is too small keep increasing it

                    # For each new parent/result we create a child from it
                    for new_i in range(len(new_results)):

                        new_i_hps = new_results[new_i][0]["hyperparameters"]
                        new_i_y = new_results[new_i][1]
                        hp_new_i = [
                            new_i_hps["learning_rate"],
                            new_i_hps["batch_size"],
                            new_i_hps["ranks_per_node"],
                        ]
                        hp_results_X.append(hp_new_i)
                        hp_results_y.append(-new_i_y)

                    self.hp_opt.tell(hp_results_X,
                                     hp_results_y)  #! fit: costly
                    new_hps = self.hp_opt.ask(n_points=len(new_results))

                    new_batch = self.gen_random_batch(size=len(new_results),
                                                      hps=new_hps)

                    self.evaluator.add_eval_batch(new_batch)
コード例 #18
0
ファイル: rl.py プロジェクト: xclmj/deephyper
    def __init__(self, problem, run, evaluator, alg, network, env, **kwargs):

        self.kwargs = kwargs

        # It is assumed here that one agent is using one node
        self.num_agents = 1 if MPI is None else MPI.COMM_WORLD.Get_size()
        self.rank = 0 if MPI is None else MPI.COMM_WORLD.Get_rank()

        if MPI is None or MPI.COMM_WORLD.Get_rank() == 0:
            super().__init__(
                problem=problem,
                run=run,
                evaluator=evaluator,
                num_nodes_master=self.num_agents,
                **kwargs,
            )  # create self.evaluator

        MPI.COMM_WORLD.Barrier()  # Creating the app first in rank 0 only

        if self.rank != 0:
            super().__init__(
                problem=problem,
                run=run,
                evaluator=evaluator,
                num_nodes_master=self.num_agents,
                **kwargs,
            )
        # Set in super : self.problem, self.run_func, self.evaluator

        # Number of parallel environments per agent
        self.num_envs_per_agent = self.evaluator.num_workers // self.num_agents

        if MPI is None or MPI.COMM_WORLD.Get_rank() == 0:
            dhlogger.info(
                jm(
                    type="start_infos",
                    seed=self.problem.seed,
                    alg=alg,
                    network=network,
                    num_envs_per_agent=self.num_envs_per_agent,
                    nagents=1,
                    nworkers=self.evaluator.num_workers,
                    encoded_space=json.dumps(self.problem.space, cls=Encoder),
                )
            )

        if self.problem.seed is not None:
            tf.random.set_random_seed(self.problem.seed)

        self.num_evals = self.max_evals
        if self.num_evals is None:
            self.num_evals = math.inf

        self.space = self.problem.space

        dhlogger.info(f"evaluator: {type(self.evaluator)}")
        dhlogger.info(f"rank: {self.rank}")
        dhlogger.info(f"alg: {alg}")
        dhlogger.info(f"network: {network}")
        dhlogger.info(f"num_envs_per_agent: {self.num_envs_per_agent}")

        self.alg = alg
        self.network = network
        self.env_class = get_env_class(env)