Slide 1

Slide 1 text

© DMM.com LLC TensorFlow Liteで 機械学習Androidアプリを 超簡単に作る 合同会社DMM.com 古川新 2018/09/01 GDG DevFest Tokyo 2018

Slide 2

Slide 2 text

© DMM.com LLC 古川新 合同会社DMM.com CTO室 兼 AI部 機械学習エンジニア 日本Androidの会 コミュニティ運営委員 アイコンは自分で描いたものです http://ornew.net 2

Slide 3

Slide 3 text

© DMM.com LLC 今日話す内容 1. “機械学習Androidアプリ”とは 2. TensorFlow Liteとは 3. TensorFlow Liteの使い方 4. パフォーマンス考察 3

Slide 4

Slide 4 text

© DMM.com LLC “機械学習Androidアプリ” …とは??? 4

Slide 5

Slide 5 text

© DMM.com LLC これから話す “機械学習Androidアプリ” ⇒ 機械学習したモデルを実行するAndroidアプリ Androidアプリ「で」機械学習すると思った方、すいませんm(_ _)m 今日はそこまで話せません。 5

Slide 6

Slide 6 text

© DMM.com LLC 「機械学習したモデルを実行する」とは? 6

Slide 7

Slide 7 text

© DMM.com LLC クラウドAPIサービスなど データ モバイルアプリ 一般的な機械学習の利用 モバイルアプリから Web経由でサーバのAPIを叩く 7

Slide 8

Slide 8 text

© DMM.com LLC クラウドAPIサービスなど データ モバイルアプリ 一般的な機械学習の利用? ???? ☞ 8

Slide 9

Slide 9 text

© DMM.com LLC クラウドAPIサービスなど データ モバイルアプリ ☞ 「モバイル端末上で実行しちゃえばよくない?」 と思いませんか? 一般的な機械学習の利用? 9

Slide 10

Slide 10 text

© DMM.com LLC モチベーション なぜオンデバイスで実行したいのか? ➔ プライバシーへの関心 ◆ 個人情報の保持・流出リスクの排除 ◆ リスクの大きい個人情報を用いた分析の活用 ➔ オフラインユースケース ◆ サーバ運用のコスト削減 ◆ 物理的にネットワークに接続できない状況でのインテリジェンス ➔ スマートアプライアンス ◆ その他IoTへの活用など 10

Slide 11

Slide 11 text

© DMM.com LLC そんなあなたに TensorFlow Liteを おすすめします 11

Slide 12

Slide 12 text

© DMM.com LLC TensorFlow Liteとは データ モバイルアプリ オンデバイス実行に 最適化された 軽量なモデル実行エンジン TensorFlow Lite 12

Slide 13

Slide 13 text

© DMM.com LLC TensorFlow Liteの特徴① ➔ Android、iOS、Raspberry Piをサポート ◆ Edge TPUボードも対応するらしい ➔ C++ APIとして提供されており、共通のコードで動作 ◆ Android用のJava APIも提供 13

Slide 14

Slide 14 text

© DMM.com LLC TensorFlow Liteの特徴② ➔ リソース制約のある環境に最適化されたオンデバイスインタプリタ ➔ 推論を省メモリで高速実行する ➔ 量子化演算をサポート(現在は8bitのみ) ➔ 演算子のカスタマイズによりライブラリ自体のサイズを調整可能 ➔ 最近のバージョンのAndroidでは NNAPI(Android Neural Network API)による ハードウェアクセラレーションに対応 ➔ パラメータの調整に対応 14

Slide 15

Slide 15 text

© DMM.com LLC TensorFlow Liteの使い方 (Android+Javaの場合) デモアプリを交えて解説します 15

Slide 16

Slide 16 text

© DMM.com LLC 全体のプロセス モデル構築 モデル変換 アプリで実行 SavedModel など TFLite Model TensorFlow Keras など TOCO (TensorFlow Lite Optimizing Converter) など TensorFlow Lite 16

Slide 17

Slide 17 text

© DMM.com LLC 全体のプロセス モデル構築 モデル変換 アプリで実行 TensorFlow Keras など TOCO (TensorFlow Lite Optimizing Converter) など TensorFlow Lite MLエンジニアが 作るところ アプリ開発者が 作るところ TFLite Model 17

Slide 18

Slide 18 text

© DMM.com LLC モデル構築 ➔ 基本的には下記のいずれかの形式でエクスポートします: ◆ TensorFlow Frozen Graph ◆ TensorFlow SavedModel ◆ HDF5 ➔ TensorFlowかKeras以外のフレームワークであっても、 上記形式に変換できればまず問題ありません。 注意:  TensorFlow Liteがビルトインでサポートしていない演算子をモデルに含む  場合は、カスタム演算子を定義する必要があります 18

Slide 19

Slide 19 text

© DMM.com LLC モデル変換 Frozen Graph、SavedModel、HDF5のいずれかが用意できたら、 TOCO (TensorFlow Lite Optimizing Converter)を用いて TFLite専用のモデル形式(*.tflite)に変換します ➔ TOCOは、CLIか、TensorFlow Python APIの tf.contrib.lite.toco_convert関数を利用できます ➔ APIリファレンスを参考にしてください https://www.tensorflow.org/api_docs/python/tf/contrib/lite/toco_convert ➔ パラメータの量子化などもこれで行えます 19

