60
TensorFlow のののののののの 2017/2/18 株株株株株株株株株株 株株株株株株株株株株株 1 Imagination, Action, and to the Creation!

なにわTech20170218(tpu) tfug

Embed Size (px)

Citation preview

Page 1: なにわTech20170218(tpu) tfug

TensorFlow の量子化について

2017/2/18

株式会社パソナテックエンジニアリング事業部

夏谷

1

Imagination,  Action, and to the Creation!

Page 2: なにわTech20170218(tpu) tfug

アジェンダ

自己紹介と経緯 Hexagonアーキテクチャ TensorFlow で使われている量子化について 量子化された数値の演算

定数の加算、乗算 符号反転 量子化された数値の加算 量子化された数値の乗算 再量子化

NPUの紹介 NPUのアーキテクチャ Verilog SIM 結果

その他 足りないもの その他

2

Page 3: なにわTech20170218(tpu) tfug

自己紹介

夏谷実 株式会社パソナテック

株式会社パソナテック エンジニアリング事業部 エンジニアマネージメントグループ

TFUG KANSAI←New ! 最近は半導体関連の仕事が多い FPGA が好き プログラミングも好き Deep Learning も好き 

3

Page 4: なにわTech20170218(tpu) tfug

4頑張って Web サイト作成中  ・・・http://technotan.net

公認キャラにライバル登場

安芸乃 てく(通称:てくのたん) @techno_tan

高知県在住の将来がウルトラスーパー不安な高校生(ソ^ ^▽ )ナとりあえず Web 作ってみたりとかそういうことに手を出している。卒業後の将来へ漠然とした不安を感じつつ、父に勧められて Web サイトを制作し、パソナテックのインターンの面談会に参加。CV は高野麻理佳さん!

あ き の

Page 5: なにわTech20170218(tpu) tfug

Google supercharges machine learning tasks with TPU custom chip

5

https://cloudplatform.googleblog.com/2016/05/Google-supercharges-machine-learning-tasks-with-custom-chip.html

今ある情報は・ Google の実際のサービスで使われている。・消費電力が少ない・精度を落としている。

the chip to be more tolerant of reduced computational precision

あれ、 8bit に量子化してるってどこ情報?

Page 6: なにわTech20170218(tpu) tfug

8bit 情報元

6

http://www.forbes.com/sites/tiriasresearch/2016/05/26/google-builds-its-first-chip-just-for-machine-learning/#16e2168d7a92

@petewarden

Jetpac Inc,

https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/

この人、 TPUについて一言も言ってない

Page 7: なにわTech20170218(tpu) tfug

CES2017 でクアルコムが Hexagon DSP で GoogleNet を動かす

7

https://www.qualcomm.com/news/snapdragon/2017/01/09/tensorflow-machine-learning-now-optimized-snapdragon-835-and-hexagon-682

Optimal power & performance for GoogleNet Inception DNN (Deep Neural Network). Choose the core to match the user experience. (actual performance may vary)

8 ~ 9fps

整数のみの SIMD ですごく良いパフォーマンスがでる。これは何かトリックがあるはず。

Page 8: なにわTech20170218(tpu) tfug

Hxagon   Archtecture

8

http://www.hotchips.org/wp-content/uploads/hc_archives/hc27/HC27.24-Monday-Epub/HC27.24.20-Multimedia-Epub/HC27.24.211-Hexagon680-Codrescu-Qualcomm.pdf

Page 9: なにわTech20170218(tpu) tfug

TensorFlow には Hexgon 用のコードっぽいものが入ってる

9

なんかテストコードしかない

その代わりに量子化のコードは見つけた

中身はよくわからなかった。

Page 10: なにわTech20170218(tpu) tfug

なんやかんやあって

10

これなら僕にも作れそう

※ :実際に TPU がこういう実装になっているとう話ではありません。

Page 11: なにわTech20170218(tpu) tfug

11

Hexagon アーキテクチャ

Page 12: なにわTech20170218(tpu) tfug

Hexagon architecture

12

http://www.anandtech.com/show/9552/qualcomm-details-hexagon-680-dsp-in-snapdragon-820-accelerated-imaging

PC で言うところの CPU

Page 13: なにわTech20170218(tpu) tfug

Hexagon architecture

13

http://www.hotchips.org/wp-content/uploads/hc_archives/hc27/HC27.24-Monday-Epub/HC27.24.20-Multimedia-Epub/HC27.24.211-Hexagon680-Codrescu-Qualcomm.pdf

Page 14: なにわTech20170218(tpu) tfug

Hexagon architecture

14

