JupyterHubを活用した、いまどきの情報科学の教育環境簡単クラウド構築 (前編)

AIや情報工学やバイオインフォマティクスなどの「いまどきの情報教育環境」を、JupyterHubを使って簡単構築する方法をご紹介します

4月にもなると新入学生も入り、はじめての情報科学の演習授業を開始する学校もあるかと思います。ここ数年のコロナ禍の影響もあり、演習環境の提供を、学内の演習室利用だけでなく、在宅での参加なども新しく考慮しなければならない今の実情も踏まえ、セキュリティ上の制約やトラフィックの抑制など、学内のサーバからではなく、学外のクラウド環境において実施したいとの要望を相談される機会も増えてきました。

そのような演習環境の構築に簡単に安心して利用出来る仕組みを提供するのが、今回紹介するJupyterHubです。すでに国内外の多くの著名な大学で実践的に導入されていていますし、インタラクティブな教育環境を提供するオープンソースのプラットフォームとしては最適な方法だと思います。

既に利用されている方も多いと思いますが、JupyterHubが提供するJupyter Notebook(ジュピター・ノートブック)は、ブラウザー上で動作する対話型の実行環境として、最近の機械学習などのチュートリアル等のハンズオン環境では、既によく知られたアプリケーションとなっています。その優れた特徴としては、ドキュメントを中心とした環境が提供され、初心者でも課題の流れが理解しやすく、自身で問題解決や応用などに集中する事ができる等の点が挙げられます。

ただ、このJupyter Notebookの実行環境は、基本的には個人のPCにインストールして、1人のユーザが使う形態を想定しているため、複数の人が参加する授業で使うためには、演習室のすべてのPCにインストールする作業が必要でした。個人が利用する環境を等しく同じ状態に保つ事は割と難しいため、演習を受け持つ教員への負担も無視できません。そこでJupterHubは、Jupter Notebookを複数のユーザに利用してもらう事を想定して作られたプラットフォームで、Webブラウザーを使って複数のユーザが利用できる仕組みを提供してくれています。

サーバサイドで処理が実行されて結果を表示する仕組みのため、非力なクライアントPCでもネットワークに繋がっている環境ではあれば演習を行う事ができるなどのメリットがありますし、同一の利用環境を提供できるため、演習参加者個人に起きている状況を再現しやすく、把握しやすいメリットがあります。

今回は、多くの演習授業で想定できる人数として、100人以下のユーザ利用環境構築に提供されている「The Littlest JupyterHub」(TLJH)を使って、さくらのクラウド上で構築する例をご紹介します。もちろん、このような環境は、情報科学のハンズオンイベントなどでも応用できます。

想定する演習構築環境

  • 受講者の数は20名程度
  • 設定するサーバの数は1台(TLJH環境の為)
  • 高負荷のアプリケーションの同時利用は想定しない。(別の機会に紹介予定)
  • GPUなどを使うアプリケーションの利用は想定しない。(別の機会に紹介予定)
  • SSLの設定は環境構築に含めない(設定は構築後に可能です)

想定するシステム管理者と利用者

システム管理

システムの構築と管理を行うのは、クラウドを初めて利用する教員やアシスタントを想定

利用者

大学生や高校生などの演習参加者。ウェブブラウザなどによるログインなどの基本的な認証方法に関する知識は持っていて、各自がPCやPadなどの装置からインターネットを使う利用を想定

まず最初に考えておくこと

演習環境を構築する上で最初に考えなければならないのは、どのぐらいの性能の計算機を準備すべきかという事になります。まずは、計算機のスペックを考える上で大切な、メモリ・CPU・ディスクの3項目について挙げてみます。

メモリ

TLJHのインストール上の最小値としては1GBとマニュアルに提示されています。そして、システムが使うメモリとして実行時に128MB程度のオーバヘッドがあります。

次に実際の必要なメモリを推定するために、最大の同時使用ユーザの数と、それぞれのユーザ1人が利用するメモリを掛け合わせて、メモリサイズの概算見積を計算します。演習で大規模な配列に対する処理をする場合などでは多くのメモリを用意する必要があるなど、想定する演習のアプリケーションに依存する値になります。したがって、演習で使うメモリのサイズを知るには、演習内容のリハーサルを行い、Notebook上に表示される使用メモリサイズとして知るのが望ましいです。ただし、今回はクラウド上で構築するので、後からサーバをプラン変更し、メモリのサイズを変更する事は簡単にできます。これは、クラウドを利用するメリットと言えます。

