이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

TensorFlow Lite Hexagon 델리게이트

이 문서에서는 Java 및 / 또는 C API를 사용하여 애플리케이션에서 TensorFlow Lite Hexagon Delegate를 사용하는 방법을 설명합니다. 대리인은 Qualcomm Hexagon 라이브러리를 활용하여 DSP에서 양자화 된 커널을 실행합니다. 델리게이트는 특히 NNAPI DSP 가속을 사용할 수없는 장치 (예 : 구형 장치 또는 아직 DSP NNAPI 드라이버가없는 장치)의 경우 NNAPI 기능을 보완 하기위한 것입니다.

지원되는 장치 :

현재 다음을 포함한 대부분의 Qualcomm SoC 가 지원됩니다.

  • Snapdragon 835 (682 DSP)
  • Snapdragon 660/820/821 (680 DSP)
  • Snapdragon 710/845 (685 DSP)
  • Snapdragon 8150/855 (690 DSP)

지원되는 모델 :

Hexagon 델리게이트는 학습 후 정수 양자화를 사용하여 생성 된 모델을 포함하여 8 비트 대칭 양자화 사양 을 준수하는 모든 모델을 지원합니다. 레거시 양자화 인식 학습 경로로 학습 된 UInt8 모델도 지원됩니다 (예 : 호스팅 모델 페이지의 이러한 양자화 버전) .

육각 델리게이트 자바 API

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 단계. 야간 Hexagon 델리게이트 AAR을 사용하도록 app / build.gradle 편집

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

2 단계. Android 앱에 Hexagon 라이브러리 추가

  • hexagon_nn_skel.run을 다운로드하고 실행합니다. 3 개의 서로 다른 공유 라이브러리“libhexagon_nn_skel.so”,“libhexagon_nn_skel_v65.so”,“libhexagon_nn_skel_v66.so”를 제공해야합니다.

3 단계. 델리게이트 생성 및 TensorFlow Lite 인터프리터 초기화

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();
}

육각 델리게이트 C API

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 단계. 야간 Hexagon 델리게이트 AAR을 사용하도록 app / build.gradle 편집

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

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 delegate AAR에서 추출 할 수 있습니다.

4 단계. 델리게이트 생성 및 TensorFlow Lite 인터프리터 초기화

  • 코드에서 네이티브 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.deviceadb shell getprop ro.board.platform )를 포함하여 필요한 모든 재현 세부 정보와 함께 GitHub 문제를 생성하세요.

자주하는 질문

  • 대리인은 어떤 작업을 지원하나요?
  • 델리게이트를 활성화 할 때 모델이 DSP를 사용하고 있음을 어떻게 알 수 있습니까?
    • 델리게이트를 활성화하면 두 개의 로그 메시지가 인쇄됩니다. 하나는 델리게이트가 생성되었는지를 나타내고 다른 하나는 델리게이트를 사용하여 실행중인 노드 수를 나타냅니다.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • 델리게이트를 실행하려면 모델의 모든 Ops가 지원되어야합니까?
    • 아니요, 모델은 지원되는 작업에 따라 하위 그래프로 분할됩니다. 지원되지 않는 모든 작업은 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 하고 "하드웨어 : Qualcomm Technologies, Inc MSMXXXX"와 같은 내용을 반환하는지 확인합니다.
    • 일부 휴대폰 제조업체는 동일한 휴대폰 모델에 대해 다른 SoC를 사용합니다. 따라서 Hexagon 델리게이트는 동일한 전화 모델의 모든 장치가 아닌 일부에서만 작동 할 수 있습니다.
    • 일부 휴대폰 제조업체는 시스템이 아닌 Android 앱에서 Hexagon DSP 사용을 의도적으로 제한하여 Hexagon 대리인이 작동하지 않도록합니다.