cuDNN: Efficient Primitives for Deep Learning笔记
论文链接:https://arxiv.org/pdf/1410.0759.pdf
2014年的文章。
深度学习是计算密集的,优化kernel,非常困难且耗时。随着并行架构演进,相应kernel就要重新优化,代码难以维护。因此cuDNN实现了深度学习的原语,非常方便集成到不同框架,且不需要反复优化。
主要优化的是卷积计算,同时提供了深度学习常用的其他函数,比如:sigmoid,reLU,hyperbolic Tangent等激活函数,softmax routines,平均和取最大值的池化操作,broadcasting、转置等转换操作。这样深度学习过程就有望只通过cuDNN和cuBLAS来完成,无需手工做并行计算。
卷积运算目标:非常高效,而且额外使用的内存尽量少。
实现上:把卷积降维到矩阵,相应的D矩阵要做很多replication,卷积操作变为一次矩阵乘法。因为矩阵乘法高度优化,且几乎越大越高效,因为这种算法运行非常平稳高效(和输入的规模有关,但几乎和输入什么数据无关),但这样会带来更多的内存占用。通过使用英伟达提供的高效矩阵乘法例程,具体是分块分块相乘,lazily materializing方式把Dm迭代式加载到显存中。因为Dm中有冗余,所以需要有到D中的映射计算,其中涉及除法和取模操作,通过《高效能程序的奥秘》(英文:Hacker's Delight)中介绍的做法转换为乘法和位移操作。
性能相比cuda-convnet2有0.8到2.25的加速比,尤其是对小batch;相比Caffe有1.0到1.41的加速比。即使对于小批,也能达到最高性能的86%,非常稳定。在不同架构上移植,性能也较稳定。
Caffe集成后加速36%,百度Paddle Paddle集成后加速30%。