系统环境
CUDA 11.1
gtx1070-8g
win10 21h1 19043.1266

打开该选项
torch.backends.cudnn.benchmark=True
加快运算速度,但相比加速。。。。。。
最为直观的影响
计算误差会增大约1000倍。
显存占用会变为关闭时的 1.1 - 1.5 倍。

这个选项不能随便打开,影响很大。

以下为实验
cudnn.benchmark = False,显存占用为 3.0 G

card_id: 0 elapsed/total: 1/10 max_diff_1: 0.00003290 max_diff_1: 0.00002837
card_id: 0 elapsed/total: 2/10 max_diff_1: 0.00003082 max_diff_1: 0.00002468
card_id: 0 elapsed/total: 3/10 max_diff_1: 0.00003231 max_diff_1: 0.00002813
card_id: 0 elapsed/total: 4/10 max_diff_1: 0.00003111 max_diff_1: 0.00002661
card_id: 0 elapsed/total: 5/10 max_diff_1: 0.00003064 max_diff_1: 0.00002551
card_id: 0 elapsed/total: 6/10 max_diff_1: 0.00003046 max_diff_1: 0.00002813
card_id: 0 elapsed/total: 7/10 max_diff_1: 0.00003266 max_diff_1: 0.00002570
card_id: 0 elapsed/total: 8/10 max_diff_1: 0.00003067 max_diff_1: 0.00002459
card_id: 0 elapsed/total: 9/10 max_diff_1: 0.00003183 max_diff_1: 0.00002503
card_id: 0 elapsed/total: 10/10 max_diff_1: 0.00003159 max_diff_1: 0.00002563

cudnn.benchmark = True,显存占用为 4.0 G

card_id: 0 elapsed/total: 1/10 max_diff_1: 0.12276840 max_diff_1: 0.09905499
card_id: 0 elapsed/total: 2/10 max_diff_1: 0.10842407 max_diff_1: 0.08467466
card_id: 0 elapsed/total: 3/10 max_diff_1: 0.11710882 max_diff_1: 0.08327144
card_id: 0 elapsed/total: 4/10 max_diff_1: 0.11344403 max_diff_1: 0.08150017
card_id: 0 elapsed/total: 5/10 max_diff_1: 0.10728776 max_diff_1: 0.08666122
card_id: 0 elapsed/total: 6/10 max_diff_1: 0.12120318 max_diff_1: 0.08831707
card_id: 0 elapsed/total: 7/10 max_diff_1: 0.12990451 max_diff_1: 0.08046508
card_id: 0 elapsed/total: 8/10 max_diff_1: 0.11482769 max_diff_1: 0.08473527
card_id: 0 elapsed/total: 9/10 max_diff_1: 0.11562169 max_diff_1: 0.08603296
card_id: 0 elapsed/total: 10/10 max_diff_1: 0.11495388 max_diff_1: 0.08923209

以下为实验代码,你可以通过修改第100行的代码来观察 cudnn.benchmark 的影响

