Jupyter Notebookのジョブ実行 on ABCI

この投稿はrioyokotalab Advent Calendar 2020の投稿です。

adventar.org

Jupyter NotebookをABCI上で使いたい

公式の方法はこちら

Jupyter Notebookの利用 - ABCI User Guide

Jupyter Notebookは便利なもので[要出典]、ABCI上に立てれば、強力な計算資源の恩恵(4x Tesla V100 + 80 Thread + 384GBメモリ)を受けながらインタラクティブなプログラムの実行が行えます。

この利点は、データの読み込みに時間がかかるが、デバッグを細かく行いたい場面などで活かされます。また、実行内容の可視化を素早く行うことができ、実験結果の共有や、実行内容の正常性を確認することもできます。

これらの利点は、まさに機械学習と相性が良く、機械学習のためのスパコンであるABCIでこそJupyter Notebookの利便性を確保することは重要です。

しかし、公式の方法は手順を理解するためには重要な内容ですが、毎回その手順を行うのはコマンドが多く、大変です。今回は、Jupyter Notebookの起動を簡潔に行う方法を紹介します。

Jupyter Notebookの起動コマンドのジョブ実行

ABCI上でジョブ実行するためには、qsubコマンドを使います。qsubコマンドでスクリプトを実行するためには、ジョブスクリプトを用意する必要があります。

仮想環境の作成

公式の起動方法にもあるように、起動する前に、Pythonの仮想環境を作成する必要があります。

仮想環境の作成は、

python -m venv venv

と実行することで、手元に、venvという名前の仮想環境が作成されます。 Jupyter Notebookを起動するためには、Jupyterをpipでインストールする必要があるので、

source ./venv/bin/activate

と実行し、仮想環境を起動した後、

pip install jupyter

と実行しましょう。その他、必要なライブラリもこのタイミングでインストールしましょう。

Jupyter Notebookはアクセスする際にパスワードかトークンを求められます。ジョブ実行した場合、トークンを確認するのが面倒なので、予めパスワードを設定しておきましょう。パスワードの設定は

Running a notebook server — Jupyter Notebook 6.1.5 documentation

が参考になります。

jupyter notebook --generate-config
jupyter notebook password

の後、passwordを入力することで、パスワードの設定が可能です。

Jupyter Notebookの起動

自分が使っているJupyter Notebook起動のためのスクリプトjupyter.shは次の通りです。

#!/bin/bash
#$ -cwd
#$ -l rt_F=1
#$ -l h_rt=24:00:00
#$ -o log/o.$JOB_ID
#$ -j y


source /etc/profile.d/modules.sh
module load gcc/7.4.0
module load python/3.7/3.7.6
module load cuda/10.1/10.1.243
module load cudnn/7.6/7.6.5
module load nccl/2.5/2.5.6-1
unset JOB_ID

source ./venv/bin/activate
jupyter notebook --ip=`hostname` --port=8888 --no-browser --notebook-dir=./

このコマンドを用意して、

qsub -g [group_id] jupyter.sh

と実行すると、rt_Fノード上でJupyter Notebookの起動が行えます。

Jupyter Notebookへの接続

Jupyter Notebookに接続するためには、起動したJupyter NotebookがABCI上のどのノードで起動したかを特定する必要があります。

qstat

を実行し、queueの項目の下にある、gpu@g0000などとある部分を確認しましょう。

g0000の部分をメモしたら、自分のPCのローカルのターミナル上で、

ssh -N -L 8888:g0000:8888 [abciへsshするために叩いているHostName]

を実行しましょう。自分の環境の場合は、

ssh -N -L 8888:g0010:8888 abci

といった感じになります。

これによって、ローカルPCから、ABCI上のJupyter Notebookまでのトンネルが確保され、ローカルPCのlocalhost:8888からJupyter Notebookへアクセスできます。

Jupyter Notebookをジョブ実行によって起動するメリットと注意点

メリット

  • インタラクティブノードの確保する際の制限である、12時間を超えてJupyter Notebookを起動できる。
  • インタラクティブノードが切断されることによって、実行途中の計算結果などが消えてしまうことがない。(ターミナルなどが閉じてしまっても、トンネルを通しなおせば、実行途中のノートブックが開けます。)
  • jupyter.sh内に環境を書くことができる。(インタラクティブノードで、毎回、必要なモジュールをmodule loadするのはミスが起こりやすい)(機械学習において、環境の差は再現性を壊す最大の原因の一つ)
  • コマンドが少なくて済むので、楽

注意点

  • Jupyter Notebookを起動したジョブは自動的に終了してくれないので、ポイントの無駄遣いになる可能性がある。

Jupyter Notebookの終了方法

Jupyter Notebookのジョブを終了する方法は3種類ほどあります。

方法1

f:id:deoxy:20201201213922p:plain ブラウザ上で、Quitボタンを押す

方法2

ABCI上で、

qdel jupyter.sh

を実行する

方法3

ABCI上で、qstatコマンドで、Jupyter Notebookを起動したジョブIDを調べて、

qdel [ジョブID]

を実行する

まとめ

ABCI上でJupyter Notebookを

  1. qsub -g group_id jupyter.sh
  2. ssh -N -L 8888:g0000:8888 abci
  3. localhost:8888へアクセス

の3ステップで起動できます。Jupyter Notebookを楽々起動して、楽しい機械学習ライフを!