Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kubernetes(k8s)とJupyterHubで構築する機械学習eラーニングサイト
Search
wapa5pow
September 17, 2019
Programming
2
1.5k
Kubernetes(k8s)とJupyterHubで構築する 機械学習eラーニングサイト
PyCon JP 2019 の発表資料です
wapa5pow
September 17, 2019
Tweet
Share
More Decks by wapa5pow
See All by wapa5pow
ベンチャーに朗報!! (ほぼ)無料で高度な分析ができる環境を整える
wapa5pow
0
630
Other Decks in Programming
See All in Programming
ReadMoreTextView
fornewid
1
480
Team operations that are not burdened by SRE
kazatohiei
1
260
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
390
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
170
Blazing Fast UI Development with Compose Hot Reload (droidcon New York 2025)
zsmb
1
240
WebViewの現在地 - SwiftUI時代のWebKit - / The Current State Of WebView
marcy731
0
100
AWS CDKの推しポイント 〜CloudFormationと比較してみた〜
akihisaikeda
3
320
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
150
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
1.6k
PicoRuby on Rails
makicamel
2
110
Select API from Kotlin Coroutine
jmatsu
1
190
NPOでのDevinの活用
codeforeveryone
0
420
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
57
9.4k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
GraphQLとの向き合い方2022年版
quramy
48
14k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
220
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
Rails Girls Zürich Keynote
gr2m
94
14k
Typedesign – Prime Four
hannesfritz
42
2.7k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
Adopting Sorbet at Scale
ufuk
77
9.4k
How to Ace a Technical Interview
jacobian
277
23k
Transcript
Kubernetes(k8s)と JupyterHubで構築する 機械学習eラーニングサイト 2019.09 PyCon JP 2019 Koichi Ishida (@wapa5pow)
⾃⼰紹介 • 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. なぜ機械学習環境構築は⼤変か 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. なぜ機械学習環境構築は⼤変か 2. AI_STANDARDの紹介 3. 既存のサイトにどのように JupyterHubを導⼊するか 4. 運営ノウハウ
1年前にSTANDARD社から エンジニアリング⽀援の依頼がありました
2.1 1年前のシステム
サイトのページ例
依頼内容# •ブラウザ上でユーザごとにテキスト に応じたJupyter Notebookの ファイル(.ipynb)を実⾏して写経さ せたり課題を提出させたい
テキストに応じた Jupyter notebookを右ペインに表⽰
機械学習は環境構築が⼤変 $ ⽣徒 ローカルのPCに機械学習の環境を構築す るのに時間と⼿間がかかる % 運営 構築のサポートに時間が取られ本来必要 な学習のサポートの時間が少なくなる
解決策⚡ JupyterHubとk8sで⽣徒がブラウ ザ上で機械学習を実⾏できるように する
Demo
None
None
コンテンツに応じた Jupyter notebookを右ペインに表⽰
AI_STANDARDサイトの紹介 •AI⼈材育成に特化した法⼈研修e ラーニングサイト •実践重視・体系的・⼿厚いサポート 体制で 92%の講座修了率を実現 •ブラウザのみでPython, scikit- learn, Kerasなどが実⾏できる
• ローカルPCへの環境構築不要
AIエンジニアリング講座-1
AIエンジニアリング講座-2
AI_STANDARDサイトの機能
現在の構成
現在の構成
⽬次 1. なぜ機械学習環境構築は⼤変か 2. AI_STANDARDの紹介 3. 既存のサイトにどのように JupyterHubを導⼊するか 4. 運営ノウハウ
3.1 k8sの導⼊
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のCustom Authenticatorを使う
ユーザ認証
JupyterHubのCustom Authenticatorの設定 •HubにCookieに保存したTokenで認 証できるようにした token_authenticator.pyをコー ディングし、Dockerfileで追加しビ ルド •config.yamlに token_authenticatorを使うように 設定
config.yaml Dockerfile
URL: /chapters/75/coding /chapter_contents/ml7_1.html 3.8 Notebookにコンテンツを配置したい
URL: /chapters/75/coding /jupyterhub/…/ml7_code.ipynb /chapter_contents/ml7_1.html 3.8 Notebookにコンテンツを配置したい
解決策: Notebook⽴ち上げ時 にファイルを取得・更新⚡ •Notebookコンテンツはgitで管理 •Notebookが⽴ち上がったときにgit のリポジトリとシンクする (Jupyter serverextensionの nbgitpullerを利⽤してk8sの Container
Lifecycle Hooksの postStartで更新)
None
config.yaml コンテンツの設定
ここまでで⼀通りJupyterHubを既存 のサイトに組み込めました
⽬次 1. なぜ機械学習環境構築は⼤変か 2. AI_STANDARDの紹介 3. 既存のサイトにどのように JupyterHubを導⼊するか 4. 運営ノウハウ
はノウハウマーク
テキスト・Notebookファイルの追加 や誤字脱字の更新をした際に Notebookが、CPUやメモリを想定以 上に消費したり、エラーで実⾏でき ない 4.1 テキストを安全に更新
テキスト・Notebookファイルの例
jupyter nbconvertとtimeコマンド を使いCircle CIでビルドし実⾏でき るか確かめる 解決策⚡
None
nbconvertの実⾏ コマンド 実⾏結果
エラーになったときなどに表⽰され るテンプレートが英語なので⽇本語 表記にしたい 解決策⚡ Hubの設定でCustom Templatesを 使⽤ 4.2 Jupyter Hubページのカスタマイズ
テンプレートの変更例
テンプレートの変更 Dockerfile フォルダ構成
写経する際にバージョンの違いでエラー にならないように、Notebookのパッ ケージのバージョンを固定したい 解決策⚡ DockerfileでNotebookをビルドしてそ れを使う 4.3 パッケージのバージョン差異
再掲: JupyterHubの内部構造
Jupyter Docker Stacks https://github.com/jupyter/docker-stacks
Notebookイメージの設定 config.yaml Dockerfile
ユーザがサイト上で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)
None
スケールアウト時に短い起動時間で 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数をStackdriver Monitoringでダッシュボード作成 4.10 監視
まとめ • JupyterHubを導⼊すれば機械学習の ⽣徒が本質的でない作業につまずかず に学習ができる • 運営にはノウハウが必要だが JupyterHubの設定でカバーできるこ とも多く、それ以外は⾃分で作って快 適に運⽤できる
ご清聴ありがとうございました JupyterHubでサービスを構築したい というご相談があればTwitterの @wapa5pow 宛にお知らせくださ い JupyterHub使っているよという⽅が いれば、ぜひお声がけください