CPU

CPUに関してもメモリとほぼ同様の考え方が適用できます。TLJHが消費するCPU使用率として20%の負荷を加算する必要があるとTLJHのマニュアルに説明されているので、これを最大の同時使用人数と1人あたりのCPU使用率の最大値を掛け合わせた値と合算する事で、必要とするCPUの数を算出します。例えば20人が40%の使用率を出すコードを実行した場合には、20%+20人x40%=合計820%となりますので、約9個以上のCPUを準備できれば良いという事になります。

ディスクスペース

ディスクスペースに関しても同様の考え方になりますが、演習用のシステムとして長期的に運用する場合には、利用者の延べ人数が使用するディスクスペースを用意する必要があります。演習内容によっては、特定の課題を行うために、より多くのディスクスペースを用意する必要性を考慮します。

ディスクのスペースに関しては、先に説明したメモリやCPUとは異なり、クラウドであっても容量を変更するには注意が必要です。また一般的に容量は、増やす事より減らす事の方が難しいケースが多いです。

サーバが持つディスクスペースを全体として増やす方法はいくつかありますが、簡単にいえば、より大きなディスクに入れ換えるか、別のディスクを追加するかの2つが挙げられます。より大きなディスクに入れ換える場合には、以前の情報を新たなディスクにコピーする作業が発生する点がCPUやメモリとは異なります。通常、コピーには多くの時間を要するため注意が必要です。

また、大きなサイズのディスクに入れ換えるのではなく、別のディスクを追加する場合には、追加されたディスクを適切にフォーマットし、適切な場所にマウントするなどのシステムに対する操作を理解しておく必要があり、間違った操作で構築するとサーバが思わぬ挙動を示す場合もあります。しかしながら、役割の異なるファイル領域を適切な単位に分割する事で、管理コストや不慮の事故などに対して対応しやすくなります。そこで、今回の例では可能な限り実践的な環境構築について紹介するため、複数のディスクで構成される例についても合わせて紹介したいと思います。

構成するディスクの役割は以下の3つとなります。

システム用ディスク

Ubuntu ServerのOSイメージ(/)が格納され、JyupterHubや実行環境に関連するソフトウェアが格納されているディスク。最低限単独に起動でき、演習のサービスも行うのに必要なディスク。JupyterHubのプログラムが格納される/opt以下のディレクトリも含まれます。

ユーザホーム領域用(/home)ディスク

ユーザ用のホーム領域として利用するディスク。通常はシステム用ディスクに作られる /home 領域を複製して、独立してマウントする形で構成します。演習の学生のHomeは、このディスク上で作成されます。したがって、このディスクをバックアップする事で、演習過程で作られるファイルはバックアップ対象として守る事ができます。

共有データ領域用(/data)ディスク

演習の際に必要とされる参照データや配布物などを演習参加学生に共有するためのディスク領域。演習に利用する実験データや画像、動画などを格納するのに使われます。

ユーザホーム領域用ディスクや共有データ領域用ディスクを持たない、システム用ディスク単独構成の場合には、ユーザホーム領域や供給データ領域として使えるスペースはシステム用ディスク上に作られます。

クラウド上で計算機を作る

1クラス20名程度の利用を想定した計算機の設計内容

  1. CPU:10vCPU
  2. メモリ:32GB
  3. ディスク:システム用(/) 20GB (1台) ユーザホーム領域用 (/home) 100GB(1台)共有データ領域用(/data) 100GB(1台)
  4. OS:Ubuntu Server 20.04.2 LTS 64bit (cloudimg)

実際の利用スペックは、構築する前に確認して、ご自身の演習環境に合う規模で設定を調整してください。

さくらのクラウドでの構築の基本的な知識

