内容


在 IBM Bluemix 上运行 IPython Notebook

Comments

IPython Notebook 是一个基于 Web 用于交互式计算和可再现(reproducible)研究的环境。您可以在 Web 浏览器中编写 notebook 中的代码,然后单击一个按钮就可以运行它,并在浏览器中查看它的输出。

编码和分析之间严格的反馈循环(以及在 notebook 中包含 Markdown 文本、Web 媒体和交互式小部件的能力),使得 IPython 成为了处理数据和新想法的强大工具环境:

IPython Notebook 屏幕截图
IPython Notebook 屏幕截图

Bluemix 使得部署一个 IPython Notebook 实例供立即使用变得非常容易。本文将介绍获得一个正常运行的 notebook 服务器和一些流行的 Python 科学计算包(numpy、Pandas 和 matplotlib)所需的步骤。

此外,我还会设置 notebook 服务器的密码作为一种基本的安全保护方式。最后,我将介绍一些可以(和不可以)对您的 notebook 环境实施的一些想法。

访问示例服务器获取代码

备注:示例服务器配置了一个空密码,可由所有用户访问。不要在实际工作中使用这样设置!

Bluemix 使得部署一个 IPython Notebook 实例供立即使用变得非常容易。

需要做的准备工作

第 1 步. 获取代码

克隆 IBM DevOps Services 上的 parente | ipython-on-bluemix 项目的源代码:

git clone https://hub.jazz.net/git/parente/ipython-on-bluemix

如果计划以后使用该方法(例如向 notebook 环境添加更多科学计算库),那么可以考虑获得一个 DevOps Services 帐户并 fork 该存储库。然后使用命令 git clone https://hub.jazz.net/git/您的 DevOps Services 用户名/ipython-on-bluemix 克隆您 fork 的存储库。

第 2 步. 理解代码

当然,您不需要理解代码也可以运行它。如果只想获得一个正常运行的 notebook,那么可以跳过这一步。

如果查看代码,您就会注意到它没有什么特别的地方。manifest.yml 文件包含有关 Bluemix 如何部署 IPython Notebook 实例的说明。它规定了应用程序名称、要分配的内存量、要设置的主机名等:

---
applications:
- name: ipython
  memory: 1G
  instances: 1
  host: ipython-${random-word}
  domain: mybluemix.net
  path: .
  buildpack: https://github.com/joshuamckenty/heroku-buildpack-python

requirements.txt 文件包含该 buildpack 将安装的库列表。可以在这里添加或删除库:

ipython[notebook]
numpy
pandas
matplotlib

最后,Procfile 告诉 Bluemix 在构建您的应用程序后如何运行它:

web: ipython profile create; echo "c.NotebookApp.password = '$( python -c 'from 
IPython.lib import passwd; import os; print passwd(os.environ.get("PASSWORD", 
""))' )'" >> ~/.ipython/profile_default/ipython_notebook_config.py; 
ipython notebook --port=$VCAP_APP_PORT --ip=$VCAP_APP_HOST --no-mathjax

这是该解决方案最复杂的部分。(它也是最凌乱的部分,因为它必须位于单行中。这里将该行划分为多行只是为了提高可读性。)将它分解开来,该代码:

  1. 创建一个 IPython 用户配置文件。
  2. 生成 PASSWORD 环境变量的一个安全哈希值,并将它插入到配置文件中。
  3. 使用 Bluemix 所提供的端口和主机信息启动 notebook 服务器。

第 3 步. 将应用程序包推送到 Bluemix

使用 cf 命令行工具访问 Bluemix,登录并推送您的 notebook 应用程序包。

在一个本地命令 shell 中,运行以下命令,回复您遇到的任何提示:

cd ipython-on-bluemix
cf api https://api.ng.bluemix.net
cf login
cf push --no-start

第 4 步. 设置一个密码

由于 Bluemix 现在已知道您的应用程序,所有您可以在一个 *nix 或 OS X 操作系统上使用以下命令来为它设置一个密码。该子命令提示您输入一个密码,然后提供该代码供 cf 命令使用:

cf set-env ipython PASSWORD $( echo -n "Password: " && read -s PASSWORD && echo $PASSWORD )

如果您的 shell 不支持 read(例如在 Windows 上),或者您不关心密码是否出现在您的控制台输入历史记录中,那么可以直接给出该密码。在这里,我的密码是 mysecretpassword

cf set-env ipython PASSWORD mysecretpassword

备注:cf 命令可能建议使用 cf push,以确保您的环境变量更改生效。您此时不需要执行推送,因为您尚未启动应用程序。

第 5 步. 部署应用程序

在推送并配置了应用程序环境后,可以使用以下命令部署该应用程序:

cf start ipython

此命令可能会运行一定的时间,因为 Bluemix 要构建和安装 requirements.txt 文件中列出的依赖项。可以运行下面这个命令来监视它的进度:

cf logs --recent ipython

