当前位置: 首页 > news >正文

PyTorch之计算模型推理时间

一、参考资料

如何测试模型的推理速度
Pytorch 测试模型的推理速度

二、计算PyTorch模型推理时间

1. 计算CPU推理时间

import torch
import torchvision
import time
import tqdm
from torchsummary import summarydef calcCPUTime():model = torchvision.models.resnet18()model.eval()# summary(model, input_size=(3, 224, 224), device="cpu")dummy_input = torch.randn(1, 3, 224, 224)num_iterations = 1000  # 迭代次数# 预热, GPU 平时可能为了节能而处于休眠状态, 因此需要预热print('warm up ...\n')with torch.no_grad():for _ in range(100):_ = model(dummy_input)print('testing ...\n')total_forward_time = 0.0  # 使用time来测试# 记录开始时间start_event = time.time()with torch.no_grad():for _ in tqdm.tqdm(range(num_iterations)):start_forward_time = time.time()_ = model(dummy_input)end_forward_time = time.time()forward_time = end_forward_time - start_forward_timetotal_forward_time += forward_time * 1000  # 转换为毫秒# 记录结束时间end_event = time.time()elapsed_time = (end_event - start_event)  # 转换为秒fps = num_iterations / elapsed_timeelapsed_time_ms = elapsed_time / (num_iterations * dummy_input.shape[0])avg_forward_time = total_forward_time / (num_iterations * dummy_input.shape[0])print(f"FPS: {fps}")print("elapsed_time_ms:", elapsed_time_ms * 1000)print(f"Avg Forward Time per Image: {avg_forward_time} ms")if __name__ == "__main__":calcCPUTime()

输出结果

warm up ...testing ...100%|██████████| 1000/1000 [00:09<00:00, 102.13it/s]
FPS: 102.11109490533485
elapsed_time_ms: 9.793255090713501
Avg Forward Time per Image: 9.777164697647095 ms

CPU资源占用情况

在这里插入图片描述

2. 计算GPU推理时间

方法一

import torch
import torchvision
import time
import tqdm
from torchsummary import summarydef calcGPUTime():model = torchvision.models.resnet18()model.cuda()model.eval()# summary(model, input_size=(3, 224, 224), device="cuda")dummy_input = torch.randn(1, 3, 224, 224).cuda()num_iterations = 1000  # 迭代次数# 预热, GPU 平时可能为了节能而处于休眠状态, 因此需要预热print('warm up ...\n')with torch.no_grad():for _ in range(100):_ = model(dummy_input)print('testing ...\n')total_forward_time = 0.0  # 使用time来测试# 记录开始时间start_event = time.time() * 1000with torch.no_grad():for _ in tqdm.tqdm(range(num_iterations)):start_forward_time = time.time()_ = model(dummy_input)end_forward_time = time.time()forward_time = end_forward_time - start_forward_timetotal_forward_time += forward_time * 1000  # 转换为毫秒# 记录结束时间end_event = time.time() * 1000elapsed_time = (end_event - start_event) / 1000.0  # 转换为秒fps = num_iterations / elapsed_timeelapsed_time_ms = elapsed_time / (num_iterations * dummy_input.shape[0])avg_forward_time = total_forward_time / (num_iterations * dummy_input.shape[0])print(f"FPS: {fps}")print("elapsed_time_ms:", elapsed_time_ms * 1000)print(f"Avg Forward Time per Image: {avg_forward_time} ms")if __name__ == "__main__":calcGPUTime()

输出结果

warm up ...testing ...100%|██████████| 1000/1000 [00:01<00:00, 727.79it/s]
FPS: 727.1527832145586
elapsed_time_ms: 1.375226806640625
Avg Forward Time per Image: 1.3709843158721924 ms

GPU资源占用情况

在这里插入图片描述

方法二

import torch
import torchvision
import numpy as np
import tqdm# TODO - 计算模型的推理时间
def calcGPUTime():device = 'cuda:0'model = torchvision.models.resnet18()model.to(device)model.eval()repetitions = 1000dummy_input = torch.rand(1, 3, 224, 224).to(device)# 预热, GPU 平时可能为了节能而处于休眠状态, 因此需要预热print('warm up ...\n')with torch.no_grad():for _ in range(100):_ = model(dummy_input)# synchronize 等待所有 GPU 任务处理完才返回 CPU 主线程torch.cuda.synchronize()# 设置用于测量时间的 cuda Event, 这是PyTorch 官方推荐的接口,理论上应该最靠谱starter, ender = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)# 初始化一个时间容器timings = np.zeros((repetitions, 1))print('testing ...\n')with torch.no_grad():for rep in tqdm.tqdm(range(repetitions)):starter.record()_ = model(dummy_input)ender.record()torch.cuda.synchronize()  # 等待GPU任务完成curr_time = starter.elapsed_time(ender)  # 从 starter 到 ender 之间用时,单位为毫秒timings[rep] = curr_timeavg = timings.sum() / repetitionsprint('\navg={}\n'.format(avg))if __name__ == '__main__':calcGPUTime()

输出结果

warm up ...testing ...100%|██████████| 1000/1000 [00:01<00:00, 627.50it/s]avg=1.4300348817110062

GPU资源占用情况

在这里插入图片描述

http://www.lryc.cn/news/335052.html

相关文章:

  • layui后台框架,将左侧功能栏目 集中到一个页面,通过上面的tab切换 在iframe加载对应页面
  • 【网络原理】使用Java基于TCP搭建简单客户端与服务器通信
  • Hadoop生态系统主要是什么?
  • GlusterFS分布式文件系统
  • spark本地模拟多个task时如何启动多个Excutor
  • RocketMQ笔记(八)SpringBoot整合RocketMQ广播消费消息
  • Appium如何自动判断浏览器驱动
  • MVCC-多版本并发控制
  • c++找最高成绩
  • 前端saas化部署
  • [Java基础揉碎]Math类
  • MyBatis输入映射
  • 金三银四,程序员求职季
  • [react优化] 避免组件或数据多次渲染/计算
  • 「意」起出发 丨意大利OXO城市展厅盛大启幕,成都设计圈共襄盛举
  • 你不知道的JavaScript---深入理解 JavaScript 作用域
  • FPGA(Verilog)实现按键消抖
  • 第十二届蓝桥杯大赛软件赛省赛C/C++大学B组
  • 面了钉钉搜广增算法岗(暑期实习),秒挂。。。。
  • 前端实现流文件下载的完整指南
  • Kotlin:常用标准库函数(let、run、with、apply、also)
  • 雷军给年轻人的五点建议
  • Unity DOTS物理引擎的核心分析与详解
  • C++ //练习 12.4 在我们的check函数中,没有检查i是否大于0。为什么可以忽略这个检查?
  • 达梦备份与恢复
  • iOS App Store审核要求与Flutter应用的兼容性分析
  • javaScript常见对象方法总结
  • 使用Java流API构建树形结构数据
  • 蓝桥杯备考
  • Linux云计算之Linux基础1——操作系统理论基础