Format logging message. Args: log_vars (dict): It contains the following keys: epoch (int): Epoch number. iter (int): Current iter. lrs (list): List for learning rates. time (float): Iter time. data
(self, log_vars)
| 70 | |
| 71 | @master_only |
| 72 | def __call__(self, log_vars): |
| 73 | """Format logging message. |
| 74 | |
| 75 | Args: |
| 76 | log_vars (dict): It contains the following keys: |
| 77 | epoch (int): Epoch number. |
| 78 | iter (int): Current iter. |
| 79 | lrs (list): List for learning rates. |
| 80 | |
| 81 | time (float): Iter time. |
| 82 | data_time (float): Data time for each iter. |
| 83 | """ |
| 84 | # epoch, iter, learning rates |
| 85 | epoch = log_vars.pop('epoch') |
| 86 | current_iter = log_vars.pop('iter') |
| 87 | lrs = log_vars.pop('lrs') |
| 88 | |
| 89 | message = (f'[{self.exp_name[:5]}..][epoch:{epoch:3d}, iter:{current_iter:8,d}, lr:(') |
| 90 | for v in lrs: |
| 91 | message += f'{v:.3e},' |
| 92 | message += ')] ' |
| 93 | |
| 94 | # time and estimated time |
| 95 | if 'time' in log_vars.keys(): |
| 96 | iter_time = log_vars.pop('time') |
| 97 | data_time = log_vars.pop('data_time') |
| 98 | |
| 99 | total_time = time.time() - self.start_time |
| 100 | time_sec_avg = total_time / (current_iter - self.start_iter + 1) |
| 101 | eta_sec = time_sec_avg * (self.max_iters - current_iter - 1) |
| 102 | eta_str = str(datetime.timedelta(seconds=int(eta_sec))) |
| 103 | message += f'[eta: {eta_str}, ' |
| 104 | message += f'time (data): {iter_time:.3f} ({data_time:.3f})] ' |
| 105 | |
| 106 | # other items, especially losses |
| 107 | for k, v in log_vars.items(): |
| 108 | message += f'{k}: {v:.4e} ' |
| 109 | # tensorboard logger |
| 110 | if self.use_tb_logger and 'debug' not in self.exp_name: |
| 111 | if k.startswith('l_'): |
| 112 | self.tb_logger.add_scalar(f'losses/{k}', v, current_iter) |
| 113 | else: |
| 114 | self.tb_logger.add_scalar(k, v, current_iter) |
| 115 | self.logger.info(message) |
| 116 | |
| 117 | |
| 118 | @master_only |