Делегат ускорения графического процессора с API C/C++

Использование графических процессоров (GPU) для запуска моделей машинного обучения (ML) может значительно повысить производительность и удобство работы с приложениями с поддержкой ML. На устройствах Android вы можете включить выполнение ваших моделей с ускорением на графическом процессоре, используя делегат и один из следующих API:

  • API-интерпретатор — руководство
  • Нативный (C/C++) API — это руководство

В этом руководстве рассматриваются расширенные возможности использования делегата графического процессора для C API, C++ API и использования квантованных моделей. Дополнительные сведения об использовании делегата графического процессора для LiteRT, включая рекомендации и передовые методы, см. на странице делегатов графического процессора .

Включить ускорение графического процессора

Используйте делегат LiteRT GPU для Android на C или C++, создав делегат с помощью 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() , а затем изменить их по мере необходимости.

Делегат LiteRT GPU для Android на C или C++ использует систему сборки 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() .

С LiteRT в Сервисах Google Play:

Если вы используете LiteRT в API C сервисов Google Play, вам потребуется использовать API Java/Kotlin, чтобы проверить, доступен ли делегат графического процессора для вашего устройства, прежде чем инициализировать среду выполнения LiteRT.

Добавьте зависимости делегата графического процессора в ваше приложение:

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

Затем проверьте доступность графического процессора и инициализируйте TfLiteNative, если проверка прошла успешно:

Ява

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

Вам также необходимо обновить конфигурацию 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, создайте делегат графического процессора с помощью 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 по умолчанию поддерживают квантованные модели. Вам не нужно вносить какие-либо изменения в код, чтобы использовать квантованные модели с делегатом графического процессора. В следующем разделе объясняется, как отключить поддержку квантования для целей тестирования или экспериментов.

Отключить поддержку квантованной модели

Следующий код показывает, как отключить поддержку квантованных моделей.

С++

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

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

Дополнительные сведения о запуске квантованных моделей с ускорением графического процессора см. в разделе Обзор делегатов графического процессора .