基于pytorch hook机制,生成一次前后向的timeline

news2024/12/24 9:05:37

基于pytorch hook机制,生成一次前后向的timeline

  • 一.效果图
  • 二.代码
  • 三.运行以上代码,生成timeline.json,打开https://ui.perfetto.dev/,导入该文件,可看到以上效果

本文通过pytorch hook机制,拦截所有子module的forward和backward,统计执行时间及内存使用情况

一.效果图

在这里插入图片描述

二.代码

import os
os.environ["CUDA_LAUNCH_BLOCKING"] = "1"
import torch
import torchvision.models as models
import time
import threading

def singleeton(cls):
    instance = {}
    def _singleton(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return _singleton

@singleeton
class TimeLineContext(object):
    def __init__(self) -> None:
        self.content = "[\n"

    def close(self):
        fo = open(f"timeline.json", "w")
        body = self.content[:-2] + "]\n"
        fo.write(body)
        fo.close()

    def write(self, message):
        self.content += message
        self.content += ",\n"

class TimeLine:
    def __init__(self, title, rank):
        self.ctx = TimeLineContext()
        self.rank = rank
        self.title = title
        self.beg = time.time() * 1000 * 1000
        self.pid = os.getpid()
        self.tid = threading.current_thread().ident
        self.ctx.write(
            "{"
            + f'"name": "{self.title}","cat": "operator", "ph": "B", "pid": {self.rank}, "tid": {self.tid}, "ts": {self.beg}'
            + "}")

    def __del__(self):
        self.end = time.time() * 1000 * 1000
        self.ctx.write(
            "{"
            + f'"name": "{self.title}","cat": "operator", "ph": "E", "pid": {self.rank}, "tid": {self.tid}, "ts": {self.end}'
            + "}")
        self.ctx.write(
            "{"
            + f'"name": "{"memory_allocated"}","cat": "memory_allocated", "ph": "C", "pid": {self.rank}, "tid": 100, "ts": {self.end}, "args": {{"value": {torch.cuda.memory_allocated(self.rank)}}}'
            + "}")
        self.ctx.write(
            "{"
            + f'"name": "{"max_memory_allocated"}","cat": "max_memory_allocated", "ph": "C", "pid": {self.rank}, "tid": 100, "ts": {self.end}, "args": {{"value": {torch.cuda.max_memory_allocated(self.rank)}}}'
            + "}")

class TimelineHook(object):
    def __init__(self, net):
        self.hooks = []
        self.timing = {}
        output_dict = {}
        self.get_submodule_recrusicve(model, "", output_dict)
        for name, module in output_dict.items():
            if name.endswith("Sequential"):
                continue
            self.hooks.append(
                module.register_forward_pre_hook(
                    self.build_hook_handler(f"{name}_forward", False)
                )
            )
            self.hooks.append(
                module.register_forward_hook(self.build_hook_handler(f"{name}_forward", True))
            )
            self.hooks.append(
                module.register_full_backward_pre_hook(
                    self.build_hook_handler(f"{name}_backward", False)
                )
            )
            self.hooks.append(
                module.register_full_backward_hook(
                    self.build_hook_handler(f"{name}_backward", True)
                )
            )

    def get_submodule_recrusicve(self,module, prefix, output_dict):
        prefix = prefix + "/" + type(module).__name__
        output_dict[prefix] = module
        for name, submodule in module.named_children():
            self.get_submodule_recrusicve(submodule, f"{prefix}[{name}]", output_dict)

    def build_hook_handler(self, name, finish=False):
        def hook(module, *args, **kwargs):
            if finish == False:
                self.timing[name] = TimeLine(name, 0)
            else:
                # torch.cuda.synchronize()
                del self.timing[name]
        return hook

    def remove(self):
        for hook in self.hooks:
            hook.remove()

model = models.resnet50(pretrained=False, num_classes=10).cuda()
hooks = TimelineHook(model)

input = torch.randn(1, 3, 224, 224).cuda()
label = torch.tensor([1]).cuda()

for _ in range(5):
    output = model(input)
    print(output.shape)
    loss = torch.nn.functional.cross_entropy(output, label)
    loss.backward()
    time.sleep(0.1)

hooks.remove()
TimeLineContext().close()

三.运行以上代码,生成timeline.json,打开https://ui.perfetto.dev/,导入该文件,可看到以上效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Sun-Panel:一站式服务器、NAS导航面板、Homepage、浏览器首页

随着数字化时代的持续演进,尤其是对于开发者而言,我们与浏览器的互动频率越来越高。尽管浏览器提供了书签功能,但总有一种感觉,似乎书签并不能完全满足我们的需求。我们期待着一个能够满足我们需求的可私有化部署的浏览器导航页。…

vue实现水平排列且水平居中

样式实现 .body{text-align: center; } .body_content{display: inline-block; } .body_content_cardList{display: flex;flex-wrap: wrap;text-align: center; }<div class"body"><div class"body_content"><div class"body_content…

OpenAI内部最受欢迎的10个GPTs推荐!建议收藏!

前面文章介绍了如何创建自己的GPTs&#xff0c;但是在应用商店里还有很多各种GPTs可以供我们使用&#xff0c;满足我们的各种应用场景。这就像手机的应用商店一样&#xff0c;我们除了可以自己编写应用程序之外&#xff0c;还可以使用使用应用商店里海量应用。有关创建自己的自…

Spring三级缓存源码解析

Spring三级缓存 前置知识三级缓存定义SpringBean生命周期 Bean的初始化getSingleton 分析加入一级缓存 CreateBean过程(A)A填充属性BB填充属性A,执行getSingleton&#xff08;A&#xff09;B完成初始化 前置知识 三级缓存定义 public class DefaultSingletonBeanRegistry ext…

nginx配置挂载html

目标 很多软件的官方文档&#xff0c;在国内打开很慢&#xff0c;每次都得等很久&#xff0c;看到官方同时提供了html的包&#xff0c;所以想着挂载到本地nginx下&#xff0c;查看会方便很多。 下载官方html文档包&#xff0c;解压到documentation_htmls下 想添加新的文档也是…

数字人技术:VASA-1阅读笔记

论文地址&#xff1a;https://www.microsoft.com/en-us/research/project/vasa-1/ DiT约束条件 引入了5个约束条件&#xff0c;包括主要注视方向、头部到摄像头的距离、情绪偏移量、为了增加帧间平滑性&#xff0c;还增加了前K帧的语音特征和生成的运动特征&#xff0c;具体如…

交通气象站解析

TH-GQX8交通气象站专为交通气象服务而设计&#xff0c;是一种典型的综合多要素交通监测站。其核心功能在于实时监测能见度、天气现象及道面状况&#xff0c;并同时测量相关的基本气象参数。它的主要目的是及时发现各路段及关键点的各种异常交通环境因素变化和气象状况&#xff…

C语言实现双人贪吃蛇项目(基于控制台界面)

一.贪吃蛇 贪吃蛇是一款简单而富有乐趣的游戏&#xff0c;它的规则易于理解&#xff0c;但挑战性也很高。它已经成为经典的游戏之一&#xff0c;并且在不同的平台上一直受到人们的喜爱和回忆。 二.贪吃蛇的功能 游戏控制&#xff1a;玩家可以使用键盘输入设备来控制蛇的移动方…

JavaScript系列------1

1. JavaScript组成 ECMAScript JS 语言基础。比如&#xff1a;变量、分支语句、循环语句、对象等等。 Web APIs DOM(页面文档对象模型): 操作文档&#xff0c;比如对页面元素进行移动、大小、添加删除等操作 BOM(浏览器对象模型): 操作浏览器&#xff0c;比如页面弹窗&#x…

【前端面试常问】什么是前端工程化

&#x1f31f;【前端面试常问】前端工程化&#x1f31f; &#x1f4da; 什么是前端工程化&#xff1f; &#x1f389; 前端工程化&#xff0c;简而言之&#xff0c;是通过整合先进的工具链和最佳实践&#xff0c;将前端开发过程实现标准化、自动化和高效化的过程&#xff0c;…

如何利用美国站群服务器通过CN2线路优化中美之间的数据传输?

如何利用美国站群服务器通过CN2线路优化中美之间的数据传输? 随着全球化进程的不断推进&#xff0c;跨国企业和国际市场的拓展对数据传输速度和稳定性提出了更高的要求。特别是对于中美之间的数据传输&#xff0c;由于地理位置遥远和网络环境不同&#xff0c;优化数据传输变得…

机器人自动驾驶时间同步进阶

0. 简介 之前时间同步也写过一篇文章介绍机器人&自动驾驶中的时间同步。在最近的学习中发现一些额外需要阐述学习的内容&#xff0c;这里就再次写一些之前没写到的内容。 1. NTP NTP 是网络时间协议&#xff0c;用来同步网络中各计算机时间的协议&#xff0c;把计算机的时…

QT常量中有换行符解决方法--使用中文显示乱码或者编译报错

QT6.3常量中有换行符 方法1&#xff1a;&#xff08;不能与方法2混用&#xff09; cpp文件顶部添加&#xff1a; #pragma execution_character_set("utf-8") 方法2&#xff1a;&#xff08;不能与方法1混用&#xff09; int ret2QMessageBox::information(this,QSt…

Java | Leetcode Java题解之第45题跳跃游戏II

题目&#xff1a; 题解&#xff1a; class Solution {public int jump(int[] nums) {int length nums.length;int end 0;int maxPosition 0; int steps 0;for (int i 0; i < length - 1; i) {maxPosition Math.max(maxPosition, i nums[i]); if (i end) {end maxP…

Qt 菜单栏上手教程:QMenuBar QMenu QToolbar

引言 在Qt框架中&#xff0c;QMenuBar、QMenu、QToolbar和QAction都是用于构建应用程序界面中的用户交互元素。 QMenuBar 是什么&#xff1a;QMenuBar是一个用于创建横向菜单栏的类。在桌面应用程序中&#xff0c;它通常位于窗口的顶部。应用场景&#xff1a;当您需要一个包含…

清华大学灵境智能技术交叉创新群体博士后,综合年收入30-60万

清华大学灵境智能技术交叉创新群体现面向全球招聘优秀博士后研究人员&#xff0c;以进一步推动三维生成、三维重建、多模态智能交互、控制交互演化、知识工程及情感计算等领域的研究。我们诚邀有志于从事交叉学科研究的青年才俊加入我们的团队&#xff0c;共同探索智能技术的前…

智慧中药煎配系统:自动化煎药管理,传统中医焕发现代魅力-亿发

传统中医药服务迎来了全新的发展契机。亿发中药煎配系统&#xff0c;利用现代通信技术和自动控制技术&#xff0c;结合智能制造、大数据和物联网等现代化信息技术&#xff0c;革新中药煎制的方式&#xff0c;实现了100%数字化和全流程信息追溯&#xff0c;从根本上保障了药效和…

【Git系列】rebase的使用场景

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

解密 Grupo MasMovil 使用 ClickHouse 监控无线网络

本文字数&#xff1a;4151&#xff1b;估计阅读时间&#xff1a;11 分钟 作者&#xff1a;Rodrigo Aguirregabiria Herrero, Grupo MasMovil 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 我们很高兴与大家分享来自西班牙最大的电信…

跟裤裤一起探索结构体的奥秘!

目录 1.结构体类型的声明 2.结构体变量的创建和初始化 2.1结构体成员的直接访问 2.2结构体成员的间接访问 2.3结构体变量的创建和初始化 3.结构的自引用 4.结构体内存对齐 4.1对齐规则 ​4.2为什么存在内存对齐&#xff1f; 4.3修改默认对齐数 5.结构体传参 6.结构…