引   言

如今,得益于低成本和大容量的存储设备,我们拥有了远多于以往的数据。不论有多少炒作的成分,我们还是要感谢大数据。但是,真正的 MVP 应该是更快和更好的计算能力,正因为有了这样的计算能力,我们才可以把二十世纪八九十年代的论文真正应用到实际中去(LSTM 实际上是在 1997 年被发明的)。随着更快更好的 CPU(中央处理器)和 GPU(图形处理器)的出现,我们也终于能够发挥出神经网络和深度学习的真正力量。承认与否,在处理那些高维度、非结构化数据、高复杂度和大容量数据的问题时,传统的统计学和机器学习模型事实上具有严重的局限性。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java

来源:https://twitter.com/andrewyng/status/700086119333892096

深度学习已经开始在这些领域崭露头角,我们也看到它逐步被应用到一些现实世界中的规模化问题上。著名的人工智能传奇人物吴恩达在几年前也提到过相同的问题!

深度学习的优势在于, 在构建解决方案时,我们拥有更好的计算能力、更多的数据,以及各种各样易于使用的开源框架,例如 Keras、Tensorflow 以及Pytorch 等。

深度学习的劣势在于, 从零开始建立自己的深度学习环境是一个非常痛苦的过程,尤其是在我们要迫切编写代码和实现深度学习模型的时候。

本文则是在作者多次实战部署的基础上,借助已有服务,尽可能避免从零创建深度学习环境,从而让你可以专注于快速构建学习模型,更快地解决问题。本文主要包括以下方面:

  • 最小化配置的云深度学习环境

  • 构建自定义配置的云深度学习环境

  • 构建本地开发环境的建议

直截了当,让我们开始吧!

最小化配置的云深度学习环境

如果你不想购买额外的专用硬件,也不想面对那些讨厌的配置文件和设置命令,那使用一个已经预先配置的云深度学习环境将会是你最好的选择。很多云供应商已经提供了对深度学习的支持。下面的几种云服务只需要让我们进行最少的配置就能立即开始工作。需要一提的是,下列选项只是来自个人经验以及一些深度学习从业者的建议,并不代表全部。

  • 谷歌 Colaboratory

  • Paperspace Gradient

  • Floydhub Workspace

  • Lamda GPU 云

  • 亚马逊深度学习机器镜像

  • GCP 深度学习虚拟机镜像

我们接下来会介绍一些使用它们的必要知识,以便让你尽快上手。除此之外,我们更希望你能够主动探索,了解它们的细节,从而选出一个最适合自己的服务!

谷歌 Colaboratory

Colaboratory 也许是谷歌提供的一个最好的选项。它本身免费,能够支持基于 GPU 甚至 TPU(张量处理器)的深度学习环境,而且支持运行交互式 Jupyter Notebook。谷歌一直在积极推广它在各个领域中的应用,其中就包括广受欢迎的机器学习 Crash Course 课程。本质上,Colaboratory 是一个免费的 Jupyter Notebook 开发环境,它不需要任何设置,并且让你免费使用 GPU 去运行深度学习模型。详情请参阅 本文。

默认情况下,你可以得到一个基于 CPU 的深度学习环境,该环境预装了所有的库,可以使用以下代码验证。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_02

现如今,这种开发环境只能处理那些计算任务和数据量较少的相对简单的模型,更多时候我们需要利用 GPU 来解决更复杂的问题。Google Colab 只需要数秒就可以将运行时从 CPU 更改为 GPU,操作如下所示:

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_03

完成上述操作后,Google Colab 将申请一个新的基于 GPU 的深度学习环境,我们可以使用如下指令查看 GPU 类型:

通过上图可知,我们免费获得了一个具有 12GB 显存的 Tesla K80 GPU,这相当于 AWS 中价值 0.9 美元 / 小时的 p2.xlarge 实例。最后,可以使用下面的代码来确认正在使用 GPU 的深度学习类库。

以上步骤应该能够让你快速上手 Google Colab,运行自己的深度学习模型。如果你也在使用 Colab 来测试 CPU/GPU 深度学习环境,欢迎参阅作者的 代码。

Paperspace Gradient

