リモート開発メインのソフトウェア開発企業のエンジニアブログです

JupyterHub のセットアップ

JupyterHub は、名前からある程度想像つくとは思いますが、大雑把に言って Jupyter Notebook が複数人で使えるような環境です。

Project Jupyter | JupyterHub

今流行りの Kubernetes を作って、大規模環境にインストールすることも出来ますが、今回は1台のマシンに JupyterHub をインストールして複数人で使えるようにしてみます。

やりたいこと

やりたいことは以下の通りです。

  • 社内メンバー複数人で1台のマシンを使い回す
    • (ゲーム用の)GPU が載った PC が1台余っていたので
  • 主に機械学習の勉強、簡単なプロジェクト用
    • お客様向けの本格的なプロジェクトの場合は、環境をお客様に用意していただく事が殆どのため
  • 基本的には、ブラウザ上で機械学習の作業を完結させる

やることの概要

今回以下の事を行いましたので、順に説明していきます。

  • JupyterHub のインストール・設定
  • Let’s Encrypt を使って、SSL 化する
  • 実際に使ってみる

環境は以下の通りです。

  • Ubuntu 18.04
  • GeForce GTX 1080 Ti

JupyterHub のインストール・設定

JupyterHub を1台のマシンにインストールする構成を The Littlest JupyterHub (TLJH) と呼ぶようですが、セットアップ方法は以下のページにまとまっています。

Installing on your own server — The Littlest JupyterHub v0.1 documentation

インストール

以下の通りインストールします。コマンドラインで管理者ユーザーのユーザー名を指定します。

sudo apt install python3 python3-dev git curl
curl https://raw.githubusercontent.com/jupyterhub/the-littlest-jupyterhub/master/bootstrap/bootstrap.py | sudo -E python3 - --admin <admin-user-name>

ユーザー管理

管理者ユーザーは、前項の通りインストール時に指定しましたが、それ以外のユーザーはどのように管理されているのでしょうか。

以下のドキュメントに記載の通り、デフォルトでは PAMAuthenticator というのが使われており、その名の通り認証に PAM が使われます。ローカル(Linux 上)に存在するユーザーであればログイン可能です。

Authenticators — JupyterHub 1.0.0 documentation

OAuth など、それ以外の認証方式も選ぶことが出来ます。主なものは以下のページに記載があります。

Authenticators · jupyterhub/jupyterhub Wiki

設定変更及びスタンドアロンでの起動

JupyterHub の設定を変更するには、以下のコマンドでデフォルトの設定ファイルを出力します。

jupyterhub --generate-config

実行したディレクトリに jupyterhub_config.py というファイルが出来ていると思いますので、 /etc/jupyterhub/ というディレクトリを作ってそこに入れると良いと思います。

JupyterHub をスタンドアロンで動かすには、以下のコマンドを実行します。

jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

DockerSpawner を使うように設定

JupyterHub で各ユーザーが作成した notebook は、JupyterHub の “spawner” が新たなプロセス等を起動して、そこで実行されます。

spawner の種類には色々あるのですが、今回は DockerSpawner を使用します。DockerSpawner は、各ユーザーの notebook 環境を Docker コンテナとして起動します。そして、少しややこしいのですが、DockerSpawner にも3種類あって、今回はそのうちの SystemUserSpawner というものを使用します。

インストール方法などは、以下のページを参照して下さい。

jupyterhub/dockerspawner: Spawns JupyterHub single user servers in Docker containers

dockerspawner.DockerSpawnerdockerspawner.SystemUserSpawner の違いがドキュメントだと分かりにくいのですが、前者はどの JupyterHub ユーザーに対しても同じ環境でコンテナを起動するのに対して、後者は各システムユーザー(Linux ユーザー)の権限・環境でコンテナを起動します。

前述の通り、今回は PAMAuthenticator を使っていますので、JupyterHub のユーザー = システムユーザーです。従って、SystemUserSpawner を使う事にしました。

自動起動するように変更

ここまでで、設定は大体完了です。このままだと JupyterHub の起動をコマンドラインで毎回やらなければいけなくて面倒なので、systemd に登録して service コマンドで起動できるようにします。

以下のようなファイルを /etc/systemd/system/jupyterhub.service として作成することで、他のサーバープロセスなどのように service jupyterhub start で起動できるようになります。

[Unit]
Description=Jupyterhub
After=syslog.target network.target

[Service]
User=root
ExecStart=/usr/local/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py --port 任意のポート --ip 0.0.0.0

[Install]
WantedBy=multi-user.target

Let’s Encrypt を使って SSL 化

概要

ここまでで、http://ホスト名:ポート番号 で JupyterHub にアクセス出来るようになりましたが、ログインパスワードなどが平文で流れるのは抵抗があるため、サイトを SSL 化します。

いくつか方法はあると思いますが、今回の JupyterHub は主に勉強用のためなので、Let’s Encrypt を使って無料の証明書を取得します。また、Let’s Encrypt の証明書インストール方法にもいくつかありますが、今回は Certbot を使用します。

Certbot

インストール

以下のドキュメントにまずは目を通します。

インストール手順は以下の通りです。

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

sudo apt-get install certbot

sudo certbot certonly --standalone

証明書の更新

Let’s Encrypt の証明書は有効期間が90日間ですが、上のインストール処理を行う事で、更新処理の systemd timer もインストールされます。興味のある方は以下のファイルを覗いてみて下さい。

  • /lib/systemd/system/certbot.timer
  • /lib/systemd/system/certbot.service

更新処理が正しく動くか(設定が正しいか)を確認するために、以下のコマンドで dry run 処理を行えますので、一度は確認すると良いと思います。

sudo certbot renew --dry-run

設定

jupyterhub_config.py に以下のように記載します。

c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/{mydomain.tld}/fullchain.pem'
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/{mydomain.tld}/privkey.pem'

ssl_cert の方に fullchain.pem を、 ssl_key の方に privkey.pem を指定します。逆にならないように気をつけましょう(私は最初逆に設定してしまい、しばらく時間を浪費してしまいました。)

使い方

まずは、 https://ホスト名:ポート番号 にアクセスします。ログインには Linux ユーザーのユーザー名とパスワードを使用します。

その後は、JupyterNotebook を使った事があれば問題無く使えると思います。

Notebook からは、Linux サーバー上のファイルも参照できるため、データファイルなどは scp などで事前にサーバー上にコピーしておきましょう。

まとめ

JupyterHub を使うと、1台のサーバーを複数人で共用する機械学習環境が簡単に作れます。(JupyterHub 自体は、複数台環境にも対応しています。)

本格的な学習作業は、AWS の GPU インスタンスなどを使う必要があるかもしれませんが、弊社では主に以下の用途で問題無く使えています。

  • 機械学習初心者の勉強用
    • メンバーは自由に使用可能
  • 小規模R&Dプロジェクト

弊社では、今後、機械学習関連の仕事が増えていくと思いますので、引き続きサーバー増強など環境整備などを進めていこうと思っています。

弊社でのお仕事にご興味のある方などは、以下のページよりお気軽にお問い合わせ下さい。

お問い合わせ – もばらぶん

← 前の投稿

Firebaseのためのお手軽な開発環境2

次の投稿 →

Firebaseのためのお手軽な開発環境

コメントを残す