TensorFlow を使用して Android デバイスでディープラーニング推論を実装する方法

TensorFlow を使用して Android デバイスでディープラーニング推論を実装する方法

[[211369]]

個人や企業にとって、ローカルデバイスでディープラーニング推論を実行することが望ましい状況は数多くあります。たとえば、旅行中に信頼できるインターネット接続がない場合や、クラウド サービスにデータを送信する際にプライバシーや遅延の問題に対処しなければならない場合などを想像してみてください。エッジ コンピューティングは、データが生成される場所に物理的に近い場所でデータを処理および分析する方法であり、これらの問題の解決策を提供します。

「OK Google」機能を例に挙げてみましょう。ユーザーの音声を使用して「OK Google」をトレーニングすると、このキーワードを受信すると携帯電話が起動します。この小さなフットプリントのキーワードスポッティング (KWS) 推論は通常、デバイス上でローカルに実行されるため、サービス プロバイダーがいつでも音声を聞いていることを心配する必要はありません。クラウド サービスは、コマンドを実行した場合にのみ開始されます。同様の概念は、インターネットに依存せずにハンズフリーの音声制御が必要なスマート家電やその他の IoT デバイスのアプリケーションにも拡張できます。

さらに、エッジ コンピューティングは IoT の世界に人工知能をもたらすだけでなく、他の多くの可能性と利点も提供します。たとえば、画像や音声データをローカルデバイス上で圧縮表現に事前処理してから、クラウドに送信することができます。このアプローチはプライバシーと遅延の問題に対処します。

Insight 在職中、私は TensorFlow を使用して事前トレーニング済みの WaveNet モデルを Android にデプロイしました。私の目標は、ディープラーニング モデルをデバイスに展開して動作させるためのエンジニアリング上の課題を探求することです。この投稿では、TensorFlow を使用して Android 上で汎用の音声テキスト認識アプリケーションを構築する方法について簡単に説明します。

図 1. プロセスの概要。 Android に WaveNet をインストールする 3 つの手順。

開発環境情報:

  • ピクセル、CPU タイプ: ARM64
  • アンドロイド7.1.1
  • Android 15.2 リリース
  • Android Gradle プラグイン 2.3.0
  • テンソルフロー 1.3.0
  • bazel 0.5.4-自作

詳細なチュートリアルと実装: https://github.com/chiachunfu/speech

ステップ1: モデルの圧縮

ディープラーニング モデルをモバイル/組み込みデバイスに展開するには、モデルのメモリ フットプリントを削減し、推論時間を短縮し、消費電力を削減するよう努める必要があります。これらの要件を満たすには、量子化、重みの削減、大規模なモデルから小規模なモデルへの分割など、いくつかの方法があります。

このプロジェクトでは、TensorFlow の量子化ツールを使用してモデル圧縮を実行しました。現在、私はモデル サイズを縮小するためにのみ重み量子化を使用しています。これは、Mac でのテスト結果に基づくと、完全な 8 ビット変換では推論時間の短縮などの追加の利点が得られないためです。 (requant_range のバグのため、Pixel 上で完全な 8 ビット モデルを実行できません)。 8 ビットの量子化ツールは CPU に適していないため、時間は 2 倍になります。量子化に関するより実践的なアドバイスに興味がある場合は、Pete Warden によるこの素晴らしい記事を読んでみてください。

