本文将指导你逐步在 AWS GPU 实例上运行深度学习 Jupyter notebook,并可在你的浏览器中从任何地方对其编辑。如果你的本地机器上没有 GPU,这将会是一个研究深度学习的理想设置。
一、什么是 Jupyter noterbook?为什么要在 AWS GPU 上运行 Jupyter notebook?
Jupyter notebook 是一个网页应用程序,允许你以交互的方式编写并注释 Python 代码。这是一种做试验,做研究,并分享工作内容的有效方法。了解什么是 notebook 请点击这里(链接:http://suo.im/4Em4IR)。
许多深度学习应用的计算非常密集,且在笔记本的 CPU 内核上运行通常需要耗费几个小时甚至是几天。如果把一个现代的 CPU 换成 GPU,训练和推理的速度可提升 5 到 10 倍。但是,你可能无法在本地计算机上安装 GPU。在 AWS 运行 Jupyter notebook 可以给你在本地计算机上运行时的相同体验,同时允许你利用 AWS 上的一个或多个 GPU。如果你只是偶尔使用深度学习,相比投资专有的 GPU,Jupyter notebook 更为有利,你只需支付所用的东西。
二、为什么我不想在 AWS 上使用 Jupyter 进行深度学习?
AWS GPU 实例的价格可以迅速变贵。我们建议的使用价格是每小时 0.9 美元。这个价格偶尔使用还可以接受,但是如果你每天都要进行几个小时的实验,那么你***搭建配备 Titan X 或者 GTX 1080 Ti 的专属深度学习机。
1. 开始之前注意:
- 你需要一个激活的 AWS 账户
- 如果你对 AWS EC2 有所了解会有帮助,但并不必须
搭建需要花费 5 到 10 分钟的时间。
2. 分步指南
(1) 导航至 EC2 控制面板,并点击「启动实例」链接。
(2) 选择官方 AWS 深度学习 Ubuntu AMI
选择「AWS 市场」并在搜索框中搜索「深度学习」。
向下滚动,直到找到名为「深度学习 AMI Ubuntu 版本」的 AMI(如下图),并选择它。
(3) 选择 p2.xlarge 实例
该实例类型提供对单个 GPU 的访问,并且每小时的使用成本为 0.9 美元(截至 2017 年 3 月)。点击「配置实例细节」:
(4) 配置实例细节
你可以为「配置实例」、「添加存储」和 「添加标签」等步骤保留默认设置。但是我们将自定义步骤「配置安全组」。
创建一个自定义 TCP 规则以允许 8888 端口。
在你当前的公共 IP(例如你的笔记本电脑的 IP),或者在前者不可能的情况下,对于任意 IP,该规则都被允许。请注意,如果你允许任意 IP 均可接入端口 8888,则理论上任何人都可以收听你的实例上的那个端口(这是我们将运行 IPython notebook 的地方)。我们将为笔记本电脑添加密码保护,以便降低任意人员都可以对其进行修改的风险,但这也许是较弱的保护。如果可能的话,你应该考虑限制特定 IP 的访问。但是,如果你的 IP 地址不断更改,这不太实际。如果你打算对任意 IP 开放接入端,请记住不要在实例上留下任何敏感数据。
在启动过程结束时,系统将会询问你是否要创建新的连接密钥,或者是否重复使用现有的密钥。如果你之前从未使用过 EC2, 只需创建新的密钥并下载即可。
(5) 启动你的实例并连接到它
为了连接实例,在 EC2 控制面板上选择并点击「连接」按钮,遵循提供的说明,例如:
注意,实例完全启动之前可能需要几分钟。如果开始时不能连接,请等待并重试。
(6) 设置 SSL 证书
通过 ssh 登录实例后,在实例的根目录下创建一个 ssl 目录,然后对其进行 cd(并非必要,但更干净)。
- mkdir ssl
- cd ssl
使用 OPenSSL 创建新的 SSL 证书:
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "cert.key" -out "cert.pem" -batch
完成后,你已在当前的 sll 目录中创建了两个文件:cert.key 和 cert.pem.
(7) 配置 Jupyter
在我们开始使用 Jupyte 之前,我们需要调整其默认配置。首先,我需要生成一个新的 Jupyter 配置文件(仍然在远程实例上):
- jupyter notebook --generate-config
或者,你可以为自己的 notebook 生成 Jupyter 密码。由于你的实例配置可能为从任何 Ip 访问(取决于你在配置安全组时所做的选择),***通过密码限制对 Jupyter 的访问。要生成密码,请打开 IPython shell(ipython 命令)并运行:
- from IPython.lib import
- passwdpasswd()
- exit
passwd() 命令将要求你输入并验证密码,完成后将显示密码哈希(hash)。复制哈希,我们稍后会用到。它看起来像:「sha1:b592a9cf2ec6:b99edb2fd3d0727e336185a0b0eab561aa533a43」(这是「密码」哈希,并非是你应该使用的密码)。
接下来,使用 Vi(或者用你最喜欢的可用文本编辑器)编辑配置文件:
- vi ~/.jupyter/jupyter_notebook_config.py
这是一个 Python 文件,其中所有的行都被注释掉。
你需要插入以下 Python 代码行(比如,在文件的开头)
- c = get_config() # get the config object
- c.NotebookApp.certfile = u'/home/ubuntu/ssl/cert.pem' # path to the certificate we generated
- c.NotebookApp.keyfile = u'/home/ubuntu/ssl/cert.key' # path to the certificate key we generated
- c.IPKernelApp.pylab = 'inline' # in-line figure when using Matplotlib
- c.NotebookApp.ip = '*' # serve the notebooks locally
- c.NotebookApp.open_browser = False # do not open a browser window by default when using notebooks
- c.NotebookApp.password = 'sha1:b592a9cf2ec6:b99edb2fd3d0727e336185a0b0eab561aa533a43' # this is the password hash that we generated earlier.
如果,你以前没有使用过 Vi,请记住,你需要按 i 开始插入内容;完成后,你可以点击 esc 然后是 :wq 最终 enter 退出 Vi,同时保存更改(:wq 代表写入-退出)
(8) 更新 Keras
你马上可以开始使用 Jupyte 了。但首先,通过运行(仍然在远程实例上)以确保 Keras 是***的:
- sudo pip install keras --upgrade --no-deps
你所使用的 AMI 由亚马逊负责日常更新,但其可能没有使用每个包的***版本。
(9) 设置本地端口转发
在本地机器上的一个 Shell(不是远程实例中)中,开始将你的本地端口 443(HTTPS 端口)转发到远程实例的端口 8888。这是通过句法(syntax)完成的:
- 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
(10) 从你的本地浏览器中开始使用 Jupyter
首先,在远程实例中,创建保存你的 notebook 的文件夹:
- mkdir notebooks
- cd notebooks
在远程实例上,通过在你创建的文件夹中运行此命令来启动 Jupyter Notebook:
- ipython notebook
然后,在本地浏览器中,导航至我们发送到远程 notebook 进程的本地地址 https://127.0.0.1。确保你在地址中使用 HTTPS,否则你将收到 SSL 错误。
你将看到一个安全警告:
该警告只是因为我们生成的 SSL 证书没有被任何受权威机构验证(显然,我们刚刚生成了我们自己的证书)。点击「advanced」,继续浏览,这很安全。
然后系统会提示你输入 Jupyter 密码。然后,你会进入 Jupyter 控制面板。
点击「新建 - >Notebook」开始。你可以使用你选择的 Python 版本。
好了!
原文:
https://blog.keras.io/running-jupyter-notebooks-on-gpu-on-aws-a-starter-guide.html
【本文是51CTO专栏机构机器之心的原创译文,微信公众号“机器之心( id: almosthuman2014)”】