2016-8-23
提到人工智能领域,现在最热的词之一就是深度学习 Deep Learning(下文简称 DL)。近年来,深度学习成为了学术界乃至整个工业领域视觉计算方面的绝对主流。除了传统的计算机几何处理、专业渲染、医疗、生命科学、能源、金融服务、汽车、制造业以及娱乐业纷纷着力深度学习应用和技术优化,避免在企业竞争中失利。在群雄逐鹿的技术比拼中,GPU扮演着至关重要的角色,与其相关的技术优化也是研发人员关注的焦点之一。
考你一个问题,你知道什么是 CNN 吗?如果你不知道这是“卷积神经网络”,小编担心接下来的内容你也看不懂啊,还是分享出去,给别的小伙伴吧……
关于深度学习卷积在 GPU,乃至 Jetson TX1 平台上的一些优化思路,还得请“大神” GPU 深度学习资深专家赵开勇为 GPU 骨灰粉们奉上技术详解。
赵开勇,香港浸会大学计算机系异构计算实验室 PhD Candidate,长期从事高性能计算领域研究,在 CPU、GPU异构计算方面有多年的研究经验。
赵开勇先生组织参与多个科研单位和高性能用户的高性能项目研发,曾担任浪潮 GPU 高性能计算顾问,曾多次担任 NVidia 中国 CUDA 比赛评委。他还曾经组织出版《GPU 高性能运算之 CUDA》,翻译《大规模并行处理器编程实战》第二版。国内最早推广 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,高斯滤波等等,这些都是二维卷积。
TIPS: 可以用其他的形状
虽然现在大家做卷积都是方块的,但其实这只是定义,你完全可以不遵循这个标准,可以用其他的形状来代替卷积,去更好的适应你的运算方式,尤其是卷积核心比较大的时候,这也是对卷积做出优化的一种方式。 一般来说,目前比较流行的 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。这样就把整个矩阵优化的思路整理出来了。
哇哦,深入浅出,小编居然听懂了!
借助 NVIDIA GPU 和相关工具,优化神经网络算法我们都可以拥有!
把崇拜之情投向赵老师!
期待更多锦囊、TIPS 的干货分享!
以上就是针对深度学习卷积在 GPU、乃至 Jetson TX1 平台上的一些优化思路。