在进行神经网络部署的时候需要对神经网络耗时最长的计算过程进行优化以达到实时计算的效果,可以使用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