さくらインターネットの会員IDをすでにお持ちの方は、さくらのクラウドのログインページから、さくらのクラウドをご利用いただく事ができます。もし、ご利用の課金を大学・高等専門学校などの教育機関でお支払いを予定されている場合には、法人会員IDをお使いになる事を強くお勧めいたします。お持ちでない場合には、新規会員登録で法人種別を選んでいただき、新規に作成していただく事もできます。その際には、所属法人のお名前や部署名、メールアドレス等をご入力いただけます。法人での新規会員IDの登録時にも個人所有または法人所有のクレジットカードの登録が必要になりますが、後に請求書払いや単年度プリペイドなどの支払い方法を選択する事が可能となります。

さくらインターネットでは、単年度会計組織でのクラウド利用のために、法人アカウントに対してのみ「単年度プリペイド」という新しい支払い方法を提供しています。ご興味のある方は、本記事の末尾にある「この記事へのフィードバック」からお問い合わせください。

さくらのクラウドのログインページ

さくらのクラウドを初めてご利用の方もいらっしゃると思いますので、表示される画面を使って、できるだけ分かりやすく説明していきます。

まず左側の青いログイン画面と、右側の緑のログイン画面の2つがある事について、簡単に説明しておきます。青いログイン画面は、会員IDをお持ちのユーザのための入口になります。このアカウントを持つユーザは、「クラウドアカウント」という課金単位になるアカウントを作成し、そのアカウントに紐付くユーザを作成できます。

そして、右の緑のログイン画面は、そのクラウドアカウントに紐付いたユーザがログインする事ができる画面です。紐付ける時に設定される権限により、サーバ資源を作成したり、情報を回覧したりなどの操作が出来ます。

クラウドアカウントを設定した覚えがない場合には、左の青いログイン画面にて会員IDでログインして、クラウド利用のためのアカウントを定義して利用を開始します。

少し難しく感じられるクラウドアカウントですが、例えば予算の異なるプロジェクトをクラウドアカウントを使って個別に管理する事で、請求書を個別に分ける事ができるなどのメリットがあります。会員IDを持つ管理者が、作成したユーザに対して複数のクラウドアカウントでの権限を設定する事で、柔軟な管理が出来る便利なサービスです。複数のプロジェクトに同一の技術員が関わっていて、サーバを構築したり起動するなどの権限を渡したい場合などのケースで活用できます。

サーバ資源の定義と作成

先に紹介したログインページから会員IDを使って青いログインボタンを利用すると、下の画面のような8つのサービスメニューが表示されるコントロールパネルに進めます。このとき、右上にログインした会員IDが表示され、中央上の「現在のアカウント」には、これから行う操作の対象となる課金グループであるクラウドアカウントが表示されます。もし、何も表示されない場合には、左側のリストにあるアカウント項目を選択して、新しいクラウドアカウントを作成してください。

またログインページの右側にある緑のログインで入った場合は、そのログインしたユーザが利用できるアカウントが選択する事ができるようになっています。操作できる内容は事前に設定された権限の範囲になります。権限によって表示される項目も変化しますので注意が必要です。

会員IDを管理する管理者は、クラウドアカウントを新規に作成し、そのアカウントに紐付いたユーザも作成できますので、そのユーザの権限でリソースの作成や操作を行います。このような仕組みにより、ユーザがアサインされたクラウドアカウントで新規の計算資源を作成する権限を持っていれば、新しいサーバ資源を定義して作成する事ができます。

画面1 さくらのクラウドホーム画面

さくらのクラウドのアカウントで作られるユーザと、これから扱うJupyterHubの利用ユーザは別物になります。したがって、今回のケースでは、利用学生に対してさくらのクラウドアカウントのユーザを作る必要はありません。さくらのクラウドユーザは、サーバを作成したり起動できる権限を与えたい教員や技術員に対して発行するだけで必要十分です。

正しいアカウントが表示されている事を確認して、「さくらのクラウド(IaaS)」の項目を選択してください。

画面2 サーバリソース追加操作

次に表示されるのは、このようなサーバの一覧を表示する画面となります。右上に会員IDとクラウドアカウント名が合わせて表示されているはずです。今後操作する事で発生する課金をまとめる対象のクラウドアカウントになっている事を確認してください。

次に、左上に「石狩第2ゾーン」と表示されている部分をご確認ください。さくらのクラウドでは、東京第1ゾーン、東京第2ゾーン、石狩第1ゾーン、石狩第2ゾーンの4つの異なるゾーンで計算資源が管理されています。それらのゾーンごとに選択できる計算資源サイズ等も変わりますので、必要な資源が定義できるゾーンで作業を行ってください。

