从硬件配置到框架选择,请以这种姿势入坑深度学习

桂林seo半杯酒博客

深度学习初学者经常会问到这些问题:开发深度学习系统,我们需要什么样的计算机?为什么绝大多数人会推荐英伟达 GPU?对于初学者而言哪种深度学习框架是最好的?如何将深度学习应用到生产环境中去?所有这些问题都可以归结为一个——搭建深度学习系统都需要些什么?(其中包含硬件、软件、环境与数据)在本文中,让我们将这些问题一并解决。

你需要的硬件

我们要感谢游戏行业

从收益来看,视频游戏行业比电影和音乐行业加起来还要大。过去 20 年中,视频游戏行业推动 GPU 出现了巨大进步,GPU 用于制作呈现图所需的矩阵运算。幸运的是,这些正是深度学习所需的计算类型。GPU 行业的发展是神经网络比几十年前更加强大的重要原因之一。大部分情况下不使用 GPU 训练深度学习模型会非常慢。

并非所有 GPU 都是一样的

大部分深度学习从业者不直接编写 GPU CUDA 代码,我们通常会使用软件库(如 PyTorch 或 TensorFlow)。但是,要想高效使用软件库,你需要选择合适的 GPU。在几乎所有情况下,这意味着你需要使用英伟达的产品。

CUDA 和 OpenCL 是进行 GPU 编程的两种主要方式。CUDA 目前是开发最好、具备最广泛生态系统、深度学习库最支持的方式。CUDA 是英伟达创建的专用语言,因此其他公司的 GPU 无法使用它。几乎可以肯定,英伟达 GPU 是目前执行深度学习任务最好的选择。

英伟达主导 GPU 市场,它最大的竞争对手是 AMD。今年夏天,AMD 发布了 ROCm 平台提供深度学习支持。该工具适用于主流深度学习库(如 PyTorch、TensorFlow、MxNet 和 CNTK)。目前,ROCm 仍然在不断开发中。虽然对于用户而言我们都希望看到另一个开源的替代方案崛起,但是我必须得承认目前的 ROCm 文档难以理解。我在阅读 ROCm 网站上「概述、快速上手和深度学习」的页面之后仍然无法用自己的语言复述出其中的内容——尽管我很希望把 AMD 的这部分内容包含进本文中(虽然我对于硬件的理解不深,但像我这样的数据科学家应该是这一项目的使用者)。

如果你没有 GPU