Slide 20

Slide 20 text

© DMM.com LLC アプリで実行 インタプリタの作成 モデルファイルの読み込み インタプリタの実行 TFLiteモデル形式(*.tflite)のファイルです。 Androidの場合、アセットに組み込むか、 ローカルストレージに保存して、 読み込むことになります。 ネットワーク経由で保存する場合は 悪意あるモデルを実行されないように ファイルの改ざんには気をつけてくださいね 20

Slide 21

Slide 21 text

© DMM.com LLC アプリで実行 インタプリタの作成 モデルファイルの読み込み インタプリタの実行 org.tensorflow.lite.Interpreter です。開発環境に応じて、ライブラリを追加してお きます。 インタプリタはモデルの実行エンジンです。 ほとんどの操作はインタプリタを介して 行います。 21

Slide 22

Slide 22 text

© DMM.com LLC アプリで実行 インタプリタの作成 モデルファイルの読み込み インタプリタの実行 モデルを実行するだけです。 22

Slide 23

Slide 23 text

© DMM.com LLC プロジェクトにライブラリを追加 Gradleの場合: allprojects { repositories { jcenter() } } dependencies { implementation 'org.tensorflow:tensorflow-lite:+' } 23

Slide 24

Slide 24 text

© DMM.com LLC プロジェクトにライブラリを追加 Bazelの場合(@org_tensorflow_tensorflow_lite//aar): GMAVEN_TAG = '20180723-2' http_archive( name = 'gmaven_rules', strip_prefix = 'gmaven_rules-%s' % GMAVEN_TAG, url = 'https://github.com/bazelbuild/gmaven_rules/archive/%s.tar.gz' % GMAVEN_TAG, ) load('@gmaven_rules//:gmaven.bzl', 'gmaven_rules') gmaven_rules() load('@gmaven_rules//:import_external.bzl', 'aar_import_external') aar_import_external( name = "org_tensorflow_tensorflow_lite", licenses = ['notice'], aar_urls = [ 'https://google.bintray.com/tensorflow/org/tensorflow/tensorflow-lite/1.9.0/tensorflow-lite-1.9.0.aar', ], aar_sha256 = 'b5a0c9c2063b56318b642ad9388c06865a5d7392fa5205074825b2615ddba267', ) 24

Slide 25

Slide 25 text

© DMM.com LLC インタプリタを作成/実行する インタプリタ(org.tensorflow.lite.Interpreter)に 下記のいずれかでモデルデータを渡して作成 - java.io.File - java.nio.MappedByteBuffer - java.nio.ByteBuffer try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) { interpreter.run(input, output); } 25

Slide 26

Slide 26 text

© DMM.com LLC サンプル: ラクガキ認識アプリ 学習済みモデルデータ、学習プログラム、サンプルアプリ … すべてオープンソースで公開しています。 GitHub: https://github.com/maru-labo/doodle ※ Androidアプリのサンプルソースコードはリポジトリ下の  examples/tensorflow_lite_androidディレクトリにあります ※ モデルの学習プログラムも置いてあります ※ 学習済みモデルデータ( model.tflite)はリリースに含まれています 26

Slide 27

Slide 27 text

© DMM.com LLC サンプル実装 https://github.com/maru-labo/doodle/blob/master/examples/tensorflow_lite_android/src/net/marulabo/doodle/MainActivity.java public class MainActivity extends AppCompatActivity { (略) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); (略) try { AssetManager assets = getAssets(); MappedByteBuffer model = loadAssetToMemory( assets, MODEL_FILENAME); interpreter = new Interpreter(model, THREAD_NUM); interpreter.setUseNNAPI(true); recognize.setEnabled(true); print("The model was loaded successful."); } catch(IOException e) { print("Failed to load the model: " + e.getMessage() + "\n"); return; } } メインアクティビティのonCreateで ①アセットからモデルファイルを  メモリに読み込み ②インタプリタを作成 ③NNAPIを有効化 しています。 ① ② ③ 27

Slide 28

Slide 28 text

© DMM.com LLC サンプル実装 https://github.com/maru-labo/doodle/blob/master/examples/tensorflow_lite_android/src/net/marulabo/doodle/MainActivity.java image = new float[BATCH][IMAGE_HEIGHT][IMAGE_WIDTH][IMAGE_CHANNEL]; probabilities = new float[BATCH][NUMBER_CLASSES]; interpreter.run(image, probabilities); ②image変数にピクセル強度を代入(80-95行目) ③インタプリタの実行(99行目) ④probabilities変数に10カテゴリそれぞれの確率が入るので、  最も確率が高いカテゴリを表示する(106-109行目) 28 ①入出力を格納する多次元配列を用意(125-126行目)

Slide 29

Slide 29 text

© DMM.com LLC TensorFlow Lite パフォーマンス 29

Slide 30

Slide 30 text

