狠狠撸

狠狠撸Share a Scribd company logo
db analytics showcase Sapporo 2018
ソニーネットワークコミュニケーションズ株式会社 / ソニー株式会社
シニアマシンラーニングリサーチャー
小林 由幸
ソニーのDeep Learningソフトウェア、最新情報
2
自己紹介
小林 由幸
1999年にソニーに入社、2003年より機械学習
技術の研究開発を始め、音楽解析技術「12音
解析」のコアアルゴリズム、認識技術の自動
生成技術「ELFE」などを開発。近年は
「Neural Network Console」を中心にディー
プラーニング関連の技術?ソフトウェア開発
を進める一方、機械学習普及促進や新しいア
プリケーションの発掘にも注力。
こばやし よしゆき
3
目次
? ソニーのDeep Learningソフトウェア
? Neural Network Libraries最新情報
? Neural Network Console最新情報
? Windows版 Version 1.20新機能紹介
? Cloud版 正式サービス绍介
? まとめ
Neural Network Libraries/Consoleの
最新情報はこちらから
Twitter
@NNC_NNL_Jpn
4
ソニーのDeep Learningソフトウェア
5
ソニーのDeep Learningに対する取り組み
Neural Network Libraries/Consoleにより、効率的なAI技術の開発を実現
2000年以前~ 機械学習の研究開発
2010年~ Deep Learningの研究開発
2011年~
初代コアライブラリ 2013年~
第二世代コアライブラリ 2016年~ 第3世代コアライブラリ
Neural Network Libraries
2015年~ GUIツール
2010年~ Deep Learning開発者向けソフトウェアの開発
Deep Learningを用いた認識技術等の
開発者が用いるソフトウェア群
技術開発効率を圧倒的に向上
Neural Network
Console
17/8/17 Windows版無償公開
18/5/9 クラウド版正式サービス開始
17/6/27 オープンソースとして公開
6
Neural Network Libraries / Console
Neural Network Libraries
?Deep Learning研究開発者向けオープンソースフレーム
ワーク(他社製既存Deep Learning FWに相当)
?コーディングを通じて利用→高い自由度
?最先端の研究や製品への実装にも柔軟に対応
Neural Network Console
?研究や、商用レベルの技術開発に対応したDeep
Learningツール
?様々なサポート機能→高い開発効率
?GUIによるビジュアルな操作→敷居が低い
主なターゲット
?じっくりと研究?開発に取り組まれる方
?プログラミング可能な研究、開発者
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
x = nn.Variable(100)
t = nn.Variable(10)
h = F.tanh(PF.affine(x, 300, name='affine1'))
y = PF.affine(h, 10, name='affine2')
loss = F.mean(F.softmax_cross_entropy(y, t))
主なターゲット
?特に開発効率を重視される方
?はじめてDeep Learningに触れる方
学習エンジンとして
Neural Network Librariesを利用
優れたDeep Learningの開発環境を提供し、需要の急拡大するAI技術の普及?発展に貢献
7
Neural Network Libraries最新情報
Mixed Precision学習
Extension開発支援機能
nnabla-examples
8
Neural Network Libraries
? 17/6/27 v0.9.1 最初のOSSバージョン
? 17/7/22 v0.9.2 Python 3のサポート
? 17/8/3 v0.9.3 マルチGPUのサポート
? 17/8/22 v0.9.4 C++のみによる推論機能
? 17/11/8 v0.9.5 MacOSビルドの正式対応など多数の改善
? 17/11/27 v0.9.6 マルチノードのサポート
? 17/12/7 v0.9.7 様々な改善
? 18/3/6 v0.9.8 分散学習の改善
? 18/3/28 v0.9.9 Mixed Precision学習対応
nnabla.org
github.com/sony/nnabla
https://github.com/sony/nnabla/releases
https://github.com/sony/nnabla-ext-cuda/releases
17年6月27日のリリース後も活発にアップデートを継続
9
Neural Network Librariesを用いたMixed Precision学習
Mixed Precision学習とは
? NVIDIAのPascal世代以降のGPUを用いた場合に利用できる
? 通常用いられる32bit浮動小数点数(float)の代わりに16bit浮動小数点数(half)を可能な限り用いた学習
? GPUの使用メモリを約半分に抑えられることから、大きいバッチサイズでの学習が可能になる
? NVIDIAのVOLTA世代以降のGPUでは、TensorCoreによる高速化の恩恵も得られる(1.5~2倍程度)
Float(fp32)→Half(fp16)への切り替え
from nnabla.ext_utils import get_extension_context
nn.set_default_context(get_extension_context('cudnn'))
from nnabla.ext_utils import get_extension_context
nn.set_default_context(get_extension_context('cudnn', type_context='half')
Float
Half
その他のコードはそのままに、fp16を用いた学習を行うことができる
10
Neural Network Librariesを用いたMixed Precision学習
Loss Scaling
? ネットワーク構造によっては、halfを用いた演算では演算途中に必要な情報が失われてしまい、うまく学習
できないものもある
? このような場合は、Loss Scaling※と呼ばれるテクニックを用いて現象を回避できる
l.backward(clear_buffer=True)
solver.weight_decay(weight_decay)
solver.update()
Back-propagation時
Update時(Sgd, Momentum系利用の場合)
※Mixed Precision Training
Paulius Micikevicius, Sharan Narang, Jonah Alben, Gregory Diamos, Erich Elsen, David Garcia, Boris Ginsburg, Michael
Houston, Oleksii Kuchaiev, Ganesh Venkatesh, Hao Wu
https://arxiv.org/abs/1710.03740
l.backward(grad=loss_scale, clear_buffer=True)
Loss Scalingあり:勾配をLoss Scaling倍するLoss Scalingなし
solver.weight_decay(weight_decay * loss_scale)
solver.set_learning_rate(lr / loss_scale)
solver.update()
Loss Scalingあり:WeightDeacyをloss_scale倍、
Learning Rateを1/loss_scale倍する
Loss Scalingなし
11
Extension開発支援機能
NNLでは、新しいデバイス向けの実装をExtensionとして追加実装することができる
High-level API
?Python API
?C++ API
?CLI
?Utils
CPU Implements
?Array
?Function
?Solver
?Communicator
Core
?Variable
?CoputationGraph
?…
nnabla
nnabla-ext-cuda
CUDA Implements
?Array
?Function
?Solver
?Communicator
from nnabla.ext_utils import get_extension_context
nn.set_default_context(get_extension_context('cudnn'))
宣言一つで、
APIやコア部分はそのままに、
特定デバイス用のコードを利用○○ Implements
?Array
?Function
?Solver
?Communicator
nnabla-ext-cudaをフォークし
社内独自チップ等、
特定デバイス用実装を開発可
nnabla-ext-○○
プラグインに実装がない関数は
自動的にCPUにフォールバック
12
参考)Neural Network LibrariesのAffineCUDA実装
template <class T>
void AffineCuda<T>::forward_impl(const Variables &inputs, const Variables &outputs) {
cuda_set_device(std::stoi(this->ctx_.device_id));
const T *x = inputs[0]->get_data_pointer<T>(this->ctx_);
const T *w = inputs[1]->get_data_pointer<T>(this->ctx_);
T *y = outputs[0]->cast_data_and_get_pointer<T>(this->ctx_);
// y = x * w.
...
}
template <class T>
void AffineCuda<T>::backward_impl(const Variables &inputs, const Variables &outputs,
const vector<bool> &propagate_down, const vector<bool> &accum) {
cuda_set_device(std::stoi(this->ctx_.device_id));
const T *dy = outputs[0]->get_grad_pointer<T>(this->ctx_);
if (propagate_down[0]) {
T *dx = inputs[0]->cast_grad_and_get_pointer<T>(this->ctx_);
const T *w = inputs[1]->get_data_pointer<T>(this->ctx_);
// dx += dy * w^t
...
}
Forward計算
Backward計算
Code Generatorが基本的なコードを自動生成。開発者は関数の演算部の実装に集中できる
(他にSetupがある)
13
nnabla-examples github.com/sony/nnabla-examples
GitHubにてNeural Network 尝颈产谤补谤颈别蝉を用いた様々なサンプルコードを公开している
14
nnabla-examples
? GANs
? Pix2pix(画像翻訳)
? Cycle-GAN (画像翻訳)
? PGGAN(画像生成)
? Capsule Net(画像認識)
? CIFAR-10データセット
? Resnetとその分散学習
? Imagenetデータセット
? Resnet
? MNISTデータセット
? Binary Networks(二値化ネットワーク)
? Siamese Network(特徴空間学習)
? DCGAN(画像生成)
? 物体検出
? Yolov2
? Penn Treebankデータセット
? LSTM(言語モデルの学習)
? Reduction(ネットワークのコンパクト化)
? Distillation(蒸留学習)
? Factorization (テンソル分解)
? Quantization(量子化)
? Resnet2rnn(重み共有)
? Structured-sparsity(スパース化)
? Word Embedding
? Word2vec
github.com/sony/nnabla-examples
サンプルコードも活発に更新中!
15
Neural Network Console最新情報
Windows版 version 1.20 新機能紹介
ユニット機能
量子化実験機能
pptxレポート出力機能
16
ユニット機能 – 概要
? 部分ネットワークであるユニットを定義し、それらを
組み合わせてネットワークを定義可能に
(ネストも可)
? 従来1度の計算に用いるネットワークは1つの
ネットワークにベタ書きする必要があった
Fire Module (Unit) SqueezeNet
利用
例)SqueezeNet
SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
Forrest N. Iandola, Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, Kurt Keutzer
https://arxiv.org/abs/1602.07360
+
複雑なニューラルネットワークをより簡潔に記述
17
ユニット機能 – 基本的な使い方
プログラミングにおける関数とその引数感覚で、直観的に使うことができる
1. ユニットを定義する 2. 定義したユニットを呼び出す
Argumentレイヤーで
引数を定義
受け取った
引数の利用
Unitレイヤーで
定義したUnitを
呼び出し
18
ユニット機能 – ユースケース1
よく使う構成をユニットとして定義し、グラフの見通しをよくする
例) LSTM 例) Squash@CapsNet
プログラミングにおける、サブルーチンの定義に相当する使い方ができる
19
ユニット機能 – ユースケース2
? ネットワークの主要部分は1つだけ定義し、差異
のみを上位のネットワークに記述可能に
例:MobileNet
学習用Net
評価用Net
MobileNet
Unit
学習用Net 評価用Net
利用
? 従来、学習、評価時に別のネットワークを使う場
合、それぞれを別に定義する必要があった
(コピー&ペースト)
ネットワークの改造時に複数のネットを修正する必要がなくなり、作業効率が改善
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adamnnhttps://arxiv.org/abs/1704.04861
20
ユニット機能 – NNLibrariesのPythonコード出力にも対応
def network_FireModule(x, SqueezeMaps, ExpandMaps, test=False):
# Input:x -> 96,56,56
# Squeeze -> 16,56,56
h = PF.convolution(x, SqueezeMaps, (1,1), (0,0), name='Squeeze')
# SqueezeReLU
h = F.relu(h, True)
# Expand1x1 -> 64,56,56
h1 = PF.convolution(h, ExpandMaps, (1,1), (0,0), name='Expand1x1')
# Expand3x3 -> 64,56,56
h2 = PF.convolution(h, ExpandMaps, (3,3), (1,1), name='Expand3x3')
# Expand1x1ReLU
h1 = F.relu(h1, True)
# Expand3x3ReLU
h2 = F.relu(h2, True)
# Concatenate -> 128,56,56
h1 = F.concatenate(h1, h2)
return h1
ユニットのコード 呼び出し元のコード
Neural Network Librariesとの高い親和性
? 各ユニットはそれぞれ関数として出力
? Argumentレイヤーで設定した引数も引き継がれる
def network_SqueezeNet(x, DropP, test=False):
# SNInput:x -> 3,227,227
# MulScalar
h = F.mul_scalar(x, 0.01735)
# AddScalar
h = F.add_scalar(h, -1.99)
# Convolution -> 64,113,113
h = PF.convolution(h, 64, (3,3), (0,0), (2,2), name='Convolution')
# ReLU
h = F.relu(h, True)
# MaxPooling -> 64,56,56
h = F.max_pooling(h, (3,3), (2,2))
# FireModule -> 128,56,56
with nn.parameter_scope('FireModule'):
h = network_FireModule(h, 16, 64)
# FireModule_2
with nn.parameter_scope('FireModule_2'):
h = network_FireModule(h, 16, 64)
…
21
量子化実験機能
例えば、FixedPointQuantizeを各データパスおよびパラメータに挿入することで、それぞれを固定
小数点に量子化した際にどの程度の精度が得られるかの実験を行うことができる
←符号あり/符号なし
←量子化ビット数
←量子化ステップ
←(値域外の
Gradientを0とするか
どうか)
FPGAへの実装等を想定したよりコンパクトなネットワーク構造を容易に探索できる
22
pptxレポート出力機能
学習の設定、学習?評価結果をPower Point ? 形式のレポートとして出力できる機能
※PowerPoint?は米国Microsoft Corporationの米国およびその他の国における登録商標です。
LeNet
dataset-require=MNIST
pptxレポート出力機能を用いて出力した実際のレポート
Dataset : Training
? Number of data : 60,000
– Variable : x (image)
? Type : Image
? Shape : 1, 28, 28
– Variable : y (label)
? Type : Scalar
pptxレポート出力機能を用いて出力した実際のレポート
Dataset : Examples of variable x in "Training"
pptxレポート出力機能を用いて出力した実際のレポート
Dataset : Validation
? Number of data : 10,000
– Variable : x (image)
? Type : Image
? Shape : 1, 28, 28
– Variable : y (label)
? Type : Scalar
pptxレポート出力機能を用いて出力した実際のレポート
Dataset : Examples of variable x in "Validation"
pptxレポート出力機能を用いて出力した実際のレポート
Network Architecture : Main
Type Value
Output 26,929
CostParameter 70,054
CostAdd 21,920
CostMultiply 3,144
CostMultiplyAdd 700,904
CostDivision 10
CostExp 110
CostIf 13,124
pptxレポート出力機能を用いて出力した実際のレポート
Training Procedure : Optimizer
? Optimize network "Main" using "Training" dataset.
– Batch size : 64
– Solver : Adam
? Learning rate(Alpha) : 0.001
? Beta1 : 0.9
? Beta2 : 0.999
? Epsilon : 1e-08
– Weight decay is not applied.
pptxレポート出力機能を用いて出力した実際のレポート
Experimental Result : Learning Curve
pptxレポート出力機能を用いて出力した実際のレポート
Experimental Result : Evaluation
? Evaluate network "MainRuntime" using "Validation" dataset.
? Variable : y
– Accuracy : 0.9931
– Avg.Precision : 0.9930
– Avg.Recall : 0.9929
– Avg.F-Measures : 0.9929
pptxレポート出力機能を用いて出力した実際のレポート
References
? Sony Corporation. Neural Network Console : Not just train and evaluate. You can design neural
networks with fast and intuitive GUI. https://dl.sony.com/
? Sony Corporation. Neural Network Libraries : An open source software to make research,
development and implementation of neural network more efficient. https://nnabla.org/
? BatchNormalization - Ioffe and Szegedy, Batch Normalization: Accelerating Deep Network
Training by Reducing Internal Covariate Shift. https://arxiv.org/abs/1502.03167
? Convolution - Chen et al., DeepLab: Semantic Image Segmentation with Deep Convolutional
Nets, Atrous Convolution, and Fully Connected CRFs. https://arxiv.org/abs/1606.00915, Yu et al.,
Multi-Scale Context Aggregation by Dilated Convolutions. https://arxiv.org/abs/1511.07122
? ELU - Clevart et al., Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs).
http://arxiv.org/abs/1511.07289
? Adam - Matthew D. Zeiler. ADADELTA: An Adaptive Learning Rate Method.
https://arxiv.org/abs/1212.5701
pptxレポート出力機能を用いて出力した実際のレポート
33
Neural Network Console最新情報
Cloud版 正式サービス绍介
34
豊富なGPUリソースを利用可能に
? ニューラルネットワークの学習には膨大な演算が必要
? 必要な演算量は主に扱うデータの量とニューラルネットワークの
構造に依存
? GPU、マルチGPUを用いると、学習完了までの時間を
大幅に短縮できる
? ネットワークにもよるが、10倍~数百倍高速に学習できる
? 同じ開発期間でより多くの試行錯誤を行うことが可能に
? 環境のセットアップ、メンテナンス作業不要で豊富な
GPUリソースを利用可能
? 開発者はDeep Learningの開発作業に集中できる
最先端研究者と同等の環境(1ジョブあたり8GPU×無制限の並列利用)をGUI環境から利用可能
35
シングルGPUにおける学習時の動作
Fwd/Bwd
1 iteration
GPU Fwd/Bwd Fwd/Bwd Fwd/Bwd…
Time
1 epoch
Num data / Batch size
Fwd/Bwd
Update
1 epochの間にデータセットのデータ数÷Batch Size回以下の動作を行う
? CONFIGタブ、Global ConfigのBatch Sizeで指定した数のデータをデータセットから取得
? 取得したデータを用いてニューラルネットワークのパラメータの勾配を計算
(Forward/Backward)
? 求めた勾配を用いてニューラルネットワークのパラメータを更新(Update)
36
マルチGPU時における学習時の動作
Fwd/BwdGPU 1 Fwd/Bwd Fwd/Bwd…
Time
1 epoch
Num data / (Batch size * Num GPU)
Fwd/BwdGPU 2 Fwd/Bwd Fwd/Bwd…
Fwd/BwdGPU 3 Fwd/Bwd Fwd/Bwd…
Fwd/BwdGPU n Fwd/Bwd Fwd/Bwd…
…
UpdateSync1 iteration
Forward/Backward計算と
Update計算の間に以下の
処理が入る
? 求めた勾配を全ての
GPU間で平均(Sync)
37
マルチGPU学習とシングルGPU学習の関係
Fwd/Bwd
256×4 data
GPU=Fwd/Bwd
256 data / GPU
GPU 1
Fwd/BwdGPU 2
Fwd/BwdGPU 3
Fwd/BwdGPU 4
Multi-GPU Single-GPU
シングルGPU時と同じ結果を得るには、
Learning RateをGPU数倍する
例)シングルGPU時Learning Rate 0.1のプロジェクトを
4GPUで学習するには、Learning Rateを4倍の0.4とする
マルチGPUを用いた学習は、シングルGPUにおけるBatch SizeをGPU数倍した学習に相当
38
マルチGPUの使いどころ
マルチGPU学習が適さないケース
学習に要する時間が極めて短い
? 1 Iterationの演算に要する時間が極端に短い場
合(10ms以下など)、マルチGPUの場合GPU
間の通信に要する時間等、その他のオーバー
ヘッドが支配的に
1つのデータのサイズが小さい
1つの関数の処理にかかる時間が短い
? 各レイヤーのForward、Backward演算に要す
る時間が極めて短い(0.1ms以下など)ような
ネットワークではGPUによる高速化効果が得
られづらいことがある
マルチGPU学習が適したケース
学習に要する時間が長い
? シングルGPUでは1度の学習に数日~数週間を
要するケース
? 4GPU、8GPUの利用により最大4倍、8倍に学
習時間を短縮可能
演算量に対するパラメータサイズが小
さいネットワーク
? 画面右下に表示されるCostMultiplyAdd(演算
量)に対してCostParameter(パラメータサイ
ズ)が小さいネットワークほど効率よく複数の
GPUを利用できる
プロジェクトの特性に合わせて効果的にマルチGPUの活用を
39
まとめ
40
Webにてチュートリアルを随時公開中 https://support.dl.sony.com/docs-ja/#Tutorial
質問?ご要望等はフォーラムへ
https://groups.google.com/forum/#!forum/neur
al_network_console_users_jp
41
Neural Network Libraries/Consoleまとめ
今後もDeep Learningの研究開発におけるボトルネックの徹底的な解消を目指した開発を継続
Neural Network Libraries
https://nnabla.org/
Neural Network Console
https://dl.sony.com/
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
x = nn.Variable(100)
t = nn.Variable(10)
h = F.tanh(PF.affine(x, 300, name='affine1'))
y = PF.affine(h, 10, name='affine2')
loss = F.mean(F.softmax_cross_entropy(y, t))
実現
? Deep Learning応用技術者の迅速な育成
? 効率的なDeep Learning応用技術の研究開発~実用化
様々な特長を兼ね備えた最新世代のDeep Learningフレームワーク 商用クオリティのDeep Learning応用技術開発を実現する統合開発環境
SONYはソニー株式会社の登録商標または商標です。
各ソニー製品の商品名?サービス名はソニー株式会社またはグループ各社の登録商標または商標です。その他の製品および会社名は、各社の商号、登録商標または商標です。