http://www.anandtech.com/show/9552/qualcomm-details-hexagon-680-dsp-in-snapdragon-820-accelerated-imaging

大容量のDRAM

Page 15: なにわTech20170218(tpu) tfug

Hexagon architecture DSP とは

CPU の横の GPU ポジション、 SIMD で行列演算が強い OS を動かすのは苦手 消費電力と計算量のバランスが良い DRAM から内部メモリへデータを持ってきて、ベクトル

計算後 DRAM へ書き戻す。 Hexagon の特徴

Snapdragon に GPU も乗っている。 GPU と CPU の間の処理

整数のベクトル演算に特化。 バイト単位の計算も得意 LUT 持ってます

15

Page 16: なにわTech20170218(tpu) tfug

16

TensorFlow で使われている量子化について

Page 17: なにわTech20170218(tpu) tfug

TensorFlow がサポートしている型

17

https://www.tensorflow.org/api_docs/python/framework/tensor_types

•tf.int8: 8-bit signed integer.•tf.uint8: 8-bit unsigned integer.•tf.uint16: 16-bit unsigned integer.•tf.int16: 16-bit signed integer.•tf.int32: 32-bit signed integer.•tf.int64: 64-bit signed integer.•tf.bool: Boolean.•tf.string: String.•tf.qint8: Quantized 8-bit signed integer.•tf.quint8: Quantized 8-bit unsigned integer.•tf.qint16: Quantized 16-bit signed integer.•tf.quint16: Quantized 16-bit unsigned integer.•tf.qint32: Quantized 32-bit signed integer.•tf.resource: Handle to a mutable resource.

量子化はサポート済み

Page 18: なにわTech20170218(tpu) tfug

qint8

18

・・・・

float maxfloat min

8bit

0

max

min

Mix から max の間を 0-255 の整数値で表現

Page 19: なにわTech20170218(tpu) tfug

How Does the Quantization Process Work?

19

https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/

Page 20: なにわTech20170218(tpu) tfug

Quantization, DeQuantization

20

0

max

min

Xqt

X

255

gain offset

y = ax + b

Page 21: なにわTech20170218(tpu) tfug

21

量子化された数値の演算

Page 22: なにわTech20170218(tpu) tfug

量子化された数値の演算

定数の加算、乗算 A + 0.5 A * 0.2

符号反転 -A

量子化されたベクトルの加算 A + B

量子化されたベクトルの乗算 A * B

再量子化

22

※numpy のイメージで

Page 23: なにわTech20170218(tpu) tfug

定数の加算

23

0

max+a

min+a

Xqt

X

255

gain offsetmax と min の値に定数を加算すれば終り。

例: min = 0, max = 100 の量子化されたデータ全てに 50 を足す場合は、 min=50, max=150 にする。量子化された値は修正不要。

X の要素数 n によらず定数の加算は O(1) 、ほぼノーコストで実行できる。

Page 24: なにわTech20170218(tpu) tfug

定数の乗算

24

0

max*a

min*a

X

255

gainoffset

max と min の値に定数をかければ終り。X の要素数 n によらず定数の乗算も O(1) 、ほぼノーコストで実行できる。

負数を乗算するときは、符号反転してから乗算する。(後で)

Xqt

Page 25: なにわTech20170218(tpu) tfug

定数の乗算

25

float maxfloat minA

𝐴′=14 𝐴

float max/4  float min/4

①ベクトル A から、定数倍したベクトル A’ を作るときに、 max, minだけ変数の領域を取ればよい

②ベクトル A とベクトル Bにそれぞれ違う定数をかける

𝐴′=0.25∗ 𝐴float max_a*0.25  float min_a*0.25

𝐵′=0.128∗𝐵 float b_max*0.128float b_min*0.128

Page 26: なにわTech20170218(tpu) tfug

定数の乗算

26

縦方向のコンボリューション

3x3 kernel

kernel の係数の乗算は、定数の乗算なのでO(1) で完了する。

横方向のコンボリューション

5 6 7 8

の注目画素が 6 の時、 p-1 は 5, p+1 は7

3x3 kernel

横方向はもっと楽。元のベクトルを変更することなく、コンボリューションの係数乗算が終了する。→加算ができればコンボリューション終了

注意点:加算時に乗算が入るので、計算自体が減るわけではない。(むしろ増える)

Page 27: なにわTech20170218(tpu) tfug

符号反転

27

0

max

min

Xqt

X

255

gain offset255

min

max0 Xqt

量子化された値を入れ替える

max, min に -1 をかけるだけでもシステムとしては問題無いが、 TensorFlowの世界では常に max > min が成り立つようにしないといけない。