そして、「Sandbox」と呼ばれる特別なゾーン設定も提供されています。Sandboxは操作方法などを確認するのに利用できますが、実際の計算資源は作成する事ができません。さくらのクラウドの操作に慣れるためにSandboxを使って操作してみて、サーバ資源を作成する際に必要なオプション項目の内容などを試してみたり、どのようにコントロールパネル上に表示されるのかなどを練習する事ができます。ヘルプにあるマニュアルを見ていただくと、操作方法について詳しく案内されています。

画面中央上にある「追加」のボタンを押していただくと、新しいサーバリソースを定義する画面が表示されます。今回は石狩第2ゾーンでサーバの追加を行っていきます。

画面3 サーバ追加に必要な項目

設定項目が多いので、上から順番に見ていきます。

サーバを追加する場合は、サーバプランとディスクを決める事から始まります。サーバプランには「通常プラン」と「コア占有プラン」がありますが、今回は通常プランを選択します。演習を行ってみて、多くのユーザが同時に使う際に動作が不安定になるなどの事象があるようであれば、コア占有プランを選択してみてください。課金単価は上がりますが安定感は増します。通常プランとコア占有プランでは、選べるコア数やメモリの組み合わせが変わる場合がありますので、希望の組み合わせに一番近い物を選択してください。

経験上、演習環境での利用は、同時利用といっても各ユーザの操作が分散する事が多く、よほど長い時間にわたって実行する、負荷の高い題材の演習でなければ、サーバ全体に過度な負荷を与える事はないと思われますが、実際に行う演習に合ったリソースの組み合わせを事前にテストする事をお勧めします。

次にディスクを定義します。CPUやメモリと違って、ディスクにはインストールするOSの種類や、利用するユーザのアプリケーションの情報の書き込みが必要なので、設定する項目が少し多くなります。

ディスクの設定項目の、「新規ディスクを作成」「SSDプラン」「アーカイブ」、そしてアーカイブの種類として「Ubuntu Server 20.04.2 LTS 64bit (cloudimg)」を選択してください。もし、何らかの理由で「Ubuntu Server 18.04.5 LTS 64bit (cloudimg)」を選択する必要がある場合でも、問題なく起動する事ができます。今回の説明ではcloud-initを使う例を示すので、同じUbuntuでも、”cloudimg”と表示されるアーカイブを選択してください。利用するTLJHではUbuntuを使うように指定されていますので、CentOSなどのOSは対象外となります。

次にディスクのサイズは、最小サイズである20GBを選択します。演習環境のJupyterHubでは、ユーザごとにHomeスペースとしてのディレクトリを作成し、書き込むスペースを定義するため、各ユーザはそれぞれのスペースを使って作業を行います。したがって、演習過程では同様なファイルが人数分作成されます。よって、今回の20名という想定のユーザ数では、1人あたり約5GB程度のスペースを割り当てると合計で100GB必要になり、ここで指定している20GBのスペースでは足りません。そこで後半の記事で、追加のディスクを設定する事でユーザが利用できる領域を拡大する方法を説明しますが、設定初期の段階では20GBで十分なサイズです。またディスクの追加を望まない場合は、この時点でユーザ領域に必要な量を満たすサイズのディスクを選択する事で、後半説明するディスクの追加をすることなく演習に利用できますので、実際の演習に合わせて適切なサイズを選んでください。

画面4 ネットワーク(NIC)の設定項目

NICの項目は「インターネットに接続」にチェックをいれてください。この場合に作成されるサーバは共有セグメントと呼ばれるエリアにネットワークのインターフェースが作成され、帯域は100Mbpsのベストエフォートとなります。20名程度の同時アクセスであれば、経験上大きな問題にはならないと思います。

画面5 起動時のサーバの設定(cloud-init項目)

起動時のサーバの設定に関する項目を設定していきます。先に選択したUbuntuのCloudimgのアーカイブではcloud-initがインストールされ、起動時にさまざまな設定を行う事ができますが、認証には公開鍵の設定が不可欠となります。公開鍵についての詳しい説明はここでは割愛します。ネットで「ssh公開鍵作成方法」で検索すると、わかりやすい説明を見つける事ができます。この公開鍵は、ご自身が使われている端末から、作成したサーバにログインする事を目的した鍵となります。公開鍵が収められているファイルの中身のテキスト(つまり公開鍵)を、必ずコピー&ペーストで貼り付けるようにしてください。

