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)
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)
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
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
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()
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()