Page 28: なにわTech20170218(tpu) tfug

量子化された加算

28

C の max と min は、 A,Bそれぞれの max, min の和

Bqt のスケールを Aqt に合わせて加算

加算結果を Cqt のスケールに合わせる

ここには負の数がでてこない。地味に Verilog 実装が楽

Page 29: なにわTech20170218(tpu) tfug

量子化された加算

29

この 2 行だけが numpy array の計算。(ベクトル演算)

ここは普通の変数( スカラーの演算)

Page 30: なにわTech20170218(tpu) tfug

量子化された加算

30

BqtAqt

Gain*qparamqparam

Cqt

×

×

1命令で量子化された加算を実行可能

Page 31: なにわTech20170218(tpu) tfug

量子化された加算

31

緑: numpy で計算した結果(float)青: Cqt (8bit)赤: Cqt を deQuantaize した結果

Page 32: なにわTech20170218(tpu) tfug

量子化された乗算

32

C の max と min は、 A,Bそれぞれの max, min の積

量子化の時はこの項の計算不要

バグ有り実装

8x8 の乗算加算が 2回

例:(3x-2)(2y+1)=6xy+3x-4y-2

Page 33: なにわTech20170218(tpu) tfug

量子化された乗算

33

バグ有り実装

Page 34: なにわTech20170218(tpu) tfug

量子化された乗算

34

C の max と min は、 A,Bそれぞれの max, min の積→間違い

Page 35: なにわTech20170218(tpu) tfug

量子化された乗算

35

0

y

x

1,000,000

1.0

1 つでも -1.0 があるとかけ算の結果は -1,000,000 になる。

Page 36: なにわTech20170218(tpu) tfug

量子化された乗算

36

A,B の最小値を 0 にする。 A’,   B’ とも全ての要素は 0以上。

8bit の乗算 量子化された加算が 2回

A’, B’ の offset は 0だから

例:(3x-2)(2y+1)=6xy

Page 37: なにわTech20170218(tpu) tfug

量子化された乗算

37

BqtAqt

Gain*qparamqparam

Cqt

×

×

Aqt×Bqt

× again*bgain

量子化された乗算も、 2命令でできる。

BqtAqt

Gain*qparamqparam

Cqt

×

×

× again*bgain

×

もしかしたら 1命令で実行しているかも

Page 38: なにわTech20170218(tpu) tfug

量子化された乗算

38

緑: numpy で計算した結果(float)青: Cqt (8bit)赤: Cqt を deQuantaize した結果

Page 39: なにわTech20170218(tpu) tfug

再量子化

39

量子化された値を、実際の最大値、最小値の範囲で、再度量子化を行う。

Page 40: なにわTech20170218(tpu) tfug

まとめ

40

定数の加算、乗算 符号反転 量子化されたベクトルの加算

量子化されたベクトルの乗算

再量子化

max, min の操作のみ

max, min の操作+量子化された値を反転

乗算 2回、加算 1回、ただし DSPだと 1命令

乗算 4回、加算 2回、ただし DSPだと 1 ~ 2命令

Page 41: なにわTech20170218(tpu) tfug

41

NPU の紹介

Page 42: なにわTech20170218(tpu) tfug

NPU のアーキテクチャ

Nagato Processing Unit 細かい計算は CPU に任せて、量子化された

データの SIMD のみ実装 一回目のテスト実装 名前は募集中

42

ボツ案てくのたんのプロセッシングユニット

TTPU

Page 43: なにわTech20170218(tpu) tfug

NPU アーキテクチャ

43

Local memory x4

M0

M1

M2

M3

DRAM

CPU I/F

NPU Core8bit

8bit

qADD

qMUL

registers

SRAM CNT

CPU R/W

8bit

Page 44: なにわTech20170218(tpu) tfug

符号反転回路

44

Page 45: なにわTech20170218(tpu) tfug

加算

45

・入力 8bit, 出力 8bit・ 1CLK で 1 データのスループット・レイテンシ 7CLK

Page 46: なにわTech20170218(tpu) tfug

乗算

46

Page 47: なにわTech20170218(tpu) tfug

Sim環境

47

M0

M1lin2.dat

M2lin2.dat

M3

CPU I/F

8bit

registers

NPU Core

①input ディレクトリから、テキストデータをSRAM にロード$readmemh

②CPU へレジスタ設定、演算の開始

③割り込み待ち(タイムアウト有り)

④ouptut ディレクトリに、テキストダンプして$finish$writememh

lin2.dat

Page 48: なにわTech20170218(tpu) tfug

