从CUDA到Keras,这些年你应该了解的深度学习工具

发布于 2024-7-9 09:39
浏览
0收藏

“风起于青萍之末”,十年前,Nvidia被人工智能(AI)清风拂面,推出CUDA,成功把自己打造成风口上的飞猪。“Nvidia还从没有抢到过像人工智能这样强的风口,这意味着我们在GPU领域的成就无以伦比”,在AI淘金热潮中,N记这家“卖水的”走到了2017CES聚光灯下。“据估计,世界上目前有3000家AI初创公司,大部分都采用了Nvidia提供的硬件平台”,如果大家最近在某东关注过游戏本,可以直观感受到N记这种成功。

一切得从GPU说起。GPU(Graphic Processing Unit)即“图形处理器”,区别于CPU (Central Processing Unit)即“中央处理器”。CPU敢称“中央”是有道理的,他是电脑的核心大管家,负责各种计算任务,通才多面手,因而其在架构选择上重控制与缓存、少执行单元,以提升执行单元的效率。GPU则是为图形渲染而生,特定用于G(Graphics)任务的,砖家能手,其架构上虽然跟CPU同根同源,但选择轻控制、多执行单元,以提升并行处理能力。说的专业点,就是GPU在浮点运算能力上,相对CPU有数量级上的提升。架构选择由计算任务的特点决定,CPU面对不同类型的计算任务会有不同的性能表现,而GPU在图形渲染领域有CPU无法比拟的性能优势。

GPU为图形渲染而生,但人们很快发现这个家伙对“运算密集”、“高度并行”、“控制简单”的其他任务也能得心应手,这是某种程度的“通用”计算,比如矩阵运算与方程求解。在强烈的需求驱动下,GPU向SIMD(Single Instruction Multiple Data,单指令多数据流)处理器方向不断演化。SIMD 是个什么鬼?简单说就是一个教官喊“稍息”,大家都稍息,教官再喊“立正”,大家一起立正。对应SIMD,还有MIMD(Multiple Instruction Multiple Data)架构,多个教官,一个教官喊“稍息”,只有你稍息,另一个教官可能已经让他的兵“卧倒”“匍匐前进”了。MIMD能比较有效率地执行分支程序,而SIMD体系结构运行分支或条件语句时会造成很低的资源利用率。

说到这里,你可能已经觉得GPU这个东西酷毙了,可以像部队一样成军团的战斗,实现真正意义上的硬件层面的并行。现在我们有这么个大锤子,钉子在哪,在哪啊?打住,还有个重要的问题没有解决,锤子的比喻不妥,其实我们是有了个大筛子,胃口大得很,你怎么及时喂饱它呢?数据库天才 Jim Gray曾经打过比方,存在硬盘上的数据离CPU是宇宙距离,遥远不可及,放到内存里,就变成银河系内了,放到Cache里,就到了太阳,放到寄存器里,才到手边。 这些存储器对于输运数据到CPU至关重要,也是决定处理能力的关键。为此,CPU配置了主存储器,而GPU则配置了显存。显存目前以领先主存两代的技术配置,加之执行部件的并行存取,其存储带宽也是数倍于主存,为强大的浮点运算提供稳定充足的数据吞吐。

GPU火了,但仍是冯诺依曼的处理器架构方式,有通用的执行单元,接受软件指令,处理复杂的控制逻辑,有绕不开的局限性,SIMD影响灵活并行, MIMD方式教官又不能太多,它并没有把各司其职的理念推到极致。让专业的人做专业的事,效率一定是最高的,硬件层面做事,比用软件效率高、能耗低。为追求极致性能,在一些特定的领域,人们设计了专用集成电路(ASIC)来处理固定的运算逻辑。ASIC逻辑是死的,无法更改,有诸多不便,这催生了介于处理器与ASIC之间的 FPGA.