实际上,有时该 buildpack 所花的时间很长,以至于 Bluemix 将它记为一个暂存错误,即使它已成功完成。如果在控制台中收到这样的错误,可以运行 cf logs 命令多次来检查暂存应用程序的过程是否取得进展。如果看到有进展,则继续处理,直到在日志中看到以下行:

Successfully installed ipython numpy pandas matplotlib tornado pyzmq jinja2 
python-dateutil pytz pyparsing nose backports.ssl-match-hostname markupsafe six
       Cleaning up...

然后运行以下命令,让该应用程序正确运行:

cf stop ipython
cf start ipython

可查询 notebook 服务器的状态来确认它在正常运行:

cf app ipython

检查输出,确保应用程序实例处于 running 状态:

Showing health and status for app ipython in org pparent@us.ibm.com / space dev as pparent@us.ibm.com...
OK
requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: ipython-unspecious-subconsul.mybluemix.net
     state     since                    cpu    memory         disk
#0   running   2014-05-28 09:10:09 PM   0.4%   149.1M of 1G   282.5M of 1G

第 6 步. 使用 IPython Notebook

现在您的 IPython Notebook 实例已在正常运行。在浏览器中通过第 5 步中运行的最后一个命令中提及的 URL 来访问它。例如,基于第 5 步末尾的示例输出,可访问 https://ipython-unspecious-subconsul.mybluemix.net。

notebook 服务器提示时,输入您在第 4 步设置的密码。如果跳过该步骤,则密码是空的,只需按下 Enter 即可:

IPython Notebook 登录页面的屏幕截图
IPython Notebook 登录页面的屏幕截图

在仪表板页面上,单击 New notebook 在新浏览器选项卡中打开一个空白 notebook 实例:

一个新 IPython Notebook 的屏幕截图
一个新 IPython Notebook 的屏幕截图

在您的新 notebook 中,将 %matplotlib inline 输入到第一个单元格并单击工具栏中的 Run 按钮。

对以下 3 个代码段执行同样的操作,将每段代码放在自己的单元格中并运行该单元格:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 4*np.pi, 0.05)
y = [np.sin(i) for i in x]

plt.plot(x, y)

最后,您应看到一个简单的正玄波曲线图:

一个 notebook 实例中的正玄波曲线图的屏幕截图
一个 notebook 实例中的正玄波曲线图的屏幕截图

继续探索

第 6 步末尾的简单曲线图只触及到了 IPython Notebook 的强大功能的皮毛。以下是一些可进一步探索的想法:

  • 访问 nbviewer 站点或搜索公共 notebook,以便进一步了解可以在新环境中实现的用途。您可以下载您找到的任何 notebook,然后将它上传到您的 notebook 服务器的仪表板中来使用该 notebook。
  • 安装一些额外的包,比如 scikit-learn(机器学习)、nltk(自然语言处理)和 PyMC(贝叶斯统计建模)。可将它们添加到您的 requirements.txt 中并重新部署。也可通过 bash shell,使用一个代码单元(比如 !pip install scikit-learn)将它们安装到 notebook 界面中,请参阅 “限制和替代方案”,了解此方法的更多信息。
  • 将 Bluemix 服务连接到您的 notebook 实例,以便通过 notebook 以交互方式利用它们的 API。参阅 Bluemix 文档,了解如何向应用程序中添加服务和访问它们各自的 API。
  • 查阅您的 notebook 中的帮助菜单,了解键盘快捷键,以提高您的熟练程度。

限制和替代方案

在本文中,您将一个 IPython Notebook 实例部署到 Bluemix 上。该过程相对简单,但结果具有一定的局限性。

目前,重命名 notebook 的功能还不可用,因为 IPython Notebook 服务器使用的 HTTP 方法未被 Bluemix 路由器处理。

Bluemix 针对托管无状态、高 I/O 水平的 Web 服务器进行了优化,要求应用程序具有这样的行为。例如,Bluemix 会按 manifest.yml 文件中指定的限制来限制应用程序内存空间。如果在使用了比您分配的更多 RAM 的 notebook 中执行计算,Bluemix 可能停止并重新启动该该服务器。如果您的平均 CPU 使用率高于提供商配置的阈值,Bluemix 可能执行相同操作 — 比如如果执行一项 CPU 密集的计算。如果尝试按 “继续探索” 节中介绍的内容,使用 pip 安装额外的包,可能发生其中一种情况。

最后,分配给您的 notebook 服务器的磁盘空间是短暂性的,不会长久保留。

如果计划认真使用 IPython Notebook,那么可以向 IBM SoftLayer 部署一个长期存在的实例来克服这些问题。可以使用 Docker 容器镜像来实现此目的,这不需要构建和安装所有必要的依赖项。请不断关注有关这个主题的未来文章。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing
ArticleID=1000377
ArticleTitle=在 IBM Bluemix 上运行 IPython Notebook
publish-date=03122015