大学の研究用GPUサーバーでJupyterノートブックを使う必要があったので、Dockerを使ってJupyterサーバーを立てた手順を備忘録としてメモっておきます。
Docker自体は既にインストールされており、利用に必要な権限があることを前提にします。
1. Dockerイメージの取得
まずはDocker HubからJupyterサーバーのイメージを取得します。
$ docker pull jupyter/tensorflow-notebook
今回はtensorflow用のイメージをダウンロードしましたが jupyter/tensorflow-notebook (イメージ名) の部分は用途に合わせてに合わせて変更してください。
2. 作業データ保存用のディレクトリの作成
基本的にDockerコンテナーは終了すると保存していたデータが吹っ飛んでしまいます。数時間かけて学習させて保存したモデルの重みパラメータが突然消えてしまうようなことは必ず避けたいですよね。
データを保持する方法はボリューム(Volumes)やバインドマウント(Bind Mounts)等があります。
今回はバインドマウントを使いました。ホスト機にあるディレクトリとDocker環境内にあるディレクトリ同期させることによってDockerコンテナーを終了してもホスト機側のディレクトリに保存したデータが残る方法です。
$ mkdir jsdir
3. Dockerコンテナーの構築
$ docker run -d --gpus '"device=0,1,2"' -v [データ保存用ディレクトリのパス]:/home/jovyan/work -p 21799:8888 --name [任意のコンテナー名] jupyter/tensorflow-notebook
コマンドの各部分の説明
docker run : 新しいDockerコンテナーを作成して実行するコマンド
-d : コンテナをバックグラウンドで実行するためのオプション
--gpus '"device=0,1,2"' : 利用したいGPUデバイスの指定。全てのGPUを使いたければdevice=all。GPUを使わない場合は無くても問題なし。
-v [データ保存用ディレクトリのパス]:/home/jovyan/work : バインドマウントのオプション。Dockerコンテナー内の/home/jovyan/workが指定したディレクトリとほぼリアルタイムで同期されます。
-p 21799:8888 : Dockerコンテナのポート8888とホスト機のポート21799間のポート転送
--name [任意のコンテナー名] : 任意のコンテナー名
jupyter/tensorflow-notebook : Dockerイメージ名
4. Jupyterサーバーにアクセス
この時点でコンソール画面に前のコマンドで指定した任意のコンテナー名が出力されていたら正常にコンテナーが稼働しているはずです。
トークンの取得
Jupyterサーバーは稼働していてもアクセスするのにトークンが必要です。
$ docker logs [コンテナー構築時に指定したコンテナー名]
このコマンドはコンテナーのコンソール出力を表示します。
上の画像にある赤枠に似た部分をコピー(2つとも同じです)
パスワードの設定
ブラウザーで http://[ホストサーバーのアドレス]:[コンテナー構築時に指定した転送ポート(21799)] を開きSetup a Password部分にスクロール。
Tokenのテキストボックスにコピーしたトークンを貼り付け、New Passwordのテキストボックスに任意のパスワードを入力し、Log in and set new password をクリック。
無事にログインすることが出来ました。
左側に表示されているworkフォルダーはコンテナー構築時に指定したホスト機のディレクトリと同期されていますがworkフォルダー外に保存するファイルやディレクトリはコンテナーを終了すると消えます。
5. 再ログイン
これでコンテナーを終了(ホスト機をシャットダウン)しない限りJupyterサーバーか稼働し続きますが別デバイスからアクセスしたりCookieを削除したりすると、ログイン時にトークン/パスワードを問われます。その時は、手順4で設定したパスワードやトークンでログインできます。
最後に
以上、 DockerでJupyterサーバーを建てた時の備忘録でした。誰かのお役に立てれば幸いです。
コメント
コメントを投稿