pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍

这篇具有很好参考价值的文章主要介绍了pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 测量时间的方式

time.time()
time.perf_counter()
time.process_time()

time.time() 和time.perf_counter() 包括sleep()time 可以用作一般的时间测量,time.perf_counter()精度更高一些
time.process_time()当前进程的系统和用户CPU时间总和的值

测试代码:

def show_time():
    print('我是time()方法:{}'.format(time.time()))
    print('我是perf_counter()方法:{}'.format(time.perf_counter()))
    print('我是process_time()方法:{}'.format(time.process_time()))
    t0 = time.time()
    c0 = time.perf_counter()
    p0 = time.process_time()
    r = 0
    for i in range(10000000):
        r += i
    time.sleep(2)
    print(r)
    t1 = time.time()
    c1 = time.perf_counter()
    p1 = time.process_time()
    spend1 = t1 - t0
    spend2 = c1 - c0
    spend3 = p1 - p0
    print("time()方法用时:{}s".format(spend1))
    print("perf_counter()用时:{}s".format(spend2))
    print("process_time()用时:{}s".format(spend3))
    print("测试完毕")

测试结果:
pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍
更详细解释参考
Python3.7中time模块的time()、perf_counter()和process_time()的区别

2. model.eval(), model.train(), torch.no_grad()方法介绍

2.1 model.train()和model.eval()

我们知道,在pytorch中,模型有两种模式可以设置,一个是train模式、另一个是eval模式。

model.train()的作用是启用 Batch Normalization 和 Dropout。在train模式,Dropout层会按照设定的参数p设置保留激活单元的概率,如keep_prob=0.8,Batch Normalization层会继续计算数据的mean和var并进行更新。

model.eval()的作用是不启用 Batch Normalization 和 Dropout。在eval模式下,Dropout层会让所有的激活单元都通过,而Batch Normalization层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值。

在使用model.eval()时就是将模型切换到测试模式,在这里,模型就不会像在训练模式下一样去更新权重。但是需要注意的是model.eval()不会影响各层的梯度计算行为,即会和训练模式一样进行梯度计算和存储,只是不进行反向传播。

2.2 model.eval()和torch.no_grad()

在讲model.eval()时,其实还会提到torch.no_grad()。

torch.no_grad()用于停止autograd的计算,能起到加速和节省显存的作用,但是不会影响Dropout层和Batch Normalization层的行为。

如果不在意显存大小和计算时间的话,仅仅使用model.eval()已足够得到正确的validation的结果;而with torch.zero_grad()则是更进一步加速和节省gpu空间。因为不用计算和存储梯度,从而可以计算得更快,也可以使用更大的batch来运行模型。

3. 模型推理时间方式

在测量时间的时候,与一般测试不同,比如下面的代码不正确:

start = time.time()
result = model(input)
end = time.time()

而应该采用:

torch.cuda.synchronize()
start = time.time()
result = model(input)
torch.cuda.synchronize()
end = time.time()

因为在pytorch里面,程序的执行都是异步的。
如果采用代码1,测试的时间会很短,因为执行完end=time.time()程序就退出了,后台的cu也因为python的退出退出了。
如果采用代码2,代码会同步cu的操作,等待gpu上的操作都完成了再继续成形end = time.time()

4. 一个完整的测试模型推理时间的代码

一般是首先model.eval()不启用 Batch Normalization 和 Dropout, 不启用梯度更新
然后利用mode创建模型,和初始化输入数据(单张图像)

def measure_inference_speed(model, data, max_iter=200, log_interval=50):
    model.eval()

    # the first several iterations may be very slow so skip them
    num_warmup = 5
    pure_inf_time = 0
    fps = 0

    # benchmark with 2000 image and take the average
    for i in range(max_iter):

        torch.cuda.synchronize()
        start_time = time.perf_counter()

        with torch.no_grad():
            model(*data)

        torch.cuda.synchronize()
        elapsed = time.perf_counter() - start_time

        if i >= num_warmup:
            pure_inf_time += elapsed
            if (i + 1) % log_interval == 0:
                fps = (i + 1 - num_warmup) / pure_inf_time
                print(
                    f'Done image [{i + 1:<3}/ {max_iter}], '
                    f'fps: {fps:.1f} img / s, '
                    f'times per image: {1000 / fps:.1f} ms / img',
                    flush=True)

        if (i + 1) == max_iter:
            fps = (i + 1 - num_warmup) / pure_inf_time
            print(
                f'Overall fps: {fps:.1f} img / s, '
                f'times per image: {1000 / fps:.1f} ms / img',
                flush=True)
            break
    return fps
if __name__ == "__main__":
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    # device = 'cpu'
    print(device)
    img_channel = 3
    width = 32

    enc_blks = [2, 2, 4, 8]
    middle_blk_num = 12
    dec_blks = [2, 2, 2, 2]

    width = 16
    enc_blks = [1, 1, 1]
    middle_blk_num = 1
    dec_blks = [1, 1, 1]

    net = NAFNet(img_channel=img_channel, width=width, middle_blk_num=middle_blk_num,
                 enc_blk_nums=enc_blks, dec_blk_nums=dec_blks)
    net = net.to(device)

    data = [torch.rand(1, 3, 256, 256).to(device)]
    fps = measure_inference_speed(net, data)
    print('fps:', fps)

    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    # device = 'cpu'
    print(device)
	
	# sample 2
    net = UNetSeeInDark()
    net = net.to(device)

    data = [torch.rand(1, 4, 400, 400).to(device)]
    fps = measure_inference_speed(net, data)
    print('fps:', fps)

    # gpu : 32ms  cpu: 350ms
    summary(net, input_size=(1, 4, 400, 400), col_names=["kernel_size", "output_size", "num_params", "mult_adds"])
    from ptflops import get_model_complexity_info

    macs, params = get_model_complexity_info(net, (4, 400, 400), verbose=True, print_per_layer_stat=True)
    print(macs, params)

pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍

5. 参考:

https://blog.csdn.net/weixin_44317740/article/details/104651434
https://zhuanlan.zhihu.com/p/547033884
https://deci.ai/blog/measure-inference-time-deep-neural-networks/
https://github.com/xinntao/BasicSR文章来源地址https://www.toymoban.com/news/detail-462115.html

到了这里,关于pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模型训练时使用的 model.train() 和模型测试时使用的 model.eval()

    在 PyTorch 中,模型训练时使用的  model.train()  和模型测试时使用的  model.eval()  分别用于开启和关闭模型的训练模式和测试模式。 model.train()  会将模型设置为训练模式,启用 Dropout 和 Batch Normalization 等训练时特有的操作。这种模式适用于训练阶段,由于 Dropout 在每次迭代时

    2024年02月11日
    浏览(40)
  • 【学习】pytorch中with torch.no_grad():和 model.eval()的区别

    model.eval()和with torch.no_grad()的区别 先给出结论: 这两个的所起的作用是不同的。 model.eval()的作用是不启用Batch Normalization 和 Dropout. 相当于告诉网络,目前在eval模式,dropout层不会起作用(而在训练阶段,dropout会随机以一定的概率丢弃掉网络中间层的神经元,而且在实际操作

    2024年02月22日
    浏览(48)
  • 【PyTorch如何实现CPU、GPU相互转换?】

    写代码时非常困惑,明明下载了cuda支持包和PyTorch-GPU版本,进行NN和CNN时却是用CPU在进行计算(CPU利用率超90%,GPU利用率不到5%),如下图: 首先我检查了PyTorch是否安装成功,输入命令print(torch.cuda.is_available()),返回值为True,说明PyTorch是安装成功了,这可让我有点捉急。 看

    2024年02月06日
    浏览(31)
  • pytorch 安装部署(cpu+gpu) linux+windows

    官网打开可能较慢,耐心等待,可以正常打开。 链接:pytorch官网 2023年12月10日更新,演示版本2.1.1 如果中间有任何报错,参考最后一节的处理 1.pytorch是一个和tensorflow类似的框架 如果需要安装tensorflow,可以参考: tensorflow 1,2 cpu+gpu(windows+linux)安装 2.安装anaconda 主要是为

    2024年02月03日
    浏览(41)
  • pytorch如何查看tensor和model在哪个GPU上以及指定GPU设备

    1. 查看tensor所在的设备: 2. 查看model所在的设备 3. Pytorch中将模型和张量加载到GPU的常用方法有两种。 方式1: 方式2: 4. 指定GPU代码 参考链接:PyTorch 中 选择指定的 GPU 注意需要将指定GPU代码放在程序段最开始的部位,如下图所示: 5.查看gpu个数

    2024年02月13日
    浏览(42)
  • conda安装GPU版pytorch,结果总是cpu版本

    正常安装某版本pytorch时,采用官网的方法和对应的命令,选择适合的pytorch、cudatoolkit版本 Previous PyTorch Versions | PyTorch 由于要在GPU上运行,但测试发现pytorch装的是cpuonly的版本: 得到的结果是false 再检查安装的pytorch版本,可以看到是cpuonly的版本: 这里建议直接采用解决三 参

    2024年02月06日
    浏览(59)
  • 怎么把pytorch从CPU版本替换成GPU版本

    使用pip命令 pip uninstall torch 就可以卸载当前的torch版本。(不是cpu版本一般也没有必要重装吧?) 接着找到官网https://pytorch.org/get-started/locally/ 在里面选择 根据你自己的需要选择最新的(我现在是11.8)或者没那么新的(11.7)的GPU版torch 接着复制下面的pip3的安装命令 pip3 ins

    2024年02月13日
    浏览(35)
  • pytorch实现简单的线性回归cpu版本和gpu版本

    实现步骤 准备数据 定义模型 实例化模型,实例优化器类,实例loss 循环进行梯度下降,参数更新 cpu版本实现

    2024年02月16日
    浏览(57)
  • 解决conda安装的pytorch是CPU版本/conda安装pytorch的GPU版本

    激活conda环境,并查看 发现pytorch版本是cpu_py38*********,代表是CPU版本。 (别太在意原有的库包,因为cpu版本关联了很多包,一个是cpu版本会有不少包都是cpu版本,重装后缺什么再安装什么就是了) 我这里指定3.8的py版本重装一个叫env的环境 查看当前的conda源中,pytorch的安装

    2024年02月05日
    浏览(62)
  • pytorch2.0.1 安装部署(cpu+gpu) linux+windows

    官网打开可能较慢,耐心等待,可以正常打开。 链接:pytorch官网 2023年12月10日更新,演示版本2.1.1 如果中间有任何报错,参考最后一节的处理 1.pytorch是一个和tensorflow类似的框架 如果需要安装tensorflow,可以参考: tensorflow 1,2 cpu+gpu(windows+linux)安装 2.安装anaconda 主要是为

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包