附录 B 在 EC2 GPU实例上运行Jupyter笔记本
本附录是一个分步指南,教你如何在 AWS GPU实例上运行深度学习 Jupyter笔记本,并在浏览器中编辑这些笔记本。如果你的本地计算机上没有 GPU,那么这种设置非常适合深度学习研究。本指南的原始版本(以及最新版本)位于 https://blog.keras.io。
B.1 什么是 Jupyter笔记本,为什么要在 AWS GPU上运行 Jupyter笔记本
Jupyter笔记本(Jupyter notebook)是一款 Web应用,让你可以交互式地编写和注释Python代码。这种方法非常适合做实验、做研究以及分享你目前的工作。
许多深度学习应用都是计算密集型的,在笔记本电脑的 CPU内核上运行可能需要数小时甚至数天的时间。在 GPU上运行可以让训练和推断的速度提高很多倍(从现代 CPU转到单个现代 GPU,通常可以提速 5~10倍)。但你的本地计算机上可能没有 GPU。在 AWS上运行 Jupyter笔记本的体验与在本地计算机上运行完全相同,前者可以让你在 AWS上使用一个或多个 GPU。你只需根据使用时长付费,如果你只是偶尔使用深度学习,那么这种方法比购买自己的 GPU更划算。
B.2 为什么你不想在 AWS上使用 Jupyter进行深度学习
AWS GPU实例的费用可能很快会变得很高。我们建议使用的实例价格是 0.90美元 /小时。如果偶尔使用的话这个价格很合适,但如果你每天都要花几个小时运行实验,那么最好用TITAN X或 GTX 1080 Ti搭建你自己的深度学习计算机。
总之,如果你没有本地 GPU,或者不想安装 Keras依赖(特别是 GPU驱动程序),那么就可以在 EC2上使用 Jupyter。如果你有本地 GPU,我们推荐在本地计算机上运行模型。这种情况请参阅附录 A中的安装指南。
注意你需要一个有效的 AWS账号。熟悉 AWS EC2会对你有所帮助,但并不是必需的。
B.3 设置 AWS GPU实例
以下设置过程需要 5~10分钟的时间。
(1)打开 EC2控制面板( https://console.aws.amazon.com/ec2/v2),点击 Launch Instance(创建实例)链接(见图 B-1)。
图 B-1 EC2控制面板
(2)选择 AWS Marketplace(AWS市场,见图 B-2),并在搜索框中搜索“deep learning”(深度学习)。向下翻页寻找名为 Deep Learning AMI Ubuntu Version的 Amazon系统映像(AMI,见图 B-3),选择它。
(3)选择 p2.xlarge实例(见图 B-4)。这种实例类型允许访问单个 GPU,每小时的使用费用为 0.90美元(2017年 3月的价格)。
图 B-4 p2.xlarge实例
(4)你可以在 Configure Instance(配置实例)、Add Storage(添加存储)、Add Tags(添加标签)这几步均保留默认配置,但在 Configure Security Group(配置安全组)这一步需要自定义配置。创建一个自定义的 TCP规则来允许 8888端口(见图 B-5),这个规则可以只允许你当前的公共 IP访问(比如你笔记本电脑的 IP),如果这种方法不可行,也可以允许任何 IP访问(比如 0.0.0.0/0)。请注意,如果你允许任何 IP访问 8888端口,那么任何人都可以监听你的实例上的那个端口(也就是你运行 IPython笔记本的位置)。你需要为笔记本添加密码保护,防止随便某个陌生人修改数据,但这可能也是相当弱的保护。如果可能的话,你应该考虑限制只允许特定 IP访问。但如果你的 IP地址会不断变化,那么这种做法不切实际。如果你打算允许任何 IP访问,那么记住不要在实例上保留任何敏感数据。
图 B-5 配置一个新的安全组
注意在创建实例过程的最后,系统会询问你想要创建新的连接密钥还是重复使用现有密钥。如果你之前从未用过 EC2,那么就创建新密钥并下载。
(5)想要连接到实例,需要在 EC2控制面板上选择它,点击 Connect(连接)按钮,并按照指示操作(见图 B-6)。注意,启动实例可能要花几分钟的时间。如果一开始无法连接,请稍等一会儿再尝试。
图 B-6 连接指示
(6)通过 SSH登录到实例上之后,你可以在实例的根目录下创建一个 ssl目录,然后 cd打开它(并非强制这么做,但这么做更清楚)。
$ mkdir ssl $ cd ssl
(7)使用 OpenSSL创建一个新的 SSL证书,并在当前ssl目录下创建cert.key和cert.pem文件。
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "cert.key" -out "cert.pem" -batch
配置 Jupyter
使用 Jupyter之前,需要修改其默认配置。具体步骤如下。
(1)生成一个新的 Jupyter配置文件(仍然在远程实例上)。
$ jupyter notebook --generate-config
(2)(可选)可以为笔记本生成 Jupyter密码。你的实例配置可能允许任何 IP访问(取决于你在配置安全组时的选择),所以最好通过密码来限制对 Jupyter的访问。生成密码的方法是,打开一个 IPython shell(ipython命令),并运行下列代码。
from IP ython.lib import passwd passwd() exit
(3) passwd()命令会要求你输入并确认密码。完成之后,它会显示密码的散列值。复制这个散列值,你很快会用到它。散列值看起来像是这样的。
sha1:b592a9cf2ec6:b99edb2fd3d0727e336185a0b0eab561aa533a43
注意,这是单词 password的散列值,不应该用这个单词作为密码。
(4)使用 vi(或你最喜欢的文本编辑器)编辑 Jupyter配置文件。
$ vi ~/.jupyter/jupyter_notebook_config.py
(5)配置文件是一个 Python文件,所有内容都被注释掉了。将下列 Python代码插入到文件开头。
注意如果你不习惯用 vi,那么要记住,需要按i才能开始插入内容。完成之后,按 Esc并输入:wq,再按 Enter,就可以退出 vi并保存修改[:wq表示 write-quit(写入并退出)]。
B.4 安装 Keras
很快就可以开始使用 Jupyter了,但首先需要更新 Keras。AMI上预装了 Keras,但未必是最新版本。在远程实例上运行这个命令:
$ sudo pip install keras --upgrade
你可能用的是 Python 3(本书提供的笔记本用的都是 Python 3),所以还应该使用pip3更新 Keras。
$ sudo pip3 install keras --upgrade
如果实例上已经有了一个 Keras配置文件(应该是没有,但在我写完本节之后, AMI可能发生变化),为了以防万一,应该删除它。Keras将在第一次启动时重新创建一个标准的配置文件。
如果下列代码片段返回一个错误,提示你文件并不存在,那么忽略它即可。
$ rm -f ~/.keras/keras.json
B.5 设置本地端口转发
在本地计算机(不是远程实例)的 shell中,将本地 443端口(HTTPS端口)转发到远程实例的 8888端口。
$ sudo ssh -i awsKeys.pem -L local_port:local_machine:remote_port remote_machine
对我而言,这个命令如下所示。
$ sudo ssh -i awsKeys.pem -L 443:127.0.0.1:8888 ubuntu@ec2-54-147-126-214. compute-1.amazonaws.com
B.6 在本地浏览器中使用 Jupyter
在远程实例上,将包含与本书相关的 Jupyter笔记本的 GitHub仓库克隆下来。
$ git clone https://github.com/fchollet/deep-learning-with-python-notebooks.git $ cd deep-learning-with-python-notebooks
运行下列命令来启动 Jupyter笔记本,此时仍然在远程实例上。
$ jupyter notebook
然后,在本地浏览器中,打开你转发到远程笔记本进程的本地地址( https://127.0.0.1)。一定要在地址中使用 HTTPS,否则会提示 SSL错误。
你应该会看到如图 B-7所示的安全警告。出现这个警告是因为你生成的 SSL证书没有经过可信任权威机构的验证(很显然,这个证书是你自己生成的)。点击 Advanced,然后继续。
图 B-7 安全警告,可以忽略
系统应该会提示你输入 Jupyter密码,然后你就可以进入 Jupyter仪表板了(见图 B-8)。
图 B-8 Jupyter仪表板
选择 New > Notebook开始创建一个新笔记本(见图 B-9)。你还可以选择 Python版本。一切搞定!
图 B-9 创建一个新笔记本