这篇文章已翻译成中文版本在此。
我想回答一些经常被问到的问题:进行深度学习需要什么样的电脑?fast.ai为什么推荐Nvidia GPU?你推荐初学者使用哪个深度学习库?如何将深度学习应用于生产环境?我认为这些问题都归属于一个主题:进行深度学习需要什么(硬件、软件、基础和数据方面)?这篇文章面向该领域的新手和对入门感到好奇的人。
你需要的硬件
我们得益于游戏产业
视频游戏产业的规模(营收方面)比电影和音乐产业加起来还要大。在过去的20年里,视频游戏产业推动了GPU(图形处理器)的巨大进步,GPU用于处理图形渲染所需的矩阵运算。幸运的是,这些正是深度学习所需的计算类型。GPU技术的这些进步是神经网络现在比几十年前强大得多的一个关键原因。大多数情况下,在没有GPU的情况下训练深度学习模型会非常缓慢。
并非所有GPU都相同
大多数深度学习从业者并不直接编程GPU;我们使用处理这些的软件库(例如PyTorch或TensorFlow)。然而,要有效地使用这些库,你需要访问正确类型的GPU。在几乎所有情况下,这意味着能够使用英伟达公司(Nvidia)的GPU。
CUDA和OpenCL是编程GPU的两种主要方式。CUDA是迄今为止发展最完善、生态系统最广泛、并且受到深度学习库最强有力支持的方式。CUDA是英伟达创建的专有语言,因此其他公司的GPU无法使用它。fast.ai推荐英伟达GPU并非出于我们对英伟达的特殊偏好或忠诚,而是因为它迄今为止是深度学习的最佳选择。
英伟达在GPU市场上占据主导地位,最接近的竞争对手是AMD公司。今年夏天,AMD宣布发布一个名为ROCm的平台,以提供更多对深度学习的支持。ROCm对PyTorch、TensorFlow、MxNet和CNTK等主要深度学习库的支持状态仍在开发中。虽然我很希望看到一个开源替代方案成功,但我不得不承认ROCm的文档很难理解。我刚读了ROCm网站的概述、入门和深度学习页面,但仍然无法用自己的话解释ROCm是什么,尽管我想将其包含在这里以示完整。(我承认我没有硬件背景,但我认为像我这样的数据科学家应该是这个项目的目标受众之一。)
如果你没有GPU……
如果你的电脑没有GPU或拥有非英伟达GPU,你有几个很棒的选择
通过浏览器使用Crestle:Crestle是一项服务(由fast.ai学生Anurag Goel开发),它为你提供了一个已配置好的云服务,预装了所有流行的科学和深度学习框架,并配置好在云端的GPU上运行。通过浏览器即可轻松访问。新用户可免费获得10小时使用时长和1GB存储空间。之后,GPU的使用费用为每小时59美分。我向那些刚接触AWS或刚开始使用控制台的人推荐此选项。
通过控制台设置AWS云实例:你可以按照fast.ai的这个设置课程中的步骤创建一个AWS实例(它远程为你提供英伟达GPU)。AWS每小时收取90美分费用。尽管我们的设置材料是关于AWS的(你会在论坛中找到对AWS最多的支持),但一位fast.ai学生创建了一份设置用于深度学习的Azure虚拟机的指南。如果有人写一篇关于使用Google Cloud Engine执行此操作的博客文章,我很乐意分享并添加链接。
构建自己的机器。这是来自fast.ai论坛的一篇长帖子,人们在这里提问、分享他们使用的组件以及发布其他有用的链接和技巧。最便宜的新英伟达GPU大约300美元,有些学生在eBay或Craigslist上找到了更便宜的二手货,其他人则为更强大的GPU支付更多费用。我们的一些学生写了博客文章记录他们如何构建机器
- 深度困惑:构建深度学习机器的奇遇,作者Mariya Yao
- 一种懒惰而快速的设置深度学习机器的方法,作者Sravya Tirukkovalur
- 构建你自己的深度学习机器,作者Brendan Fortuner
你需要的软件
深度学习是一个相对年轻的领域,库和工具变化很快。例如,我们在2016年课程第一部分选择使用的Theano,刚刚退役。我们目前使用的PyTorch,也是今年(2017年)早些时候才发布的。正如Jeremy先前所写,你应该假定今天学到的任何特定库和软件都将在未来一两年内过时。最重要的是理解底层概念,为此,我们正在PyTorch之上创建我们自己的库,我们相信这能使深度学习概念更清晰,并将最佳实践编码为默认设置。
Python是迄今为止深度学习最常用的语言。有许多深度学习库可用,几乎每个主要的科技公司都支持不同的库,尽管这些公司的员工通常会混合使用各种工具。深度学习库包括TensorFlow(谷歌)、PyTorch(Facebook)、MxNet(华盛顿大学,亚马逊适配)、CNTK(微软)、DeepLearning4j(Skymind)、Caffe2(也是Facebook)、Nnabla(索尼)、PaddlePaddle(百度)以及Keras(一个运行在此列表中多个库之上的高级API)。所有这些库都提供了Python选项。
动态计算图 vs. 静态计算图
在fast.ai,我们认为程序员能够实验和迭代的速度(通过更简单的调试和更直观的设计)比理论上的性能提升更重要。这就是我们使用PyTorch的原因,它是一个具有动态计算的灵活深度学习库。
深度学习库之间的一个区别是它们使用动态计算还是静态计算(有些库,如MxNet和现在的TensorFlow,允许两者)。动态计算意味着程序按照你编写的顺序执行。这通常使调试更容易,并且更容易将你的想法转化为代码。静态计算意味着你预先为你的神经网络构建一个结构,然后在上面执行操作。理论上,这允许编译器进行更大的优化,尽管这也意味着你期望的程序与编译器执行的程序之间可能存在更多脱节。这也意味着bug可能看起来与导致它们的实际代码相距较远(例如,如果你的图构建方式有问题,可能直到稍后在其上执行操作时才会发现)。尽管理论上认为使用静态计算图的语言比使用动态计算的语言性能更好,但我们在实践中经常发现并非如此。
谷歌的TensorFlow大多使用静态计算图,而Facebook的PyTorch使用动态计算。(注意:TensorFlow两周前刚刚宣布了动态计算选项Eager Execution,尽管它还处于早期阶段,大多数TensorFlow文档和项目仍使用静态选项)。9月,fast.ai宣布我们选择PyTorch而不是TensorFlow用于今年的课程和我们自己的库(一个封装了最佳实践的PyTorch高级包装器)的开发。简而言之,以下是我们选择PyTorch的一些原因(在此处有更详细的解释)
- 更容易调试
- 动态计算更适合自然语言处理
- 传统的面向对象编程风格(对我们来说感觉更自然)
- TensorFlow使用scope和sessions等不寻常的约定可能令人困惑,需要学习更多
谷歌在TensorFlow的营销上投入的资源远超其他任何公司,我认为这是TensorFlow如此出名的原因之一(对于许多深度学习领域外的人来说,TensorFlow是他们唯一听说过的深度学习框架)。正如上面提到的,TensorFlow在几周前发布了一个动态计算选项,解决了上述一些问题。许多人问fast.ai我们是否会转回TensorFlow。动态选项还相当新颖且远未完善,所以我们目前将愉快地继续使用PyTorch。然而,TensorFlow团队对我们的想法非常接受,我们很乐意看到我们的fastai库被移植到TensorFlow。
注意:我们更新课程的线下版本(使用PyTorch以及我们自己的fastai库)目前正在进行中。课程结束后,将免费在线发布(预计发布:一月)。
生产环境你需要什么:不是GPU
许多人将深度学习应用于生产环境的想法过于复杂化,认为他们需要比实际更复杂的系统。你可以在生产环境中使用CPU和你选择的Web服务器来部署深度学习,事实上,这正是我们为大多数用例推荐的方式。以下是一些关键点
- 在生产环境中进行训练是极其罕见的。即使你想每天更新模型权重,也不需要在生产环境中进行训练。好消息!这意味着你在生产环境中只需要进行推理(模型的正向传播),这比训练要快得多、容易得多。
- 你可以使用任何你喜欢的Web服务器(例如 Flask),并将推理设置为简单的API调用。
- 只有当你能有效地批量处理数据时,GPU才能提供加速。即使你每秒收到32个请求,使用GPU很可能反而会让你变慢,因为你必须从第一个请求到达开始等待一秒钟,收集所有32个请求,然后执行计算,最后返回结果。我们建议在生产环境中使用CPU,并且你可以根据需要随时添加更多CPU(这比使用多个GPU更容易)。
对于大公司来说,在生产环境中使用GPU进行服务可能是有意义的——但是,当你达到这种规模时会很清楚。过早地在不需要时尝试扩展只会增加不必要的复杂性并减慢你的速度。
你需要的基础:1年编程经验
我和Jeremy创建程序员实用深度学习的灵感之一(也是令人沮丧的一点)是,大多数深度学习材料属于以下两类之一
- 过于浅显和高层,以至于无法为你提供真正在工作中使用深度学习或创建最先进模型所需的信息或技能。如果你只想有一个高层概述,这没问题,但如果你想成为一个实际从业者,这会令人失望。
- 高度理论化,并假定读者拥有研究生水平的数学背景。这对许多人来说是一个难以逾越的障碍,即使作为一个拥有数学博士学位的人,我发现理论对于学习如何编写实际解决方案并不是特别有用。许多材料有这种倾向并不奇怪。直到最近,深度学习几乎完全是一个学术领域,主要由如何在顶级学术期刊上发表论文的问题驱动。
我们的免费课程程序员实用深度学习的独特之处在于,唯一的先决条件是1年编程经验,但它仍然教你如何创建最先进的模型。你的背景可以是任何语言,不过你可能需要在开始课程之前学习一些Python,因为这是我们使用的语言。我们会根据需要介绍数学概念,并且我们不建议你提前投入大量时间学习数学理论。
如果你不知道如何编程,我强烈推荐学习,如果你对数据科学感兴趣,Python是一个很好的入门语言。
你需要的数据:比你想象的少得多
虽然许多人声称进行深度学习需要谷歌规模的数据集,但这不属实。迁移学习的力量(结合数据增强等技术)使人们能够将预训练模型应用于小得多的数据集。正如我们在其他地方讨论过的,在医疗初创公司Enlitic,Jeremy Howard领导的团队仅使用了1000例带有癌症的肺部CT扫描图像,就构建了一个比4名专家放射科医生组成的团队在诊断肺癌方面更准确的算法。C++库Dlib中有一个例子,其中一个面部检测器仅使用4张图像(包含18张人脸)就进行了准确的训练!
关于访问的说明
与我交谈的大多数人认为,深度学习的入门门槛远低于他们的预期,并且成本完全在他们的预算范围内。然而,我意识到并非所有情况都如此。我定期会收到一些学生的联系,他们想参加我们的在线课程,但负担不起AWS的费用。不幸的是,我对此没有解决方案。还有其他障碍。Bruno Sánchez-A Nuño撰文讨论了挑战在没有可靠互联网接入的地方进行数据科学的挑战,fast.ai国际研究员Tahsin Mayeesha描述了在孟加拉国等国家MOOC访问的隐藏障碍。我关心这些访问问题,但没有解决方案令人沮丧。