CLI好きのためのJupyter notebook環境

Shun Kinoshita
Black304
Published in
11 min readJan 28, 2019

Jupyter notebookはとても便利な一方,どうしてもWeb UIを経由して操作する必要があります.標準のUIは使いやすいですが,使っていくと,Editorのカラースキームやキーバインディングなどが自由にできなかったりと微妙な不満が出てきます.

本記事では,黒い画面が好きな人向けの,Jupyter環境を整備する手順と,その構築に必要なプラグインをご紹介します.

あらまし

Jupyter〜〜〜??そんなんIPythonにWebインターフェースつけただけやろ〜〜〜???と思ってなんとなく抵抗感を感じているいる人も多いと思います.しかし一度使ってみると非常に便利で,特に画像的な出力を連発しながらデータを探索的に解析していくとき非常に大きな力を発揮します.Matplotlibとかgnuplotとかを駆使して,出力された画像をいちいちダウンロードして確認するのは骨が折れますよね…..

しかし,使っていくと自分が慣れ親しんだツールたちが恋しくなります.shell, git, vim, emacsなど,WebのGUIに依存した操作ではなく正確に処理を実行できるツールたち….Jupyterを利用するためにこれまでコードを書いていたときに使っていたツールを全て封印しなくてはいけないことはかなり大きなデメリットとなります.

そこで今回は,これら我々が大好きなツールとJupyterを上手に共存させるツールをご紹介していきます!Jupyterをデプロイする方法は特に言及しませんが,Dockerで立てると便利なのでおすすめです.

AtomからJupyter kernelへ接続 【Hydrogen】

Atomはvimでもemacsでもありませんが,プラグインやキーバインディングの自由度により,自分好みにカスタマイズすることで驚くほど幅広いプロジェクトに利用することができます.Editorとして十分優秀なAtomですが,強みである多くのプラグインを利用することでその能力を更に増強することができます.

今回,なるべくキーボードのみを利用してJupyterを利用するため,Atomから,Jupyter kernelへ接続するプラグインである,Hydrogenを利用します. Hydrogenを用いれば,Jupyter notebookの持つWeb UIを経由せずとも,Jupyter kernelに処理を投げ,プログラムを実行することが可能となります.

HydrogenをAtomに導入するには,PackageのページからInstallボタンをクリックしてインストールします.基本的な使用方法は公式のドキュメントを参照していただくとして,本記事では自分が最も利用している機能である,遠隔のマシンで動いているJupyter kernelに接続して利用する方法を紹介します.このように遠隔のマシンでKernelを動かすことで,サーバやクラウドなど潤沢な計算リソースがあるマシンにて処理させることができるため便利です.

Remote kernelに接続してJupyterを利用するために,接続するkernelを設定します. Ctrl+,で開く設定画面からHydrogenの設定を確認し,Kernel Gatewaysの欄に以下のような設定を書きます.

[{
"name": "hogehuga",
"options": {
"baseUrl": "http:///hoge.example.com:8080",
"token": "your login token"
}
}]

設定画面は以下のようになります.

Kernel Gatewayの設定

この設定をしたらもう簡単で,実行したいpythonのファイルをAtomで開いて,Ctrl+Shift+Pのコマンドパレットからhydrogen:connect-to-remote-kernelを選択し,接続するRemote kernelを選択します. Remote kernelに接続できたら,実行したい行で,Shift+Enterを押すことでその行を実行できます.Jupyter notebookの良い機能であるCell単位の実行は,Alt+Shift+Enterで実行できます. HydrogenでCellは# %%で区切るので,Cell単位の実行をするときは,# %%で区切られた区間のコードが実行されます.

Hydrogenを用いればWeb UIを利用せずに,遠隔のマシンにてPythonのコードを実行することができるようになりますが,Atomで開くことができなければならないため,通常では,実行するコードが存在するマシンと,実行環境のあるマシンが異なってしまいます.そこで,Remote FTPというプラグインを用い,実行環境であるJupyterが動作しているマシンのファイルをAtomから簡単に編集することができるようにしました.こうすることで,後に説明するJupytextを用いて,Web UIからも,Hydrogenからも同じプログラムを編集することができるようになります.

リモートサーバのファイルを直接編集 【Remote FTP】

リモートサーバに存在するファイルをAtomで直接編集しているかのように扱うことを可能とするRemote FTPを使用します.

はじめにRemote FTPをリンク先の手順に従ってインストールします.Command Paletteを開いて,remote-ftp:toggleを選択すると以下のようなメニューが出るので,リモートサーバに合わせて設定を書き,接続できるようにします.

