Jupyter Notebook から ABCI の python仮想環境で tensorflow+keras を利用する

手元のWindows PCのWeb Browser から ABCI の tensorflow, keras, jupyter notebook を利用できるようにするための備忘録。

Python の仮想環境を用いる。

Windows 10 PC

まず、Windows PC での準備をする。

説明のためのPowerShellの前提

カレントディレクトリ

ユーザのホームディレクトリで作業する。

PowerShell を管理者権限以外で起動するとカレントディレクトリはホームディレクトリになっているはず。

管理者権限でPowerShellを起動した場合には以下のコマンドを実行する。

Windows Terminal

Microsoft Store からインストール済みとする。

公開鍵と秘密鍵の生成

手元のPCで、sshの公開鍵認証のための鍵をエドワーズ曲線デジタル署名アルゴリズム ed25519 によって生成する。

下記の操作で以下の2つのファイルが生成される。パスフレーズを入力する。

秘密鍵 ~/.ssh/id_ed25519_ABCI_key

公開鍵 ~/.ssh/id_ed25519_ABCI_key.pub

ssh-keygenのオプションの意味は以下の通り。

-t は、署名アルゴリズムを指定するオプション

-f は、生成するファイル名を指定するオプション

-C は、コメントを指定するオプション

公開鍵を ABCI に登録

https://docs.abci.ai/portal/ja/02/#23 に従って公開鍵 ~/.ssh/id_ed25519_ABCI_key.pub をアップロードして登録する。

~/.ssh/config の設定

https://docs.abci.ai/ja/02/ に従って、手元のPCで ~/.ssh/config を設定する。User の行の axx12345xx は ABCIのユーザアカウント名に($env:abci_user の値と同じになるように)変更が必要である。

ABCI へのログイン

先に示した ~/.ssh/config が設定してあれば、次のコマンドでインタラクティブノードにログインできる。

パスフレーズを2回入力する必要がある。1回はABCIのアクセスサーバーのため、もう1回は、インタラクティブノードのため。

ABCIでは、アクセスサーバー、インタラクティブノード、計算ノードでファイルシステムが共有され、同じ鍵が用いらる。

ABCIでの設定

https://docs.abci.ai/ja/tips/jupyter-notebook/ に従って設定する。

python仮想環境の生成

インタラクティブノードにログインした状態で以下のコマンドを実行して仮想環境 ~/venv/jupyter-tensorflow-keras を作成する。

仮想環境の設定

仮想環境の有効化

仮想環境 ~/venv/jupyter-tensorflow-keras を有効化する。

仮想環境への tensorflow、keras、jupyter のインストール

有効化した仮想環境で必要なモジュールをインストールする。必要とするモジュールによって必要なものは異なる。以下はあくまで例である。

tensorflowでGPUを用いるために tensorflow-gpu を指定しており、keras もインストールしている。

jupyter notebook も利用するので、 jupyter もインストールしている。

他に、numply、sklearn、matplotlibもインストールしているが、使わないのであればインストール不要である。

(2020年12月19日)以下のバージョンの組み合わせではGPUが利用されない。不適切なので使うべきではない。

(2020年12月20日)以下の tensorflow-gpu と keras のバージョンの組み合わせでGPUが利用されるようである。ただし、警告が出る。

Jupyter Notebook から計算ノードの利用

手元の Windows 10 PCで、3つのターミナルを利用する。

環境変数

始める前に、以下の環境変数の設定がされているとする。

PowerShellの環境変数

ABCIのユーザやグループなどは個人によって異なるので、以下の説明では、手元のPCで次のPowerShellの環境変数が設定されているとする。

$env:abci_user は、ABCIアカウント名である。

$env:abci_group は、ABCIグループ名である。

$env:abci_key_file は、ABCIとの通信の際にSSHで利用する認証のための秘密鍵ファイル名である。

上記スクリプトを .\ABCI.ps1 として保存し、それを実行することもできる。

ただし、スクリプトを実行できるようにする設定が必要である。

管理者権限で次のコマンドを実行すれば、ローカルファイルの実行は許可される。

ABCI の bash の環境変数

ABCIの bash でも環境変数を設定しておく。~/.bash_profile に以下を追加して、ログイン時に設定されているものとする。

ABCIで利用しているshellがbash 以外なら、適宜修正が必要になる。

ABCI アクセスサーバーへのPort forwarding

1つ目のターミナルで、Windows 10 PC から ABCI アクセスサーバーへのport forwarding の指定をする。

パスフレーズを1回入力する必要がある。

localhost の 10022番port を アクセスサーバーの22番(ssh)に forwarding する。ポート番号は10022である必要は必ずしもないが、ここを変更したらこれ以降の10022も変更する必要がある。

Jupyter Notebook Serverの起動

2つ目のターミナルで、まず、Windows 10 PC からABCI インタラクティブサーバーにログインする。

1つ目のターミナルで設定したPCとアクセスサーバー間のトンネルと同じトンネルが張られて2本になり、パスフレーズを2回入力する必要があるので無駄な感じがあるが、以下のようにするのが簡単であろう。

無駄が気になるようなら、次のようにコマンドを手打ちしてもよい。

必要があれば、~/.ssh/config に設定を追加する。

次に、インタラクティブサーバーから計算ノードに接続する。

計算ノードで次のコマンドを実行して 仮想環境に入る。

計算ノードのホスト名を必要に応じて調べる。

ここで表示される g1234.abci.local の中のg1234などの計算ノード名を $env:abci_node としてこれ以降では参照する。

Windows Terminal を使っていれば、タブのタイトルにノード名が示されるので、hostnameを実行しておく必要は必ずしもない。

仮想環境で Jupyter Notebook Server を起動する。

次の赤枠で示される、http://127.0.0.1:8888/?token=… を後で利用する。

Jupyter Notebook Serverとの通信のためのPort Forwarding

3つ目のターミナルで、Windows PC からJupyter Notebookが利用するポート 8888 にアクセスした際に、計算ノードのポート 8888 に転送されるように設定する。

localhostのポート8888のアクセスが計算ノードの8888に転送されるようにする。既に設定済みの localhostのポート10022からアクセスサーバーのポート22番のトンネルを介して転送される。

次のコードでは${abci_node}で示す計算ノードのホスト名が必要になるが、Jupyter Notebook Serverを起動したWindows Terminalのタブにホスト名が示されているのでそれを指定する。次の "g1234" を変更する必要がある。

パスフレーズを入力して、計算ノードにつなぐ。

本来なら $env:abci_node が自動的に設定されるようにしたいが、異なるPowerShell間で情報の受け渡しが必要になるので、Windows Terminal ではうまくできない。

Web BrowserからJupyter Notebook Serverへのアクセス

Jupyter Notebook Serverを起動時に表示された http://127.0.0.1:8888/?token=???? の形式のURLを Web Browserからアクセスする。

この例では、URLは、http://127.0.0.1:8888/?token=714e57991e37c35e941556bd59f6a381a81863c13973715f

Jupyter Notebookのファイル表示がされればうまくアクセスできるようになったことになる。