MLコミュニティデーは11月9日です! TensorFlow、JAXからの更新のために私たちに参加し、より多くの詳細をご覧ください

TensorFlowLiteヘキサゴンデリゲート

このドキュメントでは、JavaやC APIを使用して、アプリケーションでTensorFlow Lite HexagonDelegateを使用する方法について説明します。デリゲートは、Qualcomm Hexagonライブラリを利用して、DSP上で量子化されたカーネルを実行します。デリゲートは、特にNNAPI DSPアクセラレーションが利用できないデバイス(たとえば、古いデバイス、またはDSP NNAPIドライバーがまだないデバイス)のNNAPI機能を補完することを目的としていることに注意してください。

サポートされているデバイス:

現在、以下を含むがこれらに限定されない次のヘキサゴナルアーキテクチャがサポートされています。

  • ヘキサゴン680
    • SoCの例:Snapdragon 821、820、660
  • 六角形682
    • SoCの例:Snapdragon 835
  • 六角形685
    • SoCの例:Snapdragon 845、Snapdragon 710、QCS605、QCS603
  • ヘキサゴン690
    • SoCの例:Snapdragon 855、QCS610、QCS410、RB5

サポートされているモデル:

ヘキサゴンデリゲートは、トレーニング後の整数量子化を使用して生成されたモデルを含む、 8ビット対称量子化仕様に準拠するすべてのモデルをサポートします。従来の量子化対応トレーニングパスでトレーニングされたUInt8モデルもサポートされています。たとえば、ホストモデルページのこれらの量子化バージョンです。

六角形のデリゲートJavaAPI

public class HexagonDelegate implements Delegate, Closeable {

  /*

   * Creates a new HexagonDelegate object given the current 'context'.
   * Throws UnsupportedOperationException if Hexagon DSP delegation is not
   * available on this device.
   */
  public HexagonDelegate(Context context) throws UnsupportedOperationException


  /**

   * Frees TFLite resources in C runtime.
   *
   * User is expected to call this method explicitly.
   */
  @Override
  public void close();
}

使用例

手順1.app / build.gradleを編集して、夜間のヘキサゴンデリゲートAARを使用します

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
  implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}

ステップ2.AndroidアプリにHexagonライブラリを追加します

  • hexagon_nn_skel.runをダウンロードして実行します。 3つの異なる共有ライブラリ「libhexagon_nn_skel.so」、「libhexagon_nn_skel_v65.so」、「libhexagon_nn_skel_v66.so」を提供する必要があります

手順3.デリゲートを作成し、TensorFlowLiteインタープリターを初期化します

import org.tensorflow.lite.HexagonDelegate;

// Create the Delegate instance.
try {
  hexagonDelegate = new HexagonDelegate(activity);
  tfliteOptions.addDelegate(hexagonDelegate);
} catch (UnsupportedOperationException e) {
  // Hexagon delegate is not supported on this device.
}

tfliteInterpreter = new Interpreter(tfliteModel, tfliteOptions);

// Dispose after finished with inference.
tfliteInterpreter.close();
if (hexagonDelegate != null) {
  hexagonDelegate.close();
}

六角形デリゲートCAPI

struct TfLiteHexagonDelegateOptions {
  // This corresponds to the debug level in the Hexagon SDK. 0 (default)
  // means no debug.
  int debug_level;
  // This corresponds to powersave_level in the Hexagon SDK.
  // where 0 (default) means high performance which means more power
  // consumption.
  int powersave_level;
  // If set to true, performance information about the graph will be dumped
  // to Standard output, this includes cpu cycles.
  // WARNING: Experimental and subject to change anytime.
  bool print_graph_profile;
  // If set to true, graph structure will be dumped to Standard output.
  // This is usually beneficial to see what actual nodes executed on
  // the DSP. Combining with 'debug_level' more information will be printed.
  // WARNING: Experimental and subject to change anytime.
  bool print_graph_debug;
};

// Return a delegate that uses Hexagon SDK for ops execution.
// Must outlive the interpreter.
TfLiteDelegate*
TfLiteHexagonDelegateCreate(const TfLiteHexagonDelegateOptions* options);

// Do any needed cleanup and delete 'delegate'.
void TfLiteHexagonDelegateDelete(TfLiteDelegate* delegate);

// Initializes the DSP connection.
// This should be called before doing any usage of the delegate.
// "lib_directory_path": Path to the directory which holds the
// shared libraries for the Hexagon NN libraries on the device.
void TfLiteHexagonInitWithPath(const char* lib_directory_path);

// Same as above method but doesn't accept the path params.
// Assumes the environment setup is already done. Only initialize Hexagon.
Void TfLiteHexagonInit();

