图:Pixabay
原文来源:fast.ai
作者:Rachel Thomas
「雷克世界」编译:嗯~阿童木呀
对于想要入门深度学习的新手来说,可能会存在以下几个问题:我需要什么样的电脑来学习深入学习?对初学者来说什么样的深度学习库比较合适?该如何将深度学习投入到生产中?我认为所有这些问题都都涵盖在一个主题之下,即在深度学习中需要的硬件、软件、背景和数据是什么样的?这篇文章就是专门针对那些刚接触深度学习这个领域,并且对入门感兴趣的新手们的。
你需要的硬件
真的要非常感谢游戏产业。
毫不夸张地说,电子游戏产业在收入方面要大于电影和音乐产业的总和。在过去的20年里,电子游戏产业推动了GPU(graphical processing units,图形处理单元)的巨大进步,即用于绘制图形所需的矩阵运算。幸运的是,这些正是深度学习所需的计算类型。而GPU技术的这些进步则是一个关键部分,诠释了为什么现在的神经网络比几十年前更为强大。在大多数情况下,如果没有GPU那深度学习模型的训练过程将会非常缓慢。
并非所有的GPU都是一样的
大多数深度学习从业者并不是直接对GPU进行编程,我们正在使用软件库(如PyTorch或TensorFlow)来处理这个问题。但是,想要有效使用这些库,你需要使用正确类型的GPU。
CUDA和OpenCL是进行GPU编程的两种主要方式。CUDA是迄今为止开发最为完善的、拥有最广泛的生态系统,并且得到深度学习库最有力的支持。CUDA是由Nvidia创建的专有语言,因此它不能被其他公司的GPU使用。
今年夏天,AMD宣布发布一个名为ROCm的平台,为深度学习提供更多的支持。而ROCm对于诸如PyTorch、TensorFlow、MxNet和CNTK等主要的深度学习库,目前仍处于开发阶段。虽然我非常希望看到一个开源的替代方案能够取得成功,但不得不承认,我发现ROCm的文档难以理解。我刚刚阅读了ROCm网站的概述、入门和深度学习页面,但仍然不能用我自己的话来对ROCm进行一个概述,尽管我想在这里把它涵盖在内以便更为完整。(我虽然没有硬件背景,但我认为像我这样的数据科学家应该成为该项目目标受众的一部分。)
如果你没有GPU
如果你的电脑没有GPU,那么你有以下几个很好的选择:
•通过浏览器使用Crestle:Crestle是一个服务器(由fast.ai学生Anurag Goel开发),它能够为你提供一个已经建立好的云服务,其中,所有的流行科学和深度学习框架都已预先安装和配置好以在云端的GPU上得以运行。它很容易通过你的浏览器进行访问。新用户可免费获得10小时和1 GB的存储空间。之后,GPU的使用费用为每小时59美分。对于那些刚接触AWS或刚开始使用console的新手们来说,这是一个不错的选择。
•通过你的控制台设置AWS云实例:你可以按照本fast.ai设置课程中的步骤创建一个AWS实例(能够远程为你提供Nvidia GPU)。AWS为此每小时收取90美分。尽管我们的设置材料都是关于AWS的,但是一位fast.ai的学生创建了一个用于深度学习的Azure虚拟机的指南。如果有人写关于Google云端引擎的博客文章,我很乐意分享该链接。
•构建你自己的盒子。以下是我们fast.ai论坛中一个非常冗长的话题,人们可以在其中提出问题、分享他们正在使用的组件,并发布其他有用的链接和提示。最便宜的新型Nvidia GPU是300美元左右,一些学生在eBay或Craigslist上发现了更为便宜的二手GPU,而另外一些则要为更强大的GPU支付更多的费用。我们的一些学生写了篇博文,记录了他们是如何构造自己的机器的:
1.Mariya Yao所写的《深度困惑:在构建深度学习机过程中的不幸经历》。
/
2.Sravya Tirukkovalur所写的《以一种懒惰而快速的方式构建一个深度学习机》。
3.Brendan Fortuner所写的《创建自己的深度学习盒》
你所需要的软件
可以说,深度学习是一个相对不成熟的领域,因此相应的库和工具变化速度非常快。例如,我们在2016年课程中选择使用的Theano,现在已经不再使用了。而我们目前使用的PyTorch,则是在今年(2017年)刚刚发布的。就像Jeremy以前所写的那样,你应该要保持这样一种假设,你今天所学到的任何特定的库和软件都将在一两年内被淘汰。而在这个过程中,最重要的是理解底层概念。为此,我们在Pytorch上创建了自己的库,我们相信这将使深度学习概念更为清晰。
Python是目前为止深度学习中最为常用的语言。现如今,有许多深度学习库可供选择,而几乎所有主要科技公司都支持不同的库,尽管这些公司的员工经常混合使用各种工具。深度学习库包括TensorFlow(谷歌)、PyTorch(Facebook)、MxNet(华盛顿大学,由亚马逊改编)、CNTK(微软)、DeepLearning4j(Skymind)、Caffe2(也是Facebook),Nnabla(索尼)、PaddlePaddle(百度) 、以及Keras(一种高级API,在此列表中的其他几个库上运行)。所有这些都有可用的Python选项。
动态与静态图计算
在fast.ai中,我们优先考虑程序员可以进行实验和迭代(通过更简单的调试和更直观的设计),这要比理论性能上的速度提高重要得多。而这就是我们使用PyTorch的原因,它是一个具有动态计算功能的、灵活的深度学习库。
深度学习库与库之间的一个区别在于,它们是使用动态还是静态计算(诸如MxNet和现在的TensorFlow,是两者都允许的)。动态计算,意味着程序是按照你所编写的顺序执行的。这通常会使调试更为容易,并且使得将想法从大脑中转换成代码变得更为直接、简单。静态计算,意味着你要预先为你的神经网络构建一个结构,然后在上面执行操作。从理论上讲,这使得编译器能够进行更好的优化,尽管这同时也意味着你预计程序能做的和编译器真正执行的内容之间可能会有更多的脱节。另外,这还意味着,bug可能会更多地从导致其产生的代码中移除(例如,如果在构建图表时出现错误,你可能不会意识到,直到稍后你在上面执行一个操作)。即使从理论上来看,使用静态计算图的语言要比使用动态计算的语言具有更好的性能,但我们经常发现,在实践中并非如此。
谷歌的TensorFlow主要使用静态计算图,而Facebook的PyTorch则使用动态计算。(注:两周前,TensorFlow刚宣布了一个动态计算选项——Eager Execution,尽管它出现的还算很早,但大多数TensorFlow文档和项目都使用的是静态选项)。今年9月,fast.ai宣布,我们选择了PyTorch而不是TensorFlow,并将其用于开发我们自己的库(PyTorch的编码最佳实践的高级包装器)。简单地说,下面是我们选择PyTorch的几个简要原因(这里有更为详细的解释):
•更容易调试
•动态计算更适合于自然语言处理
•传统的面向对象的编程风格(于我们而言更自然)
•TensorFlow使用诸如scope(范围)和session(会话)等不寻常的协议可能会令人感到困惑,而且还有更多的东西要学习。
谷歌在营销TensorFlow方面投入的资源比其他任何人都要多,而我认为这是TensorFlow如此知名的原因之一(对于许多深度学习的“门外汉”来说,TensorFlow是他们所听说过的唯一的深度学习框架)。如上所述,TensorFlow几周前发布了一个动态计算选项,解决了上述一些问题。因此,很多人都在问,我们是否要回选TensorFlow。可以这样说,动态选项还是相当新的,而且还不太成熟,所以目前为止,现我们还是很乐意继续使用PyTorch的。不过,TensorFlow团队也是非常乐意接受我们的想法的,同时,我们也很乐意看到我们的fastai库被移植到TensorFlow上。
在生产过程中需要什么:不是GPU
许多人把在生产中使用深度学习的想法过于复杂化了,认为他们需要的系统要比实际使用的要复杂得多。你可以在生产中使用CPU以及你所选择的网络服务器进行深度学习,实际上,这是我们所推荐的大多数使用情况。这里有几个关键点:
•在生产过程中进行训练是极其罕见的。即使你想每天更新模型权重,也不需要在生产中进行训练。这是一个好消息!意味着你只是在生产过程中进行推理(通过你的模型正向传递),而这要比训练快得多、简单得多。
•你可以使用任何你所喜欢的Web服务器(例如Flask),并将推理设置为一个简单的API调用。
•如果你能够有效地批量处理数据,那么GPU将会提供更快的速度。即使你每秒收到32个请求,使用GPU的话都很可能会使你减慢速度,因为从第一个请求到达直到收集全部32个请求时,你必须要等一段时间,继而执行计算,然后返回结果。我们建议在产品中使用CPU,并且可以根据需求添加更多的CPU(比使用多个GPU要简单得多)。
对于大公司来说,在产品中使用GPU可能是有意义的,而当你达到这个公司大小的时候这一点就会很清楚了。在没有需求之前过早地尝试进行扩展只会增加不必要的复杂性,并让你的速度慢下来。
你所需要的背景:1年的编程经验
激发Jeremy和我创建《程序员实用性深度学习》()的挫折之一是,大多数深度学习材料分为两类:
•要么太浅,要么太深,以至于不能提供实际在工作场所或创建最先进的模型时使用深度学习所需要的信息或技能。如果你只是想要一个概述,那这就足够了,但如果你想成为一个工作实践者,这可能会令你失望。
•高度理论化并假设具有研究生水平的数学背景。对于许多人来说,这是一个令人望而却步的的屏障。我还发现,即使是有数学博士学位的人,在学习如何对实用性解决方案编程方面,这个理论并不是非常奏效。其实,许多材料都有这个倾向并不奇怪。直到最近,深度学习还几乎完全是一门学科,很大程度上是由发表在顶级学术期刊上的问题所驱动发展的。
我们的免费编程课程《程序员实用性深度学习》独特之处在于,唯一的先决条件是1年的编程经验,而这只是教你该如何创造最先进的模型。其实,你的学科背景可以是任何语言,但在开始课程之前你可能会想学习一些Python,因为这是我们将要使用的。我们根据需要引入数学概念,但我们不建议你提前尝试学习数学理论。
如果你不知道如何编写代码,强烈建议去学习,而且如果你对数据科学感兴趣的话,Python会是一个不错的语言选择。
你所需要的数据:远远低于你的想象
虽然很多人声称,你需要Google大小的数据集来进行深度学习,其实这是错误的。迁移学习的力量(结合数据增强等技术)使得人们可以将预先训练的模型应用于更小的数据集中。正如我们曾经在此处(个图像便可以进行精确训练!
关于访问的说明
对于我所接触过的绝大多数人来说,深度学习的入门门槛远远低于他们的预期,而且成本也在预算之内。但是,我意识到事实并非如此。我定期联系那些想要参加我们的在线课程,但无法承担AWS成本的学生。不幸的是,我并没有解决方案。除此之外还有其他的困难,Bruno Sánchez-A Nuño写了关于在没有可靠互联网接入的地方进行数据科学的挑战所在(访问的隐藏障碍。我很关心这些关于访问的问题,而令人满意的是至今没有解决方法。