cuDNN概述
NVIDIA cuDNN是一个GPU加速深层神经网络原语库。它提供了在DNN应用程序中频繁出现的例程的高度优化的实现:
- 卷积前馈和反馈,
- pooling前馈和反馈
- softmax前馈和反馈
神经元前馈和反馈:
-
- 整流线性(ReLU)
-sigmoid - 双曲线正切(TANH)
- 张量转换函数
- 整流线性(ReLU)
- LRN,LCN和批量归一化前进和后退
cuDNN的卷积程序旨在提高性能,以最快的GEMM(矩阵乘法)为基础实现此类例程,同时使用更少的内存。
cuDNN具有可定制的数据布局,支持四维张量的灵活维度排序,跨步和子区域,用作所有例程的输入和输出。这种灵活性可以轻松集成到任何神经网络实现中,并避免使用基于GEMM的卷积有时需要的输入/输出转换步骤。
cuDNN提供基于上下文的API,可以轻松实现与CUDA流的多线程和(可选)互操作性。
编程模型:
cuDNN库公开了一个Host API,但是假定对于使用GPU的操作,可以从设备直接访问必要的数据。
使用cuDNN的应用程序必须通过调用来初始化库上下文的句柄 cudnnCreate()。这个句柄被显式地传递给每一个在GPU数据上运行的后续库函数。一旦应用程序完成使用cuDNN,它就可以释放与库处理相关的资源 cudnnDestroy()。这种方法允许用户在使用多个主机线程,GPU和CUDA流时显式控制库的功能。例如,一个应用程序可以使用cudaSetDevice()要将不同的设备与不同的主机线程关联起来,并在每个主机线程中关联,请使用独特的cuDNN句柄,该句柄将库调用指向与其关联的设备。用不同的手柄创建的cuDNN库调用将自动运行在不同的设备上。与特定cuDNN上下文相关联的设备被假定在相应的之间保持不变cudnnCreate() 和cudnnDestroy()调用。为了使cuDNN库在同一个主机线程中使用不同的设备,应用程序必须设置通过调用使用的新设备cudaSetDevice() 然后通过调用创建另一个与新设备关联的cuDNN上下文 cudnnCreate()。
符号:
从CUDNN v4开始,我们采用了数学启发的图层输入和输出表示法 X,Y,DX,DY,B,W用于通用图层参数。这样做是为了提高可读性并便于理解参数含义。现在所有的层都遵循推理期间的统一惯例
y = layerFunction(x,otherParams)。
并在反向传播
(dx,dOtherParams)= layerFunctionGradient(x,y,dy,otherParams)
对于卷积来说,公式是
y = x * w + b
w 是滤波器权重的矩阵, X 是上一层的数据(在推理期间), y 是下一层的数据, b 是偏见和 *是卷积运算符。在反向传播例程中,参数保持其含义。 DX,DY,DW,DB始终参考最终网络误差函数相对于给定参数的梯度。所以DY在所有后向传播例程中,总是指通过网络计算图反向传播的错误梯度。类似于更专门化层中的其他参数,例如,dMeans 或 dBnBias 指的是这些参数的损失函数的梯度。