[ai08] 深層学習フレームワーク chainer × microsoft で広がる応用
TRANSCRIPT
齋藤俊太
経歴:Keio Univ. (Bachelor, Master, D進)→UC Berkeley (Visiting Student Researcher)→Keio Univ. (Ph. D. in Engineering 取得)→Facebook, Inc. (Contractor)→Preferred Networks, Inc. (Researcher)
専門:Computer Vision仕事:Chainerの開発、CV系応用研究
Researcher at Preferred Networks, Inc.
博論:“Semantic Segmentation for Aerial Imagery with Convolutional Neural Network”
Founded : March. 2014Office : Tokyo, San Mateo Employees : ~80(8割以上が研究者又はエンジニア)Investors : FANUC, Toyota, NTT
AutomotiveHumanoid Robot
Consumer Industrial
Cloud
Device
PhotoGameText
Speech
Infrastructure
FactoryRobot
Automotive
Healthcare
Smart City
Industry4.0
Industrial IoT
Powerful
☑ CUDA
☑ cuDNN
☑ NCCL
Flexible
☑ Convolutional Network
☑ Recurrent Network
☑ Many Other Components
☑ Various Optimizers
Intuitive
☑ Define-by-Run
☑ High debuggability
CUDAを用いたGPU計算のサポート
cuDNNによる高速な学習/推論
NCCLを用いた高速なマルチGPU学習をサポート
N次元の入力に対応したConvolution, Deconvolution, Pooling, BN, 等
LSTM, Bi-directional LSTM, GRU, Bi-directional GRU, 等のRNNコンポーネント
ニューラルネットワークで使われる多くのレイヤ定義、各種ロス関数
SGD, MomentumSGD, AdaGrad, RMSProp, Adam, 等の最適化手法が選択可能
複雑なネットワークの記述が容易
Pythonライブラリであるためエラー箇所の特定が容易:デバッグしやすい
様々なNNの学習で共通する部分を抽象化、一連の学習フローを簡易に記述可☑ Simple APIs
目的関数を設計
• 何を学習させるのか、を考える
• ロス関数などの形で定義する
勾配の計算
• ネットワークのパラメータについての目的関数の勾配を求める
最適化
• 計算した勾配を用いてネットワークのパラメータを最適化
問題に合わせて自分で設計
x
y
_ ** 2
2 * _ _ * _ _ + _ z
_ + _
計算グラフの定義と、定義に従って計算を実際に行うコードが別に存在
静的実際に計算を行うコード自体が計算グラフの定義として扱われる
動的
by
Define-and-Run(静的グラフ)まず計算グラフを構築し、構築した計算グラフにデータを流すという、2ステップから成る(Caffe, theano, TensorFlowなど)
Define-by-Run(動的グラフ)通常の行列演算をする感覚で順伝播処理をすると同時に、逆伝播用の計算グラフが構築される(Chainer, DyNet, PyTorchなど)
# 構築x = Variable(‘x’)y = Variable(‘y’)z = x + 2 * y
# 評価for xi, yi in data:eval(z, (xi, yi))
# 構築と評価が同時for xi, yi in data:x = Variable(xi)y = Variable(yi)z = x + 2 * y
データを見ながら違う処理をしてもよい
Define-and-Run Define-by-Run
Convolutional Networkを書く方法1import chainerimport chainer.links as Limport chainer.functions as F
class LeNet5(chainer.Chain):def __init__(self): super(LeNet5, self).__init__()with self.init_scope():
self.conv1 = L.Convolution2D(1, 6, 5, 1)self.conv2 = L.Convolution2D(6, 16, 5, 1)self.conv3 = L.Convolution2D(16, 120, 4, 1)self.fc4 = L.Linear(None, 84)self.fc5 = L.Linear(84, 10)
S
※V2対応コードへ変更したため発表時の資料とは若干異なります
Convolutional Networkを書く方法2class LeNet5(chainer.Chain):def __init__(self):super(LeNet5, self).__init__()net = [('conv1', L.Convolution2D(1, 6, 5, 1))]net += [('_sigm1', F.Sigmoid())]net += [('_mpool1', F.MaxPooling2D(2, 2))]net += [('conv2', L.Convolution2D(6, 16, 5, 1))]net += [('_sigm2', F.Sigmoid())]net += [('_mpool2', F.MaxPooling2D(2, 2))]net += [('conv3', L.Convolution2D(16, 120, 4, 1))]net += [('_sigm3', F.Sigmoid())]net += [('_mpool3', F.MaxPooling2D(2, 2))]net += [('fc4', L.Linear(None, 84))]net += [('_sigm4', F.Sigmoid())]net += [('fc5', L.Linear(84, 10))]net += [('_sigm5', F.Sigmoid())]for name, layer in net:
if not name.startswith('_'):with self.init_scope():setattr(self, name, layer)
self.forward = net
def __call__(self, x):for n, f in self.forward:if not n.startswith('_'):
x = getattr(self, n)(x)else:x = f(x)
return x
※V2対応コードへ変更したため発表時の資料とは若干異なります
モデルの学習model = LeNet5()model = L.Classifier(model)
# データセットはリスト([]でアクセスでき、__len__を持てば良い)dataset = [(x1, t1), (x2, t2), ...]
# データセットから batchsize 個のデータを束ねて返してくれるイテレータit = iterators.SerialIterator(dataset, batchsize=32)
# 最適化手法 (SGDをMomentumSGD, Adam, RMSplop, AdaGradなどに変えれば、容易に色々な# 最適化手法を試すことが可opt = optimizers.SGD(lr=0.01)opt.setup(model)
updater = training.StandardUpdater(it, opt, device=0) # CPUで計算する場合はdevice=-1trainer = training.Trainer(updater, stop_trigger=(100, 'epoch'))trainer.run()
https://github.com/pfnet/chainer/tree/master/examples
CuPy: ChainerのGPUバックエンド(NumPy互換GPU Arrayライブラリ)NumPyを使って書かれたコードをGPUで実行
ChainerMN: 分散深層学習用追加パッケージ高いスケーラビリティ(128GPUで100倍の高速化)
ChainerRL: 深層強化学習ライブラリDQN, DDPG, A3C, ACER, NSQ, PCL, etc. OpenAI Gym サポート
ChainerCV: 画像認識アルゴリズム・データセットラッパーパッケージFaster R-CNN, Single Shot Multibox Detector (SSD), SegNet, etc.
【バックエンド/追加パッケージ】
MN
RL
CV
https://github.com/intel/chainer
CPU
CuPy
NVIDIA GPU
CUDA
cuDNN
BLAS
NumPy
Chainer
MKL-DNN
Intel Xeon/Xeon Phi
MKL
Intel Chainer Chainer with NumPy (MKL-Build)
Alexnet Forward 429.16 ms 5041.91 msAlexnet Backward 841.73 ms 5569.49 msAlexnet Total 1270.89 ms 10611.40 ms
およそ8.35倍の高速化!
https://github.com/intel/chainer
CUDA for Python
ChainerにおけるGPU計算を全て担当するライブラリが独立
NumPy互換APIで低コストにCPUコードをGPUへ移行
特異値分解などの線形代数アルゴリズムをGPU実行
KMeans, Gaussian Mixture ModelなどのExampleの充実https://github.com/cupy/cupy
Chainer on Multi Nodes
Chainerの使いやすさはそのままに,複数GPU,複数ノード環境で高速に学習することができる(現在はデータパラレルのみに対応)
GPU
GPU
InfiniBand
GPU
GPU
InfiniBand
ノード内通信(NVIDIA NCCLライブラリ)とノード間通信(CDUA-aware MPI)を活用し全体を最適化
InfiniBand
MPI
ChainerMN
pyMPI
NCCL
NVIDIA GPU
ノード内 ノード間
CuPy
使用するGPU数に対してほぼ線形な速度向上
既存のコードを多少書き換えるだけで利用できる(!)
optimizer = chainer.optimizers.MomentumSGD()
optimizer = chainermn.DistributedOptimizer(chainer.optimizers.MomentumSGD())
• GPUサーバクラスタを用意• 可能ならInfiniBandで接続されたクラスタがベター(その場合ドライバのインストールなどInfiniBandのセットアップを行う)
• 公式ドキュメントhttps://chainermn.readthedocs.io/en/latest/installation/guide.htmlにしたがって、必要ライブラリを全ノードにインストール⁃ CUDA-aware MPI (OpenMPI or MVAPICH)⁃ NVIDIA NCCL⁃ MPI4py
https://github.com/pfnet/chainermn
Chainer + Reinforcement Learning
エージェントが環境とのインタラクションを通じて報酬を最大化する行動を学習する
• Deep Q-Network (Mnih et al., 2015)• Double DQN (Hasselt et al., 2016)• Normalized Advantage Function (Gu et al., 2016)• (Persistent) Advantage Learning (Bellemare et al., 2016)• Deep Deterministic Policy Gradient (Lillicrap et al., 2016)• SVG(0) (Heese et al., 2015)• Asynchronous Advantage Actor-Critic (Mnih et al., 2016)• Asynchronous N-step Q-learning (Mnih et al., 2016)• Actor-Critic with Experience Replay (Wang et al., 2017) <- NEW!• Path Consistency Learning (Nachum et al., 2017) <- NEW!• etc.
https://github.com/pfnet/chainerrl/blob/master/examples/quickstart/quickstart.ipynb
Chainer + Computer Vision
新しい/自前のモデルを既存手法と比較したい
https://github.com/pfnet/chainercv
DatasetsPascal VOC, Caltech-
UCSD Birds-200-2011, Stanford
Online Products, CamVid, etc.
Models
Faster R-CNN, SSD, SegNet (will add more models!)
新しい(自前の)データセットで既存モデルを学習させたい
https://github.com/pfnet/chainercv
https://github.com/pfnet/chainercv
https://github.com/pfnet/chainercv
世界コンピュータ将棋選手権に出場、2位 Ponanza(世界コンピュータ将棋選手権2連覇(2015, 2016))ベース Ponanzaが探索を行う指し手のオーダリングにDeep Learningを応用した技術を使用し、対Ponanzaで8割以上の勝率
Team PFN
Issei Yamamoto Akira Shimoyama
Team Ponanza
線画の自動着色を行うWebサービス
線画とその着色済み画像のペアを大量に用意
線画+ヒントを入力にして、着色後画像を出力する畳み込みネットワークを訓練
ただそれだけでは塗りにバリエーションが出ない…
Adversarial lossを加えることでより自然で多様な塗りを実現
https://paintschainer.preferred.tech
http://landinghub.visualstudio.com/visual-cpp-build-tools
https://developer.nvidia.com/cuda-downloads
https://developer.nvidia.com/rdp/cudnn-download
https://www.continuum.io/downloads
https://github.com/pfnet/chainer
クラウドコンピューティング エッジヘビーコンピューティング
クラウドコンピューティングから、新しいコンピューティングへ
https://github.com/pfnet/chainer
セッションアンケートにご協力ください
専用アプリからご回答いただけます。
decode 2017
スケジュールビルダーで受講セッションを登録後、アンケート画面からご回答ください。
アンケートの回答時間はたったの 15 秒です!
Ask the Speaker のご案内本セッションの詳細は『Ask the Speaker Room』各コーナーカウンタにてご説明させていただきます。是非、お立ち寄りください。