Gradient 是 Paperspace 公司提供的一个产品。Paperspace 公司专注于面向机器学习和数据科学的基础设施服务。它为开发人员提供了一套完整的工具,用于探索数据、训练深度学习模型以及在 GPU 上运行计算任务。Gradient 是一个支持了 Paperspace GPU 云全部功能的一键式 Jupyter Notebook 开发环境。

以下是他们的一些基本用户方案 (更多方案信息参阅 https://www.paperspace.com/pricing)。

我们需要按小时支付 GPU 的使用费用,但价格要比其他服务供应商便宜,Quadro P4000 方案仅 0.5 美元 / 小时,而 Tesla K80 方案也不过 0.59 美元 / 小时,这要比 AWS 中同类型选项便宜。

Floydhub Workspace

FloydHub Workspace 是 Floydhub 公司提供的一个有趣的产品,该产品旨在提供一个完全配置的云深度学习开发环境,从而避免了自定义构建的麻烦。尽管该服务并不免费,但它可以实现 CPU 和 GPU 的无缝切换,并且方案费用按秒支付!

Workspace 也是一个不错的选择,毕竟我们可以得到一个 Tesla K80、12GB 显存、61GB 内存和 200GB 固态硬盘的开发环境,而价格仅为用 10 小时 12 美元。

Lambda GPU 云

Lambda Labs 或 Lambda 是一家人工智能基础设施公司,通过提供计算能力来加速人类进步。他们专注于深度学习工作站,最近发布了 Lambda GPU 云,目前该服务仍处于封闭测试阶段。每个 Lambda GPU 云实例都有 4 个 GPU,比 AWS 中的 p2.8xlarge 实例多了一倍。Lambda 声称,我们只需按下一个按钮,就可以立即通过 SSH 远程访问一个 4-GPU 实例。其价格为 0.9 美元每小时每 GPU。你可以注册一个内部测试账户。

亚马逊深度学习机器镜像

亚马逊网络服务 (AWS) 是亚马逊的一个子公司,它通过付费订阅的方式为客户提够所需要的云计算平台。最近,他们发布了亚马逊深度学习机器镜像 AMIs(Amazon Machine Images),专门用于 GPU 密集的工作负载,例如构建深度学习模型等。AWS 深度学习 AMIs 为我们提供了必要的基础设施以及预先配置的工具和框架,用于加速云中的深度学习开发。它几乎预先配置了所有最新和最好的深度学习框架:

你可以使用一个 Conda AMI,它为每个深度学习框架提都提供了单独的虚拟环境;你也可以使用一个 Base AMI,用于自定义配置和构建。

CondaAMIs 中的虚拟环境

欢迎查阅深度学习 AMI 指南(https://aws.amazon.com/machine-learning/amis ),以及如何使用 Conda 和 Base AMIs。在使用 AWS 实例时要格外小心,因为你是按小时收费的。最便宜的选项是 p2.xlarge,它有 12GB 的 GPU,价格为每小时 0.9 美元。

GCP 深度学习虚拟机镜像

GCP(Google Cloud Platform),谷歌云平台,为我们提供了一整套的云计算服务,其中包括运行深度学习模型和工作负载的基础设施。比较好的是,这项服务同谷歌内部其他最终用户产品一样,都使用了相同的基础设施。在新注册用户的第一年里,GCP 还会免费提供价值 300 美元的使用积分,这非常酷!

谷歌云深度学习虚拟机镜像允许开发人员在谷歌计算引擎 (Google Compute Engine) 实例上实例化一个虚拟机镜像,该镜像预装了流行的深度学习和机器学习框架。我们可以在计算引擎实例中启动一个预装的 ML 流行框架 (如 TensorFlow、PyTorch 或 Scikit-Learn)。最棒的是,我们也可以通过一键点击来添加对 TPU 和 GPU 的支持。它的价格也非常具有竞争力,比 AWS 要便宜得多。对于 GCP 虚拟机,我们可以用每小时 0.45 美元的价格使用 12GB 的 Tesla K80GPU!

相信以上选项应该能给你一个潜在目标,让你用最少的配置来开始深度学习之旅。

构建自定义配置的云深度学习环境

虽然使用预配置的云环境非常方便,但有时候我们仍然需要在云或者本地构建一个自定义深度学习环境。在本节中,我们将利用一个任意的云服务平台,远程构建一个健壮的深度学习环境。主要步骤如下:

  • 选择云供应商

  • 创建虚拟服务器

  • 配置虚拟服务器

  • 配置自定义深度学习环境

  • 访问你的深度学习环境

  • 验证 GPU 支持

现在让我们详细了解一下如何配置一个云深度学习环境。

选择云供应商

现在有多家云供应商提供价格合理且具有竞争力的服务,我们也在前面也介绍了一些。我们希望借助平台即服务 (PaaS) 的便利条件,这样我们就可以只负责管理自己的数据和应用程序,以及一些仅限于 GPU 计算的基本配置。下图显示了深度学习从业者经常使用的一些云供应商:亚马逊的 AWS、微软的 Azure 和谷歌的 GCP。

提供深度学习实例的云提供商

创建虚拟服务器

在选择好云服务供应商后,我们下一步要创建一个 VM(虚拟机)实例。它本质上就是一个托管代码、数据和配置设置的服务器。创建 VM 的步骤取决于所选择的云提供商。下面的分步教程展示了如何在 AWS 和 GCP 中创建和设置个人实例。

  • 使用 AWS 深度学习 AMI 创建和设置云实例

  • 使用 GCP 平台创建和设置云实例

作者也在《迁移学习 Python 实战指南》第二章中介绍了如何在 AWS 上创建和实例化一个 VM。整个代码库都是开源的,代码详见 GitHub 库:https://github.com/dipanjanS/hands-on-transfer-learning-with-python。

配置虚拟服务器

一旦创建了实例,你就可以通过云供应商的平台启动它。我们通常使用 AWS 中的 EC2 用户界面或 GCP 中的 VM 实例页面。启动实例后我们通常需要一个私钥使 SSH 能够从本地终端登录到服务器。AWS 允许我们在创建 VM 的最后一步中设置自己的密钥,并提供一个可下载的密钥。GCP 则允许我们在 GCP 实例页面直接使用 SSH 登录到系统。然后,如果没有密钥的话,可以按照指南创建自己的 SSH 密钥。

记住要妥善保存自己的 SSH 密钥,然后你就可以使用如下命令从终端登录到服务器了。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_04

恭喜!现在你已经成功登录到深度学习服务器中。在这里我们假设你使用了 Linux 服务器来进行深度学习的配置,我们使用的是 Ubuntu 18.10,当然你可以按照自己的喜好选择其他 Linux 发行版!

因为我们主要使用 Jupyter Notebook 进行原型开发,所以很有必要为 Jupyter Notebook 服务器设置一个密码,这样陌生人即使获取了你的公共 IP 地址也无法使用它。当然,如果你就是不想设置密码,可以跳过本节设置密码的步骤。下图展示了如何利用 OpenSSL 创建一个新的 SSL 证书。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_05

如果你的系统还没有安装 python,那我们建议你安装 Anaconda 发行版,因为该发行版内带了一个很棒的包管理系统,并预先安装了很多库。安装过程请参照 官方指南。

下一步我们为 Jupyter Notebook 服务器生成了一个配置文件。通常该文件位于~/.jupyter/jupyter_notebook_config.py。如果不存在,可以使用以下命令创建。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_06

为启用 Notebook 的密码保护,我们需要首先生成一个密码及其散列。具体可以使用 Ipython.lib 中的 passwd() 函数实现,过程如下所示:

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_07

一旦你输入了密码并完成了验证,该函数将返回这个密码的散列值(在本例中,我使用了单词 password 作为密码,但你绝对不要在实际配置中使用!)。接下来复制并保存该散列值,因为我们很快就会需要它。最后,启动你最喜欢的文本编辑器来编辑 Jupyter 配置文件,如下所示:

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_08

到这里,你已经做好配置深度学习环境的准备了。

配置你的深度学习环境

我们接下来将要对你的基于 GPU 的深度学习环境进行必要的配置。如果你的虚拟服务器实例已经配置好 CUDA(Compute Unified Device Architecture- 通用计算设备架构)和 cuDNN(CUDA Deep Neural Network library- 深度神经网络加速库),那你可以根据需要跳过下面的一些步骤。

1. 安装图形驱动程序

首先确保 GPU 安装了相应的图形驱动程序。对于 NVIDIA 的 GPU,我们可以通过 nvidia-smi 命令进行驱动程序安装验证,如果该命令显示无法找到,则表明系统没有安装 GPU 驱动程序,正常输出如下图所示:

2. 安装 CUDA

Nvidia 的 CUDA 工具包基本上是一个开发环境,它能够最大限度地利用 NVIDIA GPU。CUDA 加速库可以让你在不改动代码的前提下直接应用到多个领域:线性代数、图像和视频处理、深度学习和图形分析等。假设我们使用 Ubuntu 的系统,你可以进入官方的 NVIDIA CUDA 页面并下载必要的安装文件。在写本文的时候,因为 CUDA 10 刚刚发布,我们因此使用了老版本的 CUDA 9.0,你可以从 历史版本页面 下载。如果你是在一个远程服务器上运行,可参照下图,使用终端直接下载安装文件并配置。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_09

3. 安装 cuDNN

cuDNN 是一个针对深度神经网络的 GPU 加速类库。cuDNN 库为神经网络中的标准例程提供了一个高度调优的实现,包括前向和后向卷积、池化层、归一化和激活函数层。深度学习从业者可以完全依靠 cuDNN,它极大地加速了使用 GPU 的深度学习框架。你可以从 官方页面 下载,但首先要注册一个 NVIDIA 帐户。你可以得到一个 cuDNN 的下载链接,然后就可以在远程服务器终端上直接下载。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_10

到这里,我们就完成了所有与 GPU 相关的设置。

4. 安装深度学习框架

现在,我们需要安装和设置基于 Python 的深度学习框架。我们通常使用 Keras 或 Tensorflow 框架,下面的命令可以帮助我们在环境中安装这些框架。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_11

访问你的深度学习云环境

没有人想直接使用服务器的终端编写代码,使用 Jupyter Notebook 进行交互式开发显然是一个更好的选择。为此,我们需要通过本地系统访问云服务器上的 Notebook。当然,我们首先要在远程实例上启动 Jupyter Notebook 服务器。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_12

现在,如果你已经为实例分配了一个公共 IP,并且绑定了公共端口 8888,那你可以直接在本地浏览器上通过地址 http://IP地址:8888 访问云虚拟机中的 Jupyter 服务器!

另一种选择则是使用 SSH 隧道,即在本地实例上启用端口转发,从本地浏览器直接访问云端的 Notebook,这对 AWS 实例尤其有用。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_13

使用端口转发时,转到本地浏览器并输入到一个本地地址,例如,https://localhost:8890,浏览器将会导航到云虚拟机中的 Notebook 服务器。确保地址中使用了 https,否则你将得到一个 SSL 错误。

验证 GPU 支持

最后一步为验证过程,确保我们的深度学习框架正在利用 GPU(通常按小时收费)。以下代码可以帮助我们验证。

几分钟构建自己的深度学习开发环境,我是怎么做到的?_java_14

看来我们的环境已经使用 GPU 进行深度学习了!

搭建本地开发环境建议

很多时候,用户或组织可能并不希望使用云服务,尤其是当他们的数据非常敏感的时候,因此他们需要构建一个基于本地的深度学习环境。这里的重点是选择正确的硬件和软件类型,利用合适的 GPU 来建立深度学习模型,实现资源利用的最大化。关于硬件选择,特别强调以下几点:

  • 处理器:你可以使用一个英特尔的 i5 或 i7 处理器,或者至强系列,如果你不在乎价格的话!

  • 内存:至少使用 32GB 的 DDR4、DDR5 或更好的内存。

  • 磁盘:一个 1TB 的硬盘,而且你可以使用至少 128GB 或 256GB 的固态硬盘来加速数据访问!

  • GPU:深度学习最重要的组成部分。购买一个至少高于 GTX1070 显存 8GB 的 NVIDIA 图形处理单元。

其他需要注意的东西还包括主板、电源供应、坚固的外壳,以及冷却器。一旦组装好机器,我们就可以重复上一节中的所有步骤完成软件配置,然后开始深度学习了!

结   语

本实战指南旨在帮助开发人员、工程师和深度学习从业者能够在几分钟内建立自己的深度学习环境,零基础上手深度学习。不需要花费大量的时间在论坛和 StackOverflow 上阅读相关帖子。现在就让我们开始深度学习之旅吧!