当前位置: 首页 > news >正文

TIME - MoE 模型代码 5——Time-MoE-main/time_moe/utils/log_util.py

源码:https://github.com/Time-MoE/Time-MoE

这段代码实现了一个自定义的日志配置模块,主要用于分布式训练环境下的日志管理,确保只有主进程(local_rank=0)输出日志,避免多进程环境下的日志冗余。


1. 日志基础配置

DEFAULT_LOGGER = "time_moe_logger"
DEFAULT_FORMATTER = logging.Formatter('%(asctime)s - %(filename)s[pid:%(process)d;line:%(lineno)d:%(funcName)s] - %(levelname)s: %(message)s'
)
_ch = logging.StreamHandler(stream=sys.stdout)
_ch.setFormatter(DEFAULT_FORMATTER)
_DEFAULT_HANDLERS = [_ch]
  • 日志格式
    定义了详细的日志格式,包含:

    • asctime:日志时间
    • filename:文件名
    • process:进程 ID
    • lineno:代码行号
    • funcName:函数名
    • levelname:日志级别(INFO/WARNING/ERROR 等)
    • message:日志内容
      这种格式便于定位日志对应的代码位置,适合调试和生产环境。
  • 处理程序
    创建一个输出到标准输出(stdout)的处理器(StreamHandler),并绑定上述格式器。

2. 分布式环境检测函数

def is_local_rank_0():local_rank = os.getenv('LOCAL_RANK')if local_rank is None or local_rank == '0':return Trueelse:return False

  • 功能:检测当前进程是否是分布式环境中的主进程(local_rank=0)。
  • 应用场景:在分布式训练(如使用 PyTorch DDP)中,通常只需要主进程输出日志,避免多进程重复打印。

3. 日志记录器工厂函数

def get_logger(name, level="INFO", handlers=None, update=False):if name in _LOGGER_CACHE and not update:return _LOGGER_CACHE[name]logger = logging.getLogger(name)logger.setLevel(level)logger.handlers = handlers or _DEFAULT_HANDLERSlogger.propagate = False  # 防止日志向上传播到根记录器_LOGGER_CACHE[name] = loggerreturn logger
  • 单例模式
    使用_LOGGER_CACHE缓存已创建的日志记录器,避免重复创建,提高性能。

    • 首次调用时创建新的记录器并缓存。
    • 后续调用直接从缓存获取(update=False时)。
  • 参数说明

    • name:日志记录器名称(如time_moe_logger)。
    • level:日志级别(默认INFO,支持DEBUG/WARNING/ERROR等)。
    • handlers:自定义处理器(默认使用_DEFAULT_HANDLERS,即标准输出)。
    • update:是否强制更新缓存(默认False)。

4. 分布式日志输出函数

def log_in_local_rank_0(*msg, type='info', used_logger=None):msg = ' '.join([str(s) for s in msg])used_logger = used_logger or logger  # 默认使用全局loggerif is_local_rank_0():  # 仅主进程输出日志if type == 'warn' or type == 'warning':used_logger.warning(msg)elif type == 'error':used_logger.error(msg)else:used_logger.info(msg)
  • 核心逻辑

    • 将输入参数拼接为字符串msg
    • 通过is_local_rank_0()判断是否为主进程,若是则根据type记录对应级别的日志。
    • 支持三种日志类型:info(默认)、warnerror
  • 使用场景
    在分布式训练中,确保只有主进程输出日志,避免多卡环境下日志重复(如 DDP 的 8 卡训练中,仅local_rank=0的卡打印日志)。

5. 全局日志记录器

logger = get_logger(DEFAULT_LOGGER)
  • 创建一个默认的日志记录器,名称为time_moe_logger,使用前面定义的格式和处理器。
  • 其他模块可直接导入该logger,通过log_in_local_rank_0函数控制输出。
http://www.dtcms.com/a/184874.html

相关文章:

  • Scrapy 核心组件解析:Request Response 的深度应用与实战
  • Web 性能优化四:资源体积压缩与加载策略详解:JS / CSS / 图片 / 字体怎么减负?
  • 风扇接口
  • 0基础 | L298N电机驱动模块 | 使用指南
  • C语言常见的文件操作函数总结
  • QSS样式表的选择器
  • iVX 图形化编程平台:结合 AI 原生开发的革新与实践
  • 模块化编程
  • 【问题】Watt加速github访问速度:好用[特殊字符]
  • ACM模式手动构建二叉树
  • 精读计算机体系结构基础 第三章 特权指令系统
  • 使用 SHAP 进行特征交互检测:揭示变量之间的复杂依赖关系
  • 豆包:国内 web 辅助开发的领头羊
  • 以党建网为例,深入分析IT技术栈,实战经验
  • 基于多层权重博弈与广播机制的仿生类脑 AI 决策框架
  • 文件(分片)并行上传时计算总的上传进度
  • Linux基础开发工具一(yum/apt ,vim)
  • C++内存管理详解
  • ES 面试题系列「二」
  • HTML难点小记:一些简单标签的使用逻辑和实用化
  • 49.EFT测试与静电测试环境和干扰特征分析
  • RS485和RS232 通信配置
  • 【Linux高级全栈开发】2.1高性能网络-网络编程——2.1.1 网络IO与IO多路复用——select/poll/epoll
  • Kubernetes排错(十四):Pod状态异常排查手册
  • 每日脚本 5.11 - 进制转换和ascii字符
  • Lambda表达式能用在哪些场景?
  • libcurl简单使用
  • TeledyneLeCroy在OFC2025 EA展台上展示了其400G/800G的全包围的测试解决方案,满足了UEC联盟和UALINK联盟的技术需求
  • [Java][Leetcode simple]26. 删除有序数组中的重复项
  • 欧拉路与欧拉回路(模板)