torch.backends.cudnn.benchmark=True 的效果和坑
系统环境
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 的效果和坑相关推荐
- pytorch之torch.backends.cudnn.benchmark=True——使用 GPU 来加速网络的训练
文章目录 简介 适用场景 简介 import torch torch.backends.cudnn.enabled = True torch.backend.cudnn.benchmark=True ...
- pytorch——torch.backends.cudnn.benchmark = True
问题: torch.backends.cudnn.benchmark = True 在利用pytorch进行网络训练时总会见到这行代码,这句有什么用呢?查了一些资料才知道是个非必须项,那加了有什么用呢 ...
- torch.backends.cudnn.benchmark = true的作用
在很多情况下我们都能看到代码里有这样一行: torch.backends.cudnn.benchmark = true 大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tun ...
- torch.backends.cudnn.benchmark ?!
大家在训练深度学习模型的时候,经常会使用 GPU 来加速网络的训练.但是说起 torch.backends.cudnn.benchmark 这个 GPU 相关的 flag,可能有人会感到比较陌生.在一 ...
- torch.backends.cudnn.benchmark
参考 torch.backends.cudnn.benchmark ?! - 云+社区 - 腾讯云 大家在训练深度学习模型的时候,经常会使用 GPU 来加速网络的训练.但是说起 torch.bac ...
- 随机种子、torch.backends.cudnn.benchmark\.deterministic
为什么使用相同的网络结构,跑出来的效果完全不同,用的学习率,迭代次数,batch size 都是一样? 固定随机数种子是非常重要的. 但是如果你使用的是PyTorch等框架,还要看一下框架的种子是否固 ...
- torch.backends.cudnn.benchmark 加速训练
设置 torch.backends.cudnn.benchmark=True 将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速.适用场景是网络结 ...
- 【Pytorch】torch.backends.cudnn.benchmark 作用
作用 针对你当前的硬件,找到最合适的算法.(注意,很多代码里会有import torch.backends.cudnn as cudann,所以其实torch.backends.cudnn.bench ...
- torch.backends.cudnn.benchmark有什么用?
torch.backends.cudnn.benchmark有什么用? 针对网络模型固定.输入参数固定的场景,将上述变量设置为True可以增加训练效率. cuDNN是英伟达为深度神经网络(DNN)设计 ...
最新文章
- 正确、安全地停止springboot应用
- 硬核NeruIPS 2018最佳论文,一个神经了的常微分方程
- 缺少com.umeng.analytics.MobclickAgent包,引入需注意
- php stock 资料地址
- windows无法启动oracleremexecservice服务_Windows下MySQL无法启动万能解决方案
- Linux设备驱动程序学习(4) -高级字符驱动程序操作[(1)ioctl and llseek]
- STL Map学习总结
- easyui layout 收缩的bug
- java delete file 失败_文件无法删除java.io.IOException: Unable to delete
- 语音识别百度阿里哪家强?识别率评测
- Windows Defender
- 对账 概念 - 账证核对,账账核对,账实核对,账表核对
- linux人员最爱用的键盘,Linux工作者必备-filco 87 忍者2代 黑色青轴
- php的strtoupper,关于PHP的strtoupper函数
- 华为设备DNS配置命令
- 到底应不应该【跨专业】考研计算机?希望大么?
- LTE MAC层令牌桶算法
- ChatGPT这是要抢走我的饭碗?我10年硬件设计都有点慌了
- XP系统取消开机硬件检查
- 2020.3.20 C++电视机遥控器