Jupyter事始め

  • 246
    いいね
  • 2
    コメント

はじめに

Jupyter初心者なので、AWS EC2上の環境構築方法、簡単な使い方を半年後の自分用にチラシの裏しておきます。

細かい設定はさておき、手っ取り早くEC2上にJupyter環境を構築し、Jupyter上で簡単なPython scriptを動かして、JupyterのUI操作方法の初歩を覚える所までを目標とします。Linux戦闘力が低いので、極力コピペで手順がなぞれる様に心がけます。

なお、Amazon EMRを使ってSpark Cluster上にJupyterを作りたい場合にはこちらを参照下さい。また、Jupyter Notebookは次期VersionよりJuypter Labとなり大きくUI/機能が変わる予定です。Jupyter Labの環境構築方法はこちらを参照下さい

Jupyter環境構築

まずは、Jupyter環境を構築する手順です。

EC2の作成

Jupyterを動かすEC2を起動して、sshでloginします。

  • Ubuntu 14.04を前提 (Amazon Linuxを使う場合には、aptをyum等に置き換えて下さい)
  • EC2はm4.largeぐらいは合った方が良い
  • EC2のSecurity GroupでPort 8080を開けておく

必要なmoduleのinstall

atp-getで必要なmoduleを入れて、pipをupdateして、ipython[notebook]をinstallします。

$ sudo apt-get update && sudo apt-get -y upgrade
$ sudo apt-get install -y python-pip libpq-dev python-dev
$ sudo pip install -U pip
$ sudo pip install ipython[notebook]

MatplotlibでChartを書きたい場合には、更に追加でnumpyやmatplotlibなどの必要なmoduleを入れます(が、installに数分かかります)。

$ sudo apt-get install -y libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev
$ sudo pip install numpy pandas matplotlib seaborn scikit-learn

Passwordの為のhash key作成

JupyterでLogin passwordを設定したい場合には、Passwordのhash文字列を事前に調べておく必要が有ります。以下のコマンドを実行するとPasswordを入れるPromptがでるので、設定したいPasswordを入力します。

$ python -c "import IPython;print(IPython.lib.passwd())"

するとsha1:3be1549bb425:1500071094720b33gf8f0feg474931dc5e43dfedの様なsha1:で始まるhash文字列を返してくれるのでCopyしておきます。

Jupyterの設定

以下のコマンドを実行すると、Jupyterの設定ファイルの雛形(~/.jupyter/jupyter_notebook_config.py)を作成してくれます。

$ jupyter notebook --generate-config

続いて、~/.jupyter/jupyter_notebook_config.pyを編集します。全てComment outされたデカイfileなので、fileの先頭など好きな場所に以下5行を入れて保存します。c.NotebookApp.passwordの後のhash文字列は、上で事前に調べたhash文字列に置き換えて下さい(Login passwordを設定しない場合はこの行は無しでOK)。

c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.password = u'sha1:3be1549bb425:1500071094720b33gf8f0feg474931dc5e43dfed'

Jupyterの起動

以下のコマンドを実行すると、Jupyterが起動します。

$ jupyter notebook

Browser上でec2-53-239-93-85.ap-northeast-1.compute.amazonaws.com:8080など、EC2にアクセスに行きます。portの8080をお忘れ無く。 Jupyterのlogin画面が出て、上のほうで設定したpasswordを入力してloginが出来たら成功です。Background実行させたければ、nohup jupyter notebook > /dev/null 2>&1 &としておくと、sshを切断してもJupyterが動き続けます。

Jupyterの自動起動の設定

start_jupyter.shというscriptを作成し、それを/etc/rc.localに登録して、EC2起動時に、BackgroundでJupyterが実行される様に設定します。

  • touch ~/start_jupyter.sh
  • start_jupyter.shを編集し、中に/usr/local/bin/jupyter notebook、と書いておく
  • chmod 777 ~/start_jupyter.sh
  • root権限で/etc/rc.localを編集し、su - ubuntu /home/ubuntu/start_jupyter.sh &の1行をexit 0の前に入れる
  • root権限でshutdown -r nowでEC2を再起動させる
  • Browserから、EC2にアクセスに行き、jupyterのlogin画面が出たら成功です

Jupyterの使い方

超簡単ですが、Jupyterの使い方をチラ裏します。

Jupyter notebookを作成する

Loginしたら、NewからPython2を選択し、Python2のnotebookを作成します。

Setting1.png

各種iconについて

Jupyterは、Cellという箱(?)の中に、Codeや説明(Markdown)を記載していき、順次実行させる事で動かします。各種iconの機能は以下の通り

  • +アイコンがCellの追加(Insert > Insert Cell AboveInsert Cell BelowでもCell追加可能)
  • はさみアイコンがCellの削除
  • 上下の矢印アイコンがFocusが当たっているCellの位置の上下移動
  • Pulldownで追加するCellの種類の選択
    • Codeは、PythonなどのCodeの入力時に選択
    • Markdownは、Markdown言語を使い(Codeや処理結果への)説明をつける時に選択。Mathjaxを使い数式の表記も可能
    • Raw NBConvertは、Latexで数式を入力する時に選択
    • Headingは、Markdownと似た用途らしい(将来的にはなくなる予定)

