雷锋网AI科技评论按:近日,Rachel Thomas在fast.ai上发布了一篇博文《What you need to do deep learning》,他希望通过这篇文章回答一些深度学习入门者经常会问到的问题:什么样的电脑才能用来做深度学习?为什么 fast.ai 推荐使用英伟达的 GPU 呢?哪些深度学习库不适合初学者?你又是如何将深度学习应用到实际生产中的?
Rachel Thomas认为,所有的这些问题都可以归结到一个主题,那就是“究竟需要准备好哪些东西(硬件、软件、知识背景以及数据等)才能开始深度学习?”。所以本篇博客正是针对那些想入门深度学习以及对深度学习感兴趣的新人而写的。雷锋网编译如下。
关于硬件基础,我们首先不得不感谢一下游戏工业的蓬勃发展。
视频游戏工业的体量(就盈利而言)远远超出了电影工业和音乐工业之和。在过去的 20 年里,视频游戏工业极大地推进了 GPUs (图像处理单元)的发展进步,这是由于 GPU 可用于加速游戏图像渲染的矩阵数学运算过程。并且非常幸运的是,深度学习运算中也涉及到大量的矩阵操作。而这些年在 GPU 上取得运算能力的进步也正是为什么神经网络算法在早期没有发挥出效力,直到在近几年才展露头角的原因之一。因为在没有 GPU 的条件下,要训练一个深度学习模型在大多数情况下都将是一个非常漫长而痛苦的过程。
图一 英伟达Tesla系列显卡
大多数的深度学习从业者并不需要直接通过编程来操控 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、Getting Started 和 Deep Learning 页面之后却依然无法通过自己的语言来描述和解释 ROCm。(我承认自己没有硬件知识背景,但是我认为像我这样的数据科学家应该成为该项目的目标读者之一)
如果你的电脑不具有 GPU 或者是没有英伟达产的 GPU,你还拥有以下几个选择:
使用 Crestle,仅仅需要使用浏览器进行操作。Crestle 提供了一套已经配置成熟的云服务方案(由 fast.ai 的学生 Anurag Goel 开发),云服务器中已经预装了所有的主流科学计算与深度学习将使用到的框架,并且还配置好了相应的 GPU 支持。而且你能够通过浏览器轻松地进行访问。每位新用户都将免费获得 10 个小时的体验时间以及 1GB 的存储空间。体验过后,带有 GPU 支持的服务器收费是每小时 0.59 美元。我建议那些从未使用过 AWS 服务或者不熟悉控制台操作的同学选择这个。
通过控制台创建一个 AWS 云实例。你可以选择参考这篇由 fast.ai 出品的配置教程来创建一个 AWS 实例(AWS 能够远程为你提供英伟达的 GPUs 服务)。AWS 的收费标准是每小时 0.9 美元。虽然我们的教程是关于配置 AWS 的,还是有一位 fast.ai 的同学写了一篇关于在 Azure 虚拟机上配置深度学习环境的博客。另外如果有哪位同学写了关于如何在 Google 云引擎上配置深度学习环境的博客,我也非常乐于将其链接分享出来并添加到这里。
组建自己的深度学习工作站。这是我们 fast.ai 论坛中一个较为冗长的话题,人们可以在其中提问题、分享自己正在使用的组件以及发布其它有用的链接或者提示。最便宜的新款英伟达 GPU 大概需要 300 美元左右,有些同学在 eBay 或 Craigslist 上发现了更便宜的旧版 GPU,另外也有些同学选择了花费更多的钱来购买性能更加强悍的 GPUs。并且有许多的同学写了博客来分享他们是如何组建起自己的深度学习机器:
Mariya Yao 写的 Deep Confusion: Misadventures in Building a Deep Learning Machine
Sravya Tirukkovalur 写的 Setting up a Deep learning machine in a lazy yet quick way
Brendan Fortuner 写的 Building your own deep learning box
深度学习还是一个相对新兴的领域,因此与它有关的框架和工具也是日新月异。比如说,我们在 2016 年教学课程第一部分采用的深度学习框架 Theano 就在最近宣布停止了支持和更新。而我们目前正在使用的 PyTorch 框架则是 2017 刚刚发布的。正如 Jeremy 在早些的博客中提到的——在学习任何特定的深度学习框架和软件时你都必须做好它们可能在一年或者两年后将被抛弃的心理准备。最重要的事情是理解最基础的概念,所以为了实现这一目标,我们基于 PyTorch 的基础上创建了自己的软件库,并且我们认为这将有助于更加清晰地展示深度学习的概念,同时也有助于实现最佳编码。
Python 是当前在深度学习领域使用最为广泛的编程语言。另外还存在着各式各样的深度学习框架可供选择,并且几乎所有的主流科技公司都支持着各自不同的框架,尽管这些公司的员工在实际研发中总是混合使用着各类框架。深度学习框架包括有 TensorFlow (谷歌)、PyTorch (Facebook)、MxNet (华盛顿大学开发,后由亚马逊维护)、CNTK (微软)、DeepLearning4j (Skymind)、Caffe2 (Facebook)、Nnabla (索尼)、PaddlePaddle (百度)和Keras (一个基于前边若干个框架为基础进行高级封装的 API)。并且所有这些框架都提供有 Python 的 API 接口。
在 fast.ai,我们在选择框架时优先考虑程序员编程的便捷性(能更方便地进行调试和更直观地设计),而不是框架所能带来的模型加速能力。这也正是我们选择 PyTorch 的理由,因为它是一个具有动态图机制的灵活框架。
依据采用动态计算或是静态计算的不同,可以将这些众多的深度学习框架划分成两大阵营,当然也有些框架同时具有动态计算和静态计算两种机制(比如 MxNet 和最新的 TensorFlow)。动态计算意味着程序将按照我们编写命令的顺序进行执行。这种机制将使得调试更加容易,并且也使得我们将大脑中的想法转化为实际代码变得更加容易。而静态计算则意味着程序在编译执行时将先生成神经网络的结构,然后再执行相应操作。从理论上讲,静态计算这样的机制允许编译器进行更大程度的优化,但是这也意味着你所期望的程序与编译器实际执行之间存在着更多的代沟。这也意味着,代码中的错误将更加难以发现(比如,如果计算图的结构出现问题,你可能只有在代码执行到相应操作的时候才能发现它)。尽管理论上而言,静态计算图比动态计算图具有更好的性能,但是在实践中我们经常发现并不是这样的。
谷歌的 TensorFlow 主要使用了静态计算图,而 Facebook 的 PyTorch 则使用了动态计算图机制。(注:TensorFlow 在两周前宣布了一个动态计算选项 Eager Execution,不过该特性还比较新颖并且 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,Jeremy Howard 带领着一支团队仅仅只使用了 1000 例肺癌 CT 扫描样本,创建了一个比 4 位专业放射科医师具备更准确判别肺癌能力的算法。另外 C++ 库 Dlib 提供了另外一个样例,在这个例子中仅仅使用了 4 张图片的 18 张脸来训练一个面部检测器!
图二 使用Dlib实现人脸识别
fast.ai 是一个致力于为所有人提供学习深度学习机会的平台。我们相信,深度学习将是一个转型的技术,将显着改善对发展中国家影响最大的医药,教育,农业,交通等诸多领域。但是要真正实现这一点,技术需要比现在更加容易使用,可靠和直观。我们正在研究综合利用人类与计算机各自优势的混合“人机”解决方案,建立一个随时可用的应用程序和模型库,开发完整的教育框架,并为开发人员和用户编写能够快速上手和易于使用的软件。
Via: What you need to do deep learning ,雷锋网编译