想知道深度学习卷积在GPU上如何优化吗?“大神”赵开勇带你深入浅出

2016-08-19 11:54 转载 陈杨英杰
0条评论

雷锋网(搜索“雷锋网”公众号关注)按: 本文转载自英伟达NVIDIA企业解决方案公众号。赵开勇,香港浸会大学计算机系异构计算实验室PhD Candidate,长期从事高性能计算领域研究,在CPU、GPU异构计算方面有多年的研究经验。赵开勇先生组织参与多个科研单位和高性能用户的高性能项目研发,曾担任浪潮GPU高性能计算顾问,曾多次担任NVidia中国CUDA比赛评委。他还曾经组织出版《GPU高性能运算之CUDA》,翻译《大规模并行处理器编程实战》第二版。国内最早推广GPU高性能计算的研究者之一。

提到人工智能领域,现在最热的词之一就是深度学习Deep Learning(下文简称DL)。近年来,深度学习成为了学术界乃至整个工业领域视觉计算方面的绝对主流。除了传统的计算机几何处理、专业渲染、医疗、生命科学、能源、金融服务、汽车、制造业以及娱乐业纷纷着力深度学习应用和技术优化,避免在企业竞争中失利。在群雄逐鹿的技术比拼中,GPU扮演着至关重要的角色,与其相关的技术优化也是研发人员关注的焦点之一。

“深度学习技术已经可以用于解决实际的问题,而不是停留在Demo演示阶段”

如微软的语音翻译、Google的猫识别,再到最近很火的人脸识别,还有自动驾驶等等,这些都是深度学习的典型应用。Alibaba、Baidu、Facebook、Google、IBM等大公司都在DL方面有很大的投入。这里必须强调一句,目前很多主流的DL框架和算法基本上都是华人主导开发的,DL的复兴,离不开华人研究者。

“在进行深度学习训练之前,你需要考虑的两件事”

一个是软件框架,例如Caffe,Tensorflow,Mxnet等等。
另一个就是硬件。硬件方面,目前有多种异构形式,cpu,fpga,dsp等等,但是最主流的还是GPU,真正能在DL当中快速形成战斗力的也是CUDA硬件(NVIDIA GPU)+CUDA的DL学习软件(cuDNN),这也是NVIDIA多年研发与培育的结果。

工欲善其事,必先利其器

现在主流的DL开发训练平台一般都用NVIDIA的显卡,比如NVIDIA TITAN系列就是非常好的工具。为了加快训练速度,一般选择在配备多个GPU的高性能计算机或集群上面进行训练,训练好的网络也很容易移植到采用NVIDIA Tegra处理器的嵌入式平台上面,如NVIDIA Jetson TX1,它们拥有相同的架构,所以移植起来会非常方便。

Jetson TX1基于NVIDIA Tegra X1处理器打造,它采用和超级计算机完全相同的Maxwell架构256核心GPU,可提供高达1T-Flops的计算性能并完整支持CUDA(Compute Unified Device Architecture)技术,配合预装的开发工具,非常适合基于深度学习的智慧型嵌入式设备的打造。前不久就有用户通过配备Tegra处理器的Jetson平台,检测自家花园是否有小猫闯入。

重头戏:卷积神经网络CNN算法优化

检测小猫闯入花园的视频红遍网络,这一应用就用到了卷积神经网络(Convolutional Neural Network,简称CNN)的分类,在台式机或者集群上学习,然后porting(移植)到Tegra上,CNN算法起了关键作用。而CNN最关键的部分就是卷积层。在图像识别,图像分类领域来讲大多数问题之所以CNN能起作用,关键就是卷积。它从两个方面演变而来,一个是声音处理的延时网络,一个是图像处理的特征点提取算法。对后者而言,卷积就是对图像做滤波,简单说,就是做一些特征值提取。常见的有sobel做边缘提取,还有hog,高斯滤波等等,这些都是二维卷积。

卷积形状优化

