HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

jupyter lab appを使ってみた

jupyter labのスタンドアローン版というのが最近リリースされたらしいです。

forest.watch.impress.co.jp

そういや昔ちょろっと聞いたような気がするなーと思ってたんですが、リリース履歴を見ると3年ほど放置されてたようですね。

github.com

私がjupyter labを使う時は、

  1. google colabで使う
  2. dockerからjupyter/scipy-notebook を起動して使う

のどちらかでやってたんですが、どちらの場合も起動した後で必要なファイルが不足してた時に取りに行くのが面倒 というビミョーな問題がありました。

colabの場合は、小さめのファイルなら都度アップロードすれば良いのですが、しばらく放置してるとインスタンスを落とされるという制限があります(課金すれば回避できるけど)。また、毎回アップロードするのを避けるために、必要なファイルをgoogle driveに置いて、notebookの最初の方でマウントするという運用もできるんですが、これをやると数GB単位のファイルを扱うようなコードを書いているとgoogle drive側が破綻します(こっちも課金で回避はできるけど・・・)

一方dockerの方は

docker run --rm -p8888:8888 -v${PWD}:/home/jovyan/work jupyter/scipy-notebook'

という感じで、カレントディレクトリをworkにマウントして使っているので、起動してから「しまったマウントポイントより上の階層に置いてあるファイルが必要だったorz」なんてことが稀に良くあります。

こちらも、jupyterlabの機能を使ってアップロードするなり、docker cpで送り込むという手はあるんですが、ローカルのストレージ内にあるファイルをわざわざコピーしないと使えないというのもちょっとフラストレーションが溜まります。

というわけで、どちらも一応問題無く使えてるんだけど、微妙に使い勝手が悪いのでで、問題無いようならこの機に乗り換えてみようと思います。*1

インストール

今のところhomebrewからは入れられないようなので、githubのリリースページからpkgをダウンロードしてインストールします。

Releases · jupyterlab/jupyterlab_app · GitHub

インストールは通常のmac用のアプリと同じです。 窓の杜の記事だと、インストール時に何か聞かれてるようですが、mac版では特にインストール中にいじれる設定はありませんでした。

正常にインストールできたら、こんな感じのアイコンがlaunchpadに表示されるので、これをクリックして起動します。

f:id:n_so5:20211004213200p:plain

初回起動時なのに、以前native環境にインストールしたjupyterlabを使っていた時のものと思われるnotebookがいきなり開いた状態で起動したので、一瞬パニックになりましたが一旦全部のタブを閉じてアプリを終了してから再度起動すると、こんな感じのlauncher画面になります。

f:id:n_so5:20211004233502j:plain

窓の杜の記事をざっと見たところ、jupyter lab app専用にcondaでpythonもパッケージも入れてくれているという話だったので、まずはその辺を確認しましょう。

terminalタブを開いて、バージョンを確認します。

MBA:so5 so5$ python --version
Python 2.7.16
MBA:so5 so5$ python3 --version
Python 3.8.9

続いてterminal appを起動してpythonのバージョンを確認します。

so5@MBA ~ % python --version
Python 2.7.16
so5@MBA ~ % python3 --version
Python 3.9.7

確かにpython3のバージョンが違うものが使われてますね。

入っているパッケージも一応比較してみましょう。

