pytorch 模型GPU推理时间探讨3——正确计算模型推理时间

2023-11-13

前言

  上文说到,在统计pytorch模型的推理时间时发现每次的前几次推理耗时都非常多,而且在后面多次的推理中,其时间也呈现出很大的变化,后来经过调研,得知模型在GPU上推理时,需要对GPU进行一个warm up阶段,使得显卡达到工作状态。对于后续多次推理时间的变化,差异较大,这一问题,是因为使用的计时工具是python标准库time里的perf_counter方法,该方法由CPU来执行,也就是说计时是在CPU上进行的,而实际计算是在GPU上进行的,这就涉及到同步异步计算的问题了,下面介绍同步异步计算以及怎么正确的计算模型推理时间。
  还没看过前两篇的同学可以去看一看。下面是链接
  Pytorch GPU模型推理时间探讨
  Pytorch GPU模型推理时间探讨2——显卡warm up

同步计算

请添加图片描述
  上图表示同步计算,(手工画图,字见谅),CPU将要计算的数据以及模型通过总线发送给GPU,等发送完后通知GPU开始计算,这时开始perf_counter计数,显卡开始计算,此时CPU陷入阻塞,啥事也不做,等待显卡完成计算,当显卡完成计算后,将结果和结束消息发送给CPU,CPU停止计数。这一过程就是同步计算,CPU和GPU之间进行通信需要通过总线,而通信就有开销,所以这会导致CPU的计时极大的不准确性,同步的方式还带来了CPU的资源浪费,在一段时间里啥事也不做。

异步计算

请添加图片描述
  知道了同步计算,异步计算就好理解了,上图中,CPU将数据和模型传到GPU后,通知GPU后就开始一个计数的线程,然后就去做其他事,等GPU完成计算后,给CPU发一个消息,CPU再停止计数。这样的异步计算,虽然没有CPU资源的浪费,但还是有通信上的损失,所以计时还是不准确。
  所以,我们需要在GPU上,让GPU自己对自己进行计时。

正确计算GPU推理时间

请添加图片描述
  如上图所示,正确的计时方法应该是由GPU自身发起,而不是在CPU上执行time的方法。在torch中,有torch.cuda.Event这个类可以用来计时。具体用法例子如下:

model = Model()
input = th.randn(batch_size, in_c, in_h, in_w, dtype = th.float32)

starter, ender = th.cuda.Event(enable_timing=True), th.cuda.Event(enable_timing=True)

start = perf_counter()
model.to(device)
input = input.to(device)
to_gpu = (perf_counter() - start) * 1000

# GPU warm-up
starter.record()
for _ in range(10):
    _ = model(input)
ender.record()
th.cuda.synchronize()
warm_up_time = starter.elapsed_time(ender)
print("GPU warm up time: ", warm_up_time)

timings = []
with th.no_grad():
    for i in range(100):
        starter.record()
        res = model(input)
        ender.record()
        # wait for GPU sync
        th.cuda.synchronize()
        curr_timing = starter.elapsed_time(ender)
        timings.append(round(curr_timing, 3))

# do whatever you want

如果对你有帮助,不妨点个赞再走?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch 模型GPU推理时间探讨3——正确计算模型推理时间 的相关文章

