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

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

  • 인터프리터 API - 가이드
  • 네이티브 (C/C++) API - 이 가이드

이 가이드에서는 C API, C++ API에 GPU 대리자를 사용하는 고급 사용과 양자화 모델의 사용에 관해 설명합니다. 권장사항 및 고급 기술을 포함하여 TensorFlow Lite용 GPU 대리자를 사용하는 방법에 대한 자세한 내용은 GPU 대리자 페이지를 참조하세요.

GPU 가속 사용 설정

다음 코드 예에 나와 있는 것처럼 C 또는 C++로 Android용 TensorFlow Lite 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용 TensorFlow Lite 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::ModifyGraphWithDelegate()가 호출된 스레드에서 Interpreter::Invoke()가 항상 호출되도록 해야 합니다.

Google Play 서비스에서 TensorFlow Lite 사용:

Google Play 서비스 C API에서 TensorFlow Lite를 사용하는 경우 TensorFlow Lite 런타임을 초기화하기 전에 Java/Kotlin API를 사용하여 기기에서 GPU 대리자를 사용할 수 있는지 확인해야 합니다.

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

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

그런 다음 GPU 가용성을 확인하고 성공하면 TfLiteNative를 초기화합니다.

Java

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

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

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

FlatBuffers 라이브러리는 대리자 플러그인을 구성하는 데 사용되므로 네이티브 코드의 종속 항목에 추가해야 합니다. 다음과 같이 공식 CMake 프로젝트 구성을 사용할 수 있습니다.

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

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

마지막으로 C 코드에서 GPU 추론을 사용하려면 TFLiteSettings를 사용하여 GPU 대리자를 만듭니다.

#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 대리자 개요를 참고하세요.