C/C++ API를 사용한 GPU 가속 위임

GPU(그래픽 처리 장치)를 사용하여 ML(기계 학습) 모델을 실행하면 ML 지원 애플리케이션의 성능과 사용자 경험을 크게 향상시킬 수 있습니다. Android 장치에서는 대리자 와 다음 API 중 하나를 사용하여 모델의 GPU 가속 실행을 활성화할 수 있습니다.

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

이 가이드에서는 C API, C++ API에 대한 GPU 대리자의 고급 사용 및 양자화된 모델 사용을 다룹니다. 모범 사례 및 고급 기술을 포함하여 TensorFlow Lite용 GPU 대리자 사용에 대한 자세한 내용은 GPU 대리자 페이지를 참조하세요.

GPU 가속 활성화

다음 예제 코드에 표시된 대로 TfLiteGpuDelegateV2Create() 로 대리자를 생성하고 TfLiteGpuDelegateV2Delete() 로 삭제하여 C 또는 C++에서 Android용 TensorFlow Lite GPU 대리자를 사용합니다.

// 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::Invoke() 항상 Interpreter::ModifyGraphWithDelegate() 호출된 동일한 스레드에서 호출되는지 확인해야 합니다.

Google Play 서비스의 TensorFlow Lite 사용:

Google Play Services 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를 초기화합니다.

자바

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

코틀린

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