随机推荐

  • Python Selenium UI自动化测试

    1 自动化测试基础 1 1 自动化测试的定义 将人为的测试行为转化为机器自动执行的过程 1 2 自动化测试的目的 减少成本 提高测试效率 减少人为因素对测试的影响 1 3 什么项目适合做自动化测试 项目界面稳定 需求明确 项目周期长 测试脚
  • robot framework 接口自动化测试(2)get方式传递token

    之前介绍了get请求头不需要传递参数的方式 那么对于需要传入登录状态的token接口我们怎么测试呢 下面介绍一下 首先先做post的接口自动化获取到token token实时更新 所以每次调用需要token的get接口测试都需要post的t
  • postman-post格式报文接口的配置

    post格式报文接口的配置 1 新建请求 2 配置请求报文 输入接口URL authorization界面可配置授权信息 header界面可以配置请求头 body界面可以配置请求体 非作者允许 严禁转载 http接口有许多格式 post格式
  • pymysql中 execute 和 executemany 性能对比,以及与原生SQL 相比如何

    今天在mysql中插入大批量数据时 突然想起pymysql 还有executemany 方法 那么这两个方法到底谁快 快多少 测试环境 python3 mysql pymysql 老规矩 先上测试代码 class IN sql def in
  • [1144]Hive常用日期格式转换

    文章目录 获取当前时间 Hive中处理毫秒级别的时间戳 日期格式转换 返回日期中的年 月 日 时 分 秒 当前的周数 返回当月或当年的第一天 计算日期差值 返回结束日期减去开始日期的天数 返回开始日期startdate增加days天后的日期
  • webpack5 学习(六)—— 管理资源:自定义 JSON 模块 parser

    通过使用 自定义 parser 替代特定的 webpack loader 可以将任何 toml yaml 或 json5 文件作为 JSON 模块导入 在 src 文件夹下创建一个 data toml 一个 data yaml 以及一个 d
  • 矩阵求和

    include
  • 第四十章 Unity 按钮 (Button) UI

    本章节我们介绍一下按钮UI 首先 我们创建一个新的场景 SampleScene3 unity 然后 在菜单栏中点击 GameObject gt UI gt Button 截图如下 我们选中刚刚创建的Button 然后查看它的Inspecto
  • 深度优先搜索——搜索与回溯,从n个数中取出r个数的排列

    5 2 1 include
  • IDFA 单元测试以及单元测试覆盖率步骤

    一 单元测试类 1 新建java类 随意选择java类文件 新建一个Java类CountVowel 用来统计字符串中元音的个数 代码如下 public class CountVowels private static boolean isV
  • JAVA微信公众号

    1 微信公众号介绍 账号分为服务号 订阅号 小程序 服务号和订阅号开发类似 但是申请服务号必须是企业 所以学习的话申请一个订阅号 测试账号即可 2 注册订阅号 第一步 访问 微信公众平台 点击立即注册按钮 第二步 注册类型页面选择订阅号 第
  • 【模型复杂度】torchsummary、torchstat和profile的使用

    模型的复杂度分析也是不同模型比较的重要指标 包括模型参数 浮点运算次数 Floating point operations FLOPs 内存占用和运存占用等 记录一下可以评价模型复杂度的方法 1 torchsummary torchsumm
  • C-结构体

    目录 结构体 定义结构体 第一种方式 定义的同时定义变量名 第三种方式 赋值和初始化 如何取出结构体成员 结构体变量 结构体指针作为函数参数进行传递 结构体运算 结构体 形成了一个新的数据类型 定义结构体 第一种方式 定义一个新的数据类型
  • GD32的项目源码从台式机拷贝到笔记本,烧录后串口数据异常

    目录 1 问题描述 2 故障排查 3 问题分析 4 问题总结 1 问题描述 最近一个项目 需要外场调试 将台式机的源代码拷贝到笔记本中 通过笔记本烧录程序到设备中 发现串口数据异常 重新使用台式机进行烧录 则设备输出正常 2 故障排查 由于
  • 系统架构设计高级技能 · Web架构设计

    现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is for the future of dream weaving wings let the dream fly in reality 点击进入系
  • webpack多页面改名的注意事项

    今天在进行项目打包时 由于甲方新规定了文件的名字 需要我们对原先的文件名进行重命名 这个需求是不是很简单 确实很简单 但是一不注意 就会给自己造成找错半天 原来的名字 进行改名 webpack同步更改如下 满心欢喜的以为自己改完了 然后np
  • Volley 源码解析

    1 功能介绍 1 1 Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架 在 Google I O 2013 大会上发布 名字由来 a burst or emission of many t
  • BeanUtil拷贝对象或集合时属性名不对应导致为空

    项目场景 源和目标实体类中的客户ID字段不对应 在使用Hutool的BeanUtil拷贝时字段为空 问题描述 源实体类属性 客户ID private String customerId 目标实体类属性 客户ID private String
  • jquery 小数计算保持精度,同时保留两位数

    点击打开链接 Num 3 Price 11 50 Number Price Num toFixed 2 34 50
  • pytorch 模型GPU推理时间探讨3——正确计算模型推理时间

    前言 上文说到 在统计pytorch模型的推理时间时发现每次的前几次推理耗时都非常多 而且在后面多次的推理中 其时间也呈现出很大的变化 后来经过调研 得知模型在GPU上推理时 需要对GPU进行一个warm up阶段 使得显卡达到工作状态 对