なにわTech20170218(tpu) tfug

Preview:

Citation preview

TensorFlow の量子化について

2017/2/18

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

夏谷

1

Imagination,  Action, and to the Creation!

アジェンダ

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

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

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

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

2

自己紹介

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

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

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

3

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

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

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

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

あ き の

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 に量子化してるってどこ情報?

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について一言も言ってない

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 ですごく良いパフォーマンスがでる。これは何かトリックがあるはず。

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

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

9

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

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

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

なんやかんやあって

10

これなら僕にも作れそう

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

11

Hexagon アーキテクチャ

Hexagon architecture

12

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

PC で言うところの CPU

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

Hexagon architecture

14

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

大容量のDRAM

Hexagon architecture DSP とは

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

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

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

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

15

16

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

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.

量子化はサポート済み

qint8

18

・・・・

float maxfloat min

8bit

0

max

min

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

How Does the Quantization Process Work?

19

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

Quantization, DeQuantization

20

0

max

min

Xqt

X

255

gain offset

y = ax + b

21

量子化された数値の演算

量子化された数値の演算

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

符号反転 -A

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

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

再量子化

22

※numpy のイメージで

定数の加算

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) 、ほぼノーコストで実行できる。

定数の乗算

24

0

max*a

min*a

X

255

gainoffset

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

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

Xqt

定数の乗算

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

定数の乗算

26

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

3x3 kernel

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

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

5 6 7 8

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

3x3 kernel

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

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

符号反転

27

0

max

min

Xqt

X

255

gain offset255

min

max0 Xqt

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

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

量子化された加算

28

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

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

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

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

量子化された加算

29

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

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

量子化された加算

30

BqtAqt

Gain*qparamqparam

Cqt

×

×

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

量子化された加算

31

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

量子化された乗算

32

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

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

バグ有り実装

8x8 の乗算加算が 2回

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

量子化された乗算

33

バグ有り実装

量子化された乗算

34

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

量子化された乗算

35

0

y

x

1,000,000

1.0

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

量子化された乗算

36

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

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

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

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

量子化された乗算

37

BqtAqt

Gain*qparamqparam

Cqt

×

×

Aqt×Bqt

× again*bgain

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

BqtAqt

Gain*qparamqparam

Cqt

×

×

× again*bgain

×

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

量子化された乗算

38

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

再量子化

39

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

まとめ

40

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

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

再量子化

max, min の操作のみ

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

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

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

41

NPU の紹介

NPU のアーキテクチャ

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

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

42

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

TTPU

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

符号反転回路

44

加算

45

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

乗算

46

Sim環境

47

M0

M1lin2.dat

M2lin2.dat

M3

CPU I/F

8bit

registers

NPU Core

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

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

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

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

lin2.dat

sim 結果

48

加算

乗算

A

B

A+B

A

B

A*B

実際に 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

50

その他

TPU にありそうな機能

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

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

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

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

最大値、最小値 合計値

51

TPU にありそうな機能

52

A_qt

B_qtq_add C_qt gamma

correction(LUT)

アドレス 8bit8bit幅の LUT

C‘_qt

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

出力にガンマ補正の回路

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

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 持って来る

ここで桁あわせ

足りない物

54

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

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

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

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

作成中

Keras から C へ

55

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

main ユーザープログラム

json

npy

重みを numpy形式で出力

実行時に読み込む

Keras から C へ

56

最後に

57

TensorFlow   User Group

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

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

KANSAI !

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

58

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

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

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

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

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

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

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

一緒に働く人を募集中

59

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

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

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

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

60