利用GPU预热以及同步执行正确计算卷积神经网络推理性能【附代码】

简介: 笔记

我们在评价一个卷积神经网络模型性能好坏时,通常会用AP,mAP来判断分类准确性,针对速度方面经常使用ms(毫秒),或者FPS(表示每秒处理多少张图像,或者说处理一张图像用多少秒)。在看一些代码的时候,常常会看到是直接用python中的time函数来计算,比如下面代码:

time1 = time.time()
output = model(image)
time2 = time.time()
total_time =  time2 - time1

但不知道大家在实际测试时候有没有发现一个问题,通过上面的计算给出的时间感觉并不准确,就好像你从运行代码开始,到最终给出的结果这个时间差距好像挺大的。【反正我是这么觉得】


其实这有一定的硬件影响【大家肯定觉得我再说废话,gpu和CPU不同肯定不一样】,那么如何可以更准确的计算这个时间呢?



GPU预热


我在查阅了一些资料的时候以及听到其他一些工程师说有关推理速度的时候,听到了一个词--“预热”,而这里的预热一般指的是GPU的预热。


什么叫GPU的预热呢,打个比方,我们打开电脑或者其他电子产品的时候,如果你立马用设备,会感觉有些卡顿,但如果你稍微等一下,让后台程序都跑起来再用,就明显快很多了,这就是设备的预热。同理的,GPU在你不用的时候是低功耗状态,它会把有些高性能的功能暂时关闭或降低性能,这时候如果你把模型放上面处理,你就能明显感觉到有点满,甚至你从点击程序运行以后要等个几秒钟才出结果,因为这个阶段GPU要完成很多初始化工作【当然了,这也和显卡好坏有关系】。


所以为了可以充分利用起显卡,也为了可以更准确的计算预测时间,我们可以采用模型预热的方式,其实方式很简单,就好比你让模型在显卡上先空跑一段时间。例如这样:

device = torch.device('cuda:0')
model.to(device)
model.eval()
# 预热,让模型先跑20轮
for i in range(20):
    output = model(x)

以ResNet50为例,先来看下没有预热时候测出来的速率:


predict time : 67.120902ms,FPS:14.898488646953012


再来看看预热以后计算出来的速率,是不是和上面比速度有提升呢?


predict time : 55.680942ms,FPS:17.95946634245771


预热代码:

import torch
from torchvision.models import resnet50
import time
epoch = 100
model = resnet50(pretrained=False)
device = torch.device('cuda:0')
x = torch.ones(1, 3, 640, 640).to(device)
model.to(device)
model.eval()
for _ in range(20):
    output = model(x)
times = torch.zeros(epoch)  # 用来存放每次测试结果
randn_input = torch.randn(1, 3, 640, 640).to(device)
with torch.no_grad():
    for i in range(epoch):
        time1 = time.time()
        output = model(randn_input)
        time2 = time.time()
        times[i] = time2 - time1
mean_time = times.mean().item()  # 单位是秒
print("predict time : {:.6f}ms,FPS:{}".format(mean_time*1000, 1/(mean_time)))


异步转同步


其实到这里还没有完,因为在实际计算时间的时候还牵扯一个GPU的异步处理,而python中的time函数往往是在CPU端运行的【如果你的模型本来就是用CPU推理的,那没什么问题】,这就表明你用time函数计算时间时,可能有些数据在GPU上还没处理完呢你就已经给出结果了,因此在利用GPU推理的时候,应当用torch官方提供的torch.cuda.synchronize()将模型切换到同步处理,这样的时间才是更准确的,并用torch.cuda.Event来代替time获得最终的时间。


先看一张图,图的左边是同步执行,右边是异步执行。同步执行中进程A需要等进程B执行完或者给一个响应才会继续执行进程A,而在异步执行中,进程A并不需要等待进程B的响应然后再继续执行,这就有可能会出现一种情况,一个代码可能比另一个代码先执行完。打个比方,进程A是CPU,进程B是GPU,你的模型是在GPU上执行的,如果你用time函数,实际得出的结果是进程A的,但你的模型其实已经在B中完成了,那么你这个时间就是不准确的。

40.png

为了可以更精确的判断我们的模型推理性能,我们需要将这个过程从异步转为同步。 代码如下:

import torch
from torchvision.models import resnet50
import time
epoch = 100
model = resnet50(pretrained=False)
device = torch.device('cuda:0')
x = torch.ones(1, 3, 640, 640).to(device)
starter, ender = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)
model.to(device)
model.eval()
for _ in range(20):
    output = model(x)
times = torch.zeros(epoch)  # 用来存放每次测试结果
randn_input = torch.randn(1, 3, 640, 640).to(device)
with torch.no_grad():
    for i in range(epoch):
        starter.record()
        output = model(randn_input)
        ender.record()
        # 异步转同步
        torch.cuda.synchronize()
        times[i] = starter.elapsed_time(ender)  # 单位是毫秒
mean_time = times.mean().item()
print("predict time : {:.6f}ms,FPS:{}".format(mean_time, 1000/mean_time))

elapsed_time()这个函数返回的时间单位是毫秒,需要和time函数区分。用synchronize()可以将GPU默认的异步转同步,等待事件的完成。

现在再来看一下这次的测量时间:


predict time : 47.589127ms,FPS:21.01320347146227


注意,上面说的这些东西也受硬件、分辨率、以及你模型大小以及计算量影响的,上面说的仅是一个参考。  



相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
19天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
12天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
22天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
31 2
|
22天前
|
机器学习/深度学习 自然语言处理 算法
什么是卷积神经网络
【10月更文挑战第23天】什么是卷积神经网络
32 1
|
25天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
72 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
12天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
29 0
|
16天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
22天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
24天前
|
机器学习/深度学习 算法 计算机视觉
深度学习与生活:如何利用卷积神经网络识别日常物品
【10月更文挑战第24天】在这篇文章中,我们将探索深度学习如何从理论走向实践,特别是卷积神经网络(CNN)在图像识别中的应用。通过一个简单的示例,我们将了解如何使用CNN来识别日常生活中的物体,如水果和家具。这不仅是对深度学习概念的一次直观体验,也是对技术如何融入日常生活的一次深刻反思。文章将引导读者思考技术背后的哲理,以及它如何影响我们的生活和思维方式。

热门文章

最新文章