機械学習用サーバーに JupyterHub を設定するためのメモ。
Contents
JupyterHub とは?
Jupyter Notebook は python などをブラウザ上で開発、実行でき、
その出力を notebook という形で残すことができる統合開発環境です。
JupyterLab は、Notebook の後継で、更なるその進化系ともいうべきもので、
今後開発はこちらにシフトしていくと思われます。
Jupyter Notebook/Lab はいずれもユーザー毎にセッションを開いて、
知っている人がそこにアクセスするというイメージでした。
認証はできますが、システムの認証とは異なり jupyter 用のパスフレーズ, トークンなどによる認証です。
また、生成したファイルも全てセッションを開いたユーザーの権限でしか読み書きできません。
元々が自分のデスクトップ機上で稼働するようなイメージから始まったのかもしれませんが、
上記の仕様なので、サーバーのようにして複数人で開発しようとすると色々問題が出てきます。
JupyterHub はサーバー化する際に有用で、
稼働しているシステムのローカル、或いは NIS, ldap などの認証を用いてログインでき、
それぞれのユーザーの権限で、動作・読み書きが行えます。
なので、開発サーバー機のような用途には JupyterHub が最適です。
設定目標
- 環境は Ubuntu Server 20.04
- JupyterHub は notebook/lab いずれとも連携できるが、今回は JupyterLab を呼び出すようにする。
- PyROOT も使えるようにする
- ポート8000ではなく標準のポート80でアクセスさせる。
その際、他のサービスと干渉しないようにサブディレクトリから転送させる。 - JupyterLab のデフォルトのディレクトリは
~/jupyter
にする。
Python/Conda
前述したように Anaconda が色々アレなので python 環境は、conda + conda-forge にする。
今回は Miniforge (link)を用いる。
インストール手順は anaconda と同じなので割愛。
PyROOT を python v3.8系を参照して作成したので、
Miniforge も python v3.8系の最終版をインストールした。
JupyterHub のセットアップ
まずインストール。
$ conda install jupyterhub jupyterlab
次に設定(以下 root で)。
1 2 3 4 5 6 7 8 9 10 11 |
# mkdir jupyterhub; cd jupyterhub # jupyterhub --generate-config /root/jupyterhub/jupyterhub_config.py c.Spawner.notebook_dir = ‘~/jupyter' c.Authenticator.admin_users = {‘yourUser’} c.Spawner.default_url = ‘/lab’ # JupyterLab で動かす c.Spawner.env_keep = […, ‘LD_LIBRARY_PATH’] # PyROOT c.JupyterHub.bind_url = 'http://:#port/jupyter/' # サブディレクトリアクセス # jupyterhub -f jupyterhub_config.py |
ひとまずこれで起動、アクセスできるようになる。
notebook 設定
ログイン先のユーザー側の設定。
1 2 3 4 |
$ jupyter notebook --generate-config ~/.jupyter/jupyter_notebook_config.py c.NotebookApp.allow_origin = '*' |
また、jupyterhub 側の設定で notebook_dir
を指定している場合は、
対応するディレクトリを作っておかないと、singleuserサービス起動に失敗する。
$ mkdir ~/jupyter
サブディレクトリアクセスからの転送
nginx で reverse-proxy してやる。
適切に設定しないと websocket の転送ができずうまく動作しない。
web で見つけた記事(出典失念)をベースに適当に設定した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/etc/nginx/conf.d/reverseproxy.conf ... location ~ /jupyter { proxy_pass http://127.0.0.1:#port; proxy_redirect off; # websocket headers proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Scheme $scheme; proxy_buffering off; } ... map $http_upgrade $connection_upgrade{ default upgrade; '' close; } ... $ sudo service nginx restart |
自動起動
systemd でシステム起動時に自動で起動するようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/etc/systemd/system/jupyterhub.service [Unit] Description=Jupyterhub After=syslog.target network.target [Service] User=root WorkingDirectory=/root/jupyterhub Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/path/to/miniforge/bin:/path/to/miniforge/condabin" Environment="LD_LIBRARY_PATH=/path/to/root/lib" Environment="PYTHONPATH=/path/to/root/lib" ExecStart=/path/to/miniforge/bin/jupyterhub -f /path/to/jupyterhub_config.py [Install] WantedBy=multi-user.target $ sudo systemctl daemon-reload $ sudo systemctl start jupyterhub.service $ sudo systemctl enable jupyterhub.service |