SlideShare a Scribd company logo
Chainerで加速する深層学習と
フレームワークの未来
Preferred Networks 海野 裕也
1
自己紹介
海野 裕也
 -2008 東大情報理工修士,自然言語処理
 2008-2011 日本アイ・ビー・エム(株)東京基礎研
 2011-2016 (株)プリファードインフラストラクチャー
 2016- (株)プリファードネットワークス
 自然言語処理、機械学習、テキストマイニング
 ChainerやCuPyなどのOSS開発
 機械とのコミュニケーションの研究開発
NLP若手の会
「オンライン機械学習」(2015, 講談社)
「深層学習による自然言語処理」(2017, 講談社)
2
http://chainer.org/
3
Chainerの目標
 高い自由度で直感的に記述できる
 十分に高速に実行できる
 容易にデバッグできる
社内の深層学習の研究開発を加速させる
世の中
4
Chainer開発時のフレームワークの状況
旧 新
5
深層学習研究者・エンジニアがすること
1. ネットワークを考案 2. ネットワーク定義を記述
3. データを用意
4. 計算機で最適化
フレームワークが担当する所
6
深層学習フレームワークがやるべきこと
 どのようにネットワーク定義を記述するか
 複雑なモデルを簡単に記述するには?
 定義の間違いを防ぐには?
 デバッグするには?
 どのように最適化するか
 自動微分(誤差逆伝播)と最適化ルーチンを提供
 いかに高速・省メモリで実行するか?
7
ニューラルネットワーク=計算グラフ
ネットワーク定義さえできれば誤差逆伝播によって学習は
自動化される
x matmul a
W
+
b
ŷ MSE l
y
l = MSE(matmul(x, W) + b, y)
8
計算グラフの作成戦略 define-and-runとdefine-by-run
 define-and-run(静的グラフ)
 ネットワーク定義と計算実行の2ステップに別れる
 Caffe, theano, TensorFlowなど
 define-by-run(動的グラフ)
 計算実行のコード自体がネットワーク定義を兼ねる
 Chainer, DyNet, PyTorchなど
9
擬似コードで比較する
define-and-run
# ネットワーク定義
x = Variable(‘x’)
y = Variable(‘y’)
z = x + 2 * y
# 計算
for xi, yi in data:
eval(z, (xi, yi))
define-by-run
# 定義と計算が同時
for xi, yi in data:
x = Variable(xi)
y = Variable(yi)
z = x + 2 * y
データを見ながら
違う処理をしてもよい
10
デバッグのしやすさで比較する
define-and-run
# ネットワーク定義
x = Variable(‘x’)
y = Variable(‘y’)
z = x + 2 / y
# 計算
for xi, yi in data:
eval(z, (xi, yi))
define-by-run
for xi, yi in data:
x = Variable(xi)
y = Variable(yi)
z = x + 2 / y
実行時エラーと定義の
対応が取りづらい
エラーはただちに
確認できる
11
デバッグコードで比較する
define-and-run
x = Variable(‘x’)
y = Variable(‘y’)
w = 2 * y
w = PrintNode(w)
z = x + w
define-by-run
for xi, yi in data:
x = Variable(xi)
y = Variable(yi)
w = 2 * y
print(w)
z = x + w
特殊なノードを追加 ただのPythonのprint文
12
define-by-runのお陰で生産性が向上
 直感的に記述できる
 デバッグも簡単に
13
GPUはCuPyという行列ライブラリを独自に作成して利用
Chainer
CPU
BLAS
NumPyCuPy
CUDA/cuDNN
NVIDIA GPU
14
CuPyはCUDAを利用したNumPy互換の行列計算ライブラリ
 CUDAとその周辺ライブラリを利用した行列ライブラリ
 CUDA、cuDNNのAPI変更を吸収
 NumPyの挙動を忠実に再現
 自分でカーネルを簡単に書く機能も提供
15
CuPyとNumPyの比較
16
import numpy
x = numpy.array([1,2,3], numpy.float32)
y = x * x
s = numpy.sum(y)
print(s)
import cupy
x = cupy.array([1,2,3], cupy.float32)
y = x * x
s = cupy.sum(y)
print(s)
高い互換性のため生産性が向上
 ライブラリを新たに覚える必要がない
 CuPyとNumPyでコードを共通化できる
 既存のNumPyのコードをそのまま流用できる
17
CuPyは深層学習以外にも利用できる
 サンプルコードとして深層学習以外のコードを公開
 古典的な機械学習(K-MeansやGMM)、数値計算(CG法)、
金融向け(モンテカルロ法)など
 NumPyと高い互換性があるので、numpyをcupyに書き
換えるだけで既存コードが動作する
18
Chainer公開から2年半
19
多くのライブラリがdefine-by-runの重要性に気づいた
 PyTorch
 Chainerをforkして、バックエンドをTorchにした
 TensorFlow
 define-by-run (Eager mode) を最近サポート
 Gluon
 mxnetやCNTKにdefine-by-runのインターフェースを提供
20
深層学習自体のトレンドもどんどん変わる
 データセットは大規模化
 異なるデータや手法の組み合わせ
 急速に進む実用化
21
フレームワークの役割が広がっている
単に誤差逆伝播を実行すればよいだけではなくなった
 大規模なデータを学習するための分散学習
 複雑な手法のサポートする高レベルライブラリ
 ユースケースに合わせた多様な実行環境のサポート
