利用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


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



相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
9天前
|
机器学习/深度学习
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
|
9天前
|
机器学习/深度学习
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
|
13天前
|
Kubernetes 网络协议 Cloud Native
Kubernetes网络问题排查分享两则(1)——calico特定场景下的网络性能问题
在对Kubernetes项目[kosmos](https://github.com/kosmos-io/kosmos)与Calico网络性能进行对比测试时,发现kosmos在跨集群容器网络的性能显著优于Calico的集群内网络(约6Gbit/s对比2.9Gbit/s)。物理机网络测试达到9.38Gbit/s,显示Calico有68%的性能损耗。问题定位到网卡的checksum/offload参数,尝试用`ethtool`调整后虽短暂提升,但随后恢复原状。转载自:https://mp.weixin.qq.com/s/XsQZCSqZAXJK46zqc7IpLw
|
21天前
|
监控 Python 调度
【计算巢】网络监控工具:保持网络健康与性能的重要性
【6月更文挑战第2天】网络监控工具扮演着数字高速公路上的“交警”角色,确保网络畅通无阻。它们监控网络状态,及时发现并定位故障,优化性能,如调整资源分配和管理带宽占用。Python的psutil库是一个简单示例,用于获取网络接口数据。选择合适的监控工具至关重要,但也不能完全依赖,需随着网络技术进步不断升级。网络监控工具是保障网络健康和效率的得力助手,让我们的数字世界运行更加顺畅。
|
22天前
|
存储 监控 安全
云端防御:融合云计算与网络安全的战略性技术展望
【5月更文挑战第31天】 随着企业数字化转型的深入,云计算已成为支撑现代业务架构的关键平台。然而,云服务的广泛采用也带来了前所未有的安全挑战。本文将探讨云计算环境中的网络安全和信息安全问题,并分析当前及未来的技术解决方案。重点关注云服务模型的安全特点、网络安全防护机制、以及在维护数据保密性、完整性和可用性方面的战略措施。通过综合分析,旨在为构建安全稳固的云环境提供指导和策略建议。
|
23天前
|
云安全 安全 网络安全
云端之盾:融合云计算与网络安全的未来之路
【5月更文挑战第30天】 随着数字化转型的浪潮,企业愈发依赖云计算以实现敏捷性和成本效益。然而,云服务的广泛应用也催生了对网络安全和信息安全的新要求。本文深入探讨了在动态且复杂的云环境中维护数据完整性、保密性和可用性的挑战,并提出了综合策略和技术框架来强化云安全体系。我们将从云服务模型出发,分析不同服务层次的安全风险,进而讨论当前网络安全技术如何与云计算环境相适应,最后提出创新的信息安全解决方案,旨在为构建一个更安全的云服务生态提供参考。
|
25天前
|
云安全 安全 网络安全
云端防御策略:融合云计算与网络安全的未来之路
【5月更文挑战第28天】 在数字化的浪潮中,云计算已成为企业架构的核心。然而,随着云服务不断扩展其边界,网络安全和信息安全的挑战亦步步紧逼。本文将探讨如何构建一个既高效又安全的云计算环境,分析现有安全威胁,并提出创新的防御策略。通过深入剖析云服务模型、加密技术、身份认证机制及入侵检测系统,本文旨在为读者提供一个全面的网络安全视角,同时对未来云计算与网络安全的融合趋势进行预测。
|
24天前
|
云安全 安全 网络安全
云端防御战线:融合云计算与网络安全的未来
【5月更文挑战第29天】 随着企业数字化转型的加速,云计算已成为推动业务发展的重要力量。然而,云服务在带来便利的同时,也引入了新型的安全挑战。本文探讨了云计算环境中的网络安全和信息安全技术,分析了当前云安全面临的威胁模型,并提出了多层次、多维度的安全策略。文章旨在为读者提供一个全面的视角,以理解如何有效保护云基础设施和数据,同时确保业务的连续性和合规性。
|
25天前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的32QAM解调算法matlab性能仿真
```markdown - 32QAM解调算法运用BP神经网络在matlab2022a中实现,适应复杂通信环境。 - 网络结构含输入、隐藏和输出层,利用梯度下降法优化,以交叉熵损失最小化为目标训练。 - 训练后,解调通过前向传播完成,提高在噪声和干扰中的数据恢复能力。 ``` 请注意,由于字符限制,部分详细信息(如具体图示和详细步骤)未能在摘要中包含。
|
27天前
|
人工智能 安全 网络安全
云端防御策略:融合云计算与网络安全的未来之路
【5月更文挑战第27天】 随着企业逐渐将关键业务迁移至云端,云计算的安全性已成为不容忽视的焦点。本文探讨了在动态且复杂的云环境中如何维护网络安全和信息安全的策略和技术。通过分析云服务模型(IaaS、PaaS、SaaS)的安全挑战,我们提出了一系列创新的防护机制,包括身份验证强化、数据加密技术、入侵检测系统以及安全合规性监管。此外,文章还讨论了利用人工智能(AI)进行威胁检测和响应的最新趋势。本文旨在为云服务提供商和使用者提供一套综合性的安全防护框架,以应对不断演变的网络威胁。

热门文章

最新文章