Remote FTPのメニュー

SFTPで設定した設定例を,以下に示します.

SFTPを利用するときの設定内容

このような設定を記述した後,Remote FTPのメニューに戻り,Connectを押してリモートサーバに接続します.

接続後のファイル一覧の例

接続に成功すると上図のように設定したディレクトリに存在するファイルやフォルダが一覧できるので,編集したいファイルを開き,編集したり,前のセクションで説明したようにJupyter kernelで実行できます.Remote FTPとHydrogenを組み合わせることで,ローカルにファイルを一切持たずに,リモートで分析基盤とソースコードの管理を完結させることができるようになります.

しかし,このままでは,Jupyter notebookのWeb UIを利用した際には,ipynb形式のファイルがないため,notebookとして編集,実行することができません. そこで,続いて紹介するJupytextを導入し,pythonファイルとnotebook用のipynbファイルを自動的に相互変換できるようにします.

ipynbとpythonを相互変換 【Jupytext】

Jupyter notebookで用いられる,セルやコードの情報が格納されるファイルの形式はIPython Notebook (ipynb) 形式です.このファイルはJupyter notebookで必要な各情報がJSONフォーマットで記述されたファイルであるため,視認性が悪く,直接gitで管理することが難しいファイルとなってしまっています.

そこで,このセクションで紹介するJupytextを用いることで,両者の利点を両方享受することができます.Jupytextでは,ipynbをJupyter notebookのWeb UIから編集した場合に,そのipynbに含まれるコードの内容であるpythonファイルを作成し,逆にpythonファイルに変更が生じたときは,その内容をipynbファイルに転記する機能を提供するため,どちらのファイルを編集した場合でも,自動的にもう片方のファイルが生成されます.

上記のGitHubのREADMEを参考に導入し,対象としたいipynbファイルのmetadataフィールド (下の方にあります) に以下のように,Jupytextの設定を記述します.以下の例では"jupytext": {"formats": "ipynb,py"},の行を追加しています.

{
"jupytext": {"formats": "ipynb,py"},
"kernelspec": {
(...)
},
"language_info": {
(...)
}
}

この設定はipynbとpyの変換を指定していますが,その他のJupyterでサポートされている言語についても同様の変換機能を使用できます. Jupytextを利用することで,pythonのファイルをAtomで編集したときに,保存時に自動的にipynbファイルも作成され,Hydrogenを利用してpythonファイルを直接編集している場合でもWeb UIから利用することができるようになります.

Jupytextを導入することで,柔軟にpythonとipynbを管理することができるようになりました.ipynbはGitで管理するのが難しいと言われていますが,自動的にpythonへ変換するJupytextを用いれば,pythonを通常通りGitで管理していくことができます.ただ,リモートサーバに存在するGit repositoryを管理する必要があるので,Atomの機能だけでは若干不便があります.なので,AtomからShellを開けるplatformio-atom-ide-terminalを利用し,SSHしてリモートサーバでコマンドを発行可能な状態にしていきます.

Atomのインタフェース内でSSHする【platformio-atom-ide-terminal】

ここまでで,かなり使いやすいJupyter環境となってるかと思いますが,最後にAtomからリモートサーバにSSHすることで,プロジェクトディレクトリでGitコマンドの発行や,監視スクリプトの実行など幅広い処理がAtomから画面を遷移せずともできるようになります.自分が利用しているTerminalプラグインは,platformio-atom-ide-terminalです.

リモートサーバにSSHして好きなことができるので,好きなツールを使ってプロジェクトを管理できます. 例として,ctopを利用してDockerの負荷を監視している画面を以下の画像に示します.

ctopを使ってDockerの負荷監視

このようになんらかのプロセスを監視したり,Gitへのコミット関連のコマンドも自由に発行できるので,プロジェクト管理が捗ります.

まとめ

今回は,できるだけWeb UIを触らずにJupyterを利用することを目指して,いくつかのAtomプラグインを組み合わせて利用する方法をご紹介しました.この環境を用いれば,Atomのシンタックスハイライトや,サジェッション機能,vimキーバインドなど,多くの資産を活用しながらJupyterを利用することができるようになります.これまで慣れ親しんだいろいろなツールを組み合わせながらJupyterを利用できるため,Jupyter notebookのキーボードショートカットを覚えたり,UIの挙動に悩まされたりすることがなくなり,ハッピーになれます.

皆さんの分析ライフが捗る一助となれば幸いです.

--

--