More Related Content

2018/06/23 Sony"s deep learning software and the latest information

  • 1. db analytics showcase Sapporo 2018 ソニーネットワークコミュニケーションズ株式会社 / ソニー株式会社 シニアマシンラーニングリサーチャー 小林 由幸 ソニーのDeep Learningソフトウェア、最新情報
  • 2. 2 自己紹介 小林 由幸 1999年にソニーに入社、2003年より機械学習 技術の研究開発を始め、音楽解析技術「12音 解析」のコアアルゴリズム、認識技術の自動 生成技術「ELFE」などを開発。近年は 「Neural Network Console」を中心にディー プラーニング関連の技術?ソフトウェア開発 を進める一方、機械学習普及促進や新しいア プリケーションの発掘にも注力。 こばやし よしゆき
  • 3. 3 目次 ? ソニーのDeep Learningソフトウェア ? Neural Network Libraries最新情報 ? Neural Network Console最新情報 ? Windows版 Version 1.20新機能紹介 ? Cloud版 正式サービス绍介 ? まとめ Neural Network Libraries/Consoleの 最新情報はこちらから Twitter @NNC_NNL_Jpn
  • 5. 5 ソニーのDeep Learningに対する取り組み Neural Network Libraries/Consoleにより、効率的なAI技術の開発を実現 2000年以前~ 機械学習の研究開発 2010年~ Deep Learningの研究開発 2011年~ 初代コアライブラリ 2013年~ 第二世代コアライブラリ 2016年~ 第3世代コアライブラリ Neural Network Libraries 2015年~ GUIツール 2010年~ Deep Learning開発者向けソフトウェアの開発 Deep Learningを用いた認識技術等の 開発者が用いるソフトウェア群 技術開発効率を圧倒的に向上 Neural Network Console 17/8/17 Windows版無償公開 18/5/9 クラウド版正式サービス開始 17/6/27 オープンソースとして公開
  • 6. 6 Neural Network Libraries / Console Neural Network Libraries ?Deep Learning研究開発者向けオープンソースフレーム ワーク(他社製既存Deep Learning FWに相当) ?コーディングを通じて利用→高い自由度 ?最先端の研究や製品への実装にも柔軟に対応 Neural Network Console ?研究や、商用レベルの技術開発に対応したDeep Learningツール ?様々なサポート機能→高い開発効率 ?GUIによるビジュアルな操作→敷居が低い 主なターゲット ?じっくりと研究?開発に取り組まれる方 ?プログラミング可能な研究、開発者 import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF x = nn.Variable(100) t = nn.Variable(10) h = F.tanh(PF.affine(x, 300, name='affine1')) y = PF.affine(h, 10, name='affine2') loss = F.mean(F.softmax_cross_entropy(y, t)) 主なターゲット ?特に開発効率を重視される方 ?はじめてDeep Learningに触れる方 学習エンジンとして Neural Network Librariesを利用 優れたDeep Learningの開発環境を提供し、需要の急拡大するAI技術の普及?発展に貢献
  • 7. 7 Neural Network Libraries最新情報 Mixed Precision学習 Extension開発支援機能 nnabla-examples
  • 8. 8 Neural Network Libraries ? 17/6/27 v0.9.1 最初のOSSバージョン ? 17/7/22 v0.9.2 Python 3のサポート ? 17/8/3 v0.9.3 マルチGPUのサポート ? 17/8/22 v0.9.4 C++のみによる推論機能 ? 17/11/8 v0.9.5 MacOSビルドの正式対応など多数の改善 ? 17/11/27 v0.9.6 マルチノードのサポート ? 17/12/7 v0.9.7 様々な改善 ? 18/3/6 v0.9.8 分散学習の改善 ? 18/3/28 v0.9.9 Mixed Precision学習対応 nnabla.org github.com/sony/nnabla https://github.com/sony/nnabla/releases https://github.com/sony/nnabla-ext-cuda/releases 17年6月27日のリリース後も活発にアップデートを継続
  • 9. 9 Neural Network Librariesを用いたMixed Precision学習 Mixed Precision学習とは ? NVIDIAのPascal世代以降のGPUを用いた場合に利用できる ? 通常用いられる32bit浮動小数点数(float)の代わりに16bit浮動小数点数(half)を可能な限り用いた学習 ? GPUの使用メモリを約半分に抑えられることから、大きいバッチサイズでの学習が可能になる ? NVIDIAのVOLTA世代以降のGPUでは、TensorCoreによる高速化の恩恵も得られる(1.5~2倍程度) Float(fp32)→Half(fp16)への切り替え from nnabla.ext_utils import get_extension_context nn.set_default_context(get_extension_context('cudnn')) from nnabla.ext_utils import get_extension_context nn.set_default_context(get_extension_context('cudnn', type_context='half') Float Half その他のコードはそのままに、fp16を用いた学習を行うことができる
  • 10. 10 Neural Network Librariesを用いたMixed Precision学習 Loss Scaling ? ネットワーク構造によっては、halfを用いた演算では演算途中に必要な情報が失われてしまい、うまく学習 できないものもある ? このような場合は、Loss Scaling※と呼ばれるテクニックを用いて現象を回避できる l.backward(clear_buffer=True) solver.weight_decay(weight_decay) solver.update() Back-propagation時 Update時(Sgd, Momentum系利用の場合) ※Mixed Precision Training Paulius Micikevicius, Sharan Narang, Jonah Alben, Gregory Diamos, Erich Elsen, David Garcia, Boris Ginsburg, Michael Houston, Oleksii Kuchaiev, Ganesh Venkatesh, Hao Wu https://arxiv.org/abs/1710.03740 l.backward(grad=loss_scale, clear_buffer=True) Loss Scalingあり:勾配をLoss Scaling倍するLoss Scalingなし solver.weight_decay(weight_decay * loss_scale) solver.set_learning_rate(lr / loss_scale) solver.update() Loss Scalingあり:WeightDeacyをloss_scale倍、 Learning Rateを1/loss_scale倍する Loss Scalingなし
  • 11. 11 Extension開発支援機能 NNLでは、新しいデバイス向けの実装をExtensionとして追加実装することができる High-level API ?Python API ?C++ API ?CLI ?Utils CPU Implements ?Array ?Function ?Solver ?Communicator Core ?Variable ?CoputationGraph ?… nnabla nnabla-ext-cuda CUDA Implements ?Array ?Function ?Solver ?Communicator from nnabla.ext_utils import get_extension_context nn.set_default_context(get_extension_context('cudnn')) 宣言一つで、 APIやコア部分はそのままに、 特定デバイス用のコードを利用○○ Implements ?Array ?Function ?Solver ?Communicator nnabla-ext-cudaをフォークし 社内独自チップ等、 特定デバイス用実装を開発可 nnabla-ext-○○ プラグインに実装がない関数は 自動的にCPUにフォールバック
  • 12. 12 参考)Neural Network LibrariesのAffineCUDA実装 template <class T> void AffineCuda<T>::forward_impl(const Variables &inputs, const Variables &outputs) { cuda_set_device(std::stoi(this->ctx_.device_id)); const T *x = inputs[0]->get_data_pointer<T>(this->ctx_); const T *w = inputs[1]->get_data_pointer<T>(this->ctx_); T *y = outputs[0]->cast_data_and_get_pointer<T>(this->ctx_); // y = x * w. ... } template <class T> void AffineCuda<T>::backward_impl(const Variables &inputs, const Variables &outputs, const vector<bool> &propagate_down, const vector<bool> &accum) { cuda_set_device(std::stoi(this->ctx_.device_id)); const T *dy = outputs[0]->get_grad_pointer<T>(this->ctx_); if (propagate_down[0]) { T *dx = inputs[0]->cast_grad_and_get_pointer<T>(this->ctx_); const T *w = inputs[1]->get_data_pointer<T>(this->ctx_); // dx += dy * w^t ... } Forward計算 Backward計算 Code Generatorが基本的なコードを自動生成。開発者は関数の演算部の実装に集中できる (他にSetupがある)
  • 13. 13 nnabla-examples github.com/sony/nnabla-examples GitHubにてNeural Network 尝颈产谤补谤颈别蝉を用いた様々なサンプルコードを公开している
  • 14. 14 nnabla-examples ? GANs ? Pix2pix(画像翻訳) ? Cycle-GAN (画像翻訳) ? PGGAN(画像生成) ? Capsule Net(画像認識) ? CIFAR-10データセット ? Resnetとその分散学習 ? Imagenetデータセット ? Resnet ? MNISTデータセット ? Binary Networks(二値化ネットワーク) ? Siamese Network(特徴空間学習) ? DCGAN(画像生成) ? 物体検出 ? Yolov2 ? Penn Treebankデータセット ? LSTM(言語モデルの学習) ? Reduction(ネットワークのコンパクト化) ? Distillation(蒸留学習) ? Factorization (テンソル分解) ? Quantization(量子化) ? Resnet2rnn(重み共有) ? Structured-sparsity(スパース化) ? Word Embedding ? Word2vec github.com/sony/nnabla-examples サンプルコードも活発に更新中!
  • 15. 15 Neural Network Console最新情報 Windows版 version 1.20 新機能紹介 ユニット機能 量子化実験機能 pptxレポート出力機能
  • 16. 16 ユニット機能 – 概要 ? 部分ネットワークであるユニットを定義し、それらを 組み合わせてネットワークを定義可能に (ネストも可) ? 従来1度の計算に用いるネットワークは1つの ネットワークにベタ書きする必要があった Fire Module (Unit) SqueezeNet 利用 例)SqueezeNet SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size Forrest N. Iandola, Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, Kurt Keutzer https://arxiv.org/abs/1602.07360 + 複雑なニューラルネットワークをより簡潔に記述
  • 17. 17 ユニット機能 – 基本的な使い方 プログラミングにおける関数とその引数感覚で、直観的に使うことができる 1. ユニットを定義する 2. 定義したユニットを呼び出す Argumentレイヤーで 引数を定義 受け取った 引数の利用 Unitレイヤーで 定義したUnitを 呼び出し
  • 18. 18 ユニット機能 – ユースケース1 よく使う構成をユニットとして定義し、グラフの見通しをよくする 例) LSTM 例) Squash@CapsNet プログラミングにおける、サブルーチンの定義に相当する使い方ができる
  • 19. 19 ユニット機能 – ユースケース2 ? ネットワークの主要部分は1つだけ定義し、差異 のみを上位のネットワークに記述可能に 例:MobileNet 学習用Net 評価用Net MobileNet Unit 学習用Net 評価用Net 利用 ? 従来、学習、評価時に別のネットワークを使う場 合、それぞれを別に定義する必要があった (コピー&ペースト) ネットワークの改造時に複数のネットを修正する必要がなくなり、作業効率が改善 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adamnnhttps://arxiv.org/abs/1704.04861
  • 20. 20 ユニット機能 – NNLibrariesのPythonコード出力にも対応 def network_FireModule(x, SqueezeMaps, ExpandMaps, test=False): # Input:x -> 96,56,56 # Squeeze -> 16,56,56 h = PF.convolution(x, SqueezeMaps, (1,1), (0,0), name='Squeeze') # SqueezeReLU h = F.relu(h, True) # Expand1x1 -> 64,56,56 h1 = PF.convolution(h, ExpandMaps, (1,1), (0,0), name='Expand1x1') # Expand3x3 -> 64,56,56 h2 = PF.convolution(h, ExpandMaps, (3,3), (1,1), name='Expand3x3') # Expand1x1ReLU h1 = F.relu(h1, True) # Expand3x3ReLU h2 = F.relu(h2, True) # Concatenate -> 128,56,56 h1 = F.concatenate(h1, h2) return h1 ユニットのコード 呼び出し元のコード Neural Network Librariesとの高い親和性 ? 各ユニットはそれぞれ関数として出力 ? Argumentレイヤーで設定した引数も引き継がれる def network_SqueezeNet(x, DropP, test=False): # SNInput:x -> 3,227,227 # MulScalar h = F.mul_scalar(x, 0.01735) # AddScalar h = F.add_scalar(h, -1.99) # Convolution -> 64,113,113 h = PF.convolution(h, 64, (3,3), (0,0), (2,2), name='Convolution') # ReLU h = F.relu(h, True) # MaxPooling -> 64,56,56 h = F.max_pooling(h, (3,3), (2,2)) # FireModule -> 128,56,56 with nn.parameter_scope('FireModule'): h = network_FireModule(h, 16, 64) # FireModule_2 with nn.parameter_scope('FireModule_2'): h = network_FireModule(h, 16, 64) …
  • 22. 22 pptxレポート出力機能 学習の設定、学習?評価結果をPower Point ? 形式のレポートとして出力できる機能 ※PowerPoint?は米国Microsoft Corporationの米国およびその他の国における登録商標です。
  • 24. Dataset : Training ? Number of data : 60,000 – Variable : x (image) ? Type : Image ? Shape : 1, 28, 28 – Variable : y (label) ? Type : Scalar pptxレポート出力機能を用いて出力した実際のレポート
  • 25. Dataset : Examples of variable x in "Training" pptxレポート出力機能を用いて出力した実際のレポート
  • 26. Dataset : Validation ? Number of data : 10,000 – Variable : x (image) ? Type : Image ? Shape : 1, 28, 28 – Variable : y (label) ? Type : Scalar pptxレポート出力機能を用いて出力した実際のレポート
  • 27. Dataset : Examples of variable x in "Validation" pptxレポート出力機能を用いて出力した実際のレポート
  • 28. Network Architecture : Main Type Value Output 26,929 CostParameter 70,054 CostAdd 21,920 CostMultiply 3,144 CostMultiplyAdd 700,904 CostDivision 10 CostExp 110 CostIf 13,124 pptxレポート出力機能を用いて出力した実際のレポート
  • 29. Training Procedure : Optimizer ? Optimize network "Main" using "Training" dataset. – Batch size : 64 – Solver : Adam ? Learning rate(Alpha) : 0.001 ? Beta1 : 0.9 ? Beta2 : 0.999 ? Epsilon : 1e-08 – Weight decay is not applied. pptxレポート出力機能を用いて出力した実際のレポート
  • 30. Experimental Result : Learning Curve pptxレポート出力機能を用いて出力した実際のレポート
  • 31. Experimental Result : Evaluation ? Evaluate network "MainRuntime" using "Validation" dataset. ? Variable : y – Accuracy : 0.9931 – Avg.Precision : 0.9930 – Avg.Recall : 0.9929 – Avg.F-Measures : 0.9929 pptxレポート出力機能を用いて出力した実際のレポート
  • 32. References ? Sony Corporation. Neural Network Console : Not just train and evaluate. You can design neural networks with fast and intuitive GUI. https://dl.sony.com/ ? Sony Corporation. Neural Network Libraries : An open source software to make research, development and implementation of neural network more efficient. https://nnabla.org/ ? BatchNormalization - Ioffe and Szegedy, Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. https://arxiv.org/abs/1502.03167 ? Convolution - Chen et al., DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs. https://arxiv.org/abs/1606.00915, Yu et al., Multi-Scale Context Aggregation by Dilated Convolutions. https://arxiv.org/abs/1511.07122 ? ELU - Clevart et al., Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). http://arxiv.org/abs/1511.07289 ? Adam - Matthew D. Zeiler. ADADELTA: An Adaptive Learning Rate Method. https://arxiv.org/abs/1212.5701 pptxレポート出力機能を用いて出力した実際のレポート
  • 34. 34 豊富なGPUリソースを利用可能に ? ニューラルネットワークの学習には膨大な演算が必要 ? 必要な演算量は主に扱うデータの量とニューラルネットワークの 構造に依存 ? GPU、マルチGPUを用いると、学習完了までの時間を 大幅に短縮できる ? ネットワークにもよるが、10倍~数百倍高速に学習できる ? 同じ開発期間でより多くの試行錯誤を行うことが可能に ? 環境のセットアップ、メンテナンス作業不要で豊富な GPUリソースを利用可能 ? 開発者はDeep Learningの開発作業に集中できる 最先端研究者と同等の環境(1ジョブあたり8GPU×無制限の並列利用)をGUI環境から利用可能
  • 35. 35 シングルGPUにおける学習時の動作 Fwd/Bwd 1 iteration GPU Fwd/Bwd Fwd/Bwd Fwd/Bwd… Time 1 epoch Num data / Batch size Fwd/Bwd Update 1 epochの間にデータセットのデータ数÷Batch Size回以下の動作を行う ? CONFIGタブ、Global ConfigのBatch Sizeで指定した数のデータをデータセットから取得 ? 取得したデータを用いてニューラルネットワークのパラメータの勾配を計算 (Forward/Backward) ? 求めた勾配を用いてニューラルネットワークのパラメータを更新(Update)
  • 36. 36 マルチGPU時における学習時の動作 Fwd/BwdGPU 1 Fwd/Bwd Fwd/Bwd… Time 1 epoch Num data / (Batch size * Num GPU) Fwd/BwdGPU 2 Fwd/Bwd Fwd/Bwd… Fwd/BwdGPU 3 Fwd/Bwd Fwd/Bwd… Fwd/BwdGPU n Fwd/Bwd Fwd/Bwd… … UpdateSync1 iteration Forward/Backward計算と Update計算の間に以下の 処理が入る ? 求めた勾配を全ての GPU間で平均(Sync)
  • 37. 37 マルチGPU学習とシングルGPU学習の関係 Fwd/Bwd 256×4 data GPU=Fwd/Bwd 256 data / GPU GPU 1 Fwd/BwdGPU 2 Fwd/BwdGPU 3 Fwd/BwdGPU 4 Multi-GPU Single-GPU シングルGPU時と同じ結果を得るには、 Learning RateをGPU数倍する 例)シングルGPU時Learning Rate 0.1のプロジェクトを 4GPUで学習するには、Learning Rateを4倍の0.4とする マルチGPUを用いた学習は、シングルGPUにおけるBatch SizeをGPU数倍した学習に相当
  • 38. 38 マルチGPUの使いどころ マルチGPU学習が適さないケース 学習に要する時間が極めて短い ? 1 Iterationの演算に要する時間が極端に短い場 合(10ms以下など)、マルチGPUの場合GPU 間の通信に要する時間等、その他のオーバー ヘッドが支配的に 1つのデータのサイズが小さい 1つの関数の処理にかかる時間が短い ? 各レイヤーのForward、Backward演算に要す る時間が極めて短い(0.1ms以下など)ような ネットワークではGPUによる高速化効果が得 られづらいことがある マルチGPU学習が適したケース 学習に要する時間が長い ? シングルGPUでは1度の学習に数日~数週間を 要するケース ? 4GPU、8GPUの利用により最大4倍、8倍に学 習時間を短縮可能 演算量に対するパラメータサイズが小 さいネットワーク ? 画面右下に表示されるCostMultiplyAdd(演算 量)に対してCostParameter(パラメータサイ ズ)が小さいネットワークほど効率よく複数の GPUを利用できる プロジェクトの特性に合わせて効果的にマルチGPUの活用を
  • 41. 41 Neural Network Libraries/Consoleまとめ 今後もDeep Learningの研究開発におけるボトルネックの徹底的な解消を目指した開発を継続 Neural Network Libraries https://nnabla.org/ Neural Network Console https://dl.sony.com/ import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF x = nn.Variable(100) t = nn.Variable(10) h = F.tanh(PF.affine(x, 300, name='affine1')) y = PF.affine(h, 10, name='affine2') loss = F.mean(F.softmax_cross_entropy(y, t)) 実現 ? Deep Learning応用技術者の迅速な育成 ? 効率的なDeep Learning応用技術の研究開発~実用化 様々な特長を兼ね備えた最新世代のDeep Learningフレームワーク 商用クオリティのDeep Learning応用技術開発を実現する統合開発環境