大数据、算法和计算能力决定了人工智能的发展。在计算领域上,主要依靠的硬件就是 GPU、CPU,以及最近刚推出的 TPU,背后是英伟达、英特尔和谷歌的角力。伴随着这些公司的股价一路上涨的趋势,从此也能看出并行计算的再次崛起。InfoQ 一直很关注并行计算领域,联系了业界领军人物刘文志老师,并拜托杨旸进行了一次较深入的访谈,以下是访谈实录。
刘文志(花名风辰),商汤科技高性能计算总监,毕业于中国科学院研究生院,闻名于并行计算江湖,尤善异构并行计算(X86、ARM、GPU、APU 及 PHI)和大规模集群计算,有 7 年相关经验,涉及图像处理、计算机视觉、数据挖掘和石油勘探。曾任英伟达并行计算工程师(协助建立英伟达北京 CUDA 团队)、百度在线高级研发工程师(协助建立百度深度学习实验室异构计算团队)。著有《并行算法设计与性能优化》《并行编程方法与优化实践》《科学计算与企业级应用的并行优化》《OpenCL 异构并行计算》四本并行计算领域的专著。
并行计算和职业发展背景
InfoQ:刘老师您好,非常感谢您接受我们 InfoQ 的采访您在并行计算里的经验丰富,经历过图像处理,数据挖掘和石油勘探,能否介绍一下您所经历有趣的项目,和这些年并行计算在国内的发展?
刘文志:我的工作经历,或者说我对这个行业的阅历大致也反映了并行计算在国内的发展。首先在我读书的时候,并行计算基本上是很少很少有研究所(去做),或者是一些非常顶尖的高校才去做的事情。国内在 08 年之后 GPU 开始兴起,叫 GPU 计算,在一些科学计算领域开始得到应用。我也是在那个时候开始接触到这个,当时去做了更多的偏学术上(的应用),比如分子动力学,一些图像处理等等,用 GPU 可以比这种传统的 CPU 获得更好的速度。而在这种分子动力学这类上速度是非常重要的,因为模拟有时候是几个月,再快通过也常常要几周,用 GPU 我们可以把它缩短到一周,甚至一周以内。那么这个时候就对发论文什么非常重要,因为我们可以在短的时间里多发论文,很快去实验更多的场景,可以得到更好的结果,而这对发论文都很有帮助。
我在 11 年从毕业的时候我就遇到一个问题,就是我未来要去做什么,当时去在各个网站上去搜这种相关的职位,基本上一个都找不到。所以这个行业只能去像 NVIDIA 这种公司。当然也很荣幸,我后来就去了 NVIDIA,呆了三年,大致的工作也是计算机识别,石油勘探这些,也是从那个时间开始接触到深度学习。那个时候还比较原始,主要工作是去帮潜在的客户比如 BAT 等等,把应用的性能做好。那时就已经意味着国内已经开始有公司在往这个方向发展。而且也渐渐的发现,能够在招聘网站上能看到一些相关的职位了。在 14 年,我加入了百度 IDL,那个时候已经开始大力的去招聘这个方向的人。从那个时候基本上可以看得到,人工智能加并行计算和 GPU 计算这类,在未来会有非常大的应用,非常大广阔的领域。但是整个的业界其实对这方面的人才的储备,包括高校都没有准备,甚至现在很多高校自己没有老师能够去做这方面的授课或这种教育等等。
整体来说,这些年,因为 GPU 计算,包括计算机视觉的发展,或者人工智能的发展,并行计算在国内的发展一路上升,而且是从产业界往学术界扩张的方式。所以计算机视觉加并行计算,或者说人工智能加并行计算,在未来还是会有非常大的发展。另外对工作来说是由市场的需求导致的,所以包括 BAT 以及其他大公司,对这方面人才需求也非常大,给的薪水也相对来说比较高。
在个人的项目中,让我比较感触,现在依然记得非常深刻,更多的是在做一些石油勘探、数据挖掘和计算机视觉优化的项目。我们当初在百度 IDL 做了一个 CNN 的中间的卷积步骤优化,当时性能最好的 CNN 的库还没出来,CuDNN 也没出来,要由计算机视觉的研究人员自己写代码,我们当时觉得性能最好的,最流行的框架叫 CUDA ConvNet,GPU 代码做得非常棒,它的作者是 Alex Krizhevsky,AlexNet 的创造者。我当时做了一个工作,我们发现它在新 GPU 上的性能并不如预期,我去在 NVIDIA 的 K20 上对它做了一些优化,可以达到当时那个 ALEX 原来的版本的性能的两倍,当然后来我们做出来大约一年后 Alex 也升级了,也跟我们当时的性能差不多,我们后来把这个成果反映给了 NVIDIA,然后相关的东西应该也已经被 CuDNN 吸收了。
InfoQ:挺好的,我们自己关注也是感觉好像 2010 年,2011 年这个时间段,实际上是 GPU 开始在通用的计算里头做了一些尝试,美国好像有一个公司做 GPU Database,叫 MapD,也是从学术,他们做 Paper 的时候觉得速度特别慢,用 GPU 来做计算。
刘文志:数据库本身可能并不是一个非常适合拿 GPU 来做,因为数据库大多数运算是增删改查,计算量相对来说比较小。
InfoQ:它其实并没有很多的迭代,数据库比如 select 这样的,都是非常简单的一些计算。我看到您说这个当时就是实际上是你们自己在 CUDA 上头做了一些,是 AlexNet 的一个系统上做了一个优化是吧?
刘文志:AlexNet 是一个深度学习神经的一个网络,也是早期非常常见的,现在也有很多公司在使用它做 Benchmark。
InfoQ:当时是 CUDA 已经出来了,你们在 C 的层面上头做了一些代码上的修改?
刘文志:我们在 C 的层面上对卷积运算做了一些优化,性能超越当时 Alex 所做的 ConvNet 库的性能,然后我们当时也发了一个专利。
InfoQ:那所以说您还是在 CUDA 的 kernel 和数据交换上做了一些修改工作是吧?
刘文志:在 kernel 层,我们使用了一种和 Alex 不同的计算方法,这个计算方法在当时新的 GPU 上性能更好。
InfoQ:很多最开始的时候,确实是大家需要在 kernel 层面做很多运算的优化,当时是 kernel 并行执行上的问题,还是 Host Mem 和 Device Mem 数据交换造成的这种瓶颈呢,我自己比较好奇。
刘文志:当时主要是计算和缓存交换之间的同步没有做好,在时间上没有充分地相互交错掩盖。
InfoQ:确实是,您说的这个是很典型的 CUDA 里面的优化内容,实际上要把数据交换时间用 Kernel 计算 hidden 起来。同步的时候,数据准备和 kernel 执行的 timing 要协调好。
刘文志:对,就是避免他们一个在运算,另外一个再等着。
商汤人工智能应用场景和技术
InfoQ:第二个问题,回到商汤现在这款产品上面,你能不能举几个现在市场需求比较大的智能识别场景,跟我们分享一下?
刘文志:常见的一个是安防监控。安防监控对于人类来说是一个强需求,因为安全我们都非常重视,不希望自己回家时候发现家里已经被人光顾了。更具体地,对公安来说,他们更希望能够找到嫌疑人。人最明显的标志是脸,因为人脸特征非常丰富,相对来说比较容易识别,相对来说比指纹更容易在公共的场合获取,所以通过人脸识别来抓到嫌疑人或找到嫌疑人,在公安领域非常受欢迎。
在另外一些场景下,我们需要知道某些人是不是带了违禁物品。比如一些恶性事件里,我们需要在嫌犯拿出刀、枪的时候,检测到,及时向周围巡警发出通知。这样,我们在安防监控上可以让人们的生活变得更安全。另外,在日常的生活中,比如最近的手机卡实名制。之前因为历史的原因,中国大多数人包括我自己都是不太喜欢购买手机卡时提供名字等个人信息,所以通常用假名字。这个政策出来后,可能要得去中国移动营业网点重新去登记一下。对于我个人来说可能不是什么大问题,打个车来回一趟不麻烦,但是对中国移动来说,是个非常大的需求,因为中国可能有 10 亿个左右类似情况的手机号,如果为这 10 亿个人办的话,要在几个月内完成几乎不可能,用人脸识别就可以帮他来解决这个问题。比如我在家里可以打开一个中国移动的 APP,把我的个人信息,身份证和我的脸做适配,把我的个人信息和手机号定义起来,可以减少移动这方面的工作,对移动是非常重要的。
另外如互联网金融:如果事先在家里能处理好开户和某些业务,能省下去银行的时间,省了两个小时的排队。在网上自己处理可能半小时,或几分钟就搞定了。
还有一些偏娱乐的场景,也是商汤占有优势的应用场景。比如直播,美女通常都希望自己的镜头里面表现的非常漂亮,那我们如何在直播里面,通过人脸技术去提高网红颜值,也非常重要。
InfoQ:您谈到这个,互联网金融和安防监控趋确实是行业里头谈的比较多的,这两个应用已经有几年的时间了,那么您刚刚谈到这个网红确实以前很少关注过,娱乐行业也好,现在对人脸识别的实时要求也挺高的。
刘文志:娱乐也是人们的日常需求,通过我们的人脸技术,甚至与其他技术结合,可以把美颜等做得更好,把人的外观体验也做得更好。另外比如两个人在聊天时候,可能对方觉得我现在穿着睡衣不太合适,就把我的衣服换成一个西装等等。
InfoQ:是,现在对直播的监管要求也比较高,而且如果你纯粹把它看成一个互动娱乐也挺有意思,比如我想让主播换个装什么的,真的可以虚拟实现。您说的这些场景一部分是识别,一部分需要结合实时分析。那咱们是围绕图像识别和人脸识别提供引擎,还是提供一个完整的系统,包括图像识别,也包括了实时分析,以及消息系统?
刘文志:这些商汤都提供。一方面,我们提供这种偏 IP 的 SDK,另外一方面,也提供整个业务系统,比如安防监控服务器,我们可以提供整个服务器给客户,供客户直接使用,不用二次开发。
InfoQ:咱们提供的接口是什么样的呢?
刘文志:这个关系不大。对于大多数工程师来说,C 肯定是一个必须要掌握的编程语言,其他语言基本都能加入 C 的支持,所以呢,我们要提供一个 C 的接口,去包装 Android,包装 Python 接口。基本上所有用户都可以接受 C 的接口。
InfoQ:现在用深度学习实现的人脸识别也有一些不同的技术,一些开源框架,像 kaggle 网站上也有一些分享和实验,商汤在人脸识别,图像识别上的优势是在什么地方呢?
刘文志:如果单从人脸识别的技术上来讲,业界的几个顶尖的公司的差别不是非常大。但是对整个产业来说,优势从来都不是比单个点。更多的是综合集成的优势。
对商汤来说,从技术到算法,到平台,我们都有优势。我们有自己的做深度学习的框架,相比与 Caffe、TensorFlow,我们有自己的一些特色。当然这些特色如果跟 TensorFlow 一比一的比较,可能各有优势。但是好处就在于商汤可以完全控制该框架,我们可以按需求去做修改,对特殊场景去做非常好的优化,而这很难通过 TersorFlow 框架获得的。另外,我们在算法上面,有非常多的研究人员,技术上可以开发非常好的技术版本,超越业界的顶尖水平,另外,也可以关注新领域,新方向,去看未来一年两年可能在哪些领域上取得突破,预先做准备。
除了在训练平台上保证我们技术领先之外,在部署和交付用户时,如何保证也是领先的,这样是一个非常大的挑战,因为客户需求是千变万化的,有的需要在云上部署一个应用,有的可能需要在手机上部署一个应用,有的客户可能需要在摄像头上部署,有的客户可能需要在手表上部署。在这些千变万化的应用中,我们需要有一个平台,一个技术框架来保证我们的算法都在各个平台上能够跑到比较好的性能。因为在云上一般是用 X86,计算能力在一百 G flops 左右,在手机单核通常就十几 G,嵌入可能就几 G,差别通常几倍到几十倍。我们在云上跑的很好的算法,可能在手机上跑得非常慢,嵌入式可能就跑得更慢了。
那我们怎么样把不同平台的性能做好,我们商汤自己开发一整套系统,从云到手机,到嵌入式,甚至到 FPGA,我们都做了很多工作,让我们和竞争对手拉开很大距离。
另外,在数据上,因为我们商汤从成立一开始,我们就非常关注数据的价值,我们通过公开渠道获取了许多重要的人脸数据,做了标注等工作,人力投入也是非常大的。所以单讲算法优势,我们可能并不是非常大,但是,把集成其他的优势,我们相比竞争对手,或者其他一些开源技术,是非常大的。
InfoQ:谢谢。您刚提到商汤自己开发的深度学习框架,如果我们的开发者想尝试一下试用,需要准备怎么样的开发平台呢?
刘文志:目前来说,如果要把我们的框架公布出去,会带来另外一个需求,很多同事,朋友会好心地给我们提需求,但按照我们现在的体量和现在面临的压力,没有时间和精力去做这个事情的。目前来说我们不太会公布。更多的是把这些东西在我们自己的产品上使用好。
关于如何提升一个平台来去做深度学习的训练和部署,国内有许许多多的厂商已经非常的专业了,像浪潮,曙光,AMS 等等,他们都已经做了很多年的积累,对这方面的需求也比较了解,可能更熟悉。我的经验在于,如果需要一个好的深度学习的训练平台的话,我们可以去基于 NVIDIA GPU 自己去搭一个。通常关注的问题主要是两个,一个是整体的功耗,整体的功耗限制了我们要用多大的电源,机房线路能不能承受的起。另外要考虑空调散热和噪音,通常单机的话不会存在这个问题,但是如果是一个小机房就要考虑空调的问题。
InfoQ:您谈得有道理,如果要维护一个深度学习的开发框架,所需要付出的精力不是一点点,很多人会提很多的需求。
刘文志:这也是现在为什么我们现在并没有公开,如果有一天发展得像 BAT 发展的这么大了,我们也很愿意把它公开出去,因为那个时候我们就有人力来维护这个事情,而且这个事情对整个产业都是非常有利的。
InfoQ:您刚刚提到在不同平台上头做部署,在手机端、摄像头、嵌入式上的部署。NVIDIA 也是有这样的考虑,在嵌入式设备,在云端,在高性能计算也需要兼容不同的 GPU。是不是也是类似于这样的框架思路,在不同的设备上的 kernel、代码是一样的,只是编译到不同的设备平台?
刘文志:因为不同的设备有不同的特性,计算能力不一样,希望有共同的模型,思路基本上是一致的。
GPU 编程应用与深度学习
InfoQ:在并行计算上,英伟达和 Intel 在国内都做了很多工作,nvidia 进来得很早,英伟达近年发展也很强,我们知道天河二号用了 Intel 的 XeonPhi,英伟达各个系列的 GPU 的开发者群体很大,您有没有一些心得,或者观察到的一些有意思的东西跟我们分享一下?
刘文志:从面向市场的宣传来说, GPU 比 XeonPhi 更早。 Xeon Phi 当时的目的之一是 Intel 为了避免在 HPC(高性能计算)里被 NVidia 超越。但是在深度学习领域,都是为了面对深度学习训练的需求,目标是一样的。不同点主要两个方面,一是生态系统,二是芯片的设计。Xeon Phi 相比于原先的 X86 的架构做了一些更适合做众核的改变和调整,而 GPU 本身擅长图像处理、渲染,运算有非常大的并行性,更关心整幅图,整个场景,最终渲染的时间,而不是说某个像素的结果,设计时有非常大的差别。
在生态系统,Intel X86 坚持的是串行优先,兼顾并行的方式,构建生态系统的思路也不太一样。
但是整体来说,我个人看来,无论是 Intel,还是 NVidia,他们都很难单独把人工智能这个市场吃掉。站在消费者的角度来说他们的竞争是好事,一方面能够提高整个行业的技术水平,给消费者提供更好的产品和服务,同时会促进整个市场的繁荣和行业的向前发展。
InfoQ: 如您提到的,Xeon Phi 也好, GPU 也好,在并行计算上,思路有一定的区别。比如 GPU 以计算单元比较多,而控制流转、控制单元和缓存都大大减少,不同处理器的架构对编程思路也会有区别,像您说的话,GPU 一幅图,是一个单向逻辑,多个线程同时做一个,而不用很多跳转。这对开发者和代码维护来说有很大挑战的。如果你一旦你的程序是面向 GPU 写的话, 如果今后想转移到 Xeon Phi 上,代码调整还是很大的一个工作量,两种处理器上的编程不完全是兼容的。
刘文志:如果要深入细节的话差别是有。你刚才提到的那个关于控制的方面,在 GPU 上是要减少控制的比例,在 Xeon Phi 也是同样的,因为控制它本身会导致这个并行的时候,一些工作是浪费掉的。而且控制会导致 Cache Miss,分支预测失败等等。从优化的角度来说是近似的,只是说优化的技术在哪个架构上产生的收益哪些会大些,哪些会小些。
InfoQ:这个话题可能有点走题,不过前段时间,我也关注一下并行计算优化层面的东西,包括编译器层面的优化,实际上现在也有很多挑战。并不是完全有定论,所以我们这个时代好像很有意思,正好在一个快速发展的阶段。
刘文志:是在快速发展。技术百花齐放,多分支,碎片化的发展等等。
InfoQ:现在 NVIDIA 的 CuDNN 用来加速 Caffe,TensorFlow 和 CNTK、Theano 这样的 Deep Learning 的框架实际上越来越多,我不知道您在工作里是什么时候开始接触到 CuDNN? 您在英伟达工作过,CuDNN 从什么时候开始在中国有明确的需求,最开始的需求是什么样的,你对这个技术本身有些什么样的评价吗?
刘文志:CuDNN 我接触最早是在 14 年, NVIDIA 第一次发布的时候,我在百度 IDL 就开始使用,它做得非常好的地方是给大家减少了我上面提到的自行对 ConvNet 的卷积计算优化之类的工作。而且 NVidia 通过这种方式一下子把整个大家用 GPU 做深度学习的性能提高了。原来我们可能需要两个 GPU 才能做完,用 CuDNN 之后,可能一个 GPU 就搞定了。好处之二是,很多时候我们不用自己去写 framework,因为 Caffe,TensorFlow 之类都支持它,那么直接可以按自己的喜好选择这些框架来用,性能区别不会太大,可以忽略。因此对于用户来说,就更容易根据自己的喜好,根据自己的习惯去选择,而不是根据计算速度去选择。CuDNN 本身是非常底层的,在使用的时候需要知道很多细节的库,那么在使用的时候,我们需要非常注意它的各方面配置。尤其是卷积,它有不同的算法实现。要注意各个算法的性能和其他指标的搭配。比如某些场景下,我们希望速度尽量快,在另外场景下,我们希望使用的显存尽量的少,还有些情况下,我们有些其他的需求,比如我要保证计算的结果跟某个计算的结果是一致的,这时,我们要非常注意它使用的具体算法是什么。
InfoQ:我记得 CuDNN 的介绍里也谈到,同样目的的具体算法可能有三四种,每一种在计算、内存、涉及到的数据交换,处理好像不太一样。所以开发者还是需要了解这些细节。CuDNN 有没有提供某一些监测界面, 来看运行状态?比如运行时,开发者用某些工具查看不同的几种类型的运行情况,看看目前所用的类型的运算情况是否合乎自己的期望,不行的话,就换另外一种?这个可行吗?
刘文志:这个可行,在 CuDNN 里面有些内置就有这个功能,当然我们需要根据自己的具体情况,把定的参数输进去,这样我们就可以知道每个场景下的这些数据是什么样的。在大部分场景下,更多希望性能最优,所以我们用运行时的查找的方法就可以了。
InfoQ:现在 Deep learning 的框架蛮多的,一些开发者对多 GPU 并行比较感兴趣。好像并不是所有框架都支持多 GPU 并行,比如 CNTK,可以通过 Microsoft 一些特殊算法执行可以支持,但是像 Caffe,TensorFlow 似乎还不是。您觉得哪些框架对多颗 GPU 运行的支持相对比较好一些?
刘文志:整体上来说,Caffe,TensorFlow 都支持多个 GPU 的并行,Theano 我不太清楚,Theano 本身更偏学术一点,希望用脚本语言来处理,灵活性非常高,但是是否支持多 GPU,目前我不是太了解。
Caffe 和 TensorFlow 都支持。有一个 NVIDIA Caffe,是经过 NVIDIA 优化的,支持单机多卡。Caffe2 可以支持多机多卡,TensorFlow 既可以支持单机多卡,也支持多机多卡。我们的测试表明在 NVIDIA Caffe 上,单机多卡的性能还是挺不错的。TensorFlow 的单机多卡的性能,最近的版本还行,但多机多卡的版本的性能相对来说比较一般。我估计一个原因是因为谷歌更多关注自己的应用,很有可能 TensorFlow 在谷歌的数据中心里面性能比较好,但是它的数据中心的情况,跟你我用的不太一样,可能 TensorFlow 就不太适合你我的数据中心。这也是为什么我们自己去建数据中心,自己去开发深度学习训练框架的原因。因为我们的算法不一样,那我们的数据中心就要相应调整,我们的框架也要做调整。从这角度上来看,我觉得,任何深度学习,人工智能公司只要想做大,那么深度学习的框架最终都必须自己去做,依赖于开源的,或者说依赖于商业的解决方案并不是很好,也并不是很合适。
InfoQ:您说的开源的问题我们也有同感,借助开源的框架或 Package 来起步和早期实验没问题,但是要把一个产品做强,推向市场,恐怕一方面要自己掌握核心技术,同时参与这种开源社区就要有 committer 级别的人。
另一个问题:一些应用里用单个 GPU,或者一个单机里有多颗 GPU 能做很多事情了,那么现在的情况下,到底有多必要,把从单机版推向多机多颗 GPU 并行?
刘文志:这个答案是非常肯定的。这么说可能有点过:如果用不到多个数据中心来做深度学习的公司绝对不是最顶级的。道理很简单,对深度学习来说,我们有许许多多的应用和配置需要优化,但是我们如何去选择一个更好的配置,这需要去实验,去做判断。如果我们有一个大的数据中心的话,那实验的次数、频率、结果和配置就会非常多,就意味着,我们可以从中更好地了解这个应用场景的特性,获得更好的模型。所以如果要在这个领域做得好,一个大的数据中心,一个好的框架是必不可少的。
InfoQ:您谈到这个也是现在多 GPU 的一个典型场景:一种情况是把一组 GPU 都用同一种模型,而数据集不同;另一种是在不同的 GPU 上用同样数据训练不同的模型,得出一个优化结果。您刚才是说,是在训练阶段,来尝试不同模型呢,还是说在客户的现场,部署下去以后,用多颗 GPU 实现线性拓展,缩短判断时间?
刘文志:这个看用户需求,大部分情况下,在部署的时候,单个 GPU 来跑应用可能更好,而在训练的时候不太一样。
InfoQ:恩,训练和部署还是有一些具体的区别。让我们回到 Xeon Phi 上,听说以前的一些代码略微做一些修改,就可以在 Xeon Phi 上实行并行化和加速。这很有现实意义——我们以前开发的串行代码很容易移到这样的架构上面来。这种将以前代码并行化移植到多核环境,是不是在不同的处理器上头确实有不同,是不是像 Xeon Phi 这样的,可移植性更强一些,并行化更容易一些?
刘文志:商汤现在并没有用 Xeon Phi,但是我个人在 Xeon Phi 上有些开发的经验。任何想要拿到 free lunch 的想法都是徒劳的,从大的层次上来说,用 Xeon Phi 来实现并行化和加速,希望不做修改不现实。不修改代码,在新的处理器上运行不难,但是,如果将一个 X86 上的程序移植到 Xeon Phi 的 60 个核上,希望获得 30 倍的加速,仅仅靠简单地修改一下,或者说重新编译一下,是不现实的。
要获得对应的加速,要付出相当多的时间。对于深度学习的公司,短期内换到 Xeon Phi 上不太现实,因为今天所有的关于深度学习的框架,都对 GPU 非常好的支持,但是对 XeonPhi 的支持很少。只有 Intel 自己的 Caffe 对 Xeon Phi 提供了支持,而 TensorFlow 和其他的框架没有足够支持。在这样情况下,切换到 Xeon Phi 上,可能为时过早。另外,也需要整个生态上对它的支持非常好,才有可能有让深度学习的科技公司考虑迁移到 Xeon Phi 上。现实情况是 Intel 并没有把它的对深度学习和训练的投资集中在 Xeon Phi 上面,还看不到这样的保证。
InfoQ:我能理解,像卷积计算在 GPU 这种多核并行的架构上很有优势。如果单纯从硬件加速角度来看,为了利用多核来把以前的应用,转移到一个多核平台上, Intel 等厂家推出了 Cilk, OpenMP 这样的框架,通过加入一些 directive,就可以把部分执行编译成并行的,这样,看起来对代码本身,对逻辑本身的修改相对比较少一些,也不需要在编程初期考虑并行或处理器 SIMD。但是如果通过 directive 这样的方法,也许能提高一些性能,但是能加速多少?并行度能提高多少?对后面的优化有怎样的影响?我们心里还是没底,你在以前的工作有没有接触过这种加速?
刘文志:这个我用的比较多了,但是整体上来说,像 OpenMP,Cilk 等还是多核级的并行工具,并不是众核级的并行工具。当应用的并行不太多,每个的粒度也比较大,那么用这种多核级的 OpenMP 可能会获得比较好的性能,但是一旦并行度非常大,OpenMP 和 Cilk 这种粗粒度的就不太适合了。因为当并行度比较低的时候,只要几个线程就够了,但是当并行度非常高的时候,可能要有成千上万个线程甚至更多,这种情况下,这些线程之间的交互,相互影响如何控制?这在 OpenMP 里面没有多少支持,相对比较简单的支持是通过 Synchronize,或者说同步,原子函数等,但是这些同步的代价又非常的大。所以本质上从我的经验来看,OpenMP 这类还是多核的编程方法,并不是众核的(如 GPU 或 Xeon Phi)。Intel 用 OpenMP,更多的是想让之前开发的多核程序能很快地迁移到 Xeon Phi 上,获得加速,但是实际的性能结果不会像预期的那样好。
InfoQ:您说的也对,NVIDIA 在进程通信、在 Barrier 和同步机制上面,或者 Share/Global 显存,mapping,pinned memory 上都提供了很多更细腻的手段。商汤下阶段在哪些方面会重点开发,下阶段可以看到哪些重点应用和重点方向呢?
刘文志:从我的人工智能加嵌入式并行计算的领域来看,嵌入式,或者 IoT 是未来的方向。可以分为几个大的应用场景。一个是云;一个是更靠近人的城市或社区;再进一步到每个人的身边和身上。对于云,整个业界已经关注的非常多,目前看起来做得最完善;城市和社区已经有许多安防公司在做。但家庭和个人上还是待开发的领域。
真正要把人工智能做到无处不在,只在云和城市是不够的,最终要落实到人和家庭上,而 IoT 就是这样的技术:怎么把 IoT 和人工智能结合起来,这是未来的方向。
在我加入商汤之后,也就大约两年前,就把我所在部门的使命定义为:让人工智能无处不在。这个观点最近已经被许多的公司,包括 BAT 的一些部门,也定义成自己的使命,让我很欣慰。我相信让人工智能无处不在的 IoT 和嵌入式是未来的方向,而且在嵌入式的人工智能上创业和扩张的公司将会越来越多。甚至从某种程度上人工智能的新的独角兽将会出现在嵌入式领域。
InfoQ:能不能理解成家庭的安保、家庭的摄像头,反侵入?
刘文志:反侵入,感知。在家庭里通过人工智能,能做许许多多的工作,家庭安防,家庭辅助是很小的一方面。大的一方面是机器人,我相信最终每个人的家庭都会至少有一个机器人,无论是扫地的,还是家庭辅助的等等。而机器人必须需要嵌入式和人工智能。
InfoQ:这很有意思。现在像家用机器人,工业机器人,安防都是大数据领域这几年大家看好的一些发展方向。那您觉得机器人在工业制造业里,现在是不是有很好的一些发展方向可以做,还是说前几年的工业机器人视觉的技术积累,已经相对可以满足现在需求了?还看不到下一个更能可能突破的方向呢?
刘文志:我个人对工业机器人并不是太熟,我看得到的,有很多事情通过传统机器视觉的方法在机器人应用上做得还不够好。在我们可以看得到,大家认为相对比较好的机器人的创业公司,比如波士顿动力的机器人,离人类的期望还有差距。这个差距怎样通过人工智能和拟人来弥补,其实是一个很大方向。简单的来说,我们怎么让机器人在家里抓起一个物品的时候,感觉是人在抓起一个物体。它在跟我们握手的时候,我们就可以感觉是一个人在跟我们握手,而不是机器,这需要很人工智能的技术,比如拟人的技术来辅助。我是觉得一旦这个技术做好了,机器人真的会进入每个人的家庭。
InfoQ:所以说这实际上需要按视觉,分析物体的重量和形状,细致调整手上的力道的一个闭环的系统,我能理解。工业机器人的发展受限也是跟工业生产线上的那些东西都很固定,零件基本上就是那些东西,对识别之后的行为要求不是很高,它用传统的特征提取,一个很固定的模型就够了,不需要太多学习?
刘文志:对。但是未来的机器人不是这样的,尤其是到了家庭,到了社区的时候。
InfoQ:在一个比较自由、开放的环境里进行识别,形成动作,就完全不一样了。
对新手的建议
InfoQ:我们 InfoQ 的读者现在很多都对 AI 比较感兴趣,或者以前从事相关行业,希望在自己工作中使用 GPU 或深度学习。对这些刚起步的一些朋友,你觉得有什么样的建议,怎么样让他们能更快的学会一些干货呢?
刘文志:整体上来说,今天的人工智能、深度学习、机器人的发展已经远远超过了三四年前。今天已经非常容易学习各种框架了。
首先框架现在已经非常多,很多都是开源的,对初学者来说可以很容易获取到它们。硬件,GPU 的性能已经非常高了,价格也相对来说比较便宜,很容易买到。
但是在具体的步伐上,我建议大家可以通过这些步骤,首先可以花一两周的时间去学习一下深度学习的基本理论,比如说吴恩达在 Udacity 上的视频,斯坦福有一个网上课程等等,通过一两周的时间理解理论基础和一些基本认知,然后在具体的工作的时候可以去重新去加深,去查找。另外,一两周之后,可以找一个常用的深度学习框架,比如装个 Caffe, TensorFlow,跑一些例子,了解一下它的运行过程。完成这步之后,如果还愿意去用深度学习做些事情的时候,可以组装一台 GPU 的服务器,当然这个价格就可能比较贵了,可能达到十万左右。当然如果只是个人学习,可以买一台高配置的 NVIDIA 的游戏配置的台式机。然后可以把深度学习的框架,和 CUDA 环境等等配置好,用来跑程序,去看具体的代码实现。比如一个新的任务,在原来的 TensorFlow 或 Caffe 上面都不支持,应该怎么去修改这个框架,才能让它支持,这基本上就可以来比较好地完成一些工作了。我个人并不建议大家重头去搭深度学习的硬件平台,因为这不是核心,也不是重点,深度学习在现在已经这么流行了,各个厂家,各个硬件的集成商都有他们的配置,我们直接按预算去购买一个合适的配置是更好的选择,把时间花在学习上更有价值。
InfoQ:我们最近关注到 NVIDIA 之类的公司推了一些比较简单的入门产品,比如说 DIGITS,微软在 Azure 上有 Machine Learning Studio,用拖拽可以搭一个神经网络,用一个样本数据集来训练。这样的东西你觉得对于哪种阶段的朋友会有帮助,而对哪些阶段的朋友不适合?
刘文志:我建议刚开始学的时候,开始花一两天时间去学习一下是可以的,但是如果想要去把东西做得很好的话,不应该去使用这个。把实现的细节最终隐藏起来,能方便最终用户,但是对于希望把技术做到很好的同学来说,这个是反而阻碍他的技术发展,因为从来就没有免费的午餐。要把东西做好就必须要去了解细节,比如我们去改东西的时候,如果我们只会拖拉,是不可能改好的。如果我们只会去跑一个 Demo,我们要去改它里面的细节也是不可能的。所以建议在早期的时候,可以去参考这些东西。另外,如果我们确信,要用的东西是非常固定的,不会有什么大的变化,用了这些东西也可以满足需求。如果想要做得非常好,如果有拓展的需求,那么还是不应该去使用这些东西。
InfoQ:那么还有哪些开源的包,或者是一些常用的 library,你觉得哪些作为起步阶段,可以先下载,用一些 Python 脚本来做一些很简单的神经网络的尝试,有哪些开源工具会比较好呢?
刘文志:一个是 NVidia 的一个库:TensorRT, 用来部署。如果我们要把东西交给客户,让它在 GPU 上运行的时候,这很容易上手。其他还有一个工具叫 Deeplearning4j 或 DL4J,是一个 Java 平台上的 Deep Learning 框架,现在安卓、和云的程序员还是非常多,可以去看一下。因为使用的方式跟 Java 理念比较一致。
InfoQ:非常棒,非常感谢您的时间,我自己的收获很大,我相信我们的读者收获也会很大。
作者:
刘文志(花名风辰),商汤科技高性能计算总监,毕业于中国科学院研究生院,闻名于并行计算江湖,尤善异构并行计算(X86、ARM、GPU、APU 及 PHI)和大规模集群计算,有 7 年相关经验,涉及图像处理、计算机视觉、数据挖掘和石油勘探。曾任英伟达并行计算工程师(协助建立英伟达北京 CUDA 团队)、百度在线高级研发工程师(协助建立百度深度学习实验室异构计算团队)。著有《并行算法设计与性能优化》《并行编程方法与优化实践》《科学计算与企业级应用的并行优化》《OpenCL 异构并行计算》四本并行计算领域的专著。
杨旸,上海雅捷信息技术股份有限公司 产品总监。美国宾州州立大学电子工程硕士, 曾就职于易鲸捷、Cisco Systems,Eastman Kodak 等;2000 年开始从事分布式多媒体通信系统研发,历经电信运营商级的互联网电话、安全监控 / 电子病历 / 慢病管理大数据、OLTP-On-HBase 的分布式数据库等项目。现负责基于 NVidia GPU 的高速查询加工引擎的售前、方案架构、技术市场等工作,兴趣在于多 GPU 集群在关联、聚合和模型计算的技术,以及在金融、电信及商业的应用。
感谢杜小芳对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论