adtech studio

木星を継ぐもの 〜JupyterLab よこんにちは〜

By peinan

未分類 開発

AI Lab で主に NLP を担当している張です。
突然ですが、まだ Jupyter Notebook で消耗していませんか?

2011 年に IPython Notebook (現 Jupyter Notebook) の登場1によって研究やデータサイエンスの環境は一変しました。
それまではソースコードの実行やグラフの出力、メモやノートなどをすべて別々に取っておく必要があったものが、このツールによって一箇所にまとめて表示できるようになり、管理や閲覧が一元化され圧倒的に便利になりました。IPython Notebook の登場は研究者やデータ分析する人に革命的な効率改善をもたらしたのです。まさに働き方改革です。
2019 年現在、初登場から約 8 年もの年月が過ぎました。この 8 年の間に Python のバージョンは 3.2 から 3.7 にあがり、GPU は GTX 500 番台から RTX 2000 番台になり、NLP における state-of-the-art な言語モデルも RNNLM 2 から GPT-2 3 へと進化しました4。そんな中 Jupyter は過去に留まったままでしょうか?否、 Jupyter もこの激しい変化に適応するための新しい武器を粛々と開発していたのです。Jupyter Notebook で使いづらかった点を改善し、より利便性を向上させた後継、それが JupyterLab なのです。
しかし悲しいかな、まだその存在を知らない方が多くいらっしゃいます。そこで、 Jupyter Notebook との違いと活用方法に主眼を置きながら、その良さをあまねくご紹介できたらと思います。

もくじ

  1. 画面
    1. 画面構成
    2. 画面操作
    3. ダークモードとプレゼンテーションモード
    4. CSV / TSV のテーブル表示と JSON の展開可能な表示
  2. セル操作
    1. セルの D&D
    2. 補完機能
    3. マルチカーソル
    4. セル内検索、正規表現検索
  3. ファイル操作関係
    1. ファイルダウンロード
    2. 共有リンク
  4. 拡張機能(extensions)
  5. おすすめの運用方法
  6. さいごに
  7. 参考

1. 表示関係

画面構成

JupyterLab になって一番はじめに目につくのはなんと言っても画面構成でしょう。ディレクトリ画面も ipynb 実行画面も全てがシングルページだった Jupyter Notebook とは違い、JupyterLab では画面がマルチタブ・マルチペインな構成に一新されました。

トップレイヤーでは左側にサイドバー、右側に実行画面がある2ペイン構成になっています。
サイドバーではディレクトリ移動や実行中のファイル操作、さまざまなコマンド、拡張機能タブなどと多くの補助的な機能が備わっています。
右側にある実行画面では Notebook やエディタ、ターミナル、出力画面などと数多くの編集・実行可能画面が自分好みなペイン・タブ構造に配置できるようになっています。
え?シングルページの方が集中できる?ご心配なさらずに。左のサイドバーは非表示可能なので、それを閉じればいつものシングルページな Jupyter Notebook に早変わりです。さらにメニューバーの View から Single-Document Mode なるモードも選択可能で、それを実行すればタブバーも消失するのでもう完璧に Jupyter Notebook と化します。

画面操作

具体的な画面操作についてご紹介していきます。

画面の配置変更は、タブをドラッグすると分割する方法が青い枠線で提示されるので、自分がやりたいようにタブをドラッグします。カーソルを画面の左、右、上、下、中央に重ねることによって、ペインに分割することやタブに統合することなどの挙動になります。下の GIF から分かるように、動作は非常にスムーズでストレスはほとんどありません。

また、タブ・ペイン化できるのはなにもファイルだけではありません。ターミナル画面や拡張機能画面、ipynb 内で実行する際の出力まで可能です。その自由度の高さを下の GIF で表現してみました。

この実行出力を別タブ・ペインで表示できるのは非常に便利で、上の GIF のように画像を表示させながら色んな処理を施したりできます。

他にもいくつか便利なタブ・ペイン化できる機能が JupyterLab に備わっています。そのひとつが同じ ipynb の複数画面表示です。自分もこの機能には大いにお世話になっています。例えば長くなった ipynb の上の方のコードを修正したいときはわざわざ上までスクロールするのはめんどくさいですよね?そういうときはペインを上の部分と下の部分のふたつの分割をすればその手間もなくなります。

もうひとつの有用な機能が、Code Console と呼ばれるものです。これは ipynb 内の環境を引き継いた IPython インタラクティブシェルと言えば伝わりやすいでしょうか。これは ipynb の編集中に、スペース部分の右クリックメニューから「New Console for Notebook」を選ぶことで開くことができます。ipynb に残したくない検証や、軽いアドホックな処理を行うのに最適です。ただし、同じ ipython カーネルを使っている以上、名前空間は ipynb と共有されるので、くれぐれもお気をつけください。

ダークモードとプレゼンテーションモード

