PyCon JP 2019 の発表資料です
Kubernetes(k8s)とJupyterHubで構築する機械学習eラーニングサイト2019.09PyCon JP 2019Koichi Ishida (@wapa5pow)
View Slide
⾃⼰紹介• Koichi Ishida (@wapa5pow)• => => =>• 10Xで献⽴アプリのタベリーを開発• 他のスタートアップ⽀援もしている今回は⽀援先の「株式会社 STANDARD」の事例
JupyterHubとは(https://jupyter.org/hub より)• 複数ユーザにJupyter Notebookを提供する• ユーザはブラウザだけで環境構築必要なし• ユーザ(⽣徒・研究者・データサイエンティストなど)は管理された共有リソースを使ってNotebookを使える
⼤学などでの教育でPythonistの育成に効果的•⽣徒側で環境構築不要。ブラウザを使って、すぐ本質の学習へ•演習課題を提出させたり、点数をつけれる(nbgraderプラグイン使⽤)•共有のリソース(CPU, Memory)なので無駄にリソースを消費せず⾼速にモデルの学習ができる
発表で伝えたいこと⭐1. 機械学習eラーニングの⽣徒が最初に⼤きくつまずくのは機械学習環境構築。JupyterHubを使うとブラウザがあればすぐ学習が始められる環境ができる2. 既存サイトにどのようにJupyterHubを導⼊するか
⽬次1. なぜ機械学習環境構築は⼤変か2. AI_STANDARDの紹介3. 既存のサイトにどのようにJupyterHubを導⼊するか4. 運営ノウハウ
1-1 ⽣徒がローカルで環境構築する場合1. スペックのいいPCを⽤意2. Python環境の構築3. 機械学習⽤パッケージ(scikit-learn,TensorFlow, Keras等)をバージョンを指定してインストール4. ローカルでJupyter Notebookを⽴ち上げ学習開始
1-2 JupyterHubを使うと1. ブラウザを⽴ち上げる
1-3 JupyterHubの仕組み
1.4 なぜGoogle ColaboratoryではなくJupyterHubなのか• Pythonパッケージのバージョンを固定できる• 事前にコンテンツファイルを⽤意できる• Notebookファイルを運営と簡単に共有できる• サイトの同じドメイン上で⾃動でログインでき、サイト内のコンテンツとして提供できる
JupyterHubを導⼊したい︕でもどうやって︖
ちょうどいいAI_STANDARDの事例があるので紹介します
1年前にSTANDARD社からエンジニアリング⽀援の依頼がありました
2.1 1年前のシステム
サイトのページ例
依頼内容#•ブラウザ上でユーザごとにテキストに応じたJupyter Notebookのファイル(.ipynb)を実⾏して写経させたり課題を提出させたい
テキストに応じたJupyter notebookを右ペインに表⽰
機械学習は環境構築が⼤変$ ⽣徒ローカルのPCに機械学習の環境を構築するのに時間と⼿間がかかる% 運営構築のサポートに時間が取られ本来必要な学習のサポートの時間が少なくなる
解決策⚡JupyterHubとk8sで⽣徒がブラウザ上で機械学習を実⾏できるようにする
Demo
コンテンツに応じたJupyter notebookを右ペインに表⽰
AI_STANDARDサイトの紹介•AI⼈材育成に特化した法⼈研修eラーニングサイト•実践重視・体系的・⼿厚いサポート体制で 92%の講座修了率を実現•ブラウザのみでPython, scikit-learn, Kerasなどが実⾏できる• ローカルPCへの環境構築不要
AIエンジニアリング講座-1
AIエンジニアリング講座-2
AI_STANDARDサイトの機能
現在の構成
3.1 k8sの導⼊
3.2 DX(Developer Experience) 向上# 開発者•⼿でデプロイするのだるい•いつデプロイされたのかわからない•エラーが起こっても通知もこないしスタックトレースもわからない
解決策⚡
3.3 フロントエンド開発改善$ ⽣徒クリックするたびにロードが⾛りシームレスな体験ができない# 開発者中規模のサイトを効率的に構築したい
解決策: Nuxt.jsの導⼊ ⚡
Nuxt.js導⼊の理由• SPAでユーザ体験があがる• コンポーネントの再利⽤で開発の⽣産性があがり表現できることが増える• Reactなどに⽐べVue.jsの学習コストが低い(と感じる)• ルーティングなど規約にそえば、実現したい機能に集中して開発できる
3.4 Kubernetesの嬉しいところ•インフラをコードで記述できる•アプリケーション間の連携が楽•オートスケールが簡単に設定できる•クーロンの管理が楽(再実⾏や並列処理の禁⽌も設定でできる)•etc…
3.5 GKEの嬉しいところ•Podなどの標準出⼒・エラー出⼒が⾃動でLoggingに出る•さらにそれをフィルタしてBigQueryにエクスポートできる•k8sのメンテナンスが楽•k8s⽤のダッシュボードが充実
Podなどの標準出⼒・エラー出⼒が⾃動でLoggingに出る
k8sのメンテナスが楽
k8s⽤のダッシュボード
3.6 JupyterHubをk8s上に構築すぐできます
JupyterHubのk8sへのインストール
JupyterHubインストール後の構成
JupyterHubの内部構造
インストールしたてのJupyterHub
JupyterHubのAuthenticatorを設定しない場合
ユーザがサイトを開いたときにログインしていればJupyterHubにもログインさせていたい3.7 JupyterHubの認証を既存サイトと統合
解決策⚡JupyterHubのCustomAuthenticatorを使う
ユーザ認証
JupyterHubのCustomAuthenticatorの設定•HubにCookieに保存したTokenで認証できるようにしたtoken_authenticator.pyをコーディングし、Dockerfileで追加しビルド•config.yamlにtoken_authenticatorを使うように設定
config.yamlDockerfile
URL: /chapters/75/coding/chapter_contents/ml7_1.html3.8 Notebookにコンテンツを配置したい
URL: /chapters/75/coding/jupyterhub/…/ml7_code.ipynb/chapter_contents/ml7_1.html3.8 Notebookにコンテンツを配置したい
解決策: Notebook⽴ち上げ時にファイルを取得・更新⚡•Notebookコンテンツはgitで管理•Notebookが⽴ち上がったときにgitのリポジトリとシンクする(Jupyter serverextensionのnbgitpullerを利⽤してk8sのContainer Lifecycle HooksのpostStartで更新)
config.yamlコンテンツの設定
ここまでで⼀通りJupyterHubを既存のサイトに組み込めました
はノウハウマーク
テキスト・Notebookファイルの追加や誤字脱字の更新をした際にNotebookが、CPUやメモリを想定以上に消費したり、エラーで実⾏できない4.1 テキストを安全に更新
テキスト・Notebookファイルの例
jupyter nbconvertとtimeコマンドを使いCircle CIでビルドし実⾏できるか確かめる解決策⚡
nbconvertの実⾏コマンド実⾏結果
エラーになったときなどに表⽰されるテンプレートが英語なので⽇本語表記にしたい解決策⚡Hubの設定でCustom Templatesを使⽤4.2 Jupyter Hubページのカスタマイズ
テンプレートの変更例
テンプレートの変更Dockerfileフォルダ構成
写経する際にバージョンの違いでエラーにならないように、Notebookのパッケージのバージョンを固定したい解決策⚡DockerfileでNotebookをビルドしてそれを使う4.3 パッケージのバージョン差異
再掲: JupyterHubの内部構造
Jupyter Docker Stackshttps://github.com/jupyter/docker-stacks
Notebookイメージの設定config.yamlDockerfile
ユーザがサイト上でNotebookの演習課題を提出し運営チュータがサイト上で採点したい解決策⚡JupyterHubのAdmin機能を使う4.4 演習課題の採点
演習課題の例
JupyterHubのAdmin画⾯
チュータ⽤の採点ページ
コンテンツの質を継続的に改善したい解決策⚡•進捗や問題の正答率を分析•各コンテンツのNotebookのセルの実⾏数を保存して分析4.5 コンテンツの改善
Message Extensionの説明
ユーザ数が時間によって増減しても適切なマシン数で運⽤したい4.6 スケール
解決策(1): cull-idleサービス⚡config.yaml
解決策(2): k8sでCPUとメモリを制限しオートスケールさせる⚡•コンテンツのCircle CIでの実⾏結果をもとに最⼤CPUと最⼤メモリを決定(limit)•保証CPUと保証メモリを決定(guarantee)
スケールアウト時に短い起動時間でNotebookを起動したい⚡ 解決策config.yamlでuserPlaceholderを使う4.7 スケール時の起動時間
userPlaceholderはNodeがNotebookのポッドでいっぱいになる前にオートスケールさせる仕組み
k8sクラスタ内にPodとしてNotebookが動いても安全に運⽤したい解決策⚡• 新しいパッケージのインストール不可• Notebookでdisable_user_config• k8sのNetwork Policyの適⽤4.8 セキュリティ
Eラーニングを修了したユーザのディスクを残したままにするとコストがかかる解決策⚡基準をもうけてディスク(PVC:PersistentVolumeClaim)を削除する4.9 無駄なリソース削除
JupyterHubやサイトを安定運⽤したい解決策⚡•New Relicを使⽤•NodeあたりのPod数をStackdriverMonitoringでダッシュボード作成4.10 監視
まとめ• JupyterHubを導⼊すれば機械学習の⽣徒が本質的でない作業につまずかずに学習ができる• 運営にはノウハウが必要だがJupyterHubの設定でカバーできることも多く、それ以外は⾃分で作って快適に運⽤できる
ご清聴ありがとうございましたJupyterHubでサービスを構築したいというご相談があればTwitterの@wapa5pow 宛にお知らせくださいJupyterHub使っているよという⽅がいれば、ぜひお声がけください