虽然现在大家做卷积都是方块的,但其实这只是定义,你完全可以不遵循这个标准,可以用其他的形状来代替卷积,去更好的适应你的运算方式,尤其是卷积核心比较大的时候,这也是对卷积做出优化的一种方式。 一般来说,目前比较流行的CNN网络,卷积部分会占用70%以上的计算时间,优化卷积部分就是很有必要的。你需要从算法角度、并行化角度,以及GPU硬件特性等诸多方面做出考量。 GPU本身是一种可编程的并行计算架构,它有很多很好的算法,同时NVIDIA也提供了相应的工具,帮你去进行优化。

卷积优化的基本思路

1.   计算并行

2.   数据并行

3.   并行的粒度

4.   空间换时间

5.   IO和计算叠加

6.   更多的利用高效的缓存空间

7.   针对硬件的并行特性,更高效率的利用网络并发型

用内存来换时间

如果深度学习DL中每一层的卷积都是针对同一张图片,那么所有的卷积核可以一起对这张图片进行卷积运算,然后再分别存储到不同的位置,这就可以增加内存的使用率,一次加载图片,产生多次的数据,而不需要多次访问图片,这就是用内存来换时间。

乘法优化

卷积是对一个小区域做的乘法,然后再做加法,这在并行计算领域是非常成熟的。

以上图为例,左边是一张图片,右边是卷积核。我们可以把卷积核心展开成一条行,然后多个卷积核就可以排列成多行,再把图像也用类似的方法展开,就可以把一个卷积问题转换成乘法问题。这样就是一行乘以一列,就是一个结果了。这样虽然多做了一些展开的操作,但是对于计算来讲,速度会提升很多。

GPU优化的几个思路

  1. 了解IO访问的情况以及IO的性能;

  2. 多线程的并行计算特性;

  3. IO和并行计算间的计算时间重叠

对于NVIDIA的GPU来讲,内存访问是有一些特性的,连续合并访问可以很好地利用硬件的带宽。你可以看到,NVIDIA最新架构的GPU,其核心数目可能并没有明显增加,架构似乎也没有太大变化,但在几个计算流处理器中间增加缓存,就提高了很大的性能,为IO访问这块儿带来了很大优化。

上面是一张比较经典的内存和线程模型,shared memory和registers是访问速度最快的内存,内存的访问跟计算比起来,太慢了,所以尽量把多的数据都放到高速的缓存里面。

矩阵优化的几个思路

  1. 从计算角度出发

  2. 从结果出发

以上面这张图为例,当我们从C矩阵的结果出发,每一个C需要A的一行和B的一列来进行计算,利用GPU的特性,我们可以把零时的结果存储在registers面,那我们就可以划分64x2个线程,来作为计算线程。

在C的影印部分,可以有64×2这么多个线程在一次访问,就可以存储64×2个数据。你可以让64×2个线程每一个线程都存储16个或者32个数据,那么,我们就可以用64×2个线程存储64×2×16(32)个数据。 这么多个数据都可以一次存储在最快的内存里面,多次读写的时候,速度就可以很快。同时,我们在考虑对A和B矩阵的访问,可以把B矩阵的相应的数据,大量的放到shared memory里面,这样就提高了shared memory的公用性。这样,整个A×B再根据这些线程可以在读取globalmemory( A矩阵)的时候,可以合并访问,可以按照每一排32、32的读取,可以加快合并访问=C。这样就把整个矩阵优化的思路整理出来了。

以上就是针对深度学习卷积在GPU、乃至Jetson TX1平台上的一些优化思路。

