ohs#7 学習api
TRANSCRIPT
ohs#7 学習API
2016/12/19
@task_woof
学習API
• REST APIによる学習の実施
• 2タイプのタスクを想定
• 「バッチタスク」: バッチ形式で学習を実施する場合
• 「サービスタスク」: - 対話環境(Jupyter Notebook)で小規模の学習
- 推論サービスのデプロイ
バッチタスク
(ユースケース)
大規模な学習, 複数人環境での学習の実施
サービスタスク
(ユースケース)
実験的な学習や学習結果を用いた推論サービスのデプロイ
タスク 定義
前回お話したこと
1. 環境がバリエーションが多い
• CUDA, cuDNN, DLフレームワークの組み合わせ分の環境を用意する
→ 様々環境を使ってみたいという要望に対応するため
2. GPUリソースの管理が必要
• ジョブ管理
• リソース管理
CUDA7.5
cuDNN4
Caffe
CUDA8.0
cuDNN4
Caffe
CUDA7.5
cuDNN5
Caffe
CUDA8.0
cuDNN5
Caffe
CUDA7.5
cuDNN4
Chainer
CUDA8.0
cuDNN4
Chainer
CUDA7.5
cuDNN5
Chainer
...
使われなさそうな環境も用意しておく必要がある 排他など多重実行を抑制する
高頻度! 低頻度...
前回お話したこと
• 分散コンピューティングのための基盤ソフトウェア
• Mesosが提供するFrameworkをアプリ毎に用意することで、分散アプリ毎に
マシンを用意しなくてよくなる
• v1.0.0よりGPUサポート (2016/7/27)
前回お話したこと
Ref) http://mesos.apache.org/documentation/latest/architecture/
Marathon Chronos
サービスタスク の投入
バッチタスク の投入
• サービスタスクとしてMarathon、バッチタスクとしてChronosを利用する
ことで学習APIを実現
前回お話したこと
• DLフレームワークとJupyter Notebookを含むDockerイメージを用意
• データ取得機能、ネットワーク定義、学習実行スクリプトは、ユーザの
/homeに置いておく
• Dockerコンテナを起動し、学習実行スクリプトを叩く
Jupyter Notebook
DLフレームワーク
前回お話したこと
• いくつか課題がありました。
• Marathonはv1.3.0-RC1でGPU対応済み
• Dockerコンテナに対するGPUリソースの割当は未対応
• バッチタスクのFrameworkはChronosの後継が出たりと、まだデファ
クトは現れていない
Apache Mesos
タスクタイプ
Framework 特徴 ライセンス Docker対応 GPU指定対応
バッチ
Chronos - Cronを設定可能
- Docker対応 Apache License v2 ○ ×
Metronome - Chronosの後継といわれている
Apache License v2 ○ ×
Jenkins - Mesos-Pluginがある
Apache License v2 ○ ×
JobServer - 無料版と商用版がある
GramdLogic × ×
GoDocker - Docker上でバッチ/インタラクティ
ブな実行可能 IRISA ○ △
Cook - Sparkもサポートしているバッチスケジューラ
Apache License v2 △ ○
retz - ノーチラステクノロジーさん製のバッチフレームワーク
Apache License v2 ○ ○
サービス
Apahce
Aurora
- Docker Swarmに統合予定
- Cronも可能 Apache License v2 ○ ○
Marathon
- サービスに特化した
Framework - 開発は活発
Apache License v2 ○ ○
Singularity - 開発は活発
- バッチも可能 Apache License v2 ○ ×
Ref) Apache Mesos Framework Entering Into The Docker World: A Hitch-Hikers Guide To Clustering
• 下記のFrameworkは未評価。実現できるものもあるかも。
PBS Professional
• PBS Professionalについて
• CAE分野で多くの実績(社内で利用しているエンジニアが多い)
• 今年6月からOSS版がリリースされた
• 実現性の確認
GPUの指定が可能か?
社内で事例あり
Dockerを利用可能か?
フックスクリプトでDockerコンテナの起動およびコンテナにジョブ投入、コンテナの削除を実行
/homeをコンテナにマウント
実行ユーザ権限でDockerコンテナを起動
Masterノード Agentノード
PBS Server
PBS MoM
execjob_launch
execjob_end
1. コンテナを起動
2. ジョブ実行
3. コンテナを削除
REST
API 機能
PBS Professional
• 通常ジョブはDockerコンテナではなく、計算ノードで実行できること
• qsubコマンドの引数で制御する
Dockerイメージが指定されているか
GPUオプションが指定されているか
GPUオプションが指定されているか
ジョブ
投入
はい
いいえ
GPUを割り当てたDockerコンテナで
ジョブ実行
Dockerコンテナで ジョブ実行
GPUジョブの 実行
通常ジョブの 実行
PBS Professional
• 現時点の妥協点...
• DockerコンテナへのGPUリソース割当はNvidia-Dockerを利用
• Nvidia-DockerはisolationするGPUの指定が必要
• ngpusではGPUをどのGPUを利用すべきか指針がない
⇒割り当てるGPUを明に指定させる
• ユーザはどのようなGPUがあるかを取得
• どのGPUにジョブを投入するかを指定
$ nvidia-docker run -ti caffe /bin/bash # 全GPUをコンテナに見せる $ NV_GPU=‘0,1’ nvidia-docker run -ti caffe /bin/bash # GPU 0, 1のみDockerコンテナに見せる
PBS MoM
execjob_launch
execjob_end
1-1. コンテナを起動
2. ジョブ実行
3. コンテナを削除
gpu_id: gpu0 1-2. GPUを割当
PBS Professional
• Dockerコンテナがたまに起動しない
• “Remove In Progress”でDockerコンテナが起動後すぐに落ちる
• 今のところ再現性を確認できていない
• Docker Daemonを再起動する方法以外に回避できていない
これから
• まずは「ドッグフーディング」として社内リリース
• 改善、要望からサービスを強化していく
• やっぱりgpu数だけで指定したい → cgroup hook (NVIDIA docker使
用せず)
• 学習状況を取得したい → フレームワーク毎に差異があり、統一できるか