// Clean up and switch off the DSP connection.
// This should be called after all processing is done and delegate is deleted.
Void TfLiteHexagonTearDown();

使用例

手順1.app / build.gradleを編集して、夜間のヘキサゴンデリゲートAARを使用します

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
  implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}

ステップ2.AndroidアプリにHexagonライブラリを追加します

  • hexagon_nn_skel.runをダウンロードして実行します。 3つの異なる共有ライブラリ「libhexagon_nn_skel.so」、「libhexagon_nn_skel_v65.so」、「libhexagon_nn_skel_v66.so」を提供する必要があります

手順3.Cヘッダーを含める

  • ヘッダーファイル「hexagon_delegate.h」は、 GitHubからダウンロードするか、HexagonデリゲートAARから抽出​​できます。

手順4.デリゲートを作成し、TensorFlowLiteインタープリターを初期化します

  • コードで、ネイティブのHexagonライブラリがロードされていることを確認します。これは、 System.loadLibrary("tensorflowlite_hexagon_jni");呼び出すことで実行できますSystem.loadLibrary("tensorflowlite_hexagon_jni");
    アクティビティまたはJavaエントリポイントで。

  • デリゲートを作成します。例:

#include "tensorflow/lite/delegates/hexagon/hexagon_delegate.h"

// Assuming shared libraries are under "/data/local/tmp/"
// If files are packaged with native lib in android App then it
// will typically be equivalent to the path provided by
// "getContext().getApplicationInfo().nativeLibraryDir"
const char[] library_directory_path = "/data/local/tmp/";
TfLiteHexagonInitWithPath(library_directory_path);  // Needed once at startup.
::tflite::TfLiteHexagonDelegateOptions params = {0};
// 'delegate_ptr' Need to outlive the interpreter. For example,
// If use case will need to resize input or anything that can trigger
// re-applying delegates then 'delegate_ptr' need to outlive the interpreter.
auto* delegate_ptr = ::tflite::TfLiteHexagonDelegateCreate(&params);
Interpreter::TfLiteDelegatePtr delegate(delegate_ptr,
  [](TfLiteDelegate* delegate) {
    ::tflite::TfLiteHexagonDelegateDelete(delegate);
  });
interpreter->ModifyGraphWithDelegate(delegate.get());
// After usage of delegate.
TfLiteHexagonTearDown();  // Needed once at end of app/DSP usage.

共有ライブラリをアプリに追加します

  • フォルダ「app / src / main / jniLibs」を作成し、ターゲットアーキテクチャごとにディレクトリを作成します。例えば、
    • ARM 64ビット: app/src/main/jniLibs/arm64-v8a
    • ARM 32ビット: app/src/main/jniLibs/armeabi-v7a
  • アーキテクチャに一致するディレクトリに.soを配置します。

フィードバック

問題については、使用する電話モデルとボード( adb shell getprop ro.product.device adb shell getprop ro.board.platform )を含む、必要なすべての再現の詳細を含むGitHub問題を作成しください。

よくある質問

  • デリゲートはどの操作をサポートしていますか?
  • デリゲートを有効にしたときに、モデルがDSPを使用していることをどのように確認できますか?
    • 委任を有効にすると、2つのログメッセージが出力されます。1つは委任が作成されたかどうかを示し、もう1つは委任を使用して実行されているノードの数を示します。
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • デリゲートを実行するには、モデル内のすべてのOpをサポートする必要がありますか?
    • いいえ、モデルはサポートされている操作に基づいてサブグラフに分割されます。サポートされていない操作はCPUで実行されます。
  • ソースからHexagonデリゲートAARを構築するにはどうすればよいですか?
    • bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagonます。
  • AndroidデバイスにサポートされているSoCがあるのに、Hexagonデリゲートが初期化に失敗するのはなぜですか?
    • デバイスに実際にサポートされているSoCがあるかどうかを確認します。 adb shell cat /proc/cpuinfo | grep Hardware実行しますadb shell cat /proc/cpuinfo | grep Hardware 、「Hardware:Qualcomm Technologies、IncMSMXXXX」のようなものが返されるかどうかを確認します。
    • 一部の電話メーカーは、同じ電話モデルに異なるSoCを使用しています。したがって、Hexagonデリゲートは、同じ電話モデルのすべてではなく一部のデバイスでのみ機能する場合があります。
    • 一部の電話メーカーは、システム以外のAndroidアプリからのHexagon DSPの使用を意図的に制限しているため、Hexagonデリゲートは機能しません。
  • 私の電話はDSPアクセスをロックしています。電話を根絶しましたが、デリゲートを実行できません。どうすればよいですか?
    • adb shell setenforce 0実行して、SELinux強制を必ず無効にしてくださいadb shell setenforce 0