'''
用于检测cuda运算错误
'''
import os
import torch
import torch.nn as nn
from torch.backends import cudnn
import argparse
import time
import platformdef ConvBnAct(in_ch, out_ch, ker_sz, stride, pad, act=nn.Identity(), group=1, dilation=1):return nn.Sequential(nn.Conv2d(in_ch, out_ch, ker_sz, stride, pad, groups=group, bias=False, dilation=dilation),nn.GroupNorm(16, out_ch, eps=1e-8),act)def DeConvBnAct(in_ch, out_ch, ker_sz, stride, pad, act=nn.Identity(), group=1, dilation=1):return nn.Sequential(nn.ConvTranspose2d(in_ch, out_ch, ker_sz, stride, pad, groups=group, bias=False, dilation=dilation),nn.GroupNorm(16, out_ch, eps=1e-8),act)class RevSequential(nn.ModuleList):'''功能大部分与ModuleList重叠'''def __init__(self, modules=None):super().__init__(modules)def append(self, module):assert hasattr(module, 'invert') and callable(module.invert)super().append(module)def extend(self, modules):for m in modules:self.append(m)def forward(self, x1, x2):y1, y2 = x1, x2for m in self:y1, y2 = m(y1, y2)return y1, y2def invert(self, y1, y2):x1, x2 = y1, y2for m in list(self)[::-1]:x1, x2 = m.invert(x1, x2)return x1, x2class RevGroupBlock(RevSequential):'''当前只支持输入通道等于输出通道,并且不允许下采样'''def __init__(self, in_ch, out_ch, stride, act, block_type, blocks, **kwargs):assert in_ch == out_chassert stride == 1mods = []for _ in range(blocks):mods.append(block_type(in_ch=in_ch, out_ch=out_ch, stride=1, act=act, **kwargs))# self.extend(mods)super().__init__(mods)class RevBlockC(nn.Module):def __init__(self, in_ch, out_ch, stride, act, **kwargs):super().__init__()inter_ch = in_ch // 2self.conv1 = ConvBnAct(in_ch, inter_ch, ker_sz=5, stride=1, pad=2, act=act)self.conv2 = ConvBnAct(inter_ch, inter_ch, ker_sz=5, stride=1, pad=2, act=act, group=inter_ch)self.conv3 = ConvBnAct(in_ch, in_ch, ker_sz=1, stride=1, pad=0, act=nn.Identity())def func(self, x):y1 = self.conv1(x)y2 = self.conv2(y1)y = torch.cat([y1, y2], dim=1)y = self.conv3(y)return ydef forward(self, x1, x2):y = x1 + self.func(x2)return x2, ydef invert(self, y1, y2):x2, y = y1, y2x1 = y - self.func(x2)return x1, x2def new_model():act = nn.ELU()rvb = RevGroupBlock(128, 128, 1, act, RevBlockC, 12).to(device)rvb.eval()return rvbif __name__ == '__main__':cudnn.benchmark = Truecudnn.deterministic = Truetorch.set_grad_enabled(False)parse = argparse.ArgumentParser(description='Used to check pytorch cudnn.benchmark flag.')parse.add_argument('-i', type=int, help='Card id. Which cuda card do you want to test. default: 0', default=0)parse.add_argument('-e', type=int, help='Epoch. defaule: 10', default=10)parse.add_argument('-bp', type=bool, help='Use backward. defaule: True', default=True)parse.add_argument('-bs', type=int, help='Batch size. defaule: 8', default=8)parse = parse.parse_args()card_id = parse.iepoch = parse.euse_backward = parse.bpbatch_size = parse.bs# 使用cpu测试理论上是永远不会报错的device = 'cpu' if card_id == -1 else f'cuda:{card_id}'device = torch.device(device)assert epoch > 0assert batch_size > 0rvb = new_model()torch.set_grad_enabled(use_backward)for e in range(epoch):e = e+1a1 = torch.randn(batch_size, 128, 64, 64, device=device)b1, b2 = rvb(a1, a1)o_a1, o_a2 = rvb.invert(b1, b2)if use_backward:(o_a1.max() + o_a2.max()).backward()with torch.no_grad():max_diff_1 = torch.abs(o_a1 - o_a2).max().item()max_diff_2 = torch.abs(a1 - o_a1).max().item()line = f'card_id: {card_id} elapsed/total: {e}/{epoch} max_diff_1: {max_diff_1:.8f} max_diff_1: {max_diff_2:.8f}'print(line)

