profiling模型性能分析与优化入门

news2025/1/23 2:21:43

一、定义

  1. profiler 作用
  2. 入门
  3. pyprof
  4. torch.summary/torchinfo 模型参数量分析以及模型可视化
  5. profiling 参数分析-模型分析

二、实现

1.profiler 作用:分析模型执行时间,内存占用
CPU/GPU 端Op执行时间统计
CPU/GPU 端Op输入Tensor的维度分析
Op的内存消耗统计
2. 入门

  1. 安装profiling.
 pip install torch_tb_profiler
  1. 命令行 运行tensorboard
tensorboard --logdir=./log          #日志的路径

在这里插入图片描述

  1. 打开页面
http://localhost:6006/#pytorch_profiler

遇到的问题:json.decoder.JSONDecodeError: Invalid \escape: line 53124 column 56 (char 2265210)
在这里插入图片描述

      报错:json.decoder.JSONDecodeError: Invalid \escape: line 53124 column 56 (char 2265210)
      解决:将生成文件内  \ 路径全部替换为 /
  1. torch.summary/torchinfo 模型参数量分析以及模型可视化
    torch.summary() 已经不在更新,合并到torchinfo 模块中。
import torch, torchvision
#model = torchvision.models.vgg
model = torchvision.models.vgg16().cuda()
from torchsummary import summary
summary(model, input_size=(3, 224, 224)) #旧版

新版
import torchvision.models as models
from torchinfo import summary
resnet18 = models.resnet18().cuda() # 实例化模型
summary(resnet18, (1, 3, 224, 224)) # 1:batch_size 3:图片的通道数 224: 图片的高宽
  1. profiling 参数分析-模型分析
    从可视化界面的 解析结果,可以看出 各内存的占用情况,以及 各个模块,各个算子的内存占用、时间占用。 目的: 优化内存、优化时间
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim
import torch.profiler
import torch.utils.data
import torchvision.models
import torchvision.transforms as T
from torchvision.datasets.vision import VisionDataset
import numpy as np
from PIL import Image


