From 44538e56c54198fe84e21c2cb1789f8558cfcacd Mon Sep 17 00:00:00 2001 From: Mashiro <57566630+HAOCHENYE@users.noreply.github.com> Date: Tue, 21 Jun 2022 14:55:21 +0800 Subject: [PATCH] [Doc]: refine logging doc (#320) --- docs/zh_cn/tutorials/logging.md | 40 ++++++++++++++++++--------------- docs/zh_cn/tutorials/utils.md | 4 ++-- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/docs/zh_cn/tutorials/logging.md b/docs/zh_cn/tutorials/logging.md index 4d50ba6b..f640efe5 100644 --- a/docs/zh_cn/tutorials/logging.md +++ b/docs/zh_cn/tutorials/logging.md @@ -2,7 +2,7 @@ ## 概述 -[执行器(Runner)](TODO)在è¿è¡Œè¿‡ç¨‹ä¸ä¼šäº§ç”Ÿå¾ˆå¤šæ—¥å¿—ï¼Œä¾‹å¦‚åŠ è½½çš„æ•°æ®é›†ä¿¡æ¯ã€æ¨¡åž‹çš„åˆå§‹åŒ–ä¿¡æ¯ã€è®ç»ƒè¿‡ç¨‹ä¸çš„å¦ä¹ 率ã€æŸå¤±ç‰ã€‚ä¸ºäº†è®©ç”¨æˆ·èƒ½å¤Ÿæ›´åŠ è‡ªç”±çš„èŽ·å–这些日志信æ¯ï¼ŒMMEngine 实现了消æ¯æž¢çº½ï¼ˆMessageHub)ã€åŽ†å²ç¼“冲区(HistoryBuffer)ã€æ—¥å¿—处ç†å™¨ï¼ˆLogProcessor) 和记录器(MMLogger)æ¥æ”¯æŒä»¥ä¸‹åŠŸèƒ½ï¼š +[执行器(Runner)](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html)在è¿è¡Œè¿‡ç¨‹ä¸ä¼šäº§ç”Ÿå¾ˆå¤šæ—¥å¿—ï¼Œä¾‹å¦‚åŠ è½½çš„æ•°æ®é›†ä¿¡æ¯ã€æ¨¡åž‹çš„åˆå§‹åŒ–ä¿¡æ¯ã€è®ç»ƒè¿‡ç¨‹ä¸çš„å¦ä¹ 率ã€æŸå¤±ç‰ã€‚ä¸ºäº†è®©ç”¨æˆ·èƒ½å¤Ÿæ›´åŠ è‡ªç”±çš„èŽ·å–这些日志信æ¯ï¼ŒMMEngine 实现了消æ¯æž¢çº½ï¼ˆMessageHub)ã€åŽ†å²ç¼“冲区(HistoryBuffer)ã€æ—¥å¿—处ç†å™¨ï¼ˆLogProcessor) 和记录器(MMLogger)æ¥æ”¯æŒä»¥ä¸‹åŠŸèƒ½ï¼š - 用户å¯ä»¥é€šè¿‡é…ç½®æ–‡ä»¶ï¼Œæ ¹æ®ä¸ªäººå好æ¥é€‰æ‹©æ—¥å¿—统计方å¼ï¼Œä¾‹å¦‚在终端输出整个è®ç»ƒè¿‡ç¨‹ä¸çš„å¹³å‡æŸå¤±è€Œä¸æ˜¯åŸºäºŽå›ºå®šè¿ä»£æ¬¡æ•°å¹³æ»‘çš„æŸå¤± - 用户å¯ä»¥åœ¨ä»»æ„组件ä¸èŽ·å–当å‰çš„è®ç»ƒçŠ¶æ€ï¼Œä¾‹å¦‚当å‰çš„è¿ä»£æ¬¡æ•°ã€è®ç»ƒè½®æ¬¡ç‰ @@ -10,17 +10,17 @@  -è®ç»ƒè¿‡ç¨‹ä¸çš„产生的æŸå¤±ã€å¦ä¹ 率ç‰æ•°æ®ç”±åŽ†å²ç¼“冲区管ç†å’Œå°è£…,汇总åŽäº¤ç»™æ¶ˆæ¯æž¢çº½ç»´æŠ¤ã€‚日志处ç†å™¨å°†æ¶ˆæ¯æž¢çº½ä¸çš„æ•°æ®è¿›è¡Œæ ¼å¼åŒ–,最åŽé€šè¿‡[记录器钩å(LoggerHook)](TODO) 展示到å„ç§å¯è§†åŒ–åŽç«¯ã€‚**ä¸€èˆ¬æƒ…å†µä¸‹ç”¨æˆ·æ— éœ€æ„ŸçŸ¥æ•°æ®å¤„ç†æµç¨‹ï¼Œå¯ä»¥ç›´æŽ¥é€šè¿‡é…置日志处ç†å™¨æ¥é€‰æ‹©æ—¥å¿—的统计方å¼**。 +è®ç»ƒè¿‡ç¨‹ä¸çš„产生的æŸå¤±ã€å¦ä¹ 率ç‰æ•°æ®ç”±åŽ†å²ç¼“冲区管ç†å’Œå°è£…,汇总åŽäº¤ç»™æ¶ˆæ¯æž¢çº½ç»´æŠ¤ã€‚日志处ç†å™¨å°†æ¶ˆæ¯æž¢çº½ä¸çš„æ•°æ®è¿›è¡Œæ ¼å¼åŒ–,最åŽé€šè¿‡[记录器钩å(LoggerHook)](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/hook.html) 展示到å„ç§å¯è§†åŒ–åŽç«¯ã€‚**ä¸€èˆ¬æƒ…å†µä¸‹ç”¨æˆ·æ— éœ€æ„ŸçŸ¥æ•°æ®å¤„ç†æµç¨‹ï¼Œå¯ä»¥ç›´æŽ¥é€šè¿‡é…置日志处ç†å™¨æ¥é€‰æ‹©æ—¥å¿—的统计方å¼**。 ## 历å²ç¼“冲区(HistoryBuffer) -MMEngine 实现了历å²æ•°æ®å˜å‚¨çš„抽象类历å²ç¼“冲区(HistoryBuffer),用于å˜å‚¨è®ç»ƒæ—¥å¿—的历å²è½¨è¿¹ï¼Œå¦‚模型æŸå¤±ã€ä¼˜åŒ–器å¦ä¹ 率ã€è¿ä»£æ—¶é—´ç‰ã€‚通常情况下,历å²ç¼“冲区作为内部类,é…åˆæ¶ˆæ¯æž¢çº½ï¼ˆMessageHub)ã€[记录器钩å(LoggerHook )](TODO)和日志处ç†å™¨ï¼ˆLogProcessor) 实现了è®ç»ƒæ—¥å¿—çš„å¯é…置化。 +MMEngine 实现了历å²æ•°æ®å˜å‚¨çš„抽象类历å²ç¼“冲区(HistoryBuffer),用于å˜å‚¨è®ç»ƒæ—¥å¿—的历å²è½¨è¿¹ï¼Œå¦‚模型æŸå¤±ã€ä¼˜åŒ–器å¦ä¹ 率ã€è¿ä»£æ—¶é—´ç‰ã€‚通常情况下,历å²ç¼“冲区作为内部类,é…åˆæ¶ˆæ¯æž¢çº½ï¼ˆMessageHub)ã€[记录器钩å(LoggerHook )](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/hook.html)和日志处ç†å™¨ï¼ˆLogProcessor) 实现了è®ç»ƒæ—¥å¿—çš„å¯é…置化。 用户也å¯ä»¥å•ç‹¬ä½¿ç”¨åŽ†å²ç¼“冲区æ¥ç®¡ç†è®ç»ƒæ—¥å¿—,能够éžå¸¸ç®€å•çš„使用ä¸åŒæ–¹æ³•æ¥ç»Ÿè®¡è®ç»ƒæ—¥å¿—。我们先æ¥ä»‹ç»å¦‚何å•ç‹¬ä½¿ç”¨åŽ†å²ç¼“冲区,在消æ¯æž¢çº½ä¸€èŠ‚å†è¿›ä¸€æ¥ä»‹ç»äºŒè€…çš„è”动。 ### 历å²ç¼“冲区åˆå§‹åŒ– -历å²ç¼“冲区的åˆå§‹åŒ–å¯ä»¥æŽ¥å— `log_history` å’Œ `count_history` 两个å‚数。`log_history` 表示日志的历å²è½¨è¿¹ï¼Œä¾‹å¦‚å‰ä¸‰æ¬¡è¿ä»£çš„ loss 为 0.3,0.2,0.1。我们就å¯ä»¥è®° `log_history=[0.3, 0.2, 0.3]`。`count_history` 是一个比较抽象的概念,如果按照è¿ä»£æ¬¡æ•°æ¥ç®—,0.3,0.2,0.1 分别是三次è¿ä»£çš„结果,那么我们å¯ä»¥è®° `count_history=[1, 1, 1]`ï¼Œå…¶ä¸ â€œ1†表示一次è¿ä»£ã€‚如果按照 batch æ¥ç®—,例如æ¯æ¬¡è¿ä»£çš„ `batch_size` 为 8,那么 `count_history=[8, 8, 8]`。`count_history` åªä¼šåœ¨ç»Ÿè®¡å‡å€¼æ—¶ç”¨åˆ°ï¼Œç”¨äºŽæŽ§åˆ¶è¿”回å‡å€¼çš„粒度。就拿上é¢é‚£ä¸ªä¾‹åæ¥è¯´ï¼Œ`count_history=[1, 1, 1]` 时会统计æ¯æ¬¡è¿ä»£çš„å¹³å‡ loss,而 `count_history=[8, 8, 8]` 则会统计æ¯å¼ å›¾ç‰‡çš„å¹³å‡ loss。 +历å²ç¼“冲区的åˆå§‹åŒ–å¯ä»¥æŽ¥å— `log_history` å’Œ `count_history` 两个å‚数。`log_history` 表示日志的历å²è½¨è¿¹ï¼Œä¾‹å¦‚å‰ä¸‰æ¬¡è¿ä»£çš„ loss 为 0.3,0.2,0.1。我们就å¯ä»¥è®° `log_history=[0.3, 0.2, 0.3]`。`count_history` 是一个比较抽象的概念,如果按照è¿ä»£æ¬¡æ•°æ¥ç®—,0.3,0.2,0.1 分别是三次è¿ä»£çš„结果,那么我们å¯ä»¥è®° `count_history=[1, 1, 1]`ï¼Œå…¶ä¸ â€œ1†表示一次è¿ä»£ã€‚如果按照 batch æ¥ç®—,例如æ¯æ¬¡è¿ä»£çš„ `batch_size` 为 8,那么 `count_history=[8, 8, 8]`。`count_history` åªä¼šåœ¨ç»Ÿè®¡å‡å€¼æ—¶ç”¨åˆ°ï¼Œç”¨äºŽæŽ§åˆ¶è¿”回å‡å€¼çš„粒度。就拿上é¢é‚£ä¸ªä¾‹åæ¥è¯´ï¼Œ`count_history=[1, 1, 1]` 时会统计æ¯æ¬¡è¿ä»£çš„å¹³å‡ loss,而 `count_history=[8, 8, 8]` 则会统计æ¯å¼ å›¾ç‰‡çš„å¹³å‡ loss。 ```python from mmengine.logging import HistoryBuffer @@ -110,7 +110,7 @@ history_buffer.statistics('weighted_mean', 2, [2, 1]) # get (2 * 1 + 1 * 2) / ( ### ç»Ÿè®¡æ–¹æ³•çš„ç»Ÿä¸€å…¥å£ -è¦æƒ³æ”¯æŒåœ¨é…置文件ä¸é€šè¿‡é…ç½® 'max','min' ç‰å—段æ¥é€‰æ‹©æ—¥å¿—的统计方å¼ï¼Œé‚£ä¹ˆ HistoryBuffer 就需è¦ä¸€ä¸ªæŽ¥å£æ¥æŽ¥å— 'min','max' ç‰ç»Ÿè®¡æ–¹æ³•å—符串和相应å‚数,进而找到对应的统计方法,最åŽè¾“出统计结果。`statistics(name, *args, **kwargs)` 接å£å°±èµ·åˆ°äº†è¿™ä¸ªä½œç”¨ã€‚å…¶ä¸ name 是已注册的方法å(基本统计方法已ç»è¢«æ³¨å†Œï¼‰ï¼Œ`*arg` å’Œ `**kwarg` 用于接å—对应方法的å‚数。 +è¦æƒ³æ”¯æŒåœ¨é…置文件ä¸é€šè¿‡é…ç½® 'max','min' ç‰å—段æ¥é€‰æ‹©æ—¥å¿—的统计方å¼ï¼Œé‚£ä¹ˆ HistoryBuffer 就需è¦ä¸€ä¸ªæŽ¥å£æ¥æŽ¥å— 'min','max' ç‰ç»Ÿè®¡æ–¹æ³•å—符串和相应å‚数,进而找到对应的统计方法,最åŽè¾“出统计结果。`statistics(name, *args, **kwargs)` 接å£å°±èµ·åˆ°äº†è¿™ä¸ªä½œç”¨ã€‚å…¶ä¸ name 是已注册的方法å(已ç»æ³¨å†Œ `min`,`max` ç‰åŸºæœ¬ç»Ÿè®¡æ–¹æ³•ï¼‰ï¼Œ`*arg` å’Œ `**kwarg` 用于接å—对应方法的å‚数。 ```python history_buffer = HistoryBuffer([1, 2, 3], [1, 1, 1]) @@ -150,11 +150,11 @@ MMEngine 利用历å²ç¼“冲区的特性,结åˆæ¶ˆæ¯æž¢çº½ï¼Œå®žçŽ°äº†è®ç»ƒ ## 消æ¯æž¢çº½ï¼ˆMessageHub) -历å²ç¼“冲区(HistoryBuffer)å¯ä»¥å分简å•åœ°å®Œæˆå•ä¸ªæ—¥å¿—的更新和统计,而在模型è®ç»ƒè¿‡ç¨‹ä¸ï¼Œæ—¥å¿—çš„ç§ç±»ç¹å¤šï¼Œå¹¶ä¸”æ¥è‡ªäºŽä¸åŒçš„ç»„ä»¶ï¼Œå› æ¤å¦‚何完æˆæ—¥å¿—的分å‘和收集是需è¦è€ƒè™‘的问题。 MMEngine 使用消æ¯æž¢çº½ï¼ˆMessageHub)æ¥å®žçŽ°ç»„件与组件ã€æ‰§è¡Œå™¨ä¸Žæ‰§è¡Œå™¨ä¹‹é—´çš„æ•°æ®å…±äº«ã€‚消æ¯æž¢çº½ç»§æ‰¿è‡ªå…¨å±€ç®¡ç†å™¨ï¼ˆManageMixin),支æŒè·¨æ¨¡å—访问。 +历å²ç¼“冲区(HistoryBuffer)å¯ä»¥å分简å•åœ°å®Œæˆå•ä¸ªæ—¥å¿—的更新和统计,而在模型è®ç»ƒè¿‡ç¨‹ä¸ï¼Œæ—¥å¿—çš„ç§ç±»ç¹å¤šï¼Œå¹¶ä¸”æ¥è‡ªäºŽä¸åŒçš„ç»„ä»¶ï¼Œå› æ¤å¦‚何完æˆæ—¥å¿—的分å‘和收集是需è¦è€ƒè™‘的问题。 MMEngine 使用消æ¯æž¢çº½ï¼ˆMessageHub)æ¥å®žçŽ°ç»„件与组件ã€æ‰§è¡Œå™¨ä¸Žæ‰§è¡Œå™¨ä¹‹é—´çš„æ•°æ®å…±äº«ã€‚消æ¯æž¢çº½ç»§æ‰¿è‡ªå…¨å±€ç®¡ç†å™¨ï¼ˆManageMixin),支æŒè·¨æ¨¡å—访问。 消æ¯æž¢çº½å˜å‚¨äº†ä¸¤ç§å«ä¹‰çš„æ•°æ®ï¼š -- 历å²ç¼“冲区å—典:消æ¯æž¢çº½ä¼šæ”¶é›†å„个模å—æ›´æ–°çš„è®ç»ƒæ—¥å¿—,如æŸå¤±ã€å¦ä¹ 率ã€è¿ä»£æ—¶é—´ï¼Œå¹¶å°†å…¶æ›´æ–°è‡³å†…部的历å²ç¼“冲区å—å…¸ä¸ã€‚历å²ç¼“冲区å—å…¸ç»[消æ¯å¤„ç†å™¨ï¼ˆLogProcessor)](TODO)处ç†åŽï¼Œä¼šè¢«è¾“出到终端/ä¿å˜åˆ°æœ¬åœ°ã€‚如果用户需è¦è®°å½•è‡ªå®šä¹‰æ—¥å¿—,å¯ä»¥å¾€åŽ†å²ç¼“冲区å—å…¸ä¸æ›´æ–°ç›¸åº”内容。 +- 历å²ç¼“冲区å—典:消æ¯æž¢çº½ä¼šæ”¶é›†å„个模å—æ›´æ–°çš„è®ç»ƒæ—¥å¿—,如æŸå¤±ã€å¦ä¹ 率ã€è¿ä»£æ—¶é—´ï¼Œå¹¶å°†å…¶æ›´æ–°è‡³å†…部的历å²ç¼“冲区å—å…¸ä¸ã€‚历å²ç¼“冲区å—å…¸ç»[消æ¯å¤„ç†å™¨ï¼ˆLogProcessor)](#%E6%97%A5%E5%BF%97%E5%A4%84%E7%90%86%E5%99%A8%EF%BC%88LogProcessor%EF%BC%89)处ç†åŽï¼Œä¼šè¢«è¾“出到终端/ä¿å˜åˆ°æœ¬åœ°ã€‚如果用户需è¦è®°å½•è‡ªå®šä¹‰æ—¥å¿—,å¯ä»¥å¾€åŽ†å²ç¼“冲区å—å…¸ä¸æ›´æ–°ç›¸åº”内容。 - è¿è¡Œæ—¶ä¿¡æ¯å—典:è¿è¡Œæ—¶ä¿¡æ¯å—典用于å˜å‚¨è¿ä»£æ¬¡æ•°ã€è®ç»ƒè½®æ¬¡ç‰è¿è¡Œæ—¶ä¿¡æ¯ï¼Œæ–¹ä¾¿ MMEngine ä¸æ‰€æœ‰ç»„件共享这些信æ¯ã€‚ ```{note} @@ -208,7 +208,7 @@ message_hub.get_info('iter') # 2 覆盖上一次结果 ### 消æ¯æž¢çº½çš„跨组件通讯 -执行器è¿è¡Œè¿‡ç¨‹ä¸ï¼Œå„个组件会通过消æ¯æž¢çº½æ¥åˆ†å‘ã€æŽ¥å—消æ¯ã€‚日志钩å会汇总其他组件更新的å¦ä¹ 率ã€æŸå¤±ç‰ä¿¡æ¯ï¼Œå°†å…¶å¯¼å‡ºåˆ°ç”¨æˆ·æŒ‡å®šçš„输出端(Tensorboard,Wandb ç‰ï¼‰ã€‚由于上述æµç¨‹è¾ƒä¸ºå¤æ‚,这里用一个简å•ç¤ºä¾‹æ¥æ¨¡æ‹Ÿæ—¥å¿—é’©å和其他组件通讯的过程。 +执行器è¿è¡Œè¿‡ç¨‹ä¸ï¼Œå„个组件会通过消æ¯æž¢çº½æ¥åˆ†å‘ã€æŽ¥å—消æ¯ã€‚[RuntimeInfoHook](https://mmengine.readthedocs.io/zh_CN/latest/api.html#mmengine.hooks.RuntimeInfoHook) 会汇总其他组件更新的å¦ä¹ 率ã€æŸå¤±ç‰ä¿¡æ¯ï¼Œå°†å…¶å¯¼å‡ºåˆ°ç”¨æˆ·æŒ‡å®šçš„输出端(Tensorboard,Wandb ç‰ï¼‰ã€‚由于上述æµç¨‹è¾ƒä¸ºå¤æ‚,这里用一个简å•ç¤ºä¾‹æ¥æ¨¡æ‹Ÿæ—¥å¿—é’©å和其他组件通讯的过程。 ```python from mmengine import MessageHub @@ -278,7 +278,11 @@ if __name__ == '__main__': ### æ·»åŠ è‡ªå®šä¹‰æ—¥å¿— -我们å¯ä»¥åœ¨ä»»æ„模å—里更新消æ¯æž¢çº½çš„历å²ç¼“冲区å—典,历å²ç¼“冲区å—å…¸ä¸æ‰€æœ‰å†…容的统计结果都会在终端显示 +我们å¯ä»¥åœ¨ä»»æ„模å—里更新消æ¯æž¢çº½çš„历å²ç¼“冲区å—典,历å²ç¼“冲区å—å…¸ä¸æ‰€æœ‰çš„å—段ç»ç»Ÿè®¡åŽæœ€åŽæ˜¾ç¤ºåˆ°ç»ˆç«¯ã€‚ + +```{note} +更新历å²ç¼“冲区å—典时,需è¦ä¿è¯æ›´æ–°çš„日志å带有 train,val,test å‰ç¼€ï¼Œå¦åˆ™æ—¥å¿—ä¸ä¼šåœ¨ç»ˆç«¯æ˜¾ç¤ºã€‚ +``` ```python class CustomModule: @@ -290,17 +294,17 @@ class CustomModule: self.message_hub.update_scalars({'train/b': 1, 'train/c': 2}) ``` -默认情况下,终端上é¢å¤–显示 aã€bã€c最åŽä¸€æ¬¡æ›´æ–°çš„结果。我们也å¯ä»¥é€šè¿‡é…置日志处ç†å™¨æ¥åˆ‡æ¢è‡ªå®šä¹‰æ—¥å¿—的统计方å¼ã€‚ +默认情况下,终端上é¢å¤–显示 aã€bã€c 最åŽä¸€æ¬¡æ›´æ–°çš„结果。我们也å¯ä»¥é€šè¿‡é…ç½®[日志处ç†å™¨](#%E6%97%A5%E5%BF%97%E5%A4%84%E7%90%86%E5%99%A8%EF%BC%88LogProcessor%EF%BC%89)æ¥åˆ‡æ¢è‡ªå®šä¹‰æ—¥å¿—的统计方å¼ã€‚ ## 日志处ç†å™¨ï¼ˆLogProcessor) -用户å¯ä»¥é€šè¿‡é…置日志处ç†å™¨ï¼ˆLogProcessor)æ¥æŽ§åˆ¶æ—¥å¿—的统计窗å£å’Œç»Ÿè®¡æ–¹æ³•ã€‚默认é…置下,日志处ç†å™¨ä¼šç»Ÿè®¡æœ€è¿‘一次更新的å¦ä¹ 率ã€åŸºäºŽè¿ä»£æ¬¡æ•°å¹³æ»‘çš„æŸå¤±å’Œè¿ä»£æ—¶é—´ã€‚用户å¯ä»¥åœ¨æ—¥å¿—处ç†å™¨ä¸é…置已知å—段的统计方å¼ã€‚ +用户å¯ä»¥é€šè¿‡é…置日志处ç†å™¨ï¼ˆLogProcessor)æ¥æŽ§åˆ¶æ—¥å¿—的统计方法åŠå…¶å‚数。默认é…置下,日志处ç†å™¨ä¼šç»Ÿè®¡æœ€è¿‘一次更新的å¦ä¹ 率ã€åŸºäºŽè¿ä»£æ¬¡æ•°å¹³æ»‘çš„æŸå¤±å’Œè¿ä»£æ—¶é—´ã€‚用户å¯ä»¥åœ¨æ—¥å¿—处ç†å™¨ä¸é…置已知å—段的统计方å¼ã€‚ ### 最简é…ç½® ```python log_processor = dict( - interval=10, + window_size=10, ) ``` @@ -314,8 +318,8 @@ log_processor = dict( 我们å¯ä»¥é€šè¿‡é…ç½® `custom_cfg` 列表æ¥é€‰æ‹©æ—¥å¿—的统计方å¼ã€‚`custom_cfg` ä¸çš„æ¯ä¸€ä¸ªå…ƒç´ 需è¦åŒ…括以下信æ¯ï¼š -- `data_src`:日志的数æ®æºï¼Œç”¨æˆ·é€šè¿‡æŒ‡å®š `data_src` æ¥é€‰æ‹©éœ€è¦è¢«é‡æ–°ç»Ÿè®¡çš„日志(必填项) -- `method_name`:统计方法,å³åŽ†å²ç¼“冲区ä¸çš„基本统计方法以åŠç”¨æˆ·æ³¨å†Œçš„自定义统计方法(必填项) +- `data_src`:日志的数æ®æºï¼Œç”¨æˆ·é€šè¿‡æŒ‡å®š `data_src` æ¥é€‰æ‹©éœ€è¦è¢«é‡æ–°ç»Ÿè®¡çš„日志,一份数æ®æºå¯ä»¥æœ‰å¤šç§ç»Ÿè®¡æ–¹å¼ï¼ˆå¿…填项) +- `method_name`:日志的统计方法,å³åŽ†å²ç¼“冲区ä¸çš„基本统计方法以åŠç”¨æˆ·æ³¨å†Œçš„自定义统计方法(必填项) - `log_name`:日志被é‡æ–°ç»Ÿè®¡åŽçš„åå—,如果ä¸å®šä¹‰ `log_name`,新日志会覆盖旧日志(选填项) - 其他å‚数:统计方法会用到的å‚æ•°ï¼Œå…¶ä¸ `window_size` 为特殊å—段,å¯ä»¥ä¸ºæ™®é€šçš„æ•´åž‹ã€å—符串 epoch å’Œå—符串 global。LogProcessor 会实时解æžè¿™äº›å‚数,以返回基于 iterationã€epoch 和全局平滑的统计结果(选填项) @@ -331,7 +335,7 @@ log_processor = dict( window_size=100)]) ``` -æ¤æ—¶ä¼šæ— 视日志处ç†å™¨çš„é»˜è®¤çª—å£ 10ï¼Œç”¨æ›´å¤§çš„çª—å£ 100去统计 loss çš„å‡å€¼ï¼Œå¹¶å°†åŽŸæœ‰ç»“果覆盖。 +æ¤æ—¶ä¼šæ— 视日志处ç†å™¨çš„é»˜è®¤çª—å£ 10ï¼Œç”¨æ›´å¤§çš„çª—å£ 100 去统计 loss çš„å‡å€¼ï¼Œå¹¶å°†åŽŸæœ‰ç»“果覆盖。 ```bash 04/15 12:34:24 - mmengine - INFO - Iter [10/12] , eta: 0:00:00, time: 0.003, data_time: 0.002, loss: 0.11 @@ -345,7 +349,7 @@ log_processor = dict( by_epoch=True, custom_cfg=[ dict(data_src='loss', - log_name='loss_min' + log_name='loss_min', method_name='min', window_size=100)]) ``` @@ -356,7 +360,7 @@ log_processor = dict( ## 记录器(MMLogger) -为了能够导出层次分明ã€æ ¼å¼ç»Ÿä¸€ã€ä¸”ä¸å—三方库日志系统干扰的日志,MMEngine 在 `logging` 模å—的基础上实现了 `MMLogger`。`MMLogger` 继承自全局管ç†å™¨ï¼ˆ`ManagerMixin`),相比于 `logging.Logger`ï¼Œå…¶èƒ½å¤Ÿåœ¨æ— æ³•èŽ·å–记录器å称(logger name)的情况下,拿到当å‰æ‰§è¡Œå™¨çš„记录器。 +为了能够导出层次分明ã€æ ¼å¼ç»Ÿä¸€ã€ä¸”ä¸å—三方库日志系统干扰的日志,MMEngine 在 `logging` 模å—的基础上实现了 `MMLogger`。`MMLogger` 继承自全局管ç†å™¨ï¼ˆ`ManagerMixin`),相比于 `logging.Logger`,`MMLogger` èƒ½å¤Ÿåœ¨æ— æ³•èŽ·å–记录器åå—(logger name)的情况下,拿到当å‰æ‰§è¡Œå™¨çš„记录器。 ### 创建记录器 @@ -396,7 +400,7 @@ logger.info("this is a test") ### 分布å¼è®ç»ƒæ—¶å¯¼å‡ºæ—¥å¿— -我们å¯ä»¥é€šè¿‡é…ç½® `distributed=True` æ¥å¯¼å‡ºåˆ†å¸ƒå¼æ—¥å¿—(默认关é—)。 +使用 pytorch 分布å¼è®ç»ƒæ—¶ï¼Œæˆ‘们å¯ä»¥é€šè¿‡é…ç½® `distributed=True` æ¥å¯¼å‡ºåˆ†å¸ƒå¼è®ç»ƒæ—¶å„个进程的日志(默认关é—)。 ```python logger = MMLogger.get_instance('mmengine', log_file='tmp.log', distributed=True, log_level='INFO') diff --git a/docs/zh_cn/tutorials/utils.md b/docs/zh_cn/tutorials/utils.md index 2082bace..52ecb545 100644 --- a/docs/zh_cn/tutorials/utils.md +++ b/docs/zh_cn/tutorials/utils.md @@ -2,7 +2,7 @@ ## 全局管ç†å™¨ï¼ˆManagerMixin) -Runner 在è®ç»ƒè¿‡ç¨‹ä¸ï¼Œéš¾å…会使用全局å˜é‡æ¥å…±äº«ä¿¡æ¯ï¼Œä¾‹å¦‚我们会在 model ä¸èŽ·å–全局的 [logger](TODO) æ¥æ‰“å°åˆå§‹åŒ–ä¿¡æ¯ï¼›åœ¨ model ä¸èŽ·å–全局的 [Visualizer](TODO) æ¥å¯è§†åŒ–预测结果ã€ç‰¹å¾å›¾ï¼›åœ¨ [Reigistry](TODO) ä¸èŽ·å–全局的 [DefaultScope](TODO) æ¥ç¡®å®šæ³¨å†ŒåŸŸã€‚为了管ç†è¿™äº›åŠŸèƒ½ç›¸ä¼¼çš„模å—,MMEngine 实现了管ç†å™¨ï¼ˆManagerMix)æ¥ç»Ÿä¸€å…¨å±€å˜é‡çš„创建和获å–æ–¹å¼ã€‚ +Runner 在è®ç»ƒè¿‡ç¨‹ä¸ï¼Œéš¾å…会使用全局å˜é‡æ¥å…±äº«ä¿¡æ¯ï¼Œä¾‹å¦‚我们会在 model ä¸èŽ·å–全局的 [logger](https://mmengine.readthedocs.io/zh/latest/api.html#mmengine.logging.MMLogger) æ¥æ‰“å°åˆå§‹åŒ–ä¿¡æ¯ï¼›åœ¨ model ä¸èŽ·å–全局的 [Visualizer](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/visualization.html) æ¥å¯è§†åŒ–预测结果ã€ç‰¹å¾å›¾ï¼›åœ¨ [Reigistry](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/registry.html) ä¸èŽ·å–全局的 [DefaultScope](https://mmengine.readthedocs.io/zh/latest/api.html#mmengine.registry.DefaultScope) æ¥ç¡®å®šæ³¨å†ŒåŸŸã€‚为了管ç†è¿™äº›åŠŸèƒ½ç›¸ä¼¼çš„模å—,MMEngine 实现了管ç†å™¨ï¼ˆManagerMix)æ¥ç»Ÿä¸€å…¨å±€å˜é‡çš„创建和获å–æ–¹å¼ã€‚  @@ -40,7 +40,7 @@ class CustomHook(Hook): GlobalClass.get_instance(runner.experiment_name, value=100) ``` -当我们调用å类的 get_instance 接å£æ—¶ï¼Œ`ManagerMixin` ä¼šæ ¹æ®åå—æ¥åˆ¤æ–对应实例是å¦å·²ç»å˜åœ¨ï¼Œè¿›è€Œåˆ›å»º/获å–实例。如上例所示,当我们第一次调用 `GlobalClass.get_instance('mmengine', value=50)` 时,会创建一个å为 "mmengine" çš„ `GlobalClass` 实例,其åˆå§‹ value 为 50。为了方便åŽç»ä»‹ç» `get_current_instance` 接å£ï¼Œè¿™é‡Œæˆ‘们创建了两个 `GlobalClass` 实例。 +当我们调用å类的 `get_instance` 接å£æ—¶ï¼Œ`ManagerMixin` ä¼šæ ¹æ®åå—æ¥åˆ¤æ–对应实例是å¦å·²ç»å˜åœ¨ï¼Œè¿›è€Œåˆ›å»º/获å–实例。如上例所示,当我们第一次调用 `GlobalClass.get_instance('mmengine', value=50)` 时,会创建一个å为 "mmengine" çš„ `GlobalClass` 实例,其åˆå§‹ value 为 50。为了方便åŽç»ä»‹ç» `get_current_instance` 接å£ï¼Œè¿™é‡Œæˆ‘们创建了两个 `GlobalClass` 实例。 3. 在任æ„组件ä¸è®¿é—®è¯¥å®žä¾‹ -- GitLab