FPGA学名“现场可编程门阵列”,一头雾水啊!其实可以简单理解成可回收利用的专用集成电路,也就是你可以对他编程,知乎网友形象的解释“你所写的代码其实是在描绘一个数字逻辑电路”。这个数字逻辑电路定义好之后,“烧”到FPGA中,他就可以作为专用集成电路用了,下次处理逻辑变了,再编程,再烧。逻辑烧入FPGA中,就是个硬件电路了,没有指令,按照电路自身逻辑运行,不需要谁来控制。FPGA中逻辑单元之间的通信也是固定的,不需要协商。对于计算与通信密集型任务,FPGA天然能耗更低、效率更高。

到此,聪明的你肯定能够想到,一个复杂的计算任务,首先交给CPU去控制运算,其中对运算密集、带宽要求高的部分,分给GPU或者FPGA去做,从而各司其职,优化资源配置,达到最佳的计算效果,(此处应该有掌声)。N记推出的 CUDA (统一计算设备架构)就是这么干的,科学家比普通人强,不是在于常识,而是在于对常识的组合运用 :D 。

学过计算机原理,大家肯定记得,CPU上有汇编,有硬件驱动,有操作系统内核,有调用的API, 有编译器,有高级语言,有开发库,你用高级语言写程序,然后用编译器编译,编译生成对操作系统API的调用,进一步变成二进制指令,在CPU运行。CUDA 遵循这样的逻辑,协同CPU与GPU, 并且特别的在GPU上提供硬件驱动,设备操作内核函数,系统调用,编译器,高级语言(C或Fortran)支持,开发库(例如用于矩阵运算的cuBLAS,用于快速傅立叶变换的cuFFT等等),你依然用C或Fortran写程序,用CUDA 编译器编译,生成含有CPU端与GPU端逻辑的二进制指令,在CPU与GPU上协同运行。可以想象CUDA程序有两个蓬勃的心脏。

不过CUDA是N记的,侧重于GPU,一骑绝尘。那AMD家咋办,众多的FPGA咋办?  行业需要一个开放的标准,面向CPU、 GPU、FPGA 等异构的系统,提供通用的并行开发与运行环境。OpenCL(全称Open Computing Language,开放运算语言)就是众多领导厂商共同努力的结果,从名称上看,OpenCL分离了硬件核心驱动层与编程开发层,将硬件核心驱动交给不同的厂家自行提供。你用C语言在OpenCL标准上开发编译的程序,可以透明的跑在从CPU、GPU、到FPGA等设备上。目前OpenCL相对与CUDA在性能、成熟度、易用性以及市场占有率上都有相当大的差距,但跨平台与开放的通用性是优势,也是趋势。

上文中提到CUDA提供了不少类似矩阵运算、FFT等的开发库,CuDNN就是其中的网红,江湖地位堪比Papi酱,它是N记充分利用其GPU的性能创建的深度神经网络加速库,可以方便的集成到诸如TensorFlow、MXNet、Theano等流行的更高级别的机器学习框架之中。 CuDNN实现了典型的深度学习算法例如,卷积、Pooling、SoftMax、ReLU、Sigmoid、LSTM、RNN等等数据科学家们如数家珍的函数,屏蔽了GPU加速的技术细节,让深度学习人员专注自己的高层模型,厉害了word CuDNN!

在《站在香农与玻尔兹曼肩上,看深度学习的术与道》一文中,我提到“深度学习领域的三类最典型问题,无监督学习(Unsupervided learning),有监督学习的分类(Classification)与预测(Prediction)归根结底都是用神经网络来近似概率分布,训练的过程就是找到这个近似概率分布函数的过程。”训练模型求解这些概率分布函数的过程是异常复杂的,无论CNN、RNN还是别的什么NN, 你都得综合运用各种数学工具,设计调整神经网络架构、处理正则化与约束、反复优化求极值,这些离不开深度学习框架与工具。可以毫不不夸张的说,人类的历史就是不断制造、使用与改进工具的历史,用工具延伸我们的手、脚、牙齿、眼睛,还有头脑。

