Pytorch分布式训练print()使用技巧

在分布式训练场景中,有时我们可能会需要使用print函数(虽然大部分情况下大多会用logging进行信息输出)在终端打印相关信息。但由于同时运行多个进程,如果不进行限制,每个进程都会打印信息,不但影响观感,而且可能会造成阻塞。

通常的解决方法是利用if条件语句进行限制,只在主进程中进行打印,如下:

python 复制代码
# 当前为主进程
if args.rank == 0:
    print('Train message')

但最近在学习目标检测模型DINO源码时,我发现作者采用重写内置print函数 的方式实现了相同的功能,即只在主进程中启用print函数,在其他进程中禁用print函数。

函数源码如下:

python 复制代码
def setup_for_distributed(is_master):
    """
    This function disables printing when not in master process
    """
    import builtins as __builtin__

    # 得到内置的print函数
    builtin_print = __builtin__.print

    
    # 重写print函数
    def print(*args, **kwargs):
        force = kwargs.pop('force', False)
        # 在主进程或者强制条件下才调用内置print输出
        if is_master or force:
            builtin_print(*args, **kwargs)

    # 用重写后的print函数替换内置的print函数
    __builtin__.print = print

该方法具体的调用位置是在初始化多进程组之后,示例如下:

python 复制代码
import torch

args.rank = int(os.environ["RANK"])
args.world_size = int(os.environ['WORLD_SIZE'])
args.dist_backend = 'nccl'
args.dist_url = 'env://'
torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url,
                                         world_size=args.world_size, rank=args.rank)
# 只在主进程启用print
setup_for_distributed(args.rank == 0)

实测好用,且思路清奇,果然学习永无止境。在此做一个学习记录,也分享给需要的人。

相关推荐
带娃的IT创业者20 分钟前
《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO
数据库·python·django
AL.千灯学长36 分钟前
DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署
人工智能·gpt·ios·ai·苹果vision pro
HealthScience1 小时前
【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示
ide·python·pycharm
LCG元1 小时前
大模型驱动的围术期质控系统全面解析与应用探索
人工智能
lihuayong1 小时前
计算机视觉:主流数据集整理
人工智能·计算机视觉·mnist数据集·coco数据集·图像数据集·cifar-10数据集·imagenet数据集
政安晨1 小时前
政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成
人工智能·大模型·多模态·deepseek·janus-pro-7b
一ge科研小菜鸡2 小时前
DeepSeek 与后端开发:AI 赋能云端架构与智能化服务
人工智能·云原生
冰 河2 小时前
‌最新版DeepSeek保姆级安装教程:本地部署+避坑指南
人工智能·程序员·openai·deepseek·冰河大模型
维维180-3121-14552 小时前
AI赋能生态学暨“ChatGPT+”多技术融合在生态系统服务中的实践技术应用与论文撰写
人工智能·chatgpt
豌豆花下猫2 小时前
Python 潮流周刊#90:uv 一周岁了,优缺点分析(摘要)
后端·python·ai