Setting2.png

Python code入力してみる

以下のPython codeをCellに入力してみます。現在の時刻を1秒おきに10回printするだけのcodeです。

import datetime, time

def main():
  for count in range(0, 10):
    print_current_time()
    time.sleep(1)

def print_current_time():
  print datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')

if __name__ == '__main__':
  main()

以下の様に4つのCodeのCellに、上記Python codeを入力してみて下さい。

  • 入力が終わったら、Cell > Run All を実行すると、実行されます
  • Cellの処理の順番がぐちゃぐちゃになったら、Kernel > RestartClear all outputs & restartを選択後、再度Cell > Run All を実行すると上から順番に処理されます

Setting3.png

コメントを入力してみる

以下の様にMarkdownのCellを追加して、中にMarkdownでコメントを入力してみて下さい。Cell > Run All を実行すると、MarkdownはRenderingされた状態で上から順番に処理されます。

Setting5.png

Chartを作成してみる

必要なmoduleのinstallでmatplotlibをinstallしている場合には、以下のCodeでmatplotlibを使ってChartの作成/表示が可能です。

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randint(0, 100, 10000)
plt.hist(x, bins=20)
plt.plot()

np.random.randint(0, 100, 10000)で、0-100の範囲の乱数intを10,000個作り、その乱数の分布を柱の数を20個のヒストグラムとして表示します。%matplotlib inlineはmatplotlibの出力ChartをJupyter上に表示させる為のオマジナイで、そのNotebook上のどこかで1回宣言されていればOKです。

Jupyterを実行させて、以下のようなChartが出ればOKです。

matplotlib.png

数式を入力してみる

Jupyter上で数式を表現する方法は幾つかあります。

  • Raw NBConvertのCell上でLatexで記載する
  • MarkdownのCell上でMathjaxで記載する

ここでは、Markdown上でMathjaxを使って記載してみます。

$$r=\frac{1}{f}$$
$$\left(x + y\right)^{5}$$

Markdown Cellに上記を入力しそのCellを実行させ、以下の様にRenderingされればOKです。

mathinput.jpg

Jupyter上でMathjaxを使った数式のサンプルはこの記事や、この記事にあります。また、Mathjaxの文法はこの記事(英語)が纏まって居ます

notebookを保存してみる

file > renameで、作成したnotebookに名前を付け、file > Download as*.ipynb形式で保存が可能です。

その他Jupyter機能

Jupyter上でshell scriptの実行

使っていてShell commandを実行したい、というケースはちょいちょいあります。Pythonのlibraryを追加したい、や、wgetで別のserverからfileを持ってきたい、など。

Master nodeにsshで入ってScriptを実行しても良いのですが、以下のいずれかの方法で、Jupyter上で直接shell scriptの実行も可能です。Jupyterを起動したuser権限でScriptが実行されます。

commandsを使う

commandsというpython libraryは、python上でshell scriptを実行してくれます。

import commands
commands.getoutput("date")
commands.getoutput("curl yahoo.co.jp")
Jupyterの!を使う

Jupyter固有の機能として、!の後にshell scriptを書くと実行してくれます。

!date
!curl yahoo.co.jp

以下の様にsudoしてshell scriptの実行も可能ですが、script実行後にJupyterがずっと処理中になるので、Interrupt等で復旧させる必要が有ります。

!sudo su
!find / -name 'hoge.txt'

Jupyter notebook extensions

Jupyter/IPythonのextensionと言うのが、(Jupyterの本家開発teamとは別で)開発されています。どんな機能があるかは、こちらの記事がとても良く纏まって居ます。

ExtensionのInstall方法は、上記のjupyterの設定~/.jupyter/jupyter_notebook_config.pyを編集後、jupyter notebookでJupyterを起動させる前に、以下の2行を実行させればOKです。

mkdir -p ~/.local/share/jupyter
sudo pip install https://github.com/ipython-contrib/IPython-notebook-extensions/archive/master.zip

白状するとExtensionは自分は正直使っていません...。ExecuteTimeは便利ですが。

Jupyter Magic Commands

Jupyter/IPythonには、Magic Commandsという専用機能があります。ipython magic commandでググるといろいろ出てきますが、以下の様な物が有名です。

  • %whoで、宣言されている変数一覧の表示
  • %whosで、宣言されている変数一覧の詳細表示(型と値)
  • %%timeitで、Cellの処理に要した時間の計測
  • object名+?で、Objectの型と値の表示
  • %quickrefで、サポートされるMagic Commandの一覧の表示

Cellに%whosと入力した状態でそのCellを実行すると、Magic commandが実行されます。が、白状するとMagic Commandは自分は正直使っていません...。%whosは便利なのでたまに使いますが。

最後に

良いJupyter生活を!