幸运的是,在深度学习领域,人们已经创造了许多优秀的工具,Caffe、CNTK、Theano、Tensorflow、Torch等等,各有千秋,而且萝卜白菜。由于在IT界,不同的技术特区都带着浓浓的“宗教色彩”,为避免出现类似“你在PHP社区说Python好,会有人跟你吵上三天三夜”这样的局面出现,接下来对各种工具的比较尽量不带个人主观成分,实在需要“深入探讨”,请想办法与作者直接联系 :D。

2015年年底,Google开源了其深度学习框架 TensorFlow, 引起业界震动,这无异于当年大数据平台中的 Hadoop发布。带着谷歌的光环,TensorFlow也迅速流行。学过SQL的朋友都知道 SQL = Table + Flow, Table是输入输出、是Flow中流转的数据,Flow中的节点对应着不同的处理与加工逻辑。 将这个概念应用于更高维度输入输出数据,就是Tensor+Flow。 Tensor 这里可简单比作多维度Table (或者多维度矩阵,亦或多维度向量),Flow是Graph(计算任务的图表示),Tensor是输入输出、是Flow中流转的数据,Flow中的节点就是神经网络的“神经元”,对应着不同的处理与加工逻辑。就是这么简单。

曾经,性能是TensorFlow广受质疑的一个点,但集成了CuDNN 充分利用GPU之后,性能大为提升,并通过与Spark的整合,实现大型分布式的模型训练,回应了人们对其扩展能力的担心。TensorFlow有强大的谷歌背书,良好的网络架构与建模能力,丰富的开发语言支持(根植于Python,对R也有不错的集成),具备活跃的开源社区,因而有着巨大的发展潜力。不过,成也萧何败也萧何,谷歌全力支持,是Tensorflow大发展的基础,却使得谷歌的竞争对手们在采用与推动TensorFlow方面就显得十分纠结了。微软推出了自己的CNTK, 而亚马逊则选择了另外一个优秀的框架 MXNet。

来自MXNet核心团队的观点是: MXNet 专注深度学习运行的高效性与定制的灵活性,支持多操作系统与Python、R等多种语言,可以多机、多GPU并行, 同时支持命令式(类似Torch)和符号式(类似TensorFlow)两种编程模式,因而有较好的迁移能力。“Mxnet 的轻量化路线使得我们可以在花费 Google brain 1/10 的人力的情况下做到类似 TF 技术深度的系统”,MXNet作者李沐如是说。而且这个核心团队多是这样有识有为的华人同胞,支持下!

相比MXNet, Keras选择了对成熟框架Theano与TensorFlow做易用性的封装,站在巨人的肩膀上,又不让大家觉得高不可攀。用搭积木的方式组织你的神经网络模型,易学易用,大大降低了上手的门槛,这就是深度学习领域的乐高啊。傍上老大哥TensorFlow, 对主流模型完美的封装,加上丰富的示例,十分有利于快速模型搭建。在Lean Startup (精益创业)的MVP (最小化可行产品 Minimum Viable Product)理念盛行的今天,Keras必定有旺盛的生命力,我们拭目以待。

最后提下Jupyter Notebook(原名IPython Notebook), 它是目前一个较为流行的交互式集成开发环境(IDE),支持Python、R等几十种语言;方便易用,打开浏览器,像写笔记一样写代码、做分析,交互式,几乎没有什么学习成本;生成的笔记也是简洁优雅,人家叫“笔记本”可是名副其实,功能强大而且免费。注意到本文提到的软件组件都是“功能强大而且免费”,感谢开源打破了技术壁垒,给整个技术社区带来福利。

从底层硬件到上层框架,啰嗦了一大堆,其实用下面一张简图就可以概括常见深度学习组件、工具与其生态关系。不少东西,作者也是道听途说,本文目的是从关于深度学习平台的繁杂的信息中,理出些头绪, 文中难免不严谨的地方,仅作交流学习心得用。

从CUDA到Keras,这些年你应该了解的深度学习工具-AI.x社区

本文转载自​清熙​,作者:王庆法 ​​

收藏
回复
举报
回复
相关推荐