次にcloud-initに実行してもらうコマンドも同様に、コピー&ペーストで貼り付けてください。この貼り付けたコマンドは、JupyterHubの構築に必要な複雑な設定をすべて行ってくれます。これまでの手順に問題がなければ、演習に使う事ができるサーバを5分程度で自動的に設定して、すぐに利用出来るようになります。

以下の例では、演習の環境構築に便利な認証や環境オプションを指定して起動する例を提示しています。

runcmd:
  - export USERNAME="admin123"
  - export USER_ENVIRONMENT="jupyterlab"
  - export AUTHTYPE="NativeAuthenticator"
  - curl -fsSL https://raw.githubusercontent.com/f-konishi/tljh-quickstart-script/main/publicscript/tljh-quickstart.sh | bash

パラメータの意味は以下の通りです。

パラメータ名設定値備考
USERNAMEadmin123管理ユーザの名前となります。必ず指定してください。ご自身でわかりやすい名前に変更していただいて大丈夫です。JupyterHubへの最初のログイン時に必要になりますので、忘れないようにしてください。この時点ではパスワードは必要ありません。パスワードの設定は、最初のログイン時に自分で指定します。
USER_ENVIRONMENTjupyterlabjupyterlabを指定しない場合には、””を指定してください。
AUTHTYPEAUTHTYPE利用ユーザは自分でサインアップをして、adminユーザが各アカウントをオンラインで承認する事で有効化する方式です。
画面6 サーバの作成ボタン

最後に作成ボタンを押すと、サーバの作成が開始されます。サーバの作成状態を表すポップアップが画面に表示されるので、最後の行の「すぐに起動」が成功のステイタスになるのを待ってください。

すべての項目で成功のステータスが表示されたら、閉じるボタンを押してもらって大丈夫です。

画面7 サーバ追加後の画面表示例

正しくサーバが起動すると、サーバ一覧に今回作成したサーバを表す行が表示されます。このときに正しいCPU数とメモリ量が表示されているかを確認し、NICに割り当てられたサーバのIPアドレスを確認してください。アドレスの右側にあるアイコンをクリックするとIPアドレスをコピーする事ができます。

画面8 新規に作成されたサーバの画面上の表示

sshでログインして設定進行状況を確認する

先ほどコピー&ペーストした公開鍵が正しければ、以下のコマンドで、起動されたサーバにsshを使ってログインする事ができます。初めて公開鍵でログインする際はフィンガープリントについて聞かれますが、yesを打っていただくと接続処理が進行して、ubuntuのコマンドプロンプトが表示されたらログイン成功です。

$ ssh ZZZ.ZZZ.ZZZ.ZZZ -l ubuntu
The authenticity of host 'ZZZ.ZZZ.ZZZ.ZZZ (ZZZ.ZZZ.ZZZ.ZZZ)' can't be established.
ECDSA key fingerprint is SHA256:+T6oA+sqAQ919vSC4P1q1O8co+t2hgTGg.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

           :
           :
           :

ubuntu@sv:~$

続いて、以下のコマンドにより、サーバが設定されていく過程を見る事が出来ます。最初の行から、最後の「Done!」まで約5分程度の時間を要します。「Done!」が表示されたら、JupyterHubを起動する事が可能になります。

ubuntu@sv:~$ sudo tail -f /opt/tljh/installer.log

今回のように、常に直接サーバにログインして確認する必要はありません。ただ、起動後にオプションの変更やhttpsの設定等の操作をする場合はサーバにログインする方が良いケースがありますので、ログインできる事は覚えておくと良いでしょう。今回の例ではパスワード認証よりも公開鍵認証が優先される設定になっていますが、ubuntuユーザのパスワード認証が必要になるケースもありますので、パスワードでもログインできるように設定しておくことをお勧めします。

JupyterHubの操作

起動したJupyterHubに初めてのアクセス

作成したサーバに割り当てられたIPアドレスに対してブラウザでアクセスし、次のようなJupyterHubのSign In画面を見る事ができたら、サーバ構築の成功を確認できた事になります。

