C/C++ API를 사용한 GPU 가속 대리자

그래픽 처리 장치 (GPU)를 사용하여 머신러닝 (ML) 모델 실행 광고의 실적과 사용자 환경을 ML 지원 애플리케이션입니다 Android 기기에서 GPU 가속을 사용 설정할 수 있습니다. 대리자 및 하나를 사용하여 모델 실행을 다음 API 중 하나입니다.

  • Interpreter API - 가이드
  • 네이티브 (C/C++) API - 이 가이드

이 가이드에서는 C API, C++ API 및 양자화 모델의 활용입니다. GPU 대리자를 사용하는 방법에 대한 자세한 내용은 권장사항 및 고급 기술이 포함된 LiteRT는 GPU 위임 페이지를 참조하세요.

GPU 가속 사용 설정

C 또는 C++에서 Android용 LiteRT GPU 대리자를 사용하려면 TfLiteGpuDelegateV2Create()로 위임하고 TfLiteGpuDelegateV2Delete(): 다음 코드 예에 나와 있습니다.

// Set up interpreter.
auto model = FlatBufferModel::BuildFromFile(model_path);
if (!model) return false;
ops::builtin::BuiltinOpResolver op_resolver;
std::unique_ptr<Interpreter> interpreter;
InterpreterBuilder(*model, op_resolver)(&interpreter);

// NEW: Prepare GPU delegate.
auto* delegate = TfLiteGpuDelegateV2Create(/*default options=*/nullptr);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;

// Run inference.
WriteToInputTensor(interpreter->typed_input_tensor<float>(0));
if (interpreter->Invoke() != kTfLiteOk) return false;
ReadFromOutputTensor(interpreter->typed_output_tensor<float>(0));

// NEW: Clean up.
TfLiteGpuDelegateV2Delete(delegate);

TfLiteGpuDelegateOptionsV2 객체 코드를 검토하여 위임 인스턴스 빌드 사용할 수 있습니다 다음을 사용하여 기본 옵션을 초기화할 수 있습니다. TfLiteGpuDelegateOptionsV2Default()로 설정하고 필요에 따라 수정합니다.

C 또는 C++로 작성된 Android용 LiteRT GPU 대리자는 Bazel 빌드 시스템 다음을 사용하여 위임을 빌드할 수 있습니다. 다음 명령어를 실행합니다.

bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:delegate                           # for static library
bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate.so  # for dynamic library

Interpreter::ModifyGraphWithDelegate() 또는 Interpreter::Invoke(), 발신자는 현재 EGLContext 스레드와 Interpreter::Invoke()는 동일한 EGLContext에서 호출되어야 합니다. 만약 EGLContext가 없는 경우 위임은 내부적으로 하나를 만들지만 Interpreter::Invoke()가 항상 동일한 Interpreter::ModifyGraphWithDelegate()가 호출된 스레드입니다.

Google Play 서비스에서 LiteRT 사용:

Google Play 서비스 C API에서 LiteRT를 사용하는 경우 Java/Kotlin API를 사용하여 GPU 대리자를 사용할 수 있는지 확인해야 합니다. 기기에 대한 캡션을 확인할 수 있습니다.

애플리케이션에 GPU 대리자 Gradle 종속 항목을 추가합니다.

implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'

그런 다음 GPU 가용성을 확인하고 검사에 문제가 있다면 TfLiteNative를 초기화합니다. 성공:

자바

Task<Void> tfLiteHandleTask =
TfLiteGpu.isGpuDelegateAvailable(this)
   .onSuccessTask(gpuAvailable -> {
      TfLiteInitializationOptions options =
        TfLiteInitializationOptions.builder()
          .setEnableGpuDelegateSupport(gpuAvailable).build();
        return TfLiteNative.initialize(this, options);
      }
    );
      

Kotlin

val tfLiteHandleTask = TfLiteGpu.isGpuDelegateAvailable(this)
    .onSuccessTask { gpuAvailable ->
        val options = TfLiteInitializationOptions.Builder()
            .setEnableGpuDelegateSupport(gpuAvailable)
            .build()
        TfLiteNative.initialize(this, options)
    }
        

또한 다음을 포함하도록 CMake 구성을 업데이트해야 합니다. TFLITE_USE_OPAQUE_DELEGATE 컴파일러 플래그:

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

FlatBuffers 라이브러리는 광고 소재의 모든 속성을 구성하는 데 사용됩니다. 위임하므로 네이티브 코드의 종속 항목에 추가해야 합니다. 다음과 같이 공식 CMake 프로젝트 구성을 사용할 수 있습니다.

target_include_directories(tflite-jni PUBLIC
        third_party/headers # flatbuffers
     ...)

헤더를 앱에 번들로 묶기만 할 수도 있습니다.

마지막으로 C 코드에서 GPU 추론을 사용하려면 TFLiteSettings:

#include "flatbuffers/flatbuffers.h"
#include "tensorflow/lite/acceleration/configuration/configuration_generated.h"

flatbuffers::FlatBufferBuilder fbb;
tflite::TFLiteSettingsBuilder builder(fbb);
const tflite::TFLiteSettings* tflite_settings =
    flatbuffers::GetTemporaryPointer(fbb, builder.Finish());

const TfLiteOpaqueDelegatePlugin* pluginCApi = TfLiteGpuDelegatePluginCApi();
TfLiteOpaqueDelegate* gpu_delegate = pluginCApi->create(tflite_settings);

양자화 모델

Android GPU 위임 라이브러리는 기본적으로 양자화 모델을 지원합니다. 부적절한 콘텐츠 GPU 대리자와 함께 양자화 모델을 사용하려면 코드를 변경해야 합니다. 이 다음 섹션에서는 테스트 또는 배포를 위해 양자화 지원을 중지하는 방법을 설명합니다. 있습니다.

양자화 모델 지원 사용 중지

다음 코드는 양자화 모델에 대한 지원을 사용 중지하는 방법을 보여줍니다.

C++

TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE;

auto* delegate = TfLiteGpuDelegateV2Create(options);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

GPU 가속으로 양자화 모델을 실행하는 방법에 관한 자세한 내용은 GPU 위임 개요