sim 結果

48

加算

乗算

A

B

A+B

A

B

A*B

Page 49: なにわTech20170218(tpu) tfug

実際に FPGA で動かすために必要な回路

49

DRAM

CPU R/W

M0

M1

M2

M3

CPU I/F

8bit

registers

NPU Core

http://jp.techcrunch.com/2016/12/01/20161130aws-announces-fpga-instances-for-its-ec2-cloud-computing-service/

PYNQ

AWS FPGA instance

Page 50: なにわTech20170218(tpu) tfug

50

その他

Page 51: なにわTech20170218(tpu) tfug

TPU にありそうな機能

qint8, qint16, qint24, qint32 サポート 8bit じゃRelu が精一杯 識別系(最後が softmax) には使えるけど、それ以外の

用途だともう少し精度が欲しい気がする。 Hexagon の様子を見る

ローカルメモリコントローラ 部分行列、転置のサポート

量子化、逆量子化、再量子化ハードウェアサポート 量子化された値の統計情報サポート

最大値、最小値 合計値

51

Page 52: なにわTech20170218(tpu) tfug

TPU にありそうな機能

52

A_qt

B_qtq_add C_qt gamma

correction(LUT)

アドレス 8bit8bit幅の LUT

C‘_qt

ReLU シグモイド 飽和演算 2 値化

出力にガンマ補正の回路

Page 53: なにわTech20170218(tpu) tfug

今回の実装で真っ先に直したいところ

53

ここを固定小数点数で実装しているが、浮動小数点数をそのまま HW に入れられるほうが良い。( CPU の負担が減る)

https://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

この辺から 6 ~ 7bit 持って来る

ここで桁あわせ

Page 54: なにわTech20170218(tpu) tfug

足りない物

54

リファレンスモデル・ SystemC or MyHDL・性能見積もり、複数の NPU 、 ALU等

SIM のバッチ実行環境・乗算器の実装(ベンダー非依存に)・今 Vivado の SIM→iverilog等ベンダー非依存、かつコマンドライン実行に・リファレンスモデルから期待値を作り、自動比較・ランダム検証

評価用プログラム・ひらがな認識は単純パーセプトロン、 CNN

実機環境・ Pynq 画像入力、 CPU   I/F 、 DRAM   I/F

作成中

Page 55: なにわTech20170218(tpu) tfug

Keras から C へ

55

nnn_gen C ソースとヘッダー作成

main ユーザープログラム

json

npy

重みを numpy形式で出力

実行時に読み込む

Page 56: なにわTech20170218(tpu) tfug

Keras から C へ

56

Page 57: なにわTech20170218(tpu) tfug

最後に

57

TensorFlow   User Group

関西でも何かやりたいとかあれば連絡ください

「内輪感を出しすぎず、初心者の方でも、気軽に難しげな深層学習とか機械学習の話をわいわいやりたい」(下田さん)

KANSAI !

Page 58: なにわTech20170218(tpu) tfug

AI分野に関するパソナテックのサービス

58

①大量のデータに関する業務  ・データ収集  ・データ入力  ・データタグづけ、不正データ除去

他部署と連携し、大量データを安価にご提供します。セキュリティ面もご相談ください。

②機械学習に関する業務  ・学習環境の構築  ・学習器の設計、評価  ・パラメータ調整

お客様の目的に沿ったビジネスパートナーをご紹介します。

③商品化への業務  ・組込プログラミング  ・機械設計

機械学習に関する業務に関して、どの工程でも必要なサービスをご提供致します。

専門スキルを持った人材をご提供いたします。委託契約、派遣契約どちらも可能です。

Page 59: なにわTech20170218(tpu) tfug

一緒に働く人を募集中

59

■職務内容画像処理に関するアルゴリズムの検討と、組込システムへの実装を行います。 OpenCV等を用いて、 Windows環境で画像処理アルゴリズムの検討、評価を行います。アルゴリズムの評価終了後、 C 言語による組込プログラミングや Verilog-HDL によるハードウェア実装を行います。

■必須条件(1)幾何学変換や画像フィルターなどの基本的な画像処理の知識(2)組込 C プログラミングによるアルゴリム実装、評価(3)Verilog-HDL によるアルゴリズム実装、検証上記 3点のうち、最低 1点の経験を有すること

■歓迎条件・ DSP 、 GPU 、マルチプロセッサプログラミング経験、・ FPGA開発経験・機械学習、 Deep Learning に関する知識・マネージャ、チームリーダー経験

Page 60: なにわTech20170218(tpu) tfug

ご静聴ありがとうございました。

60