选自towardsdatascience
作者:Dipanjan (DJ) Sarkar
机器之心编译
参与:李诗萌、Chita
深度学习好处多多,但构建起来却有些令人痛苦。为此,本文提供了一份详尽的教程来教你快速构建自己的深度学习环境。不仅教你利用现有资源快速搭建深度学习模型,还一步步列出了如何通过云平台搭建自己的深度学习环境。
引言
多亏了更快更好的计算,我们终于能利用神经网络和深度学习真正的力量了,这都得益于更快更好的 CPU 和 GPU。无论我们喜不喜欢,传统的统计学和机器学习模型在处理高维的、非结构化数据、更复杂和大量数据的问题上存在很大的局限性。
深度学习的好处在于,在构建解决方案时,我们有更好的计算力、更多数据和各种易于使用的开源框架,比如 keras、TensorFlow 以及 PyTorch。
深度学习的坏处是什么呢?从头开始构建你自己的深度学习环境是很痛苦的事,尤其是当你迫不及待要开始写代码和实现自己的深度学习模型的时候。
这个痛苦的过程我经历了好几次,也在这个过程中发现了更易于使用的服务,本文旨在教你改进自己设置的深度学习模型中不那么令人满意的部分,以便你可以更快更好地建立自己的深度学习模型并解决问题。本文涵盖了以下几个方面:
配置基于云的深度学习环境
如果你不想用专用硬件搭建深度学习模型,或者你想跳过那些烦人的配置和设置命令,这里有一些选择!使用预配置的基于云的深度学习环境是最好的选择。通常,有一些常用的基于云端的深度学习服务器供应商。下面的几个只需要很少的设置和配置,就可以让你马上开始工作。不过,这个列表并不全面,基本都是我用过或者从别人那听过的:
Google Colaboratory
也许谷歌是最好的选择之一,而且它(仍然)免费,它可以让你在 GPU 甚至是 TPU 支持的深度学习环境中运行交互式 Jupyter notebook。谷歌一直在积极使用和推广它在各个领域的应用,包括其极受欢迎的机器学习速成课程(Machine learning Crash Course)。简言之,Colaboratory 是免费的 Jupyter notebook 环境,它不需要任何设置,甚至能够让你免费用 GPU 运行深度学习模型。
现在,对于工作负载和数据量较小的相对简单的模型来说,使用 CPU 就可以了,但在解决更复杂的问题时你肯定需要使用 GPU。在 Google Colab 中改变运行时来使用 GPU 只需要几秒,如下图所示:
然后 Google Colab 会给你分配一个新的GPU用于深度学习,你可以通过以下代码查看 GPU 类型:
你可以免费使用有 12 GB 内存的 Tesla K80 GPU了!同样的配置,AWS 的 p2.xlarge 每小时收费 0.9 美元。太棒了!
这应该可以帮你在 Google Colab 上尝试运行自己的深度学习模型。你在用 Colab 时,可以随意用我的 colab notebook来测试CPU 和 GPU支持的深度学习环境。
Paperspace Gradient°
Gradient° 是 Paperspace 的产品,该公司重点关注的是机器学习和数据科学的基础设施。它为开发人员提供了一套用于在 GPU 上探索数据、训练深度学习模型以及运行计算工作的完整工具。Gradient° 包括1-click jupyter notebook,该notebook支持 Paperspace GPU 云端所有功能。
如果你用 GPU 的话确实需要按小时付费,但其价格与其他服务器供应商相比极具竞争力——Quadro P4000 每小时收费 0.5$,Tesla K80 每小时收费 0.59$。而这些和 AWS 的同类产品相比也更便宜一些。
FloydHub Workspace
FloydHub 有一个有趣的产品——FloydHub Workspace,它为基于云端的深度学习提供了完全配置的开发环境。优势?虽然它不是免费的,但你可以从 CPU 后端无缝切换到 GPU 后端,而且你可以根据所使用的处理器按秒付费。
他们的价格也很值得考虑。12 GB 内存、61 GB RAM 和 200 GB SSD 的 Tesla K80,使用 10 小时的费用为 12$,这是最便宜的选择。
Lambda GPU Cloud
Lambda Labs(Lambda) 是一家 AI 基础设施公司,他们提供了可以加速人类进步的计算力。他们关注的重点是深度学习工作站,最近推出了 Lambda GPU Cloud,但它尚处于封闭测试阶段。每个 Lambda GPU Cloud 都有 4 个 GPU,比 AWS 的 p2.8xlarge 快 2 倍。他们声称,你只需要简单地按一下按钮,就可以立即通过 SSH 远程访问该云GPU。每个 GPU 每小时收费 0.9$。
AWS Deep Learning AMIS
AMS(Amazon Web Services)是亚马逊的子公司,他们根据用户需要提供付费订阅的云计算平台。近期,他们推出了深度学习 AMI(Amazon Machine Images),专门用于构建深度学习模型的GPU 密集型工作负载。AWS Deep Learning AMI 给我们提供了必要的基础架构和预配置的工具与框架,可以大规模加速云端的深度学习。它预先配置了所有最新和最好的深度学习框架。
如果选择用 AWS 那你要谨慎一点,因为它是按小时收费的。最便宜的选择是 p2.xlarge,它提供了 12 GB 的GPU,每小时收费为 0.9$。
GCP Deep Learning VM Images
GCP(Google Cloud Platform)提供了一整套云计算服务,包括运行深度学习模型和工作负载的基础设施。最棒的是,它是在谷歌内部用于终端用户产品的相同基础设施上运行的。你注册的话,GCP会在第一年给你提供价值 300$ 的免费积分,这简直太酷了!
Google Cloud Deep Learning VM Images 可以让开发人员在谷歌计算引擎(Google Compute Engine)上实例化包含流行深度学习和机器学习框架的 VM 图像。你可以使用预先安装了流行 ML 框架(如 TensorFlow、PyTorch 或 scikit-learn 等)的计算引擎。最棒的是,你可以一键添加云端 TPU 和 GPU 支持。和 AWS 相比,它的价格也非常有竞争优势。用 GCP VM 的话,每小时仅需 0.45$就可以使用 12 GB 的 Tesla K80 GPU。
上述内容可以让你充分了解潜在选项,以最少的配置和设置开启深度学习之旅。
建立基于云端的深度学习环境
尽管在云端预配置的设置很好用,但有时候你可能会想构建自定义的基于云端或者是本地的深度学习环境。在本节中,我们将研究该如何通过常用的云平台服务供应商在云端搭建自己的深度学习环境。主要包括以下几步:
现在我们来介绍如何设置基于云的深度学习环境。
选择云供应商
现在有很多配置不错且价格低廉的云供应商。我们可以利用 PaaS(Platform as a Service,平台即服务)能力,做一些管理数据、应用程序以及基本配置的工作,还可以用 GPU 计算来进行深度学习。常用的供应商包括亚马逊的 AWS、微软的 Azure 和谷歌的 GCP。
创建虚拟服务器
选择云服务供应商之后,就要创建自己的虚拟机了,它基本上就是托管代码、数据以及配置设置的服务器。创建虚拟机的步骤取决于你所选择的云供应商。
在我写的《Hands-on Transfer Learning with Python》第二章中详细介绍了如何在 AWS 上创建和实例化自己的虚拟机。完整的代码库是开源的,如果你感兴趣的话,可以在 GitHub 库中查看更多细节:https://github.com/dipanjanS/hands-on-transfer-learning-with-python。
配置虚拟服务器
创建虚拟机后,你就可以在云供应商的平台上启动实例了。在 AWS 上一般是 EC2 用户界面,在 GCP 中一般是虚拟机的页面。现在你需要个人秘钥才能从本地终端使用 SSH 登录服务器。一般而言,AWS 在创建虚拟机的最后一步才让你设置密码,并给你提供可下载的个人秘钥。GCP 允许你用 SSH 通过 GCP 页面直接登录系统。如果需要的话,你可以根据这篇指南创建SSH 密码:https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys。
将你的 SSH 密码保存在安全的地方,用下列命令从终端登录服务器:
恭喜!你现在已经成功登入了自己的深度学习服务器。以下是关于深度学习设置方面的内容,前提是你在用 Linux 服务器。我们的 Linux 发行版是 Ubuntu 18.10。你可以根据自己的喜好自由选择操作系统。
由于我们在原型设计和开发时广泛地使用了 Jupyter notebook,因此要为笔记本服务器设置密码,这样即便有人以某种方式得到了你的公共 IP 地址,他也无法使用你的 Jupyter notebook。如果你不想设置密码,你可以先跳过本节中密码设置的步骤。这里首先要用 Open SSL 创建新的 SSL 证书。
如果系统中没有安装 Python,我们建议你使用 Anaconda 发行版,它的package管理系统很强大,而且还有一整套预安装的库。我们建议按照官方指南安装 Anaconda 的 Python 发行版:https://docs.anaconda.com/anaconda/install/linux/。
为了防止配置文件不存在,要为 Jupyter notebook 服务器生成配置文件。一般而言,文件在你的主目录中:~/.jupyter/jupyter_notebook_config.py,如果该文件不存在,你可以用下列命令创建一个:
为了确保笔记本基于密码的安全性,我们首先要生成密码及其哈希码。可以在 Ipython.lib 中用 passwd() 函数实现,如下所示:
输入密码并验证后,函数会返回一个哈希值,这是你密码的哈希值(本例中,我输入的密码实际上就是单词「password」,你绝对不要用!)。将这个哈希值复制并保存下来,我们很快就会用到。接下来,启动你常用的文本编辑器来编辑 Jupyter 的配置文件,如下图所示:
我们现在准备设置自己的深度学习环境了。
设置深度学习环境
我们现在要开始设置深度学习环境所需的必要配置,以便开始使用 GPU。如果你的实例中已经配置了 CUDA 和 cuDNN,可以根据需要跳过下面的步骤。
1. 安装图形驱动
首先要确定你已经为 GPU 安装了图形驱动。假设你用的是英伟达的 GPU。测试你是否安装了驱动的最好方法是在终端运行 nvidia-smi 命令。如果命令不起作用,我们就要安装 GPU 驱动。
2. 安装 CUDA
NVIDIA® CUDA® Toolkit 基本上就是一个创建能最大程度利用英伟达 GPU 的应用和程序的开发环境。GPU 加速的 CUDA 库支持跨多个域的嵌入式加速,包括线性代数、图像和视频处理、深度学习以及图形分析。假设我们用的是基于 Ubuntu 的系统,你可以查阅英伟达 CUDA 的官方文档并下载必要的安装文件。在撰写本文时,CUDA 10 已经发布了,但是它还太新。因此我们用的是旧版的 CUDA 9.0,你可以从历史版本的发布页面获取该版本。如果你在服务器上,最好用终端直接下载安装文件,并用下面的命令配置 CUDA:
3. 安装 cuDNN
英伟达 CUDA® 深度神经网络库(cuDNN)是用于深度神经网络GPU 加速的原语库。cuDNN 库为神经网络中的标准例程提供了高度优化的实现,包括正向和反向卷积、池化、归一化和激活层。深度学习从业者可以依赖 cuDNN 加速在 GPU 上广泛使用的深度学习框架。你可以从官方网站下载 cuDNN,但你先要注册一个英伟达的账号。之后你会得到下载 cuDNN 的链接,然后你可以在服务器上通过这个链接直接在终端上下载:
一般而言,这能解决 GPU 设置所需的大部分依赖。
4. 安装深度学习框架
如果还没有安装深度学习框架,我们可以安装和设置 Python 深度学习框架。我们用得比较多的是 keras 和 tensorflow,下面的命令可以帮助我们在自己的深度学习环境上安装它们:
访问深度学习云端环境
我们并不想一直在服务器的终端上写代码。因此我们想用 Jupyter Notebook 进行交互式开发,所以我们要通过本地系统访问在云服务器上的 Notebook。首先,要启动远程实例上的 Jupyter Notebook:
现在,如果你给实例分配了公共 IP,而且公开了 8888 端口,你可以直接输入 http://:8888,然后就可以通过本地浏览器访问在云端虚拟机中的 Jupyter 服务器了!
还有另一个选择,尤其是对 AWS 实例来说,那就是在本地实例上用端口转发,通过本地机器的浏览器来访问云端服务器的笔记本。这也称为 SSH 隧道(tunneling)。
如果用的是端口转发,转到本地浏览器并导航到本地主机地址,例如 https://localhost:8890,我们将转到虚拟服务器的远程笔记本服务器。确保地址中用的是 https,否则会触发 SSL 错误。
验证 GPU 的使用
最后一步是确保一切都在正常运行,确保我们的深度学习框架在使用 GPU(我们是按小时付费的!)。下面的代码可以帮助我们验证这一点。
本地部署的安装提示
有些用户或组织可能不想用云端服务,特别是在他们的数据比较敏感的情况下,因此他们关注更多的是搭建本地部署的深度学习环境。这里主要介绍如何投资适当的硬件和软件,以实现性能最大化,并利用合适的 GPU 搭建深度学习模型。关于硬件,特别需要注意的是:
当然,其他元件你也不应该忽视,包括主板、电源、坚固的外壳以及冷却器等。配好硬件设施后,对于软件配置,你可以重复上面的所有步骤,除了云端设置。现在,你应该可以开始了!
总结
本文旨在帮助开发人员、工程师以及深度学习从业者从零开始快速部署深度学习环境。希望本文可以帮你节省精力,不必绞尽脑汁花数小时阅读论坛和 Stack Overflow中无数关于设置深度学习环境的文章,就能建立自己的深度学习环境。现在走出去,开始「深度学习」吧!