如果你的电脑没有 GPU 或者不是英伟达的 GPU,那么你有以下几个选择:

  • 通过浏览器使用 Crestle:Crestle 是 fast.ai 学生 Anurag Goel 开发的一项服务,提供云服务,所有流行的科学和深度学习框架都已经预安装和配置完成,便于在云端运行 GPU。你可以通过浏览器轻松获取。新用户可免费使用 10 小时,享受 1 GB 的存储空间。10 小时之后,每小时 59 美分。我推荐 AWS 新手或刚开始使用控制台的人选择该选项。

  • 通过控制台设置一个 AWS 云实例:你可以按照该说明创建一个 AWS 实例(http://course.fast.ai/lessons/aws.html)。AWS 收费是 90 美分/小时。我们的设置材料是关于 AWS 的,不过 fast.ai 的学生为设置适合深度学习的 Azure 虚拟机创建了一个教程(https://medium.com/@abhikprince/setting-up-an-azure-vm-for-deep-learning-bb76b453272b)。

  • 构建自己的深度学习机器。这里是 fast.ai 的论坛:http://forums.fast.ai/t/making-your-own-server/174,人们在这里提问,分享使用的组件,并发布一些有用的链接和贴士。最便宜的全新英伟达 GPU 需要 300 美元左右,很多学生发现这比在 eBay 或 Craigslist 上使用 GPU 便宜。fast.ai 的一些学生写了几篇博客记录他们如何配置自己的设备:

你需要的软件

深度学习是一个新兴领域,软件库和工具包每天都在快速地提升。例如我们,而现如今非常流行的 。可能正如 Jeremy 所说的那样,我们必须相信现在具体使用的函数库或深度学习框架在一两年后会有很大的变更,甚至有可能不复存在。因此更重要的是对深度学习底层概念的理解,所以我们在 PyTorch 上构建了自己的库,我们相信它能令深度学习概念更加清晰,并通过编写标准模型进一步在实践中理解这些概念。

因为 Python 的简洁和强大的软件包扩展体系,它目前是深度学习中最常见的语言。目前我们有很多深度学习库能够选择,例如 TensorFlow(谷歌)、PyTorch(Facebook)、MXNet(华盛顿大学和亚马逊)、CNTK(微软)、DeepLearning4j(Skymind)、(Facebook)、(索尼)、PaddlePaddle(百度)和 Keras(构建在前面部分库之上的高级 API)。当然,这些深度学习框架都支持 Python。

动态计算图 vs. 静态计算图

在很多教学和研究中,我们优先考虑开发者是否能快速进行实验与迭代,而不是考虑具体的理论性能或计算效率。这就要求深度学习框架具有更简洁的调试和更直观的设计等属性,而现如今流行的 PyTorch 正好符合这一点,它的动态计算图令深度学习模型的构建变得更加明了与简洁。

各深度学习库之间一个重要的区别就是它到底是使用动态计算图还是静态计算图,当然目前的 TensorFlow 和 MXNet 两者都支持。动态计算图表示程序将按照我们编写的顺序执行,这通常令模型或代码的调试更加方便,也使我们将创意从头到尾按贯序的方式更直观地实现。而对于静态计算图来说,我们首先要声明或构建一个计算图,并确定每一个结点和边的内容与定代码然后再执行该静态计算图以训练模型。从理论上来说,静态计算图允许编译器执行更多的优化,这也就导致我们声明的代码内容和编译器确切执行内容可能会有一些差别。不过即使理论上证明静态计算图要比动态计算图拥有更好的性能,但实际上很可能恰恰相反。

谷歌的 TensorFlow 可能是最常用的静态计算图框架,当然它也是我们最常用的深度学习框架。而 Facebook 的 PyTorch 是现在最常用的动态计算图框架。虽然 TensorFlow 目前也表明它能支持动态计算图(Eager Execution),但 Eager Execution 毕竟只是新生的库,TensorFlow 的文档也还是以静态计算图为主。在今年九月,fast.ai 就表明它们的课程会使用 PyTorch 而不是 TensorFlow,并且还会使用包装的高级 PyTorch 库来实现更好的实践体验。一般来说选择 PyTorch 有以下几个原因:

  • 易于调试

  • 动态计算图更适用于自然语言处理

  • 支持传统的面向对象编程风格

  • TensorFlow 的 上下文管理器和会话等机制需要我们花费额外的精力学习

fast.ai 认为谷歌在 TensorFlow 上做了大量的推广与营销,这也是 TensorFlow 如此出名的原因。对于很多深度学习门外汉来说,TensorFlow 可能是他们听过唯一的深度学习框架。不过虽然 TensorFlow 前几周发布了动态计算图,但对于很多人来说这一扩展库还是非常新的概念,它还远远不够完善与成熟。此外,TensorFlow 团队对于 fast.ai 的想法十分欢迎,因此我们也期待着把 fast.ai 库迁移到 TensorFlow 中。

生产所需:不需要 GPU

很多人过分复杂化在生产中使用深度学习的想法,并且认为他们需要比平时更复杂的系统才行。在生产中使用深度学习一块 CPU 就可以,服务器可任选。大多数使用案例我们都推荐这么做。以下是几个要点:

  • 在生产中进行训练的情况非常少见。即使你想每天都更新模型权重,也无需在生产中进行训练。这是一个好消息!因为这样你只需要在生产中进行推断(模型中的前向传递)就行了,比训练更快也更简单。

  • 你可以使用任意服务器(如 Flask),将推断设置为一个简单的 API 调用。

  • 如果你能够高效分批处理数据,GPU 仅提供加速。即使你每秒收到 32 个请求,使用 GPU 很可能降低速度,因为你必须等一秒:第一个请求先到达收集所有 32 个请求,然后执行计算,再返回结果。我们推荐在生产中使用 CPU,你可以按需要添加更多 CPU(比使用多个 GPU 简单一些)。

大公司在生产过程中使用 GPU 可能有意义,等你到那个规模时就知道了。过早尝试扩大规模只会增加不必要的复杂性,降低速度。

学习资源

目前网上有非常多的机器学习和深度学习资源,甚至各种各样的深度学习速成班也快速地成长了起来。因此,我们有必要了解优秀的学习资源到底有哪些。一般来说,学习资源可分为四部分,首先是如吴恩达 Machine Learning 或 Deep Learning Specialization 等课程视频,随后还有李航的统计学习方法或 ,后面的机器学习或深度学习技术博客也不能错过。当然,最后部分的学习资源应该来自研究论文,因为我们要是希望了解一个算法或一个技术,没有什么是比专门描述该技术的论文讲述地更加清晰。(若需要了解目前各方向业内最佳性能的工作,请查看:)

以上这四部分的资源又可以从两个方面理解,即实践和理论。对于实践来说,我们只需要理解深度学习的基本概念,然后再详细了解各深度学习框架的库函数就能学着实现简单的深度学习模型。而对于理论来说,数学基础是十分重要的,先不说基本的概率论、微积分、线性代数,那些深度学习概念背后的数学推导我们同样需要理解。此外,深度学习非常核心的最优化方法也是一个大坑,需要非常多的理论知识来做出改进。

课程建议:

  • 斯坦福大学 CS231n 卷积神经网络与图像识别:http://cs231n.stanford.edu/

  • 吴恩达 Deep Learning Specialization:https://www.coursera.org/specializations/deep-learning

  • Udacity 免费深度学习课程:https://www.udacity.com/course/deep-learning—ud730

  • Geoffrey Hinton 的 Neural Networks For Machine Learning:https://www.coursera.org/learn/neural-networks

  • 斯坦福大学 CS224d 自然语言处理深度学习:http://cs224d.stanford.edu/

所需数据:比你想象的少得多

尽管很多文章声称需要谷歌级别的数据集才能做深度学习,这种说法是错误的。迁移学习(数据增强技术相关)使人们可以在小型数据集上使用预训练的模型。在医疗创业公司 Enlitic,Jeremy Howard 带领的团队仅使用 1000 个肺癌 CT 扫描样本构建了一个算法,该算法诊断肺癌的准确率超过 4 个放射科专家。C++ 库 Dlib 有一个样例:人脸检测器仅使用包含 18 张人脸的 4 张图像就可以进行准确训练!

Dlib 的人脸识别样例