次に、画面下部に”Signup!”というリンクが表示されていたら、”NativeAuthenticator”のオプションが有効化できている事を示しています。

画面9 JupyterHubのサーバのサインイン画面

サーバ作成時に設定した管理者アカウントは、cloud-initでUSERNAMEの項目に設定した”admin123”になります。これは構築時にユーザ名だけ設定されている状態で、パスワードはまだ設定されていません。そのため、このアカウントでのログインができない状態です。そのため特別な状況での操作として、”Sign Up”画面で同じユーザ名にパスワードを指定する事により、管理者アカウントでログインできるようになります。

事前に作成した管理者アカウントでログインする

“Sign Up”画面で、cloud-initのUSERNAMEで指定した管理者ユーザ名と、このユーザ名で使いたいパスワードを決めて入力してください。ここで入力したパスワードが管理者のパスワードとなります。

画面10 事前設定した管理者ユーザ名でのパスワード設定(サインアップ)

USERNAMEの”admin123”とパスワードを指定して、”Create User"ボタンを押します。初期管理者ユーザ名はサーバ構築時にcloud-initにてすでに設定されており、このユーザに対してパスワードを指定することができます。したがって、初期管理者ユーザ名を知らなければパスワードの設定ができない仕組みとなっています。

この初期管理者ユーザ名以外のユーザとパスワードを指定した場合には、新規のサインアップユーザとして認識され、管理者によって承認されない限りログインする事はできません。したがって、初めてサーバを起動した際には、速やかに初期管理者ユーザのパスワードを設定し、管理者としてログインする事を強く勧めます。長期間運用する事も考えられるので、ある程度強度のある長めのパスワードを設定してください。

画面11 サインアップの成功画面

次にダイアログ上のLoginリンクをクリックして、管理ユーザ名(admin123)と設定したパスワードを入力して、システムの管理者としてログインします。これで、管理者としてJupyterHubにログインしたことになり、Jupyterlabの画面が表示されます。

画面12 管理者でのログイン
画面13 管理者としてログインした際に表示されるJupterlab画面

管理者メニューの表示

Jupyterlabは管理者メニューの表示が少しわかりにくいですが、Fileメニューの中のHub Control Panelを選ぶ事で、管理画面を表示する事ができるようになります。

画面14 管理者画面への移動方法

ユーザの登録方法について

オンラインの演習を管理するにあたって、ユーザの登録管理は主要な作業の1つになります。JupyterHubでNativeAuthenticatorオプションを選択して構築した環境では、その登録作業において2つのオプションを提供してくれます。

1つは、Add Usersを使って管理者が明示的にユーザのリストを登録する方法です。2つ目は、Sign Upによって、ユーザ自身がユーザ名とパスワードを入力する方法です。後者の方法は管理者によって承認される事でユーザが利用可能になる仕組みです。

演習での利用では、学籍番号と名前を組み合わせたユーザ名と、各自が決めたパスワードで登録させて、教員が承認するのが現実的な利用形態かと思われます。JupyterHubにはOAuthを使った認証やLDAPを使った認証方式も用意されています。今回の利用の範囲を超えてしまうので説明は割愛しますが、柔軟で現実的な認証の仕組みを利用する事ができます。

このようにしてユーザの登録ができると、JupyterHubを使った演習を実際に行う事ができるようになります。

画面15 管理者画面

管理者用画面では、管理者によるユーザ登録を行うメニュー項目と、ユーザ自身によるサインアップを承認するメニュー項目が提供されます。また、それぞれのユーザごとに、提供するJuypter notebookのサービスを起動・停止する事も可能です。

管理者権限を複数のアカウントに付与する事も、この管理者画面から操作可能ですので、複数の教員による運用も可能です。

画面16 ユーザを一括で登録する画面
画面17 サインアップユーザの承認画面

続きは後編で

本記事では、情報教育の演習環境の構築を想定して、必要なスペックの算出、さくらのクラウド上にJupyterHubをインストールしたサーバの構築、JupyterHubへのログイン方法やユーザの登録管理方法を説明しました。

後編の記事では、演習環境の運用において必要となる作業として、サーバの停止・起動方法や、サーバのスペックを変更する方法を解説します。