Пример #1
0
def test_logger(test_str):
    logger.critical(test_str)
    logger.debug(test_str)
    logger.error(test_str)
    logger.exception(test_str)
    logger.info(test_str)
    logger.warning(test_str)
Пример #2
0
def test_logger(test_multiline_str):
    logger.critical(test_multiline_str)
    logger.debug(test_multiline_str)
    logger.error(test_multiline_str)
    logger.exception(test_multiline_str)
    logger.info(test_multiline_str)
    logger.warn(test_multiline_str)
Пример #3
0
    def check_fn(*args, **kwargs):
        if not to_check_training_step():
            return fn(*args, **kwargs)

        net = args[0]  # first arg self
        # get pre-update parameters to compare
        pre_params = [param.clone() for param in net.parameters()]

        # run training_step, get loss
        loss = fn(*args, **kwargs)

        # get post-update parameters to compare
        post_params = [param.clone() for param in net.parameters()]
        if loss == 0.0:
            # if loss is 0, there should be no updates
            # TODO if without momentum, parameters should not change too
            for p_name, param in net.named_parameters():
                assert param.grad.norm() == 0
        else:
            # check parameter updates
            try:
                assert not all(
                    torch.equal(w1, w2)
                    for w1, w2 in zip(pre_params, post_params)
                ), f'Model parameter is not updated in training_step(), check if your tensor is detached from graph. Loss: {loss:g}'
                logger.info(
                    f'Model parameter is updated in training_step(). Loss: {loss: g}'
                )
            except Exception as e:
                logger.error(e)
                if os.environ.get('PY_ENV') == 'test':
                    # raise error if in unit test
                    raise (e)

            # check grad norms
            min_norm, max_norm = 0.0, 1e5
            for p_name, param in net.named_parameters():
                try:
                    grad_norm = param.grad.norm()
                    assert min_norm < grad_norm < max_norm, f'Gradient norm for {p_name} is {grad_norm:g}, fails the extreme value check {min_norm} < grad_norm < {max_norm}. Loss: {loss:g}. Check your network and loss computation.'
                    logger.info(
                        f'Gradient norm for {p_name} is {grad_norm:g}; passes value check.'
                    )
                except Exception as e:
                    logger.warn(e)
        logger.debug('Passed network parameter update check.')
        # store grad norms for debugging
        net.store_grad_norms()
        return loss
Пример #4
0
def save_image(figure, filepath=None):
    if os.environ.get('PY_ENV') == 'test':
        return
    if filepath is None:
        filepath = f'{PLOT_FILEDIR}/{_.get(figure, "layout.title")}.png'
    try:
        plotly.tools.set_credentials_file(
            username=_.get(config, 'plotly.username'),
            api_key=_.get(config, 'plotly.api_key'))
        plotly.tools.set_config_file(world_readable=True, sharing='public')
        return plotly.plotly.image.save_as(figure, filepath)
    except Exception:
        logger.error(
            'Plotly server unreachable, but you can save the plots later via retro-analysis.'
        )
        return None
Пример #5
0
 def update_nets(self):
     # NOTE: Once polyak updating for multi-headed networks is supported via updates to flatten_params and load_params then this can be removed
     space_clock = util.s_get(self, 'aeb_space.clock')
     t = space_clock.get('t')
     if self.update_type == 'replace':
         if t % self.update_frequency == 0:
             logger.debug('Updating target_net by replacing')
             self.target_net = deepcopy(self.net)
             self.online_net = self.target_net
             self.eval_net = self.target_net
     elif self.update_type == 'polyak':
         logger.error(
             '"polyak" updating not supported yet for MultiHeadDQN, please use "replace" instead. Exiting.')
         sys.exit()
     else:
         logger.error(
             'Unknown net.update_type. Should be "replace" or "polyak". Exiting.')
         sys.exit()
Пример #6
0
 def update_nets(self):
     space_clock = util.s_get(self, 'aeb_space.clock')
     t = space_clock.get('t')
     if self.update_type == 'replace':
         if t % self.update_frequency == 0:
             logger.debug('Updating target_net by replacing')
             self.target_net = deepcopy(self.net)
             self.online_net = self.target_net
             self.eval_net = self.target_net
     elif self.update_type == 'polyak':
         logger.debug('Updating net by averaging')
         avg_params = self.polyak_weight * net_util.flatten_params(self.target_net) + \
             (1 - self.polyak_weight) * net_util.flatten_params(self.net)
         self.target_net = net_util.load_params(self.target_net, avg_params)
         self.online_net = self.target_net
         self.eval_net = self.target_net
     else:
         logger.error(
             'Unknown net.update_type. Should be "replace" or "polyak". Exiting.')
         sys.exit()