这篇论文主要讨论如何针对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. 【Sublime Text3】Package Control:Install Package不能使用解决方法
  2. git上传大于100M的文件
  3. 58到家运维专家杨经营:业务上云后运维平台的演进之路
  4. c++语言int最大值,c++ 关于如何获取int型的最大值
  5. linux大数据命令操作
  6. _系列 | 全自动泊车辅助F-APA简介(系列一)
  7. 命名时取代基优先顺序_有机化学专题讲解——有机化合物的命名
  8. 《iOS9开发快速入门》——第2章,第2.1节Xcode 7.0的新特性
  9. 大学生程序设计邀请赛(华东师范大学)C:袋鼠妈妈找孩子
  10. java模拟http post
  11. 蓝牙双模音频模块 BT401蓝牙BLE应用笔记
  12. 备份与同步(二) 如何使用云存储来实现多设备的备份与同步
  13. 基于腾讯轻量服务器安装Aria2+AriaNg+Nginx+File Brower 服务
  14. 生成二维码的三种方式
  15. 使用VS2013编写螺栓计算程序
  16. 手机App开发的有关问题
  17. Developing circuit
  18. Java工作4年从美团、百度、阿里、京东面试回来感想
  19. 外接设备连接电脑万能驱动安装
  20. 如何从游戏配音试音中辨别质量?

热门文章

  1. 测试用例之性能测试用例
  2. Linux下Mysql数据库
  3. 稀疏自动编码(Sparse Autoencoder)
  4. 智能家居正进化成人们想要的样子
  5. STM32 —— STM32 的串口通信
  6. 深入理解synchronized
  7. 苹果双SIM卡+512GB: 明年苹果将发布超大尺寸iPhoneX Plus
  8. Linux (CentOS) 系统下载地址
  9. wps如何在目录里面打省略号_在wps中怎么让文档目录的省略号对齐 - 卡饭网
  10. rtx2060什么水平_新一代主流游戏显卡RTX2060来了,它的性能究竟如何?