モデルの重みを量子化します。

  1. モデルをプロトコル バッファ ファイルに書き込みます。
  2. ソースから TensorFlow をインストールして構成します (https://www.tensorflow.org/install/install_sources)。
  3. TensorFlow ディレクトリで次のコマンドラインを実行します。

  1. bazel ビルド tensorflow/tools/graph_transforms:transform_graph
  2. bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
  3. --in_graph=/your/.pb/ファイル \  
  4. --outputs="出力ノード名" \  
  5. --out_graph=/the/quantized/.pb/ファイル \  
  6. --transforms='量子化重み'  

私のプロジェクトを例にとると、重みを量子化した後、事前トレーニング済みの WaveNet モデルのサイズは 15.5 Mb から 4.0 Mb に減少しました。これで、このモデル ファイルを Android プロジェクトの「assets」フォルダーに移動できます。

ステップ2: Android用TensorFlowライブラリ

TensorFlow を使用して Android アプリを構築するには、TensorFlow Android デモから始めることをお勧めします。私のプロジェクトでは、TF スピーチの例をテンプレートとして使用しました。この例の gradle ファイルは、Android 用の TF ライブラリのビルドとコンパイルに役立ちます。ただし、この事前に構築された TF ライブラリには、モデルに必要なすべての操作が含まれていない可能性があります。 WaveNet で必要なすべての操作を検討し、それらを Android apk に適した .so ファイルにコンパイルする必要があります。オペレーションの完全なリストを見つけるために、まず tf.train.write_graph を使用してグラフの詳細を出力します。次に、ターミナルで次のコマンドを実行します。

  1. grep "op: " PATH/ TO /mygraph.txt | sort | uniq | sed -E 's/^.+"(.+)".?$/\1/g'  

次に、/tensorflow/tensorflow/core/kernels/ にある BUILD ファイルを編集し、Android ライブラリ セクションの「android_extended_ops_group1」または「android_extended_ops_group2」に不足しているオペレーションを追加します。不要なオペレーションを削除して、.so ファイルを小さくすることもできます。次に、次のコマンドを実行します。

  1. bazel ビルド -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
  2. --crosstool_top=//外部:android/crosstool \  
  3. --host_crosstool_top=@bazel_tools//tools/cpp:ツールチェーン \  
  4. --cpu=アームアビv7a  

libtensorflow_inference.so ファイルはここにあります:

  1. bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

.so ファイルに加えて、JAR ファイルも必要です。走る:

  1. ベゼルビルド
  2.  
  3. //Tensorflow/contrib/android:android_tensorflow_inference_java

ファイルはここにあります:

  1. bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

これで、.so ファイルと .jar ファイルを一緒に Android プロジェクトの「libs」フォルダーに移動できます。

ステップ3: Androidでのデータ前処理

***、入力データをモデルのトレーニングに必要な形式に処理しましょう。オーディオ システムでは、生の音声波形がメル周波数ケプストラム係数 (MFCC) に変換され、人間の耳が音を認識する方法をシミュレートします。 TensorFlow には、この機能抽出を実行できるオーディオ オペレーションがあります。ただし、この変換を実現するにはいくつかのバリエーションがあることがわかりました。図 2 に示すように、TensorFlow オーディオ オペレーションからの MFCC は、librosa によって提供される MFCC とは異なります。 librosa は、事前トレーニング済みの WaveNet の作成者がトレーニング データを変換するために使用する Python ライブラリです。

図 2. librosa と TensorFlow オーディオ オペレーションの MFCC はスケールが異なります。

独自のモデルをトレーニングする場合、または事前トレーニング済みのモデルを再トレーニングする場合は、トレーニング データを処理するときにデバイス上のデータ パイプラインを考慮することが重要です。最終的に、変換を処理するために librosa MFCC を Java で書き直しました。

結果

図 3 にアプリのスクリーンショットと例を示します。モデルには言語モデルがなく、認識は文字レベルのみであるため、文章にはスペルミスがいくつかあります。厳密にテストしたわけではありませんが、量子化後に精度がわずかに低下し、システム全体が周囲のノイズに敏感になっていることがわかりました。

図 3. アプリ内の 2 つの例のスクリーンショット。

以下の表に示す推論時間は、5 秒間の音声に対する 10 回のテストの平均です。重みの量子化はファイル サイズの削減には役立ちますが、推論時間や電力消費の改善にはほとんど役立たないため、両方のプラットフォームで推論時間が短縮されるのではなく、わずかに増加しました。

表 1. 重み量子化前後の推論時間。テスト環境は、Pixel スマートフォンと Macbook air です。

次に何をすればいいでしょうか?

このプロジェクトをさらに一歩進め、エッジ デバイスに現実的な音声認識システムを展開するための追加のチュートリアルとウォークスルーをコミュニティに提供する重要なことが 2 つあります。

  • 音声認識パフォーマンスの向上: スペル修正用の言語モデルと周囲のノイズの影響を軽減するノイズ ダウンサンプリング モデルを追加します。
  • 推論時間と電力消費を改善します。低レベルの最適化には NEON またはその他のアーキテクチャを使用し、低精度の行列計算には gemmlowp を使用します。

<<:  堅牢な機械学習アルゴリズムの構築方法: ブースティングとバギング

>>:  顔認証の過去と現在の徹底分析

ブログ    

推薦する

AIは自己反復と最適化が可能で、わずか26秒で歩行ロボットを設計できる

10月10日のニュース、AIに陸上を歩けるロボットを設計するように頼んだら何秒かかるでしょうか?答え...

分散ストレージシステムにおけるDHTアルゴリズムの改善

1. 概要通常、分散ストレージ システムや分散キャッシュ システムでは、分散ハッシュ (DHT) ア...

鵬城クラウドブレインは鵬城シリーズの大型モデルの基礎研究をサポート

[[401368]]専門家の皆さん、ゲストの皆さん、こんにちは。今日は主に、Pengcheng Bi...

パラメータ調整器、ここを見てください!ディープラーニングのトレーニング効率を向上させる2つのコツ

[[343402]] 1. トレーニングのボトルネックはどこですか? GPU 使用率が低い: モデル...

...

ビッグデータの機械理解の秘密:クラスタリングアルゴリズムの詳細な説明

この記事では、いくつかのクラスタリング アルゴリズムの基本的な概要を示し、シンプルでありながら詳細な...

SQL Server 2008 の 9 つのデータ マイニング アルゴリズム

1. 決定木アルゴリズム決定木は判断木とも呼ばれ、バイナリ ツリーやマルチ ブランチ ツリーに似たツ...

コードを知らなくても機械学習を実現できますか?

ローコード プラットフォームは、アプリケーション、統合、およびデータの視覚化の開発の速度と品質を向上...

...

LLaMA、BERT などの導入課題を解決: 初の 4 ビット浮動小数点量子化 LLM が登場

大規模言語モデル (LLM) 圧縮は常に大きな注目を集めています。トレーニング後の量子化は、一般的に...

...

データマイニングの分野でトップ 10 の古典的なアルゴリズムの 1 つ - K-Means アルゴリズム (コード付きで非常に詳細)

k-means アルゴリズムは比較的単純です。 k-means アルゴリズムでは、クラスターはクラ...

AI技術の自立を実現するために、国内のディープラーニングフレームワークは3つの大きな課題に直面している

「ディープラーニングフレームワークは人工知能技術システムの真ん中にあり、下のチップと上のアプリケーシ...

AES暗号化アルゴリズムのハードウェア設計方法の簡単な分析

[[356976]]情報セキュリティの分野では、米国は集積回路IPコアの分野で常に独占的地位を占めて...