性能优化:每一个卷积层的计算耗时Pytorch

在进行神经网络部署的时候需要对神经网络耗时最长的计算过程进行优化以达到实时计算的效果,可以使用torch.utils.benchmark工具来实现,具体实例代码如下:

import torch
from utils.utils import get_classes
from torchvision.models import mobilenet_v2
import torch.utils.benchmark as benchmark


# 加载模型
model = mobilenet_v2()

# 将模型设置为评估模式
model.eval()

# 将模型放到 CPU 上
device = torch.device('cpu')
model = model.to(device)

# 用一批样本测试模型
input = torch.randn(1, 3, 300, 300).to(device)

# 获取模型中所有卷积层
conv_layers = [m for m in model.modules() if isinstance(m, torch.nn.Conv2d)]

f = open("./time_FP32.txt","w+")
# 对每个卷积层测量计算时间
for conv in conv_layers:
    print(f"Measuring time for {conv}")
    f.write(f"Measuring time for {conv}\n")
    timer = benchmark.Timer(
        stmt="model(input)",
        globals={
            "model": model,
            "input": input
        },
        num_threads=1,#使用单线程运行计时器
        # num_iters=100,#每个计时器运行模型100次
        # warmup_iters=10#每个计时器在进行正式计时前预热10次
    )

    # 运行计时器
    res = timer.blocked_autorange(min_run_time=1)
    print(f"Mean time: {res.mean * 1000:.3f} ms\n")
    f.write(f"Mean time: {res.mean * 1000:.3f} ms\n")

运行结果片段如下

Measuring time for Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
Mean time: 41.815 ms
Measuring time for Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)
Mean time: 36.139 ms
Measuring time for Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 35.859 ms
Measuring time for Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 43.526 ms
Measuring time for Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=96, bias=False)
Mean time: 40.813 ms
Measuring time for Conv2d(96, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 38.026 ms
Measuring time for Conv2d(24, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 37.218 ms
Measuring time for Conv2d(144, 144, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=144, bias=False)
Mean time: 37.572 ms
Measuring time for Conv2d(144, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.642 ms
Measuring time for Conv2d(24, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 42.858 ms
Measuring time for Conv2d(144, 144, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=144, bias=False)
Mean time: 43.950 ms
Measuring time for Conv2d(144, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 43.544 ms
Measuring time for Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 38.716 ms
Measuring time for Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)
Mean time: 37.081 ms
Measuring time for Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.858 ms
Measuring time for Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 37.262 ms
Measuring time for Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)
Mean time: 37.860 ms
Measuring time for Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 37.438 ms
Measuring time for Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 39.329 ms
Measuring time for Conv2d(192, 192, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=192, bias=False)
Mean time: 38.713 ms
Measuring time for Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.371 ms
Measuring time for Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 35.330 ms
Measuring time for Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)
Mean time: 35.857 ms
Measuring time for Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.325 ms
Measuring time for Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.602 ms
Measuring time for Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)
Mean time: 35.514 ms
Measuring time for Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 35.842 ms
Measuring time for Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 39.115 ms
Measuring time for Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)
Mean time: 37.774 ms
Measuring time for Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 37.322 ms
Measuring time for Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 35.767 ms
Measuring time for Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)
Mean time: 38.035 ms
Measuring time for Conv2d(384, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 38.319 ms
Measuring time for Conv2d(96, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 39.739 ms
Measuring time for Conv2d(576, 576, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=576, bias=False)
Mean time: 37.433 ms
Measuring time for Conv2d(576, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.389 ms
Measuring time for Conv2d(96, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 35.957 ms
Measuring time for Conv2d(576, 576, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=576, bias=False)
Mean time: 41.091 ms
Measuring time for Conv2d(576, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 43.039 ms
Measuring time for Conv2d(96, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 38.046 ms
Measuring time for Conv2d(576, 576, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=576, bias=False)
Mean time: 37.233 ms
Measuring time for Conv2d(576, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 39.387 ms
Measuring time for Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.604 ms
Measuring time for Conv2d(960, 960, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=960, bias=False)
Mean time: 39.087 ms
Measuring time for Conv2d(960, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 40.716 ms
Measuring time for Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 38.038 ms
Measuring time for Conv2d(960, 960, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=960, bias=False)
Mean time: 36.831 ms
Measuring time for Conv2d(960, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.193 ms
Measuring time for Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 36.669 ms
Measuring time for Conv2d(960, 960, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=960, bias=False)
Mean time: 36.893 ms
Measuring time for Conv2d(960, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 37.657 ms
Measuring time for Conv2d(320, 1280, kernel_size=(1, 1), stride=(1, 1), bias=False)
Mean time: 38.812 ms
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中的卷层是神经网络中常用的一种层类型,用于处理图像和其他多维数据。卷层通过对输入数据进行卷操作来提取特征,并生成输出特征图。卷操作是指将一个滤波器(也称为卷核)与输入数据进行逐元素相乘,并将结果相加得到输出特征图的过程。[1] 在PyTorch中,卷层的相关参数包括输入通道数、输出通道数、卷核大小、步长和边缘填充等。输入通道数指的是输入数据的通道数,例如RGB图像的通道数为3。输出通道数指的是卷层输出的特征图的通道数,通常可以理解为卷核的个数。卷核大小指的是卷核的尺寸,例如3x3的卷核。步长指的是卷操作在输入数据上滑动的步长,用于控制输出特征图的尺寸。边缘填充是指在输入数据的边缘周围填充额外的像素,以保持输出特征图的尺寸与输入数据相同。[2] 在使用PyTorch的卷层时,可以通过定义一个继承自`nn.Module`的神经网络类,并在其中定义卷层的相关参数来创建卷层。例如,可以使用`nn.Conv2d`类来定义一个二维卷层,并指定输入通道数、输出通道数、卷核大小、步长和边缘填充等参数。然后,在神经网络的前向传播方法中,可以通过调用卷层的`forward`方法来进行卷操作,并返回输出特征图。[3] 总结起来,PyTorch中的卷层是用于处理图像和其他多维数据的一种神经网络层类型。它通过卷操作来提取特征,并生成输出特征图。在使用PyTorch的卷层时,需要定义相关参数,并在神经网络的前向传播方法中调用卷层进行卷操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值