Jupyter Notebook を使っている方なら少なくない方が拡張機能を入れてダークモードにしたり、プレゼンテーションモードを有効化しているのではないでしょうか。自分もそのうちの一人でした。それもそのはず、仕事の性質上、パソコンの画面と長時間に渡ってにらめっこをするのが日常化している我々にとって、明るい画面はそれだけで我々をムスカ大佐たらしめる要因になり得るのです。そのため、ダークモードといった目に優しい機能は必要不可欠です。そんな方に朗報です。なんと!JupyterLab ではダークモードとプレゼンテーションモードが標準機能として組み込まれています!(Cheers and applause)
これで拡張機能を入れたり探したりする時間をデータ分析や研究に費やせますね!

ただプレゼンテーションモードは、横幅や文字サイズをプレゼンテーション用に拡大したりするけど RISE5 みたいにスライド化されるもののではないのでご注意ください。

CSV / TSV のテーブル表示と JSON の展開可能な表示

他にも便利な表示に関するアップデートがあります。今までの Jupyter Notebook で CSV や JSON ファイルを開くと生データが表示されていましたが、それを不便に思ったことはありませんか?研究やデータ分析で扱う多くのフォーマットは CSV や JSON です。それらをきれいに表示できることは正しくデバッグすることやミスを減らすことに繋がります。そこも JupyterLab は対応してくれています!CSV や JSON ファイルを開くと、表形式や展開可能な形式にレンダリングされます。

画面構成に比べると小さな改善ではありますが、日々データを扱う身としては利便性の向上に繋がる重要な改善だと思っています。

2. セル操作

セルの D&D

JupyterLab になって、セル周りの操作もかなり便利になりました。その中でもセルをドラッグ・アンド・ドロップ(以下 D&D)できるようになったのはちょっとした驚きかもしれません。それも同じファイル内だけでなく 6、異なるファイル間でも可能なのです。

これでファイル間でのコードのコピーが楽になりますね。

補完機能

個人的にかなり嬉しいことのひとつに、JupyterLab でのコード補完の挙動がアップデートされたことが挙げられれます。というのも、以前 Jupyter Notebook を使っていたときは、一応 TAB キーで候補リストが出るものの、その移動は方向キーの↑↓でしか動かせませんでした。vim の jk でもなく、emacs の ctrl-p, ctrl-n でもなく方向キーです。いちいちキーボードのホームポジションから手を離さなければならないのが地味にストレスでした。しかしそれももう悩まされることはありません。JupyterLab では補完機能が一新されました。

TAB キーを押すと候補リストがでてくるところまでは同じですが、python の場合はリストの各項目の左にその項目が関数なのか変数なのかキーワードなのかなどの情報が表示されています。さらに、肝心の補完操作ですが、入力したキーと候補の中からマッチする項目が選択されていきます。

最初はちょっと慣れないかもしれませんが、使っていくうちにただ上下移動する方式よりも速く入力できるようになります。

マルチカーソル

これも待ち望んだ機能のひとつだと思います。自分がマルチカーソルに出会ったのは sublime text 2 というエディタを初めて使ったときでした。あのときはこんな便利な機能があったとは!と多大なる衝撃を受けたものでしたが、それが今やあらゆるエディタや IDE の標準装備として組み込まれています。マルチカーソルを含め、他にも多くの斬新な機能を搭載させた sublime text 2 はエディタ文化の一時代を切り開いたと個人的には思っています。
閑話休題。そんなデファクトスタンダードな機能になりつつあるマルチカーソルを、JupyterLab ではついに搭載しました。

ただし注意点がいくつかあります。まずマルチカーソルが有効なのは単一のセル内のみです。複数のセルに渡ってマルチカーソルを行うことができません。次に、マルチカーソルでは、BackSpace のような時々対応していないキーがあったりします。というのも、マルチカーソルの状態で BackSpace をしても、ひとつのカーソルしか動きません。BackSpace の場合は、Mac / Linux ユーザであれば ctrl-h で同じ挙動をさせることはできますが、他にも効かないキーがあるかもしれないのでご注意ください。

セル内検索・正規表現

これに関してはどれくらいの希望度があったのかわかりませんが、使ってみると意外と便利な機能と言えます。従来の検索に / を前後に追加すると正規表現での検索に早変わりです。ただリアルタイムでヒット箇所が出るわけではなく Enter キーを押して初めて該当箇所がハイライトされる仕組みになっています。

検索はできるのに置換機能はなかったり、単一セル内でしか使えなかったり、放置するとハイライトが残りっぱなしになったりなど、まだ使い勝手の向上する余地がありますが、なんだかんだ便利な機能です。

3. ファイル操作関係

ここでは軽くファイルの操作について書きます。Jupyter Notebook もそうですが、近頃共用サーバ上で Jupyter を起動して特定のグループのメンバーから使用可能にさせたり、遠隔からでもアクセスできるようにしたりする運用が増えています。この運用方法自体は非常に利便性が高いが、Jupyter Notebook だといくつか不便なことがあります。

