IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 如何正确地计算神经网络模型的推理时间【含代码,以pytorch为例】 -> 正文阅读

[人工智能]如何正确地计算神经网络模型的推理时间【含代码,以pytorch为例】

前言

无论是做学术还是做工程项目,实际推理时间(inference time)总是我们衡量一个模型好坏的重要参照指标。目前已经也有很多博客在介绍如何计算一个神经网络模型的推理时间,但是写得都比较"粗糙",在看了一些国内外的博客后,对这个问题有了一些总结性的经验,故写下这篇博客。

原理

某些博客直接将python程序的测速方式用到神经网络模型的测速中来(使用time.time计时),这忽略了深度学习问题的特殊性(在GPU上进行推理)。直接使用这种方式进行测速会忽略两个关键问题,导致测出来的速度不准:① 异步执行;② GPU预热。

下文中,我们先介绍不同的问题以及其原理,然后提出解决办法。

异步执行

在深度学习模型推理过程中,我们通常会将模型部署在GPU上,运行过程会涉及到cpugpu两种不同设备,而目前深度学习基本都是采用异步执行的方式(具体来说,就是在GPU调用某个函数时,它会在指定的设备上进行排队,不会占用其他的设备资源,从而完成并行计算)。

在这里插入图片描述

图片来自参考链接[1]

这种机制能够加快模型的推理速度,但这会使得计算推理时间变得麻烦,因为通常python程序使用time进行计时,这是在CPU端运行的,有可能存在GPU端的程序还没有运行完,但这边已经停止这一轮次的计时了,导致最终得到的结果不准确。

GPU预热

目前的GPU设备在不同的状态下会启用不同的工作模式,如果一台GPU在未使用的情况下,会处于低功耗状态(会关闭许多硬件,包括内存子系统、内部子系统、计算核等)。

如果此时将模型部署在上面并进行推理时,会触发GPU的一系列初始化,这会浪费较多的时间在GPU预热阶段,导致时间测量不准确。计算出来的推理速度也无法反映真正使用场景下的速度(持续模式)。

解决方法

为了解决异步执行的问题,使用pytorch自带的torch.cuda.synchronize(),它会将异步模式转换成同步模式,只有在当前轮次的GPU推理完成之后才停止计时,并且使用torch.cuda.Event来跟踪GPU程序并进行更新;

torch.cuda.Event和torch.cuda.synchronize()的官方文档说明

为了解决GPU预热的问题,我们可以在进行实际测量前运行一些示例,完成GPU的预热。

代码

完整测速代码如下所示,以torchvision自带的resnet101为例。

import torch
from torchvision.models.resnet import resnet101

iterations = 300   # 重复计算的轮次

model = resnet101()
device = torch.device("cuda:0")
model.to(device)

random_input = torch.randn(1, 3, 224, 224).to(device)
starter, ender = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)

# GPU预热
for _ in range(50):
    _ = model(random_input)

# 测速
times = torch.zeros(iterations)     # 存储每轮iteration的时间
with torch.no_grad():
    for iter in range(iterations):
        starter.record()
        _ = model(random_input)
        ender.record()
        # 同步GPU时间
        torch.cuda.synchronize()
        curr_time = starter.elapsed_time(ender) # 计算时间
        times[iter] = curr_time
        # print(curr_time)

mean_time = times.mean().item()
print("Inference time: {:.6f}, FPS: {} ".format(mean_time, 1000/mean_time))

参考资料

[1] The Correct Way to Measure Inference Time of Deep Neural Networks
[2] 如何正确测量 PyTorch 模型的推理时间

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:35:35  更:2022-06-14 22:39:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:24:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码