雷锋网AI科技评论按:近日,RachelThomas在fast.ai上发布了一篇博文《Whatyouneedtododeeplearning》,他希望通过这篇文章回答一些深度学习入门者经常会问到的问题:什么样的电脑才能用来做深度学习?为什么fast.ai推荐使用英伟达的GPU呢?哪些深度学习库不适合初学者?你又是如何将深度学习应用到实际生产中的?
RachelThomas认为,所有的这些问题都可以归结到一个主题,那就是“究竟需要准备好哪些东西(硬件、软件、知识背景以及数据等)才能开始深度学习?”。所以本篇博客正是针对那些想入门深度学习以及对深度学习感兴趣的新人而写的。雷锋网编译如下。
一、硬件基础
关于硬件基础,我们首先不得不感谢一下游戏工业的蓬勃发展。
视频游戏工业的体量(就盈利而言)远远超出了电影工业和音乐工业之和。在过去的20年里,视频游戏工业极大地推进了GPUs(图像处理单元)的发展进步,这是由于GPU可用于加速游戏图像渲染的矩阵数学运算过程。并且非常幸运的是,深度学习运算中也涉及到大量的矩阵操作。而这些年在GPU上取得运算能力的进步也正是为什么神经网络算法在早期没有发挥出效力,直到在近几年才展露头角的原因之一。因为在没有GPU的条件下,要训练一个深度学习模型在大多数情况下都将是一个非常漫长而痛苦的过程。
图一英伟达Tesla系列显卡
注意GPU的选择
大多数的深度学习从业者并不需要直接通过编程来操控GPUs,而是使用一些诸如PyTorch或TensorFlow这样的软件包来实现的。但是为了能够高效地使用这些软件包,我们必须购买正确的GPU,而这几乎就等价于我们需要购买英伟达出产的GPU。
CUDA和OpenCL是当前用来实现GPU编程的主流方式。CUDA是迄今为止发展最好的,拥有最广泛生态系统的,也是最被深度学习框架支持的集成技术。由于CUDA是由英伟达创建的集成技术,所以它无法被其它公司的GPU所使用。所以当fast.ai推荐使用英伟达的GPU时,并不是因为我们对英伟达公司有好感或者说英伟达给了好处,而仅仅是因为这是目前深度学习的最佳选择。
英伟达在GPUs的市场中占据着绝对的统治地位,然后紧随其后的竞争者则是AMD。在这个夏天,AMD发布了ROCm平台,用于对深度学习提供更多的技术支持。当前ROCm平台对于主流的深度学习框架(诸如PyTorch,TensorFlow和CNTK等)的支持还处于开发阶段。因为ROCm平台进行了开源,并且能够为深度学习的底层提供更多的选择,我是非常希望它能够取得成功的,但还是不得不承认ROCm的文档比较晦涩难懂。以至于尽管我想要这里介绍一下ROCm平台,但是在阅读了ROCm网站提供的Overview、GettingStarted和DeepLearning页面之后却依然无法通过自己的语言来描述和解释ROCm。(我承认自己没有硬件知识背景,但是我认为像我这样的数据科学家应该成为该项目的目标读者之一)
如果没有GPU
如果你的电脑不具有GPU或者是没有英伟达产的GPU,你还拥有以下几个选择:
使用Crestle,仅仅需要使用浏览器进行操作。Crestle提供了一套已经配置成熟的云服务方案(由fast.ai的学生AnuragGoel开发),云服务器中已经预装了所有的主流科学计算与深度学习将使用到的框架,并且还配置好了相应的GPU支持。而且你能够通过浏览器轻松地进行访问。每位新用户都将免费获得10个小时的体验时间以及1GB的存储空间。体验过后,带有GPU支持的服务器收费是每小时0.59美元。我建议那些从未使用过AWS服务或者不熟悉控制台操作的同学选择这个。
通过控制台创建一个AWS云实例。你可以选择参考这篇由fast.ai出品的配置教程来创建一个AWS实例(AWS能够远程为你提供英伟达的GPUs服务)。AWS的收费标准是每小时0.9美元。虽然我们的教程是关于配置AWS的,还是有一位fast.ai的同学写了一篇关于在Azure虚拟机上配置深度学习环境的博客。另外如果有哪位同学写了关于如何在Google云引擎上配置深度学习环境的博客,我也非常乐于将其链接分享出来并添加到这里。
组建自己的深度学习工作站。这是我们fast.ai论坛中一个较为冗长的话题,人们可以在其中提问题、分享自己正在使用的组件以及发布其它有用的链接或者提示。最便宜的新款英伟达GPU大概需要美元左右,有些同学在eBay或Craigslist上发现了更便宜的旧版GPU,另外也有些同学选择了花费更多的钱来购买性能更加强悍的GPUs。并且有许多的同学写了博客来分享他们是如何组建起自己的深度学习机器:
MariyaYao写的DeepConfusion:MisadventuresinBuildingaDeepLearningMachine
SravyaTirukkovalur写的SettingupaDeeplearningmachineinalazyyetquickway
BrendanFortuner写的Buildingyourowndeeplearningbox
二、软件基础
深度学习还是一个相对新兴的领域,因此与它有关的框架和工具也是日新月异。比如说,我们在年教学课程第一部分采用的深度学习框架Theano就在最近宣布停止了支持和更新。而我们目前正在使用的PyTorch框架则是刚刚发布的。正如Jeremy在早些的博客中提到的——在学习任何特定的深度学习框架和软件时你都必须做好它们可能在一年或者两年后将被抛弃的心理准备。最重要的事情是理解最基础的概念,所以为了实现这一目标,我们基于PyTorch的基础上创建了自己的软件库,并且我们认为这将有助于更加清晰地展示深度学习的概念,同时也有助于实现最佳编码。
Python是当前在深度学习领域使用最为广泛的编程语言。另外还存在着各式各样的深度学习框架可供选择,并且几乎所有的主流科技公司都支持着各自不同的框架,尽管这些公司的员工在实际研发中总是混合使用着各类框架。深度学习框架包括有TensorFlow(谷歌)、PyTorch(Facebook)、MxNet(华盛顿大学开发,后由亚马逊维护)、CNTK(微软)、DeepLearning4j(Skymind)、Caffe2Nnabla(索尼)、PaddlePaddle(百度)和Keras(一个基于前边若干个框架为基础进行高级封装的API)。并且所有这些框架都提供有Python的API接口。
动态图vs.静态图
在fast.ai,我们在选择框架时优先考虑程序员编程的便捷性(能更方便地进行调试和更直观地设计),而不是框架所能带来的模型加速能力。这也正是我们选择PyTorch的理由,因为它是一个具有动态图机制的灵活框架。
依据采用动态计算或是静态计算的不同,可以将这些众多的深度学习框架划分成两大阵营,当然也有些框架同时具有动态计算和静态计算两种机制(比如MxNet和最新的TensorFlow)。动态计算意味着程序将按照我们编写命令的顺序进行执行。这种机制将使得调试更加容易,并且也使得我们将大脑中的想法转化为实际代码变得更加容易。而静态计算则意味着程序在编译执行时将先生成神经网络的结构,然后再执行相应操作。从理论上讲,静态计算这样的机制允许编译器进行更大程度的优化,但是这也意味着你所期望的程序与编译器实际执行之间存在着更多的代沟。这也意味着,代码中的错误将更加难以发现(比如,如果计算图的结构出现问题,你可能只有在代码执行到相应操作的时候才能发现它)。尽管理论上而言,静态计算图比动态计算图具有更好的性能,但是在实践中我们经常发现并不是这样的。
谷歌的TensorFlow主要使用了静态计算图,而Facebook的PyTorch则使用了动态计算图机制。(注:TensorFlow在两周前宣布了一个动态计算选项EagerExecution,不过该特性还比较新颖并且TensorFlow的文档和项目依然以静态计算为主)。在九月份,fast.ai宣布将在今年的课程中采用PyTorch框架进行教学以及开发fast.ai自己的框架(实际上就是采用了更好的编码方式对PyTorch进行高级封装)。简而言之,以下是我们选择PyTorch的几个原因(更详细的原因请参见这里):
更加容易调试
动态计算更适用于自然语言处理
传统的面向对象编程风格(这对我们来说更加自然)
TensorFlow中采用的诸如scope和sessions等不寻常的机制容易使人感到疑惑不解,而且需要花费更多时间学习
谷歌在推广TensorFlow上已经花费了大量的资源,其投入要远远大于任何其它公司或者团队,并且我想这也是为什么TensorFlow会如此出名的原因之一(对于很多深度学习的门外汉,TensorFlow是他们唯一听说过的框架)。正如之前所述,TensorFlow在几周前发布了动态计算选项,这将解决了一些上述提到的问题。然后许多人就向fast.ai提问说我们是否考虑迁移回TensorFlow框架。但是目前TensorFlow提供的动态选项还比较新颖而且开发也不够完善,所以我们依然选择继续愉快地使用PyTorch。但是TensorFlow团队非常乐意于接受我们的想法,我们也很高兴看到我们的fastai库被移植到TensorFlow中。
三、如何让技术落地?
许多人把工业应用中的深度学习想的过于复杂,认为自己需要比实际更加复杂的系统。你可以在生产中使用CPU和网络服务器,并且这也是我们在多数情况下所推荐的。这里有一些关键点:
在工业应用中需要训练网络的情况是非常罕见的。即便你想要每天都更新模型权重,你也不需要在应用中去进行训练。这是一条很好的消息,这意味着我们在应用中只需要进行推理(模型前向传播的过程),这远比训练要来的简单和快速。
你可以使用任何自己所喜爱的网络服务器(比如Flask),并且将推理的过程设置成一个简单的API调用。
只有能够有效地批量处理数据,GPU才能够提供更快的计算速度。不然假设你每秒获得32个请求,使用GPU反而可能减慢速度,因为从第一个请求数据达到直到收集全32个请求数据时,你必须等待一秒钟,然后再执行计算,然后返回结果。因此我们建议在实际生产中使用CPU,并且你也可以根据需要添加更多的CPU(这比使用多GPU要来的简单)。
对于大公司而言在服务器中采用GPU是有意义的,当你发展到这个程度的时候你自然就知道自己需要了。但是过早地进行扩展只会增加不必要的复杂性并且拖慢你的速度。
四、所需背景:一年的编程经历
启发Jeremy和我编写《写给程序员看的深度学习实践》的一大原因是,目前大多数的深度学习材料存在着以下缺陷:
内容过于简单笼统,以至于不能提供如何将深度学习应用在实践中或者创造最先进模型所需的信息或技能。如果你仅仅需要一个整体的概览,这些内容没有问题。但是如果你想学会如何应用深度学习,这却是远远不够的。
高度理论化并且假设读者具备有本科生的数学背景知识。对于许多人来说,这是一道障碍,即使是具有数学博士学位的人。另外我发现这些过于理论化的学习对于掌握如何编写实际代码并没有特别大的帮助。这些材料有这种理论化的倾向其实也并不奇怪。因为直到最近,深度学习还是一门学术学科,并且很大程度上是由在顶级学术刊物上发表的内容所推动的。
我们的《写给程序员看的深度学习实践》是一门免费课程,其特点在于仅仅要求学员具备至少一年的编程经验,然后我们就可以教会你们如何创建最先进的模型。你的编程语言背景可以是任何一门语言,但是在开始学习我们的课程之前你最好先学会使用Python,因为这正是我们所使用的。我们将根据需要介绍相关的数学概念,并不建议大家单独尝试学习数学理论。
如果你还不知道如何编写代码,我们强烈建议你去学习一下。另外如果你对数据科学感兴趣的话,Python是一门非常合适的语言。
五、所需数据:远比你想象的要少
虽然许多人都声称需要具备有像谷歌一般的数据量才能从事深度学习工作,但这种观点是错误的。因为迁移学习(结合诸如数据增强的技术)的出现使得人们能够将经过预训练的模型在更小的数据集上进行训练。正如我们在其它地方谈到的,在一家医疗初创公司Enlitic,JeremyHoward带领着一支团队仅仅只使用了例肺癌CT扫描样本,创建了一个比4位专业放射科医师具备更准确判别肺癌能力的算法。另外C++库Dlib提供了另外一个样例,在这个例子中仅仅使用了4张图片的18张脸来训练一个面部检测器!
图二使用Dlib实现人脸识别
六、关于fast.ai
fast.ai是一个致力于为所有人提供学习深度学习机会的平台。我们相信,深度学习将是一个转型的技术,将显着改善对发展中国家影响最大的医药,教育,农业,交通等诸多领域。但是要真正实现这一点,技术需要比现在更加容易使用,可靠和直观。我们正在研究综合利用人类与计算机各自优势的混合“人机”解决方案,建立一个随时可用的应用程序和模型库,开发完整的教育框架,并为开发人员和用户编写能够快速上手和易于使用的软件。
Via:Whatyouneedtododeeplearning,雷锋网编译