こんにちは。
Jupyter LabやJupyter notebookは、インタラクティブにコードを書きながらグラフ描写でき、データの傾向を見ながら解析するような時に非常に便利ですよね。
簡単な計算なら普段使いのノートPCなどでも十分ですが、重たいデータの解析、GPUを使ったディープラーニングなどは別に用意したワークステーションを使っている人も多いと思います。
しかしそんな時、わざわざモニターをつけてデスクトップで動かすのは非常に面倒ですよね。
私も自宅の環境ではこれまで、普段使いのメインPC(Mac)とワークステーション(Ubuntu Desktop)をモニター切替器を使って併用していましたが、作業効率が悪すぎました。
かと言ってVNCで画面共有すると、画面全体を通信しないといけないので、動作が遅いしスマートではありません。
ワークステーションのJupyter Labをもう少しスマートに使えないかということで、環境を整えました。
今回ご紹介する方法を使うと、ローカルPCで使うのと同じような感覚でリモート先のJupyterを使えるようになります。
メインPCと計算用を分けている人にとっては、作業効率が大幅にアップするのでオススメです。
なお、以下のサイト記事を参考にしています。
参考1:https://sishida21.github.io/2019/12/12/remote-jupyter-notebook/
参考2:https://meriek.com/programing/python/jupyter-ssh/
参考3:https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1
【検証したPC環境】
ゲストPC:mac OS 10.14(Mojave)
Python環境:Anaconda
ホストPC:Ubuntu 18.04
Python環境:Anaconda
■基本的な手順(ssh設定→Jupyterの設定)
①ssh接続の設定
まず、Ubuntu側でssh接続を受け入れるための設定をします。
ホスト側でターミナルを起動して、以下のコマンドでopenssh-serverのインストールと有効化をします。
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl restart ssh
ps aux|grep ss[h]
これで同一LAN内からであれば、sshでリモート接続できるはずなので、確認します。
ホストPC側のIPアドレスを確認しておきます。メモしておいてください。
hostname -I
ゲストPCにて、ターミナルから接続します。(###はIPアドレス)
ssh "username"@###.###.###.###
②jupyterlabの設定
ここからのホストPC側の作業はデスクトップ環境で直接操作しても良いすが、
上記でssh接続はできるようになったので、sshでリモート作業してもOKです。
1) Jupyter Labにパスワードを設定するため、ipythonでパスワード生成
$ipython
In [2]: from IPython.lib import passwd
In [3]: passwd()
パスワードを聞かれるで、任意のパスワードを入力しましょう。
すると下記のような文字列が出力されるので、メモしてください。(暗号化されたパスワードです。)
'sha1:****************'
2)jupyter config の生成と書き換え
ターミナルにて
&jupyter-lab --generate-config
すると、
Writing default config to: /home/"username"/.jupyter/jupyter_notebook_config.py
と返ってきて、jupyter_notebok_config.pyが生成されます。
生成されたファイルをテキストエディタ(viなど)で書き換えます。
vi /home/"username"/.jupyter/jupyter_notebook_config.py
下記に対応する項目のテンプレがコメントアウトされた状態になっているので、
コメントアウトを消した上で、必要なところを書き換えます。
password欄には、先程メモしたパスワード(’sha1:〜から始まる文字列)を記入します。
私の環境にて各項目が記載されていた行数を参考までに追記しておきます。
c.NotebookApp.allow_remote_access = True #line82
c.NotebookApp.ip = 'localhost' #line204
c.NotebookApp.open_browser = False #line 272
c.NotebookApp.password = 'sha1:xxxx' #line281
c.NotebookApp.port = 9999 #line292
■Jupyter Labの接続方法
ここまでくれば、リモートでホストPCのJupyter Labを操作できます。
ssh接続状態の場合は、一旦exitでsshを切断します。
再度下記のコマンドでssh接続し直します。
ホストPCの9999とゲストPCの9999で接続します(接続時にはパスワードを求められます)。
接続できたら、ホストPCのJupyter Labを起動します。(###はIPアドレス。)
$ ssh "username"@###.###.###.### -L 9999:localhost:9999
$ jupyter lab
configファイルでopen_browser = False
としているので、ホストPCのブラウザは起動しません。
ターミナル上に、下記のような出力が出ると思います。
JupyterLab extension loaded from /home/"username"/anaconda3/lib/python3.7/site-packages/jupyterlab JupyterLab application directory is /home/"username"/anaconda3/share/jupyter/lab Serving notebooks from local directory: /home/"username" The Jupyter Notebook is running at: "http://localhost:9999/" Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
ゲストPCでブラウザを開き、http://localhost:9999/にアクセスします。
パスワードには、IPythonで設定したパスワードを入力します。
接続完了です!
MacからUbuntuワークステーションを使ってGPU環境下のTensorflowを動かすことができました。
■sshコマンドでの接続を簡略化する
ここまででリモートでJupyter Labを使うことはできました。
しかしsshで接続するたびに
$ ssh "username"@###.###.###.### -L 9999:localhost:9999
と書くのは面倒ですよね。
そこで.ssh/config
ファイルを作成しておくことで、ssh接続の詳細設定をショートカットできます。
ゲストPC上の~/.ssh/にconfigという名前でテキストファイルを作成し、接続に関する設定を登録します。
$ vi ~/.ssh/config
ファイルには、下記のような内容を記入しておきます。<ホスト名>は任意です。
Host <ホスト名> HostName "Host IP adress" User "Host username" Port 22 LocalForward 9999 localhost:9999
こうすることで、
$ ssh <ホスト名>
ホスト名だけで設定した Jupyter Labのポート番号でssh接続ができます。
追記/リモートセッションを切断しても起動中のプロセスに復帰する方法
Jupyter Lab起動中にPCをスリープしてしまった場合、sshが切断されてしまいますが、再度sshで接続しても作業していたJupyterのプロセスには復帰ができません。そのため長時間の計算をさせたい場合に非常に困ります。そこで、ssh接続後に、
$ tmux
と打ち、tmuxのセッションからjupyter labを起動することで、この問題を回避できました。
sshが切断された場合でも再接続し、
$ tmux a
と入力することで、切断前のtmuxプロセス内で起動しているJupyter Labに復帰できました。ゲストPCのブラウザでhttp://localhost:9999/を再読み込みすればOKです。
【まとめ】
ssh接続の設定、Jupyterの設定をすることで、SSH接続でUbuntuのJupyter Labを使うことができるようになりました。
Macのデスクトップ上でUbuntuの計算リソースを活用できるようになったことで、Macでの作業とUbuntuでの計算がシームレスになり、作業効率が大幅に改善しました。
(わざわざ買ったディスプレイ&USBアクセサリの切替器はジャマになったのでお蔵入りです(笑))
今回は以上です!参考になれば幸いです。