MBA:so5 so5$ conda list
# packages in environment at /Applications/JupyterLab.app/Contents/Resources/jlab_server:
#
# Name                    Version                   Build  Channel
anyio                     3.3.2            py38h50d1736_0    conda-forge
appnope                   0.1.2            py38h50d1736_1    conda-forge
argon2-cffi               20.1.0           py38h96a0964_2    conda-forge
async_generator           1.10                       py_0    conda-forge
attrs                     21.2.0             pyhd8ed1ab_0    conda-forge
babel                     2.9.1              pyh44b312d_0    conda-forge
backcall                  0.2.0              pyh9f0ad1d_0    conda-forge
backports                 1.0                        py_2    conda-forge
backports.functools_lru_cache 1.6.4              pyhd8ed1ab_0    conda-forge
bleach                    4.1.0              pyhd8ed1ab_0    conda-forge
brotlipy                  0.7.0           py38h96a0964_1001    conda-forge
ca-certificates           2021.5.30            h033912b_0    conda-forge
certifi                   2021.5.30        py38h50d1736_0    conda-forge
cffi                      1.14.6           py38h1a44b6c_1    conda-forge
chardet                   4.0.0            py38h50d1736_1    conda-forge
charset-normalizer        2.0.0              pyhd8ed1ab_0    conda-forge
colorama                  0.4.4              pyh9f0ad1d_0    conda-forge
conda                     4.10.3           py38h50d1736_2    conda-forge
conda-package-handling    1.7.3            py38h96a0964_0    conda-forge
cryptography              3.4.7            py38h1fa4640_0    conda-forge
cycler                    0.10.0                     py_2    conda-forge
debugpy                   1.4.1            py38ha048514_0    conda-forge
decorator                 5.1.0              pyhd8ed1ab_0    conda-forge
defusedxml                0.7.1              pyhd8ed1ab_0    conda-forge
entrypoints               0.3             pyhd8ed1ab_1003    conda-forge
freetype                  2.10.4               h4cff582_1    conda-forge
idna                      3.1                pyhd3deb0d_0    conda-forge
importlib-metadata        4.8.1            py38h50d1736_0    conda-forge
ipykernel                 6.4.1            py38h5fd9f69_0    conda-forge
ipython                   7.28.0           py38h5fd9f69_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
ipywidgets                7.6.5              pyhd8ed1ab_0    conda-forge
jbig                      2.1               h0d85af4_2003    conda-forge
jedi                      0.18.0           py38h50d1736_2    conda-forge
jinja2                    3.0.1              pyhd8ed1ab_0    conda-forge
jpeg                      9d                   hbcb3906_0    conda-forge
json5                     0.9.5              pyh9f0ad1d_0    conda-forge
jsonschema                3.2.0              pyhd8ed1ab_3    conda-forge
jupyter_client            7.0.3              pyhd8ed1ab_0    conda-forge
jupyter_core              4.8.1            py38h50d1736_0    conda-forge
jupyter_server            1.11.0             pyhd8ed1ab_0    conda-forge
jupyterlab                3.1.13             pyhd8ed1ab_0    conda-forge
jupyterlab_pygments       0.1.2              pyh9f0ad1d_0    conda-forge
jupyterlab_server         2.8.2              pyhd8ed1ab_0    conda-forge
jupyterlab_widgets        1.0.2              pyhd8ed1ab_0    conda-forge
kiwisolver                1.3.2            py38h12bbefe_0    conda-forge
lcms2                     2.12                 h577c468_0    conda-forge
lerc                      2.2.1                h046ec9c_0    conda-forge
libblas                   3.9.0           11_osx64_openblas    conda-forge
libcblas                  3.9.0           11_osx64_openblas    conda-forge
libcxx                    12.0.1               habf9029_0    conda-forge
libdeflate                1.7                  h35c211d_5    conda-forge
libffi                    3.4.2                he49afe7_4    conda-forge
libgfortran               5.0.0           9_3_0_h6c81a4c_23    conda-forge
libgfortran5              9.3.0               h6c81a4c_23    conda-forge
liblapack                 3.9.0           11_osx64_openblas    conda-forge
libopenblas               0.3.17          openmp_h3351f45_1    conda-forge
libpng                    1.6.37               h7cec526_2    conda-forge
libsodium                 1.0.18               hbcb3906_1    conda-forge
libtiff                   4.3.0                h1167814_1    conda-forge
libwebp-base              1.2.1                h0d85af4_0    conda-forge
llvm-openmp               12.0.1               hda6cdc1_1    conda-forge
lz4-c                     1.9.3                he49afe7_1    conda-forge
markupsafe                2.0.1            py38h96a0964_0    conda-forge
matplotlib-base           3.4.3            py38hc7d2367_1    conda-forge
matplotlib-inline         0.1.3              pyhd8ed1ab_0    conda-forge
mistune                   0.8.4           py38h96a0964_1004    conda-forge
nbclassic                 0.3.2              pyhd8ed1ab_0    conda-forge
nbclient                  0.5.4              pyhd8ed1ab_0    conda-forge
nbconvert                 6.2.0            py38h50d1736_0    conda-forge
nbformat                  5.1.3              pyhd8ed1ab_0    conda-forge
ncurses                   6.2                  h2e338ed_4    conda-forge
nest-asyncio              1.5.1              pyhd8ed1ab_0    conda-forge
notebook                  6.4.4              pyha770c72_0    conda-forge
numpy                     1.21.2           py38h49b9922_0    conda-forge
olefile                   0.46               pyh9f0ad1d_1    conda-forge
openjpeg                  2.4.0                h6e7aa92_1    conda-forge
openssl                   1.1.1l               h0d85af4_0    conda-forge
packaging                 21.0               pyhd8ed1ab_0    conda-forge
pandas                    1.3.3            py38ha53d530_0    conda-forge
pandoc                    2.14.2               h0d85af4_0    conda-forge
pandocfilters             1.5.0              pyhd8ed1ab_0    conda-forge
parso                     0.8.2              pyhd8ed1ab_0    conda-forge
patsy                     0.5.2              pyhd8ed1ab_0    conda-forge
pexpect                   4.8.0              pyh9f0ad1d_2    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    8.3.2            py38hee640a0_0    conda-forge
pip                       21.2.4             pyhd8ed1ab_0    conda-forge
prometheus_client         0.11.0             pyhd8ed1ab_0    conda-forge
prompt-toolkit            3.0.20             pyha770c72_0    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pycosat                   0.6.3           py38h96a0964_1006    conda-forge
pycparser                 2.20               pyh9f0ad1d_2    conda-forge
pygments                  2.10.0             pyhd8ed1ab_0    conda-forge
pyopenssl                 20.0.1             pyhd8ed1ab_0    conda-forge
pyparsing                 2.4.7              pyh9f0ad1d_0    conda-forge
pyrsistent                0.17.3           py38h96a0964_2    conda-forge
pysocks                   1.7.1            py38h50d1736_3    conda-forge
python                    3.8.12          h17280f6_0_cpython    conda-forge
python-dateutil           2.8.2              pyhd8ed1ab_0    conda-forge
python_abi                3.8                      2_cp38    conda-forge
pytz                      2021.1             pyhd8ed1ab_0    conda-forge
pyzmq                     22.3.0           py38hd3b92b6_0    conda-forge
readline                  8.1                  h05e3726_0    conda-forge
requests                  2.26.0             pyhd8ed1ab_0    conda-forge
requests-unixsocket       0.2.0                      py_0    conda-forge
ruamel_yaml               0.15.80         py38h96a0964_1004    conda-forge
scipy                     1.7.1            py38hd329d04_0    conda-forge
seaborn                   0.11.2               hd8ed1ab_0    conda-forge
seaborn-base              0.11.2             pyhd8ed1ab_0    conda-forge
send2trash                1.8.0              pyhd8ed1ab_0    conda-forge
setuptools                58.0.4           py38h50d1736_2    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
sniffio                   1.2.0            py38h50d1736_1    conda-forge
sqlite                    3.36.0               h23a322b_2    conda-forge
statsmodels               0.12.2           py38hbe852b5_0    conda-forge
terminado                 0.12.1           py38h50d1736_0    conda-forge
testpath                  0.5.0              pyhd8ed1ab_0    conda-forge
tk                        8.6.11               h5dbffcc_1    conda-forge
tornado                   6.1              py38h96a0964_1    conda-forge
tqdm                      4.62.3             pyhd8ed1ab_0    conda-forge
traitlets                 5.1.0              pyhd8ed1ab_0    conda-forge
urllib3                   1.26.7             pyhd8ed1ab_0    conda-forge
wcwidth                   0.2.5              pyh9f0ad1d_2    conda-forge
webencodings              0.5.1                      py_1    conda-forge
websocket-client          0.57.0           py38h50d1736_4    conda-forge
wheel                     0.37.0             pyhd8ed1ab_1    conda-forge
widgetsnbextension        3.5.1            py38h50d1736_4    conda-forge
xz                        5.2.5                haf1e3a3_1    conda-forge
yaml                      0.2.5                haf1e3a3_0    conda-forge
zeromq                    4.3.4                he49afe7_1    conda-forge
zipp                      3.5.0              pyhd8ed1ab_0    conda-forge
zlib                      1.2.11            h7795811_1010    conda-forge
zstd                      1.5.0                h582d3a0_0    conda-forge

