$30 off During Our Annual Pro Sale. View Details »

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
    TensorFlow Liteで
    機械学習Androidアプリを
    超簡単に作る
    合同会社DMM.com 古川新
    2018/09/01
    GDG DevFest Tokyo 2018

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. © DMM.com LLC
    クラウドAPIサービスなど
    データ
    モバイルアプリ

    「モバイル端末上で実行しちゃえばよくない?」
    と思いませんか?
    一般的な機械学習の利用?
    9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. © 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. © 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

    View Slide

  25. © 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

    View Slide

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

    View Slide

  27. © 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

    View Slide

  28. © 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行目)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  40. © 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

    View Slide

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

    View Slide

  42. © DMM.com LLC
    まとめ
    42

    View Slide

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

    View Slide

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

    View Slide