© DMM.com LLC パフォーマンス ➔ メモリ使用量 ➔ 電力消費(≒メモリアクセス) ➔ 実行速度 ➔ 精度 30

Slide 31

Slide 31 text

© DMM.com LLC ラクガキ認識モデルのスペック ➔ モデル構造 ◆ 2次元畳み込み+プーリングが2層、密結合層が2層のCNN ◆ パラメータ数(≒モデルサイズ)の削減になる テクニックは用いていない、非常にシンプルなモデル ➔ モデルサイズ ◆ 32bit浮動小数:12.4MB ◆ 8bit量子化後:3.1MB ◆ 32bitから8bitに量子化するとモデルサイズが 大幅に小さくなる(25%) 31

Slide 32

Slide 32 text

© DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 32 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果

Slide 33

Slide 33 text

© DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 当然ながら、ネットワークは利用なし 33 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果

Slide 34

Slide 34 text

© DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 モデル読み込みなし&インタプリタを起動しない場合とほぼ変わらない 34 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果

Slide 35

Slide 35 text

© DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 初回実行時にメモリ使用量が上昇 約46MB → 約60MB モデルサイズとほぼ同じくらい 35 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果

Slide 36

Slide 36 text

© DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 複数回実行してもメモリ使用量は変わらずほぼ一定 36 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果

Slide 37

Slide 37 text

© DMM.com LLC メモリ使用量・アクセス ➔ 必要最小限のメモリで動作している ◆ 必要なのはモデルサイズと同程度のメモリ ◆ 最新のテクニックを駆使したモデルは 量子化なしでも10MB前後で済むものが多いため、十分メモリに乗る ➔ モデルに用いられるFlatBuffersは、 Googleがゲームや組み込み向けに開発した フットプリントが非常に小さいデータ形式 ◆ 解析に必要なメモリは 100-300KB程度しか使わない ◆ メモリの追加割当がほぼ発生しない ◆ メモリアクセスが非常に少ないため、 電力効率が良いフォーマット でもある 【補足:パラメータ量子化モデルのメモリ使用量について】 サンプルアプリについては、量子化モデルのメモリ使用量は非量子化時のものとほぼ変わらなかった。これは、モデル構造に大きく依存する部分 となる。確認は必要だが、非量子化時のモデルサイズを大きく上回ることは考えにくいため、非量子化時を基準にメモリ使用量を考えるのが良い と思われる。 37

Slide 38

Slide 38 text

© DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 バックグラウンド移行で減ったメモリは約15MB 途中でGCが発生しているがほぼ変わらず これはモデルを読み込んでない場合とほぼ同じなので、 TFLiteで確保されたメモリはバックグラウンドでも保持されている 38 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果

Slide 39

Slide 39 text

© DMM.com LLC (左下図) インタプリタをclose&null代入した上で バックグラウンドにし、 GCが実行されたあと復帰 ⇒メモリがGCされ  約13MB(≒モデルサイズ)の差 (左上図) バックグラウンドにし、 GCが実行されたあと復帰 待機時のメモリ使用量を チューニングする場合は、 推論が不必要な際に 明示的にインタプリタを消す ような実装をしておくと◎ ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果 39 GC

Slide 40

Slide 40 text

© DMM.com LLC ベンチマーク結果(Nexus 5) Warmup runs 10 Num runs 200 Num threads 1 CPU Affinity 1 Use NNAPI N/A Inter-run delay -1 MODEL NAME MODEL SIZE AVG STD DEV Doodle 12.4 MB 7.071 ms 0.684 ms Doodle (quantized) 3.1 MB 5.763 ms 0.544 ms MobileNet 16.4 MB 140.438 ms 0.247 ms MobileNet (quantized) 4.1 MB 103.575 ms 0.194 ms Inception V4 162.7 MB 1429.210 ms 147.327 ms (a) 実行条件 (b) ラクガキモデルと一般的なモデルでの実行結果 ▼ベンチマーク実装 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/tools/benchmark ▼Pixelと一般的なモデルでの結果 https://www.tensorflow.org/mobile/tflite/performance 40

Slide 41

Slide 41 text

© DMM.com LLC 実行速度と精度 ➔ 量子化はモデルサイズを大幅に削減することができる ➔ ベンチマークを見ての通り、量子化は実行速度の向上も期待できる ◆ SIMD演算やDSPはもちろん、TPUのような専用チップによる さらなる高速化が今後も期待できる ➔ Inception級の巨大モデルがシングルスレッドでも1,2秒程度で 実行可能であることからも、実用に耐えうる実行速度である と言えるだろう ➔ ただし、一般的に量子化をすると精度が下がる事が知られており 量子化したモデルでの精度評価が必要であることに注意する 41

Slide 42

Slide 42 text

© DMM.com LLC まとめ 42

Slide 43

Slide 43 text

© DMM.com LLC TensorFlow Liteは ● かんたん ● はやい ● べんり みんなも機械学習使って アプリ作ろう! 43

Slide 44

Slide 44 text

© DMM.com LLC ご清聴ありがとうございました ▼DMMの採用情報はこちら▼ https://dmm-corp.com/recruit/engineer 44