Tensorflow Liteの量⼦化アーキテクチャ
2020.8.1 ax Inc.
Presenter : Hitoshi Shinabe ( ax Inc. )
1
本セッションについて
Tensorflow Liteを例に機械学習モデルの量⼦化のアーキテクチャを解説します
※資料については、Connpassイベントページにアップ予定です
2
「量⼦化」について
3
量⼦化とは︖(従来のFloat状態)
全てFloat
4
量⼦化するとなぜ良いのか︖
• 演算(処理速度)が速くなる
• メモリが節約できる
• モデルが⼩さくなる
→ 組み込み機器や低パフォーマンス機器でも実⾏可能になる
5
量⼦化するとなぜ良いのか︖(詳細)
• DeepLearningのテンソル(⼊⼒値・中間値・出⼒値それぞれ/レイヤの⼊出⼒)
と重みは⼀般的にFloatである
• 特に組み込み機器などでFloatを使うと、演算負荷とメモリ帯域の問題が発⽣
• FloatではなくInt8で演算できれば⾼速化が⾒込める
ベクトル
演算効率向上
(例︓SSE2/AVXの場
合)
メモリ効率向上
Float 4並列SIMD命令 Int 8並列SIMD命令
Float ( 32bit / 4byte )
Int8
( 8bit / 1byte )
6
量⼦化のデメリット
とはいえ良いことずくめでもない
❖ 精度が落ちる
➢ 単純に演算精度が落ちるため、最終的な認識精度も落ちる
➢ いかに実⽤的な精度に落として量⼦化をするかがポイント
★ 対策
○ 量⼦化に強いネットワークを使う
○ 量⼦化の⽅法を⼯夫する(今回はこちらの解説)
7
TensorFlowでの量⼦化について
8
Tensorflowにおける量⼦化⽅式(1.15.0以降)
・ダイナミックレンジ量⼦化︓重みだけInt8にする
・完全な整数量⼦化︓重みとテンソルをInt8にする ← 今回はこちらを解説(Post-training integer
quantization)
引用:https://www.tensorflow.org/lite/performance/post_training_quantization
歴史的に出てきた順番
9
Post-training integer quantizationを⾏うとどうなるか
Input Tensor
Convolution
+ Activation
Output Tensor
Weight
Float -> Int8 へ
Float -> Int8 へ
Float -> Int8 へ
Bias
Float -> Int32
へ
Int32 ->Int8
*
+
Input Tensor
Convolution
Output Tensor
Weight
Float
Float
Float
Bias
Float
Activation
*
+
Before After
10
Convolutionにおける量⼦化の実際
1.1 1.1 1.1 1.1
1.1 1.1 1.1 1.1
-1.1 -1.1 0 0
-1.1 -1.1 0 0
1.1 1.1
1.1 1.1
*
4.84 4.84
-4.84 0
=
127 127 127 127
127 127 127 127
-127 -127 0 0
-127 -127 0 0
127 127
127 127
*
645
16
645
16
-
645
16
0
=
input_scale=1.1 /127 weight_scale=1.1 / 127
127 127
-127 0
output_scale=4.84 / 127
ランタイムのグラフ読み込み時に計算
scale = input_scale * weight_scale /
output_scale = 0.00196850394
*scale
*input_scale *weight_scale
Float
Int8
キャリブレーション
ツールで事前計算
bias(Int32)
11
Tensorflowの提供する量⼦化ツール
Tensorflowで出⼒したpbをTensorflowLiteのConvert APIを使⽤することでInt8に量⼦化できる
量⼦化の際にはキャリブレーション⽤の画像が必要
学習側には⼿を⼊れなくて良い(Quantize Aware Trainingをしなくていい)
pb tflite (int8)TFLiteConvert
Validation Set
12
量⼦化のスクリプトの例
Python APIのTFLiteConverter.from_frozen_graphを呼び出す
supported_opsにTFLITE_BUILTINS_INT8を指定する
13
TFLiteConvertの内部動作
グラフ最適化、tflite (float)への変換、キャリブレーション、tflite (int8)の出⼒を⾏なっている
⼊⼒はpbだが、バイパスすればtflite (float)を直接量⼦化することもできる
pb
GraphO
ptimizati
on
pb
Convert
ToTFLit
e
tflite
(float)
Callibrat
ion
tflite
(int8)
tflite
runtime
validation
set
レイヤーフュージョン
などの最適化を⾏う
画像を変えながら推論
してTensorの
min/maxを計算する
min/max の把握をする
単純なmin/maxであり分布計算などはしていない
14
キャリブレーションにおけるmin/max
テンソルのFloatの値の最⼩値と最⼤値を計算
スケールはzero_point=0の場合、最⼩値と最⼤値の絶対値の⼤きい⽅となる
-7.0 -6.0 -5.0 -4.0
-3.0 -2.0 -1.0 0
1.0 2.0 3.0 4.0
5.0 6.0 7.0 8.0
min_v = -7.0
max_v = 8.0
scale =
max(abs(min_v),abs(max_v)) / 127
15
量⼦化したモデルの推論
tf.lite.Interpreterに量⼦化したモデルを与えることで推論できる
16
量⼦化したモデルのフォーマットとパラメータへのアクセス⽅法
tflite (float)と同じくFlatBuffersになるが、tfliteのAPIではper-axis(チャンネル毎)の量⼦化パ
ラメータは取得できないため、FlatBuffersに直接、アクセスする必要がある
17
量⼦化の仕様
テンソルもしくはテンソル内のチャンネルごとにscaleとzero_pointを持つ
scaleはfloatでtfliteファイルに格納される、zero_pointは64bit整数でtfliteファイルに格納される
TensorFlow Lite 8-bit quantization specification
引用:https://www.tensorflow.org/lite/performance/quantization_spec
FloatとInt8の対応関係
18
なぜチャンネル毎にscaleとzero-pointを持つのか︖
per-axis vs per-tensor ( channel-wise vs layer-
wise )
重みを量⼦化する際に、全てを同じscaleで量⼦化すると精度が低下する
重みについてはoutput channelごとに量⼦化することで精度が⼤幅に改善する
引用:Quantization for Rapid Deployment of Deep Neural Networks
https://arxiv.org/abs/1810.05488
GoogleNetやVGG16は
Layer-wise (per-tensor)で
量⼦化しても精度が出るが、
MobileNetやResNetは
Channel-wise (per-axis)で
量⼦化しないと精度が低下
する
量⼦化による
精度低下率
19
ConvolutionにおけるPer-axisの図解
per-tensorではoutput channelに相当する3つのweight全てで同じscaleをもつ
per-axisではoutput channelに相当する3つのweightそれぞれでscaleをもつ
Input Channel = 3
(B,H,W,C)=(1,8,8,3)
Output Channel = 3
(1,8,8,3)
Weight
(OC,KY,KX,IC)=(3,2,2,3)
scale
scale
scale
+
*
20
レイヤーごとの量⼦化設定
各レイヤーがどういう設定で量⼦化されるかが定義されている
https://www.tensorflow.org/lite/performance/quantization_spec
Output Channelご
との量⼦化
22
Tensorflowでの量⼦化の精度の例
MobileNetV2を量子化して時計の画像を入力した場合のクラス
Per-axis Quantizationによってかなり高精度に推論できる
MobileNetV2
keras model
Predicted: [('n02708093', 'analog_clock', 0.47966293), ('n04548280', 'wall_clock', 0.17145523), ('n04328186', 'stopwatch',
0.019265182)]
tf lite float
Predicted: [('n02708093', 'analog_clock', 0.47966337), ('n04548280', 'wall_clock', 0.171455), ('n04328186', 'stopwatch',
0.01926511)]
tf lite int8
Predicted: [('n02708093', 'analog_clock', 104), ('n04548280', 'wall_clock', 48), ('n04328186', 'stopwatch', 8)]
23
まとめ
量⼦化を⾏うことで精度をある程度、維持しながら演算速度を向上させることができる
Tensorflow LiteのPost-training Quantizationを使⽤することで学習のやり⽅は変えずに量⼦化
できる
24
ax株式会社について
• クロスプラットフォームでGPUを使⽤した⾼速推論ができる「ailia SDK」を開発・提供
• ailia SDKは無償評価版提供中︕詳しくはailia SDKのWEBサイトへ。
• 推論フレームワークをフルスクラッチで⾃社開発しています
• AIチップ向け、組み込み機器向けに8bit量⼦化に対応中
• 組み込み機器でのディープラーニングでお困りの事がありましたらご相談下さい
25
ax株式会社 https://axinc.jp/
ailia SDK https://ailia.jp/
ご清聴有り難うございました
https://ailia.jp/
ご質問はDLLABのSlackにて︕
26

Tensorflow Liteの量子化アーキテクチャ