这篇论文主要讨论如何针对CNN做一些GPU矩阵计算的优化。传统CNN计算主要开销是在convolutions, activation function, pooling.

首先,我们看convolution的操作过程:

参数表:

O是输出input feature map,F是filter, D0是input  feature  map. 从公式看到如果用循环操作,需要7次循环,n,k,p,q4次可独立循环,c,r,s是累加操作的循环。

其次,我们看convolution在GPU上如何实现,文中介绍了三种方法:

第一,最直观的方法是直接实现如上公式,但是这种实现呢需要处理许多的corner case。 文中介绍cuda-convnet2是实现了该种方法,该种方法在不同取值的卷积参数空间效率不一,比如batch size > 128,效率很高,但是如果batch size < 64, 效率比较低。

第二,采用快速傅里叶变换fft,具体怎么做,参见论文Fast training of convolutional networks through ffts(待读). 该种方法效率非常高,但是由于filter需要扩大到和input一样大小,占用了大量内存,特别是CNN的前几层filter 大小远小于input大小。第二,当striding 参数>1, fft效率也不高。facebook最近开源了fbfft的实现,参见论文fast convolutional nets with fbfft: a gpu performance evaluation(待读).

第三,也就是现在caffe实现的方法。将卷积操作转换为密集矩阵相乘。将input data组装成大小为CRS x NPQ的矩阵,这使得内存相对原始input data的大小扩大了之多RS倍,举个例子,对AlexNet的conv1:

Fm: 96 x 363

Dm: 363 x 387200(设double 类型, 需要临时分配内存1GB)

D: 128 x 3 x 227 x 227 = 19787136.

Dm 是D的内存大小的7倍。

具体卷积是如何转换为矩阵的呢?看如下图:

对照caffe的代码就是im2col_gpu,  caffe_gpu_gemm,  caffe_gpu_gemm 会调用cublasSgemm.

这种方法使用扩大临时内存方法换取密集矩阵计算的便利。

密集矩阵相乘为什么好呢,值得我们如此牺牲内存代价?因为 it has a high ratio of floating-point operations per byte of data transferred. 当矩阵越大,ratio越高,我们看到该方法的矩阵大小还是可以的,CRS乘机相对比较大。该方法的缺陷是: Dm太大,因此需要分片materiialize Dm,我们看caffe代码实现,在每次batch,遍历了N次的im2col_gpu,  caffe_gpu_gem。但是这种循环方法使得要多次读写Dm和读取D, 相对第一种方案需要更多memory traffic. 因此,本文采用了另一种实现:

对A x B = C, 分块加载A和B从off-chip memory to on-chip caches, 同时计算C的一部分。这样减少了数据传输带来的延迟。对于Dm,我们是在on-chip上转换成Dm,而不是在off-chip上转换.

三种方法性能的比较:

cuDNN: efficient Primitives for Deep Learning 论文阅读笔记相关推荐

  1. 华为又开始放大招了?CV新架构:VanillaNet: the Power of Minimalism in Deep Learning 论文阅读笔记

    华为又开始放大招了?CV新架构:VanillaNet: the Power of Minimalism in Deep Learning 论文阅读笔记 一.Abstract 二.引言 三.单个 Van ...

  2. GRAIL Efficient Time Series Representation Learning论文阅读笔记(三)

    GRAIL Efficient Time Series Representation Learning 有效的时间序列表示学习 作者 芝加哥大学的John Paparrizos和Michael J. ...

  3. GRAIL Efficient Time Series Representation Learning论文阅读笔记(二)

    GRAIL Efficient Time Series Representation Learning 有效的时间序列表示学习 作者 芝加哥大学的John Paparrizos和Michael J. ...

  4. GRAIL Efficient Time Series Representation Learning论文阅读笔记(一)

    GRAIL Efficient Time Series Representation Learning 有效的时间序列表示学习 作者 芝加哥大学的John Paparrizos和Michael J. ...

  5. LeCun-Nature-Deep Learning论文阅读笔记

    目录 Acknowledge 卷积的定义 神经网络模型 卷积神经网络 循环神经网络 总结 Acknowledge 首先致敬 Lecun Y, Bengio Y, Hinton G E, et al. ...

  6. A Survey on Transfer Learning 论文阅读笔记与总结

    一.引入 第一作者:Sinno Jialin Pan,南洋理工大学副教授,中大数学学士.硕士,香港科技大学博士,研究方向:迁移学习 期刊:IEEE TRANSACTIONS ON KNOWLEDGE ...

  7. 【论文阅读笔记】Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer

    摘要: 本文主要研究训练和测试类别不相交时(即没有目标类别的训练示例)的对象分类问题.在此之前并没有对于毫无关联的训练集和测试集进行对象检测的工作,只是对训练集所包含的样本进行分类.实验表明,通过使用 ...

  8. 论文阅读笔记:Improving Attacks on Speck32 / 64 using Deep Learning

    论文阅读笔记:Improving Attacks on Speck32 / 64 using Deep Learning 本文通过神经网络利用了减少轮数的 Speck 的差分性质.为此,作者对神经网络 ...

  9. Deep Learning论文笔记之(五)CNN卷积神经网络代码理解

    Deep Learning论文笔记之(五)CNN卷积神经网络代码理解 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文,但 ...

最新文章

  1. 欧拉降幂 ---- 2020 杭电多校[E - Fibonacci Sum]+欧拉降幂+和式的调整+二次剩余+毒瘤卡常
  2. 【Python进阶】实战Python面向对象基本编程
  3. c语言坐标三角形判断,【C语言】判断三角形类型(示例代码)
  4. 考研计算机组成原理难点,2010计算机考研:计算机组成原理冲刺重难点梳理
  5. Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF
  6. python3字符串属性(二)
  7. ubuntu16.04下载caffe(CPU版本)及部分文件说明
  8. eclipse中导入SVN项目步骤
  9. 软件设计是怎样炼成的(1)——什么是优秀的设计?
  10. 网络爬虫程序 *版本1.0.1* 修正几个问题
  11. MODSCAN32的应用
  12. AVPlayer添加播放进度监听
  13. 《When you are old》一如苇中的风,轻柔却难忘
  14. css radial-gradient绘制渐变背景
  15. python三维曲面合并_绘制多面体的三维曲面
  16. nginx reopen nginx 日志
  17. 沃通CA证书支持多所高校招投标文件电子签名
  18. ECL电平特点及其应用
  19. 筒仓计算表格_小时,速度,筒仓团队和甘特兹
  20. positio有哪些属性?position的属性如何使用

热门文章

  1. 每日C语言代码(The fifth day)——求素数
  2. 4. 【gRPC系列学习】Resolver原理详解
  3. 如何正确地写存储过程
  4. LeetCode994 Rotting Oranges解题方案
  5. EOS智能合约开发系列(11): 多重签名
  6. 初级会计机考模拟系统计算机怎么用,2020初级会计《机考操作与应试技巧》之机考操作篇...
  7. mac pro m1:安装dump文件内存分析工具——MAT
  8. 多个pdf文件如何合并为一个文件?怎样将多个pdf文件合并到一个文件?
  9. 网络技术基础概念总结
  10. LINUX时间格式查看