ひとつがファイルのダウンロードです。実験で作られたモデルファイルや評価の出力画像など、なんだかんだでダウンロード処理がしたい場合が多々あります。Jupyter Notebook を使っていたときはわざわざ scp などで転送するか、Google Storage などのクラウドホスティングのストレージに保存したりしていました。しかし JupyterLab からはその面倒なことをしなくて済みます。サイドバーのファイル操作画面でファイルの右クリックメニューでダウンロードできちゃいます。しかも複数選択7もできちゃいます。

他にも右クリックメニューから共有 URL のコピーとかファイルを複製するなどの機能も追加されていたりするので、ぜひ使ってみてください。

拡張機能(extension)

ここではいくつかお世話になっている便利な拡張機能をご紹介します。

jupyterlab-variableInspector [link]

個人的に一番お世話になっているのがこの拡張機能です。これはアクティブになっている ipynb の変数を一覧にして表示してくれている拡張機能です。変数名だけでなく、その型やサイズ、内容まで表示してくれるのでかなり重宝します。numpy の shape や pandas の shape も見れるので、行列計算が多いニューラルネットワークをゴニョゴニョする人やデータを分析する人にはかなり助けとなる拡張機能です。

また、Jupyter を使っている方なら一度は経験しているのが名前空間のカオス化じゃないでしょうか。関数やクラスにせずにただただ変数を宣言していくとグローバル名前空間があっという間に混沌としていきます。そこから何かを計算するときに予期しない動作をして失敗したり、なにより一番怖いのが予期しない動作に気づかないことです。そのためにもこういった宣言されている変数を見ることができる機能は非常に有用だと思っています。

ただこれにもひとつ注意点があり、Unicode 文字の扱いがいまいちなのです。例えば a = 'あ' と宣言してもインスペクタ上では \u3042 になってしまいます。以前これを Issue に上げたら製作者の方が str などの文字列には対処してくれました。が、pandas の DataFrame などには未対応のままとなっております。みなさんプルリクチャンスですよ。

jupyterlab-go-to-definition [link]

PyCharm などの IDE でおなじみのコードジャンプです。Alt + Click でその変数の宣言文までジャンプしてくれます。

ipynb はその性質上、図表なども表示できるが全体的に長くなってしまいがちなのでめちゃくちゃ便利です。

その他

他にも多くの拡張機能がありますが、自分が主に使っているのは上のふたつだけなので詳しく書いてみました。
いくつか自分は使っていないけど便利そうな拡張機能もご紹介してみます。

  • jupyterlab_templates [link]
    • テンプレートを作ってそこからファイルを新規作成できる拡張機能
  • jupyterlab_tensorboard [link]
    • JupyterLab 上で tensorboard を開ける拡張機能
  • jupyter-matplotlib [link]
    • matplotlib の出力グラフをぬるぬる動かせる拡張機能
  • jupyterlab_code_formatter [link]
    • 散らばっているコードをきれいにしてくれる formatter

世に存在する拡張機能は github のトピックや個人の awesome-jupyterlab などで追うといいかもしれません。

おすすめの運用方法

基本的に @lain21 さんの記事を参考にして下図のようにリモートサーバに JupyterLab サーバが入ったカスタマイズ済み Docker イメージを実行して運用しています。

この方法で得られるメリットはいくつかあります。

  • どこに行ってもネット環境さえあれば実験サーバにアクセスできる
  • 環境構築が容易
  • 統一性のある環境が作れる
  • GCP との接続を切っても Jupyter の実行が中断されない

ただしあまりメモリをいじめすぎると docker コンテナが落ちてしまうので気をつけましょう。

参考までに、自分で構築せず既存のサービスとして使いたいのであれば Google の ColaboratoryCloud Datalab、Miscrosoft の Azure Notebooks などの選択肢があります。どれも Jupyter Notebook のクローンではありますが、Colaboratory なら GPU/TPU が条件付きで使える、Datalab なら他の GCP サービスとの連携が容易といったそれぞれ独自のメリットがあります。自分でサーバを建てずに手軽でパワフルな環境を利用したい際は一考する価値があるかもしれません。

さいごに

よい Jupyter ライフを!

参考


  1. Fernando Perez: The IPython notebook: a historical retrospective 
  2. Mikolov et al., Recurrent neural network based language model, INTERSPEECH 2010 
  3. Radford et al., Language Models are Unsupervised Multitask Learners 
  4. なのにアーマードコアの新作はまだ出ません 
  5. Jupyter Notebook をプレゼンテーション用スライドみたいに表示してくれる拡張機能 [link
  6. 同じファイル内だったらショートカットのほうが馴染みあるし速いかもしれないですね 
  7. なにげに shift キーを使っての複数選択というお馴染みな操作ができます