想知道深度学习卷积在GPU上如何优化吗?“大神”赵开勇带你深入浅出相关推荐

  1. 深度学习究竟怎么入门?两位Google大神掀起剑气之争

    本文经AI新媒体量子位(公众号ID:qbitai )授权转载,转载请联系出处 本文约2000字,建议阅读5分钟. AI界气宗和剑宗大佬争论新手入门AI哪个路径比较好呢? 作为一名深度学习新手,该先学会 ...

  2. 吐血整理深度学习入门路线及导航【教学视频+大神博客+书籍整理】+【资源页】(2019年已经最后一个月了,你还不学深度学习吗???)

    声明: 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益, ...

  3. 干货丨深度学习究竟怎么入门?两位Google大神掀起剑气之争

    作为一名(华山派新弟子)深度学习新手,该先学会用框架快速搭出神经网络,用到实际问题中去,还是该先练习用Python基本徒手搭建模型,在小数据集上训练,了解它们的工作原理? 谷歌的两位研究员最近在Twi ...

  4. 深度学习中的GPU与CUDA

    对应视频教程:https://www.bilibili.com/video/BV1S5411X7FY/ 文章目录 1. 显卡(GPU)与驱动 2. 显卡与CUDA 3. 如何查看自己的显卡 1. 显卡 ...

  5. 10年放射科医师,想用深度学习在医疗行业有所作为

    早上八点,在广州市第一人民医院南沙分院的放射科里,身穿白大褂的冯嘉骏开始了一天的忙碌工作.这位90后的年轻小伙,从2012年在广州医科大学毕业后,就进入了这所医院工作,一干就是十年,目前已经是医院放射 ...

  6. 想要自学深度学习?不用GPU,浏览器就够了

    机器之心整理 参与:刘晓坤.思源 今天要介绍一个近期开源的自学深度学习 GitHub 项目,作者为每种具体算法提供了 Jupyter notebook 实现,可以轻易地在 Google Colab 上 ...

  7. 深度学习:在图像上找到手势_使用深度学习的人类情绪和手势检测器:第1部分

    深度学习:在图像上找到手势 情感手势检测 (Emotion Gesture Detection) Has anyone ever wondered looking at someone and tri ...

  8. 毕设 深度学习卷积神经网络的花卉识别

    文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...

  9. 31 | GPU(下):为什么深度学习需要使用 GPU?

    31 | GPU(下):为什么深度学习需要使用 GPU? 上一讲,我带你一起看了三维图形在计算机里的渲染过程.这个渲染过程,分成了顶点处理.图元处理. 栅格化.片段处理,以及最后的像素操作.这一连串的 ...

最新文章

  1. JVM 性能调优之定位问题 实战篇
  2. GSMA:中国有望成为全球领先的5G市场之一
  3. 大写的服!用耳朵也能写代码?盲人程序员自学编程成为全栈工程师
  4. Apache配置文件
  5. java jar包 和 war包 区别
  6. android listview分页显示,Android应用中使用ListView来分页显示刷新的内容
  7. 【Python基础】学习Python 一定要吃透这 5 个内置函数
  8. 4003基于邻接表的新顶点的增加(C++,附详细解析)
  9. 深入学习js之——原型和原型链
  10. android广告页白屏_Android 启动页面与广告页面的实现-Go语言中文社区
  11. 【译】成为优秀程序员(和人类)的101个技巧
  12. TensorFlow 教程 --教程--2.10偏微分方程
  13. 通过反编译深入理解Java String及intern
  14. Oracle用Start with...Connect By prior子句递归查询(转)
  15. MySQL(19)-----日期和时间函数
  16. 手机APP物联网远程控制开关
  17. FAT32文件系统快速入门
  18. [黑客入门]花无涯新手入门教程笔记
  19. 【电路】电容(三)——耦合、退耦电容
  20. ajax请求的所有状态码详解

热门文章

  1. vi 查看最顶部_5分钟带你进入 Vim 大门,让你喜欢 Vim
  2. 运行jar应用程序引用其他jar包的四种方法
  3. HotSpot JVM 垃圾收集原理
  4. Nocalhost: 云原生开发新体验
  5. leetcode算法题--除数博弈★
  6. vue filter对象_学习vue源码(3) 手写Vue.directive、Vue.filter、Vue.component方法
  7. 解决在ueditor中上传图片通过后台java+SpringMVC添加水印方法
  8. 引以为戒,特斯拉Kubernetes控制台被黑客攻击
  9. 我国网民规模已达7.51亿 但网络安全值得警惕
  10. MySQL5.7 : 对隐式锁转换的优化