2016.06.29 村上真奈
GPU REST Engineを用いた
ディープラーニングの学習
3
Key
Technology
NVIDIA Docker
GPU Rest Engine
CUDA
4
What is CUDA?
• エヌビディアのGPUで汎用計算を行う為のプラットフォーム(無償提供)
• 最新はCUDA8.0 RC
• Windows,Linux,Mac OS X(+Android)で動作
• 超並列コンピューティングで高速に計算
• 開発環境も充実。ライブラリも充実。色々な言語に対応。
• コンパイラ、デバッガはもちろん解析ツールも充実。IDE(WindowsはVS、LinuxはEclipse)もある
• ライブラリはエヌビディア製、3rdパーティー製含めて沢山
• 対応言語はC/C++/Python/Fortran/Java , etc…
CUDA = Compute Unified Device Architecture
5
CUDA Libraries
cuDNN
ディープニューラルネットワーク
計算用ライブラリ
cuSOLVER
線形代数演算LAPACK用
ライブラリ
cuRAND
乱数生成ライブラリ
cuSPARSE
疎行列計算用ライブラリ
cuFFT
高速フーリエ変換ライブラリ
cuBLAS
線形代数計算用ライブラリ
NPP
動画像処理・信号処理用
ライブラリ
Thrust
C++テンプレートライブラリ
6
nvidia-docker
GPUを搭載したdokcerコンテナ
http:/https://github.com/NVIDIA/nvidia-docker
7
nvidia-docker
ディープラーニング開発あるある
CUDAを入れて、caffeをGPU用にコンパイルしなおして…⇒環境構築大変
CUDAバージョン/cuDNNバージョン/caffeのバージョン/Digitsのバージョン…⇒管理大変
nvidia-dockerを使えば
CUDA toolkitやcuDNNの環境を構築する必要がない。バージョン切り替えも簡単。
caffeやdigitsのイメージがついてくる。すぐに使えて簡単
前提条件
Fermi以降のGPU(+NVIDIAドライバ) / docker 1.90以上/linuxx86_64 kernel 3.10 以上
GPUを搭載したdokcerコンテナ
http:/https://github.com/NVIDIA/nvidia-docker
8
nvidia-docker+コンテナでアプリケーションを起動
GPU2 GPU3 GPU4 GPU6 GPU7
NVIDIA CUDA Driver
Dockerエンジン
GPU5GPU0 GPU1
ホストPC
GPU0 GPU1
CUDA Libraries
Dockerコンテナ1
CUDA 7.5 Runtime
アプリケーション1
GPU0 GPU1 GPU2
CUDA Libraries
Dockerコンテナ2
CUDA 8.0 Runtime
アプリケーション2
GPU0 GPU1 GPU2
CUDA Libraries
Dockerコンテナ3
CUDA 7.0 Runtime
アプリケーション3
9
nvidia-docker+コンテナでアプリケーションを起動
GPU2 GPU3 GPU4 GPU6 GPU7
NVIDIA CUDA Driver
Dockerエンジン
GPU5GPU0 GPU1
ホストPC
GPU0 GPU1 GPU2
CUDA Libraries
Dockerコンテナ2
CUDA 8.0 Runtime
アプリケーション2
GPU0 GPU1
CUDA Libraries
Dockerコンテナ1
CUDA 7.5 Runtime
アプリケーション1
GPU2 GPU3 GPU4
11
GPU Rest Engine
低レイテンシーのウェブサービスを作る為の開発者の為コンポーネント
• RESTfulなウェブサービスを実現可能なマルチスレッドのHTTPサーバ
• GOで書かれたREST API対応HTTPサーバ
• 非同期リクエストに対応した作業キューを提供、効率よくマルチGPUでサービスを処理
• GPUのコンテクストなど計算に必要なリソースをプールする為のスレッドセーフなキューを提供
https://developer.nvidia.com/gre
12
GPU Rest Engine
REST APIをトリガーに呼び出されるコールバックの部分を実装する事で簡単にGPU+Webサービスを
実現
ソースコードも公開中
• https://github.com/NVIDIA/gpu-rest-engine
ディープラーニングの推論処理を行うサンプルを公開中
https://github.com/NVIDIA/gpu-rest-engine/tree/master/inference
13
GREで学習用REST APIを作ってみた(デモ)
• GPU Rest Engineを用いてディープラーニング学習用サーバを作成
• HTTPリクエストで学習を開始
• 学習可能なモデル一覧を取得
• 学習を開始
Caffeを用いた学習
学習用コンテナ
GPU REST Engine
Deep Learning
学習サーバー
①. データセット一覧取得命令
②. 結果を取得(JSON)
③. 学習の開始
④. 割り当てられたGPU ID
14
GREで学習用REST APIを作ってみた
• ディープラーニングの学習パラメータは数が膨大、全部APIでユーザーから指定するのは無理
• サーバー内に学習に必要なデータセット(train_dbやlenet.prototxtなど)をいくつか用意
• 今回は mnist / cifar10 / ilsvrc2012 の3種類を用意
• 学習パラメータはprototxtのものを初期値とし、特定のパラメータのみREST APIから更新できるように
作成
基本方針
15
GREで学習用REST APIを作ってみた
#inference_serverをベースにして足りない部分を追加
FROM inference_server
#train_testをコンパイル
COPY train_test /go/src/train_test
COPY common.h /go/src/common.h
RUN go get -ldflags="-s" train_test
#train_testサーバー起動
CMD ["train_test“, “/usr/share/digits/digits/jobs”]
Dockerfile.train_testの作成
ここだけ実装
16
GREで学習用REST APIを作ってみた
#inference_serverをベースにして足りない部分を追加
FROM inference_server
#train_testをコンパイル
COPY train_test /go/src/train_test
COPY common.h /go/src/common.h
RUN go get -ldflags="-s" train_test
#train_testサーバー起動
CMD ["train_test“, “/usr/share/digits/digits/jobs”]
Dockerfile.train_testの作成
検索する学習データセットのパス
17
nvidia-docker runで学習用サーバーを起動
GREで学習用REST APIを作ってみた
コンテナの起動
18
クライアントから学習用サーバー(コンテナ)にREST APIを投げる
GREで学習用REST APIを作ってみた
クライアントからREST APIを投げる
サーバーからの応答(JSON形式)
19
GREで学習用REST APIを作ってみた
学習の開始(サーバー)
20
クライアントには学習処理に割り当てられたGPU IDが返る
GREで学習用REST APIを作ってみた
学習の開始(クライアント)
THANK YOU!

OHS#2 GREでディープラーニング学習REST APIを作る