From 62772c111b48b4f54ed6265e1697e9eaf5d878db Mon Sep 17 00:00:00 2001 From: shippingwang Date: Fri, 29 May 2020 09:06:35 +0000 Subject: [PATCH 1/3] add visualdl --- ppcls/utils/logger.py | 54 +++++++++++++++++++++++++------------------ tools/program.py | 9 +++++++- tools/train.py | 17 ++++++++++---- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/ppcls/utils/logger.py b/ppcls/utils/logger.py index 5b192c61b..5e2c2b584 100644 --- a/ppcls/utils/logger.py +++ b/ppcls/utils/logger.py @@ -19,9 +19,10 @@ import datetime from imp import reload reload(logging) -logging.basicConfig(level=logging.INFO, - format="%(asctime)s %(levelname)s: %(message)s", - datefmt = "%Y-%m-%d %H:%M:%S") +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s %(levelname)s: %(message)s", + datefmt="%Y-%m-%d %H:%M:%S") def time_zone(sec, fmt): @@ -32,22 +33,22 @@ def time_zone(sec, fmt): logging.Formatter.converter = time_zone _logger = logging.getLogger(__name__) - -Color= { - 'RED' : '\033[31m' , - 'HEADER' : '\033[35m' , # deep purple - 'PURPLE' : '\033[95m' ,# purple - 'OKBLUE' : '\033[94m' , - 'OKGREEN' : '\033[92m' , - 'WARNING' : '\033[93m' , - 'FAIL' : '\033[91m' , - 'ENDC' : '\033[0m' } +Color = { + 'RED': '\033[31m', + 'HEADER': '\033[35m', # deep purple + 'PURPLE': '\033[95m', # purple + 'OKBLUE': '\033[94m', + 'OKGREEN': '\033[92m', + 'WARNING': '\033[93m', + 'FAIL': '\033[91m', + 'ENDC': '\033[0m' +} def coloring(message, color="OKGREEN"): assert color in Color.keys() if os.environ.get('PADDLECLAS_COLORING', False): - return Color[color]+str(message)+Color["ENDC"] + return Color[color] + str(message) + Color["ENDC"] else: return message @@ -80,6 +81,12 @@ def error(fmt, *args): _logger.error(coloring(fmt, "FAIL"), *args) +def scaler(name, value, step, path): + from visualdl import LogWriter + vdl_writer = LogWriter(path) + vdl_writer.add_scalar(name, value, step) + + def advertise(): """ Show the advertising message like the following: @@ -99,12 +106,13 @@ def advertise(): website = "https://github.com/PaddlePaddle/PaddleClas" AD_LEN = 6 + len(max([copyright, ad, website], key=len)) - info(coloring("\n{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n".format( - "=" * (AD_LEN + 4), - "=={}==".format(copyright.center(AD_LEN)), - "=" * (AD_LEN + 4), - "=={}==".format(' ' * AD_LEN), - "=={}==".format(ad.center(AD_LEN)), - "=={}==".format(' ' * AD_LEN), - "=={}==".format(website.center(AD_LEN)), - "=" * (AD_LEN + 4), ),"RED")) + info( + coloring("\n{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n".format( + "=" * (AD_LEN + 4), + "=={}==".format(copyright.center(AD_LEN)), + "=" * (AD_LEN + 4), + "=={}==".format(' ' * AD_LEN), + "=={}==".format(ad.center(AD_LEN)), + "=={}==".format(' ' * AD_LEN), + "=={}==".format(website.center(AD_LEN)), + "=" * (AD_LEN + 4), ), "RED")) diff --git a/tools/program.py b/tools/program.py index b73f10642..251d7f81c 100644 --- a/tools/program.py +++ b/tools/program.py @@ -384,7 +384,10 @@ def compile(config, program, loss_name=None): return compiled_program -def run(dataloader, exe, program, fetchs, epoch=0, mode='train'): +total_step = 0 + + +def run(dataloader, exe, program, fetchs, epoch=0, mode='train', vdl_dir=None): """ Feed data to the model and fetch the measures and loss @@ -412,6 +415,10 @@ def run(dataloader, exe, program, fetchs, epoch=0, mode='train'): metric_list[i].update(m[0], len(batch[0])) fetchs_str = ''.join([str(m.value) + ' ' for m in metric_list] + [batch_time.value]) + 's' + if vdl_dir: + global total_step + logger.scaler('loss', metrics[0][0], total_step, vdl_dir) + total_step += 1 if mode == 'eval': logger.info("{:s} step:{:<4d} {:s}s".format(mode, idx, fetchs_str)) else: diff --git a/tools/train.py b/tools/train.py index cd5b7d25b..578323899 100644 --- a/tools/train.py +++ b/tools/train.py @@ -38,6 +38,11 @@ def parse_args(): type=str, default='configs/ResNet/ResNet50.yaml', help='config file path') + parser.add_argument( + '--vdl_dir', + type=str, + default="scaler", + help='VisualDL logging directory for image.') parser.add_argument( '-o', '--override', @@ -94,7 +99,7 @@ def main(args): for epoch_id in range(config.epochs): # 1. train with train dataset program.run(train_dataloader, exe, compiled_train_prog, train_fetchs, - epoch_id, 'train') + epoch_id, 'train', args.vdl_dir) if int(os.getenv("PADDLE_TRAINER_ID", 0)) == 0: # 2. validate with validate dataset if config.validate and epoch_id % config.valid_interval == 0: @@ -103,13 +108,15 @@ def main(args): epoch_id, 'valid') if top1_acc > best_top1_acc: best_top1_acc = top1_acc - message = "The best top1 acc {:.5f}, in epoch: {:d}".format(best_top1_acc, epoch_id) + message = "The best top1 acc {:.5f}, in epoch: {:d}".format( + best_top1_acc, epoch_id) logger.info("{:s}".format(logger.coloring(message, "RED"))) - if epoch_id % config.save_interval==0: + if epoch_id % config.save_interval == 0: model_path = os.path.join(config.model_save_dir, - config.ARCHITECTURE["name"]) - save_model(train_prog, model_path, "best_model_in_epoch_"+str(epoch_id)) + config.ARCHITECTURE["name"]) + save_model(train_prog, model_path, + "best_model_in_epoch_" + str(epoch_id)) # 3. save the persistable model if epoch_id % config.save_interval == 0: From cf40ed6f1fb62466bda03cac657981be647b9c2f Mon Sep 17 00:00:00 2001 From: shippingwang Date: Fri, 29 May 2020 13:52:43 +0000 Subject: [PATCH 2/3] fixed --- ppcls/utils/logger.py | 6 ++---- tools/program.py | 6 +++--- tools/train.py | 5 ++++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ppcls/utils/logger.py b/ppcls/utils/logger.py index 5e2c2b584..7dda65e64 100644 --- a/ppcls/utils/logger.py +++ b/ppcls/utils/logger.py @@ -81,10 +81,8 @@ def error(fmt, *args): _logger.error(coloring(fmt, "FAIL"), *args) -def scaler(name, value, step, path): - from visualdl import LogWriter - vdl_writer = LogWriter(path) - vdl_writer.add_scalar(name, value, step) +def scaler(name, value, step, writer): + writer.add_scalar(name, value, step) def advertise(): diff --git a/tools/program.py b/tools/program.py index 251d7f81c..2428409ef 100644 --- a/tools/program.py +++ b/tools/program.py @@ -387,7 +387,7 @@ def compile(config, program, loss_name=None): total_step = 0 -def run(dataloader, exe, program, fetchs, epoch=0, mode='train', vdl_dir=None): +def run(dataloader, exe, program, fetchs, epoch=0, mode='train', vdl_writer=None): """ Feed data to the model and fetch the measures and loss @@ -415,9 +415,9 @@ def run(dataloader, exe, program, fetchs, epoch=0, mode='train', vdl_dir=None): metric_list[i].update(m[0], len(batch[0])) fetchs_str = ''.join([str(m.value) + ' ' for m in metric_list] + [batch_time.value]) + 's' - if vdl_dir: + if vdl_writer: global total_step - logger.scaler('loss', metrics[0][0], total_step, vdl_dir) + logger.scaler('loss', metrics[0][0], total_step, vdl_writer) total_step += 1 if mode == 'eval': logger.info("{:s} step:{:<4d} {:s}s".format(mode, idx, fetchs_str)) diff --git a/tools/train.py b/tools/train.py index 578323899..922d871ff 100644 --- a/tools/train.py +++ b/tools/train.py @@ -19,6 +19,7 @@ from __future__ import print_function import argparse import os +from visualdl import LogWriter import paddle.fluid as fluid from paddle.fluid.incubate.fleet.base import role_maker from paddle.fluid.incubate.fleet.collective import fleet @@ -96,10 +97,12 @@ def main(args): compiled_valid_prog = program.compile(config, valid_prog) compiled_train_prog = fleet.main_program + vdl_writer = LogWriter(args.vdl_dir) if args.vdl_dir else None + for epoch_id in range(config.epochs): # 1. train with train dataset program.run(train_dataloader, exe, compiled_train_prog, train_fetchs, - epoch_id, 'train', args.vdl_dir) + epoch_id, 'train', vdl_writer) if int(os.getenv("PADDLE_TRAINER_ID", 0)) == 0: # 2. validate with validate dataset if config.validate and epoch_id % config.valid_interval == 0: From e40be825fd7fc82803a280852a8778579534752f Mon Sep 17 00:00:00 2001 From: shippingwang Date: Fri, 29 May 2020 13:56:27 +0000 Subject: [PATCH 3/3] fixed --- tools/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/train.py b/tools/train.py index 922d871ff..993907136 100644 --- a/tools/train.py +++ b/tools/train.py @@ -42,7 +42,7 @@ def parse_args(): parser.add_argument( '--vdl_dir', type=str, - default="scaler", + default=None, help='VisualDL logging directory for image.') parser.add_argument( '-o',