listの中にseabornが入っていますが、実はこれ初期状態でリストを取るのを忘れてて、私が後から入れてしまったパッケージなので、デフォルトでは入ってません。 しかし、pandas, matplotlib, numpy, scipyあたりは入ってるので*2この辺を使いたい人は特に追加で入れなくてもひととおり揃った環境と言えそうです。

terminal appではそもそもcondaにパスが通っていないので、違うところを見てるのは間違いないのですが 一応pip3で確認すると、これだけしかパッケージは入ってませんでした。

so5@MBA ~ % pip3 list
Package    Version
---------- -------
labelImg   1.8.5
lxml       4.6.3
pip        21.2.4
PyQt5      5.15.4
PyQt5-sip  12.8.1
setuptools 57.4.0
wheel      0.37.0

というわけで、こちらの環境をどんなにいじったところで、デフォルトのpython環境には影響しないようです。

私みたいにjupyter labをpytonの開発環境として使ってると、jupyter labで開発してファイルに保存したpythonスクリプトをterminaから起動しようとして依存パッケージが足りないなんていうトラブルが起きそうな気もしますが、そんときゃそん時でなんとかしましょう :p

使い方

使い方は通常のjupyterlabやgoogle colabなんかと概ね同じ感じです。

colabとjupyterlabでショートカットキーとか色々と違うだろうという意見もあるかと思いますが、正直に言うとどちらもそんなに使い込んでないので、私にはレビューのしようがありませんo...rz

とりあえず、先週末にインストールして3日ほど使った感じでは、特に違和感無く使えています。

また、webアプリとして使っていた時と違って、CTRL+TABで簡単に切り替えられるので、ブラウザのタブを大量に開いて調べながらコードを書いてる時なんかは、すぐに戻ってこれるのが地味に便利ですw

まとめ

まとめるほどの内容もないんですが、最後にひとことだけ書いとくと

「jupyter lab appはいいぞ」

*1:といっても、colabはガチャで良いの引けばGPUが使えるなど、ローカルPCには無い魅力もあるので、使い続けるとは思いますが

*2:って良く考えたらanacondaのデフォルトで入るんでしたっけ?