torch.backends.cudnn.benchmark
torch.backends.cudnn.benchmark=True
将会在程序在开始时花费一点额外时间
因为网络固定,可以为整个网络的每个卷积层搜索最适合它的卷积实现算法,实现加速。
(实现卷积层的算法还有基于 GEMM的,基于 FFT 的,基于 Winograd 算法的等等,而且每个算法还有自己的一些变体。在一个开源的 C++ 库 triNNity 中,就实现了接近 80 种的卷积前向传播算法!)
适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。
可以设置在定义device时
if args.use_gpu and torch.cuda.is_available():
device = torch.device('cuda')
torch.backends.cudnn.benchmark = True
else:
device = torch.device('cpu')
参考:https://zhuanlan.zhihu.com/p/73711222
总结:预优化减少时间
torch.backends.cudnn.deterministic
torch.backends.cudnn.deterministic = True,每次返回的卷积算法将是确定的,即默认算法。
配合上设置 Torch 的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的
#确保输入固定时,输出不变
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
参考:https://zhuanlan.zhihu.com/p/141063432?from_voters_page=true
附:设置随机种子
ms_seed = 42069
np.random.seed(my_seed)
torch.manual_seed(my_seed)
torch.cuda.manual_seed_all(my_seed)