22
分散学習を可能にするChainerMN
23
典型的なケースでフレームワーク間の速度差はなくなってきている
https://github.com/ilkarman/DeepLearningFrameworks
0 50 100 150 200 250
Keras(CNTK)
Tensorflow
PyTorch
CNTK
Chainer
Knet(Julia)
Gluon
Caffe2
MXNet
Training CNN (VGG-style) on CIFAR-1
Training Time (s)
24
速度における貢献度
GPU
CUDA
GPU
CUDA
cuDNN
フレームワーク
以前 2017年
フレームワーク
CUDA/cuDNNが典型的な実装をカバーしたため、
速度はそれらが担保するようになってきた
25
そうだ分散だ!
26
ChainerMN
Chainerの使いやすさはそのままに,複数GPU,複数ノード環境で高
速に学習することができる
GPU
GPU
InfiniBand
GPU
GPU
InfiniBand
27
ノード内通信とノード間通信をそれぞれ最適化
InfiniBand
MPI
ChainerMN
pyMPI
NCCL
NVIDIA GPU
ノード内 ノード間
CuPy
28
GPUの数にほぼ比例した性能向上
29
学習速度が向上することが最も重要
30
他のフレームワークに比べても高速
31
MN-1: an in-house supercomputer
 NVIDIA Tesla P100 × 1024
8 GPUs per node, 128 nodes in total
 Inter-connected by InfiniBand FDR
2 HCAs per node, tree-like topology
 スパコンランキング、産業領域で国内1位(世界12位)
32
ResNet-50のImageNetによる学習が15分
Team Hardware Software Batchsize Time Accuracy
He et al. P100 × 8 Caffe 256 29 hr 75.3 %
Goyal et al. P100 × 256 Caffe2 8,192 1 hr 76.3 %
Codreanu
et al.
KNL 7250 ×
720
Intel Caffe 11,520 62 min 75.0 %
You et al.
Xeon 8160 ×
1600
Intel Caffe 16,000 31 min 75.3 %
Akiba et al. P100 × 1024 Chainer 32,768 15 min 74.9 %
33
Microsoft AzureのInfiniBand付きノード上でスケール
自前でサーバーを持たなくても分散学習できる
34
分散深層学習をコモディティー化していく
深層学習は分散させるのが当たり前になるように
35
様々な手法を組み合わせるための高レベルライブラリ
36
どんどん複雑になる深層学習の課題
画像処理 自然言語 音声処理 ・・・
かつては各領域ごとに研究していたが・・・
画像+言語 画像+音声 画像+強化学習 ・・・
領域横断的な課題に取り組めるようになった
37
具体例:言葉を理解して作業するロボットの研究
38
深層学習が簡単になったため,手法や課題が複雑化
Chainer
全部自作
深層学習
Chainer
深層学習
が複雑化
Chainer
よりハイレベ
ルなサポート
が必用
深層学習
39
分野特化した高レベルライブラリをリリース
強化学習
画像処理
Coming soon …
40
ChainerRL:深層強化学習ライブラリ
 環境やエージェントなど強化学習の要素を抽象化
 最新の強化学習アルゴリズムをサポート
 DQN, DDPG, A3C, ACER, ...
Agent Environment
Action
Reward
41
42
ChainerCV:画像処理ライブラリ
 物体検知、セグメンテーション、画像分類といった、典
型的な画像処理を前処理・後処理含めてサポート
 Faster R-CNN, SSD, SegNet, VGG…
 可視化などのユーティリティーも提供
43
複雑な研究をサポートするため可視化・管理ツールをリリース予定
44
周辺ライブラリがより重要度を増していく
 深層学習の適用領域は今後も増え続ける
 実験管理やデバッグのしやすさまで、効率的に実験を進
められるようにする
45
多様な実行環境のサポート
46
急速に実用化される深層学習技術
 音声認識
 各社のエンジンにすでに搭載されている
 画像認識
 実用化段階で、一部のサービスの裏ではすでに利用されている
 自然言語処理
 機械翻訳など、一部は実用化されている
47
ハードウェアの選択は速度だけが重要ではない
 利用シーンの違い
 運用コストの違い
 消費電力の違い
48
多様な環境をサポートするための取り組み
 標準形式ONNXへのエクスポート
 Intel CPU向けの最適化
 Windows向けバイナリの配布
49
ONNX (Open Neural Network Exchange) のサポート
50
Chainerで学習した結果を様々なプラットフォーム上で動作可能に
NNVM/TVM TensorRT
Jetson
51
バックエンドを切り替えてCPUしかない環境にも最適化できるように
Chainer
ideep
MKL-DNN
MKL (Math Kernel Library)
Intel CPU
MKL NumPy
BLAS
NumPyCuPy
CUDA/cuDNN
NVIDIA GPU
52
おわりに
今日お話したのは今のトレンド
今後の新しい研究トレンドにも
迅速に対応していきます
53
まとめ
 Chainerは自由度の高い深層学習フレームワーク
 大規模分散学習のためのChainerMN
 多様な研究を支えるためのChainerRL, ChainerCVなど
の高レベルライブラリ
 実運用向けのONNXサポートなど
54
55

More Related Content

20171212 gtc pfn海野裕也_chainerで加速する深層学習とフレームワークの未来