CPU适合串行计算,擅长逻辑控制;
GPU擅长高强度并行计算,适用于AI算法的训练学习;
CUDA是NVIDIA专门负责管理分配运算单元的框架;
cuDNN是用于深度神经网络的GPU加速库。
cuDNN使用非确定性算法,可以通过torch.backends.cudnn.enabled = False对其进行禁用;如果设置torch.backends.cudnn.enabled = True,则表明可以使用cuDNN。
如果在可以使用cuDNN的基础上,再设置torch.backends.cudnn.benchmark = True,那么cuDNN使用的非确定性算法就会自动寻找最适合当前配置的高效算法,来达到优化运行效率的目的。
如果网络的输入数据在维度或类型上变化不大,那么设置torch.backends.cudnn.benchmark = True可以增加运行效率;
如果网络的输入数据在每次iteration时都会在维度或类型上发生变化的话,会导致cuDNN每次都去寻找一遍最优配置,这样反而会降低运行效率。
因此,有时我们会看见在代码开头会出现这样两行代码:
torch.backends.cudnn.enabled = True # 使用cuDNN
torch.backends.cudnn.benchmark = True # cuDNN自动寻找最适合当前配置的高效算法
在使用GPU的时候,PyTorch会默认使用cuDNN加速,但是在使用cuDNN的时候,torch.backends.cudnn.benchmark的默认值为False。如果将标志位置为True,我们就可以在PyTorch中对模型内的卷积层进行预先的优化,也就是在每一个卷积层中测试cuDNN提供的所有卷积实现算法,然后选择最快的那个。这样在模型启动的时候,只要额外多花一点点预处理时间,就可以较大幅度地减少训练时间。
如果在PyTorch程序中设置了torch.backends.cudnn.deterministic = True,并且torch.backends.cudnn.benchmark = False的话,那么模型就会选那个默认的卷积算法。
如果将torch.backends.cudnn.deterministic的标志位置为True的话,每次返回的卷积算法将是确定的,即默认算法。如果配合上设置Torch的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的。