torch.backends.cudnn.benchmark=True 的效果和坑相关推荐

  1. pytorch之torch.backends.cudnn.benchmark=True——使用 GPU 来加速网络的训练

    文章目录 简介 适用场景 简介 import torch torch.backends.cudnn.enabled = True torch.backend.cudnn.benchmark=True ...

  2. pytorch——torch.backends.cudnn.benchmark = True

    问题: torch.backends.cudnn.benchmark = True 在利用pytorch进行网络训练时总会见到这行代码,这句有什么用呢?查了一些资料才知道是个非必须项,那加了有什么用呢 ...

  3. torch.backends.cudnn.benchmark = true的作用

    在很多情况下我们都能看到代码里有这样一行: torch.backends.cudnn.benchmark = true 大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tun ...

  4. torch.backends.cudnn.benchmark ?!

    大家在训练深度学习模型的时候,经常会使用 GPU 来加速网络的训练.但是说起 torch.backends.cudnn.benchmark 这个 GPU 相关的 flag,可能有人会感到比较陌生.在一 ...

  5. torch.backends.cudnn.benchmark

    参考   torch.backends.cudnn.benchmark ?! - 云+社区 - 腾讯云 大家在训练深度学习模型的时候,经常会使用 GPU 来加速网络的训练.但是说起 torch.bac ...

  6. 随机种子、torch.backends.cudnn.benchmark\.deterministic

    为什么使用相同的网络结构,跑出来的效果完全不同,用的学习率,迭代次数,batch size 都是一样? 固定随机数种子是非常重要的. 但是如果你使用的是PyTorch等框架,还要看一下框架的种子是否固 ...

  7. torch.backends.cudnn.benchmark 加速训练

    设置 torch.backends.cudnn.benchmark=True 将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速.适用场景是网络结 ...

  8. 【Pytorch】torch.backends.cudnn.benchmark 作用

    作用 针对你当前的硬件,找到最合适的算法.(注意,很多代码里会有import torch.backends.cudnn as cudann,所以其实torch.backends.cudnn.bench ...

  9. torch.backends.cudnn.benchmark有什么用?

    torch.backends.cudnn.benchmark有什么用? 针对网络模型固定.输入参数固定的场景,将上述变量设置为True可以增加训练效率. cuDNN是英伟达为深度神经网络(DNN)设计 ...

最新文章

  1. 正确、安全地停止springboot应用
  2. 硬核NeruIPS 2018最佳论文,一个神经了的常微分方程
  3. 缺少com.umeng.analytics.MobclickAgent包,引入需注意
  4. php stock 资料地址
  5. windows无法启动oracleremexecservice服务_Windows下MySQL无法启动万能解决方案
  6. Linux设备驱动程序学习(4) -高级字符驱动程序操作[(1)ioctl and llseek]
  7. STL Map学习总结
  8. easyui layout 收缩的bug
  9. java delete file 失败_文件无法删除java.io.IOException: Unable to delete
  10. 语音识别百度阿里哪家强?识别率评测
  11. Windows Defender
  12. 对账 概念 - 账证核对,账账核对,账实核对,账表核对
  13. linux人员最爱用的键盘,Linux工作者必备-filco 87 忍者2代 黑色青轴
  14. php的strtoupper,关于PHP的strtoupper函数
  15. 华为设备DNS配置命令
  16. 到底应不应该【跨专业】考研计算机?希望大么?
  17. LTE MAC层令牌桶算法
  18. ChatGPT这是要抢走我的饭碗?我10年硬件设计都有点慌了
  19. XP系统取消开机硬件检查
  20. 2020.3.20 C++电视机遥控器

热门文章

  1. Elasticsearch 7新特性
  2. linux脚本看日历,linux 下查看日历的命令为
  3. DAO及工厂模式实现
  4. C6_函数多文件管理练习
  5. 自动挡汽车驾驶技巧大全
  6. 写一个程序,读入秒数,然后按小时、分及秒输出。
  7. 《道德经》全文和译文(经典版本)
  8. win10 1803版本Chrome(谷歌浏览器),360浏览器极速内核打不开https网站的解决方法
  9. 厦门银行:稳健增长背后的差异化竞争之道
  10. katalon的那些坑