def __init__(self, fn): self.fn = fn self._config = {} nthreads_per_trial = get_cpu_count() ngpus_per_trial = get_gpu_count() self._config['scheduler'] = self._config.get('scheduler', 'fifo') self._config['scheduler_options'] = { 'resource': { 'num_cpus': nthreads_per_trial, 'num_gpus': ngpus_per_trial }, 'num_trials': self._config.get('num_trials', 2), 'time_out': self._config.get('time_limits', 60 * 60), 'time_attr': 'epoch', 'reward_attr': 'accuracy', 'searcher': self._config.get('searcher', 'random'), 'search_options': self._config.get('search_options', None) } if self._config['scheduler'] == 'hyperband': self._config['scheduler_options'].update({ 'searcher': 'random', 'max_t': self._config.get('epochs', 50), 'grace_period': self._config.get('grace_period', 100) })
def __init__(self, config=None, estimator=None, logger=None): super(ImageClassification, self).__init__() self._fit_summary = {} self._logger = logger if logger is not None else logging.getLogger( __name__) self._logger.setLevel(logging.INFO) # cpu and gpu setting cpu_count = get_cpu_count() gpu_count = get_gpu_count() # default settings if not config: if gpu_count < 1: self._logger.info( 'No GPU detected/allowed, using most conservative search space.' ) config = LiteConfig() else: config = DefaultConfig() config = config.asdict() else: if not config.get('dist_ip_addrs', None): ngpus_per_trial = config.get('ngpus_per_trial', gpu_count) if ngpus_per_trial < 1: self._logger.info( 'No GPU detected/allowed, using most conservative search space.' ) default_config = LiteConfig() else: default_config = DefaultConfig() config = default_config.merge(config, allow_new_key=True).asdict() # adjust cpu/gpu resources if not config.get('dist_ip_addrs', None): nthreads_per_trial = config.get('nthreads_per_trial', cpu_count) if nthreads_per_trial > cpu_count: nthreads_per_trial = cpu_count ngpus_per_trial = config.get('ngpus_per_trial', gpu_count) if ngpus_per_trial > gpu_count: ngpus_per_trial = gpu_count self._logger.warning( "The number of requested GPUs is greater than the number of available GPUs." "Reduce the number to %d", ngpus_per_trial) else: raise ValueError( 'Please specify `nthreads_per_trial` and `ngpus_per_trial` ' 'given that dist workers are available') # additional configs config['num_workers'] = nthreads_per_trial config['gpus'] = [int(i) for i in range(ngpus_per_trial)] if config['gpus']: config['batch_size'] = config.get('batch_size', 8) * len( config['gpus']) self._logger.info( 'Increase batch size to %d based on the number of gpus %d', config['batch_size'], len(config['gpus'])) config['seed'] = config.get('seed', np.random.randint(32, 767)) self._config = config # scheduler options self.search_strategy = config.get('search_strategy', 'random') self.scheduler_options = { 'resource': { 'num_cpus': nthreads_per_trial, 'num_gpus': ngpus_per_trial }, 'checkpoint': config.get('checkpoint', 'checkpoint/exp1.ag'), 'num_trials': config.get('num_trials', 2), 'time_out': config.get('time_limits', 60 * 60), 'resume': (len(config.get('resume', '')) > 0), 'visualizer': config.get('visualizer', 'none'), 'time_attr': 'epoch', 'reward_attr': 'acc_reward', 'dist_ip_addrs': config.get('dist_ip_addrs', None), 'searcher': self.search_strategy, 'search_options': config.get('search_options', None) } if self.search_strategy == 'hyperband': self.scheduler_options.update({ 'searcher': 'random', 'max_t': config.get('epochs', 50), 'grace_period': config.get('grace_period', config.get('epochs', 50) // 4) })
def __init__(self, config=None, logger=None): super(ObjectDetection, self).__init__() self._fit_summary = {} self._logger = logger if logger is not None else logging.getLogger(__name__) self._logger.setLevel(logging.INFO) # cpu and gpu setting cpu_count = get_cpu_count() gpu_count = get_gpu_count() # default settings if not config: if gpu_count < 1: self._logger.info('No GPU detected/allowed, using most conservative search space.') config = LiteConfig() else: config = DefaultConfig() config = config.asdict() else: if not config.get('dist_ip_addrs', None): ngpus_per_trial = config.get('ngpus_per_trial', gpu_count) if ngpus_per_trial > gpu_count: ngpus_per_trial = gpu_count if ngpus_per_trial < 1: self._logger.info('No GPU detected/allowed, using most conservative search space.') default_config = LiteConfig() else: default_config = DefaultConfig() config = default_config.merge(config, allow_new_key=True).asdict() # adjust cpu/gpu resources if not config.get('dist_ip_addrs', None): nthreads_per_trial = config.get('nthreads_per_trial', cpu_count) if nthreads_per_trial > cpu_count: nthreads_per_trial = cpu_count ngpus_per_trial = config.get('ngpus_per_trial', gpu_count) if ngpus_per_trial > gpu_count: ngpus_per_trial = gpu_count self._logger.warning( "The number of requested GPUs is greater than the number of available GPUs." "Reduce the number to %d", ngpus_per_trial) else: raise ValueError('Please specify `nthreads_per_trial` and `ngpus_per_trial` ' 'given that dist workers are available') # fix estimator-transfer relationship estimator = config.get('estimator', None) transfer = config.get('transfer', None) if estimator is not None and transfer is not None: if isinstance(estimator, ag.Space): estimator = estimator.data elif isinstance(estimator, str): estimator = [estimator] if isinstance(transfer, ag.Space): transfer = transfer.data elif isinstance(transfer, str): transfer = [transfer] valid_transfer = [] for e in estimator: for t in transfer: if e in t: valid_transfer.append(t) if not valid_transfer: raise ValueError(f'No matching `transfer` model for {estimator}') if len(valid_transfer) == 1: config['transfer'] = valid_transfer[0] else: config['transfer'] = ag.Categorical(*valid_transfer) # additional configs config['num_workers'] = nthreads_per_trial config['gpus'] = [int(i) for i in range(ngpus_per_trial)] config['seed'] = config.get('seed', np.random.randint(32,767)) self._config = config # scheduler options self.search_strategy = config.get('search_strategy', 'random') self.search_options = config.get('search_options', None) if self.search_options: self.search_options.update({'debug_log': True}) else: self.search_options = {'debug_log': True} self.scheduler_options = { 'resource': {'num_cpus': nthreads_per_trial, 'num_gpus': ngpus_per_trial}, 'checkpoint': config.get('checkpoint', 'checkpoint/exp1.ag'), 'num_trials': config.get('num_trials', 2), 'time_out': config.get('time_limits', 60 * 60), 'resume': (len(config.get('resume', '')) > 0), 'visualizer': config.get('visualizer', 'none'), 'time_attr': 'epoch', 'reward_attr': 'map_reward', 'dist_ip_addrs': config.get('dist_ip_addrs', None), 'searcher': self.search_strategy, 'search_options': self.search_options} if self.search_strategy == 'hyperband': self.scheduler_options.update({ 'searcher': 'random', 'max_t': config.get('epochs', 50), 'grace_period': config.get('grace_period', config.get('epochs', 50) // 4)}) elif self.search_strategy == 'bayesopt_hyperband': self.scheduler_options.update({ 'searcher': 'bayesopt', 'max_t': config.get('epochs', 50), 'grace_period': config.get('grace_period', config.get('epochs', 50) // 4)})