Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

TensorFlow Liteで機械学習Androidアプリを超簡単に作る

Arata Furukawa
September 01, 2018

TensorFlow Liteで機械学習Androidアプリを超簡単に作る

DevFest Tokyo 2018
https://tokyo2018.gdgjapan.org/
DMM.com LLC - Arata Furukawa

Arata Furukawa

September 01, 2018
Tweet

More Decks by Arata Furukawa

Other Decks in Technology

Transcript

  1. © DMM.com LLC 古川新 合同会社DMM.com CTO室 兼 AI部 機械学習エンジニア 日本Androidの会

    コミュニティ運営委員 アイコンは自分で描いたものです http://ornew.net 2
  2. © DMM.com LLC モチベーション なぜオンデバイスで実行したいのか? ➔ プライバシーへの関心 ◆ 個人情報の保持・流出リスクの排除 ◆

    リスクの大きい個人情報を用いた分析の活用 ➔ オフラインユースケース ◆ サーバ運用のコスト削減 ◆ 物理的にネットワークに接続できない状況でのインテリジェンス ➔ スマートアプライアンス ◆ その他IoTへの活用など 10
  3. © DMM.com LLC TensorFlow Liteの特徴① ➔ Android、iOS、Raspberry Piをサポート ◆ Edge

    TPUボードも対応するらしい ➔ C++ APIとして提供されており、共通のコードで動作 ◆ Android用のJava APIも提供 13
  4. © DMM.com LLC TensorFlow Liteの特徴② ➔ リソース制約のある環境に最適化されたオンデバイスインタプリタ ➔ 推論を省メモリで高速実行する ➔

    量子化演算をサポート(現在は8bitのみ) ➔ 演算子のカスタマイズによりライブラリ自体のサイズを調整可能 ➔ 最近のバージョンのAndroidでは NNAPI(Android Neural Network API)による ハードウェアクセラレーションに対応 ➔ パラメータの調整に対応 14
  5. © DMM.com LLC 全体のプロセス モデル構築 モデル変換 アプリで実行 SavedModel など TFLite

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

    TOCO (TensorFlow Lite Optimizing Converter) など TensorFlow Lite MLエンジニアが 作るところ アプリ開発者が 作るところ TFLite Model 17
  7. © DMM.com LLC モデル構築 ➔ 基本的には下記のいずれかの形式でエクスポートします: ◆ TensorFlow Frozen Graph

    ◆ TensorFlow SavedModel ◆ HDF5 ➔ TensorFlowかKeras以外のフレームワークであっても、 上記形式に変換できればまず問題ありません。 注意:  TensorFlow Liteがビルトインでサポートしていない演算子をモデルに含む  場合は、カスタム演算子を定義する必要があります 18
  8. © 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
  9. © DMM.com LLC アプリで実行 インタプリタの作成 モデルファイルの読み込み インタプリタの実行 TFLiteモデル形式(*.tflite)のファイルです。 Androidの場合、アセットに組み込むか、 ローカルストレージに保存して、

    読み込むことになります。 ネットワーク経由で保存する場合は 悪意あるモデルを実行されないように ファイルの改ざんには気をつけてくださいね 20
  10. © 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
  11. © DMM.com LLC サンプル: ラクガキ認識アプリ 学習済みモデルデータ、学習プログラム、サンプルアプリ … すべてオープンソースで公開しています。 GitHub: https://github.com/maru-labo/doodle

    ※ Androidアプリのサンプルソースコードはリポジトリ下の  examples/tensorflow_lite_androidディレクトリにあります ※ モデルの学習プログラムも置いてあります ※ 学習済みモデルデータ( model.tflite)はリリースに含まれています 26
  12. © 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
  13. © 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行目)
  14. © DMM.com LLC ラクガキ認識モデルのスペック ➔ モデル構造 ◆ 2次元畳み込み+プーリングが2層、密結合層が2層のCNN ◆ パラメータ数(≒モデルサイズ)の削減になる

    テクニックは用いていない、非常にシンプルなモデル ➔ モデルサイズ ◆ 32bit浮動小数:12.4MB ◆ 8bit量子化後:3.1MB ◆ 32bitから8bitに量子化するとモデルサイズが 大幅に小さくなる(25%) 31
  15. © DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 32

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

    33 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果
  17. © DMM.com LLC 起動 ラクガキ入力中 実行① 実行② BG 復帰 初回実行時にメモリ使用量が上昇

    約46MB → 約60MB モデルサイズとほぼ同じくらい 35 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果
  18. © DMM.com LLC メモリ使用量・アクセス ➔ 必要最小限のメモリで動作している ◆ 必要なのはモデルサイズと同程度のメモリ ◆ 最新のテクニックを駆使したモデルは

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

    途中でGCが発生しているがほぼ変わらず これはモデルを読み込んでない場合とほぼ同じなので、 TFLiteで確保されたメモリはバックグラウンドでも保持されている 38 ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果
  20. © DMM.com LLC (左下図) インタプリタをclose&null代入した上で バックグラウンドにし、 GCが実行されたあと復帰 ⇒メモリがGCされ  約13MB(≒モデルサイズ)の差 (左上図)

    バックグラウンドにし、 GCが実行されたあと復帰 待機時のメモリ使用量を チューニングする場合は、 推論が不必要な際に 明示的にインタプリタを消す ような実装をしておくと◎ ※Nexus 5 (Andorid 6.0.1, 2013年製の実機)での実行プロファイル結果 39 GC
  21. © 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
  22. © DMM.com LLC 実行速度と精度 ➔ 量子化はモデルサイズを大幅に削減することができる ➔ ベンチマークを見ての通り、量子化は実行速度の向上も期待できる ◆ SIMD演算やDSPはもちろん、TPUのような専用チップによる

    さらなる高速化が今後も期待できる ➔ Inception級の巨大モデルがシングルスレッドでも1,2秒程度で 実行可能であることからも、実用に耐えうる実行速度である と言えるだろう ➔ ただし、一般的に量子化をすると精度が下がる事が知られており 量子化したモデルでの精度評価が必要であることに注意する 41
  23. © DMM.com LLC TensorFlow Liteは • かんたん • はやい •

    べんり みんなも機械学習使って アプリ作ろう! 43