# sample model
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 8, 3, padding=1)
        self.conv2 = nn.Conv2d(8, 12, 3, padding=1)
        self.conv3 = nn.Conv2d(12, 16, 3, padding=1)
        self.conv4 = nn.Conv2d(16, 20, 3, padding=1)
        self.conv5 = nn.Conv2d(20, 24, 3, padding=1)
        self.conv6 = nn.Conv2d(24, 28, 3, padding=1)
        self.conv7 = nn.Conv2d(28, 32, 3, padding=1)
        self.conv8 = nn.Conv2d(32, 10, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = self.pool(F.relu(self.conv4(x)))
        x = self.pool(F.relu(self.conv5(x)))
        x = self.pool(F.relu(self.conv6(x)))
        x = self.pool(F.relu(self.conv7(x)))
        x = self.pool(F.relu(self.conv8(x)))
        x = torch.flatten(x, 1) # flatten all dimensions except batch
        return x

def log_softmax(x):
    return x - x.exp().sum(-1).log().unsqueeze(-1)

def weighted_nll(pred, target, weight):
    assert target.max() < 10
    nll = -pred[range(target.shape[0]), target]
    nll = nll * weight[target]
    nll = nll / weight[target].sum()
    sum_nll = nll.sum()
    return sum_nll

# custom loss definition
class CrossEntropyLoss(nn.Module):
    def forward(self, input, target):
        pred = log_softmax(input)
        loss = weighted_nll(pred, target, torch.Tensor([0.1]*10).cuda())
        return loss

# dataset with random images that mimics the properties of CIFAR10
class FakeCIFAR(VisionDataset):
    def __init__(self, transform):
        super().__init__(root=None, transform=transform)
        self.data = np.random.randint(low=0,high=256,size=(10000,32,32,3),dtype=np.uint8)
        self.targets = np.random.randint(low=0,high=10,size=(10000),dtype=np.uint8).tolist()

    def __getitem__(self, index):
        img, target = self.data[index], self.targets[index]
        img = Image.fromarray(img)
        if self.transform is not None:
            img = self.transform(img)
        return img, target

    def __len__(self) -> int:
        return len(self.data)

transform = T.Compose(
    [T.Resize(256),
     T.PILToTensor()])

train_set = FakeCIFAR(transform=transform)
train_loader = torch.utils.data.DataLoader(train_set, batch_size=8,
                               shuffle=True, num_workers=8, pin_memory=True)

device = torch.device("cuda:0")
model = Net().to(device)
#criterion = CrossEntropyLoss().cuda(device)
criterion = torch.nn.CrossEntropyLoss().to(device)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
model.train()


# # training loop wrapped with profiler object
with torch.profiler.profile(
        schedule=torch.profiler.schedule(wait=1, warmup=4, active=3, repeat=1),
        on_trace_ready=torch.profiler.tensorboard_trace_handler('./log/example'),
        record_shapes=True,
        profile_memory=True,
        with_stack=True
) as prof:
    for step, data in enumerate(train_loader):
        inputs = data[0].to(device=device, non_blocking=True)
        labels = data[1].to(device=device, non_blocking=True)
        inputs = (inputs.to(torch.float32) / 255. - 0.5) / 0.5
        if step >= (1 + 4 + 3) * 1:
            break
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        optimizer.zero_grad(set_to_none=True)
        loss.backward()
        optimizer.step()
        prof.step()

在这里插入图片描述
gpu Utilization:gpu 利用率,越高越好
Est. SM Efficiency: 预估SM效率。数值越高越好。此指标为kernel的 SM 效率
Est. Achieved Occupancy:CUDA 理论占用率
kernel :GPU 设备上的kernel 执行时间;
Memcpy:涉及 GPU 的内存复制时间(D2D、D2H 或 H2D);
Memset:涉及 GPU 的内存设置时间;
通信:仅在 DDP 情况下出现的通信时间;
运行时:主机端的 CUDA 运行时执行时间;
例如 cudaLaunchKernel、cudaMemcpyAsync、cudaStreamSynchronize 等;
DataLoader:在 PyTorch DataLoader 对象中的数据加载时间;
CPU 执行:主机计算时间,包括每个 PyTorch 操作符的运行时间;在这里插入图片描述
在这里插入图片描述
查看 时间占用。

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

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

相关文章

3D开发工具HOOPS如何推动3D打印应用实现数据格式转换、模型可视化?

3D打印技术的发展已经彻底改变了制造业、医疗、建筑和设计等众多领域。这一技术的核心在于其能够将数字模型转化为实物&#xff0c;而这一过程需要强大的软件支持。在这一领域&#xff0c;HOOPS作为一种专业的图形软件开发工具&#xff0c;发挥着至关重要的作用。 本文将深入探…

木板甲醛释放量气候箱法检测 木制品ENF级检测

甲醛释放量气候箱法检测 甲醛释放量气候箱法检测是一种用于评估木制品中甲醛释放量的标准测试方法。这种方法通常涉及将样品放置在一个密闭的气候箱内&#xff0c;模拟一定的温度、湿度和通风条件&#xff0c;然后定期测量箱内空气中的甲醛浓度。通过这些数据&#xff0c;可以计…

【ARM Cache 与 MMU 系列文章 7.5 -- ARMv8/v9 MMU FEAT_XS(XS Attribute)与 FEAT_MTE2 介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU FEAT_XSXS AttributeXS Attribute 兼容性和影响XS Attribute 应用场景MMU FEAT_MTE2MTE2 主要目的和用途MTE2 工作原理MTE2 特性实现MTE2 注意事项MMU FEAT_XS 在ARMv8架构中,FE…

k8s之HPA,命名空间资源限制

一、HPA 的相关知识 HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;…

docker-compose部署一款老牌apm监控软件-- pinpoint(需定制docker镜像)

一、背景 公司测试环境需要重新部署一套apm监控软件&#xff0c;选择的是我们开发都使用过的pinpoint&#xff0c;当然首选使用docker-compose部署。 可是&#xff0c;在部署的过程中&#xff0c;却遇到了不少问题。 无法直接使用官网提供的docker-compose.yml&#xff0c;需…

ATA-3080C功率放大器在电解液体浸润性测试中的应用

现在的电子设备上的供电电池多为可反复充放电的锂电池&#xff0c;这种在我们日常生活中扮演着重要角色的电池&#xff0c;却有着自燃、爆炸的风险&#xff1b;随着电池在生活中的普及&#xff0c;电池检测相关行业和领域也随之发展。那么功率放大器在电解液体浸润性测试中有什…

Stack详解(含动画演示)

目录 Stack详解1、栈数据结构动画演示2、Stack的继承体系3、Stack的push (入栈)方法4、Stack的pop (出栈)方法5、Stack是如何利用Vector实现栈数据结构的&#xff1f;6、自己实现栈(不借助JDK提供的集合)7、自己实现栈(借助JDK提供的集合)利用 ArrayDeque 实现高性能的非线程安…

深入理解 Vue Router 及其 `router` 和 `route` 变量

深入理解 Vue Router 及其 router 和 route 变量 在使用 Vue.js 进行单页面应用开发时&#xff0c;Vue Router 是一个不可或缺的工具。它使得我们可以轻松地管理应用中的路由&#xff0c;提供了流畅的用户体验。然而&#xff0c;在实际开发中&#xff0c;许多开发者可能会混淆…

在自己的电脑上搭建我的世界Java版服务器

很多朋友&#xff0c;喜欢玩Minecraft&#xff0c;也希望搭建一个服务器&#xff0c;用于和小伙伴联机&#xff1b; 并且&#xff0c;拥有服务器后&#xff0c;即使所有玩家都下线&#xff0c;“世界”依旧在运行&#xff0c;玩家可以随时参与其中&#xff0c;说不定一上线&am…

2. 音视频H264

视频软件基本流程 1.什么是H264 H.264是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&#xff08;JVT&#xff0c;Joint Video Team&#xff09;提出的高度压缩数字视频编解码器标准 H265又名高…

我国含氢硅油产量逐渐增长 市场集中度较高

我国含氢硅油产量逐渐增长 市场集中度较高 含氢硅油又称为烷基硅油&#xff0c;是一种有机硅化合物&#xff0c;在常温常压下多表现为一种无色透明液体。与其他类型的硅油相比&#xff0c;含氢硅油具有良好的滋润性、疏水性、润滑性、化学稳定性等优点。经过多年发展&#xff…

【C语言】10.C语言指针(5)

文章目录 1.sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof 和 strlen的对⽐ 2.数组和指针笔试题解析2.1 ⼀维数组2.2 字符数组2.3 ⼆维数组 3.指针运算笔试题解析3.1 题⽬13.2 题⽬23.3 题⽬33.4 题⽬43.5 题⽬53.6 题⽬63.7 题⽬7 1.sizeof和strlen的对比 1.1 sizeof …

正则表达式:从左到右一个个去匹配,api帮助文档搜:Pattern

正则匹配字符&#xff1a; \:在java里面是转义字符的意思&#xff0c;在java里面可以理解为&#xff1a;\\\ “你”匹配一个&#xff1a;. a匹配一个&#xff1a;. 匹配多个的情况&#xff1a; 正则表达式练习&#xff1a; 忽略大小写的书写方式&#xff1a;(?i) 正则表达式在…

【仿真建模-anylogic】Dynamic Event原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-12 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 EventOriginator是Anylogic中各类事件的父类&#xff0c;对外暴露的接口主要有: 函数功能boolean isActive()判定…

泛微OA E9 浏览框显示的数据根据表单字段过滤

一、实现效果&#xff1a;如图所示&#xff0c;字段“物品名称”浏览框显示的数据根据“类型”字段进行过滤。 二、实现方法&#xff1a; 1、建模引擎-应用建模-浏览框-浏览框列表中单击“办公耗材”-“浏览框列表”-“操作”-“编辑” 2、sql语句中根据OA自带是示例增加where…

autoware lidar-centerpoint 点云在rviz上叠加显示问题

在使用自采数据包放入autoware中的lidar_centerpoint上进行检测时发现&#xff0c;在rviz可视化上出现问题&#xff1a;多帧点云在一个位置上不断叠加&#xff0c;不能正常随时间显示。 如下图所示&#xff1a; 解决方法&#xff1a; 出现上述问题是因为autoware默认使用的是…

多用户竞拍商城系统 挂售转卖竞拍商城系统源码 竞拍系统 竞拍系统开发定制 转拍闪拍系统 后端PHP+前端UNIAPP源码+教程

挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP前端UNIAPP源码 玩法简介 ①、后台可添加商品进行挂单 ②、后台设置场次以及场次开始时间 ③、用户抢单 ④、抢单以后可选择提货或者转售 ⑤、玩家寄售需按照后台设置百分比进行加价 ⑥、玩家寄售需支付手续费(余额支付…

图的存储表示

目录 概述 图的定义 图的存储结构 1&#xff09;邻接矩阵 2&#xff09;邻接表 3&#xff09;十字链表 4&#xff09;邻接多重表 概述 数据结构分为两类&#xff0c;一类是具有递归结构的数据结构&#xff0c;也就是可以给出一个递归定义的数据结构&#xff0c;一类是非递归结构…

你好!Python

目录 写在前面 编辑推荐 内容简介 作者简介 前言 推荐理由 写在后面 写在前面 本期博主给大家推荐一本全新出版的Python图书&#xff0c;感兴趣的小伙伴一起来看看吧&#xff01; 《你好&#xff01;Python 全彩印刷 从零开始学 语言轻松幽默 版式精美 视频讲解 提供代…

成功的管理者必做的10件事

管理者是团队的核心&#xff0c;他们不仅要有出色的领导能力&#xff0c;还要具备应对各种挑战的智慧和勇气。以下是成功的管理者必做的10件事&#xff1a; 1、设定明确的目标 管理者要为团队设定清晰、可衡量且具有挑战性的目标&#xff0c;这些目标不仅与组织的长期愿景相…