Посетите симпозиум «Женщины в машинном обучении» 7 декабря Зарегистрируйтесь сейчас

Делегат ускорения графического процессора для Android

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

На этой странице описывается, как включить ускорение графического процессора для моделей TensorFlow Lite в приложениях для Android. Дополнительные сведения об использовании делегата графического процессора для TensorFlow Lite, включая рекомендации и передовые методы, см. на странице делегатов графического процессора .

Используйте GPU с API библиотеки задач

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

Добавить зависимости проекта

Включите доступ к API-интерфейсам делегатов графического процессора с помощью библиотек задач TensorFlow Lite, добавив следующие зависимости, обновите файл build.gradle проектов разработки, чтобы включить tensorflow-lite-gpu-delegate-plugin , как показано в следующем примере кода:

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

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

Включите параметр делегата графического процессора для класса модели Task API с помощью класса BaseOptions . Например, вы можете настроить GPU в ObjectDetector , как показано в следующих примерах кода:

Котлин

    import org.tensorflow.lite.task.core.BaseOptions
    import org.tensorflow.lite.task.gms.vision.detector.ObjectDetector

    val baseOptions = BaseOptions.builder().useGpu().build()

    val options =
        ObjectDetector.ObjectDetectorOptions.builder()
            .setBaseOptions(baseOptions)
            .setMaxResults(1)
            .build()

    val objectDetector = ObjectDetector.createFromFileAndOptions(
      context, model, options)

      

Ява

    import org.tensorflow.lite.task.core.BaseOptions
    import org.tensorflow.lite.task.gms.vision.detector.ObjectDetector

    BaseOptions baseOptions = BaseOptions.builder().useGpu().build();

    ObjectDetectorOptions options =
        ObjectDetectorOptions.builder()
            .setBaseOptions(baseOptions)
            .setMaxResults(1)
            .build();

    val objectDetector = ObjectDetector.createFromFileAndOptions(
      context, model, options);
      

Используйте GPU с API-интерфейсом интерпретатора

API интерпретатора TensorFlow Lite предоставляет набор API общего назначения для создания приложений машинного обучения. В этом разделе описывается, как использовать делегат ускорителя графического процессора с этими API.

Добавить зависимости проекта

Включите доступ к API-интерфейсам делегатов графического процессора, добавив следующие зависимости: обновите файл build.gradle проектов разработки, включив в org.tensorflow:tensorflow-lite-gpu , как показано в следующем примере кода:

dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite'
    implementation 'org.tensorflow:tensorflow-lite-gpu'
}

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

Затем запустите TensorFlow Lite на графическом процессоре с помощью TfLiteDelegate . В Java вы можете указать GpuDelegate через Interpreter.Options .

Котлин

    import org.tensorflow.lite.Interpreter
    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = Interpreter.Options().apply{
        if(compatList.isDelegateSupportedOnThisDevice){
            // if the device has a supported GPU, add the GPU delegate
            val delegateOptions = compatList.bestOptionsForThisDevice
            this.addDelegate(GpuDelegate(delegateOptions))
        } else {
            // if the GPU is not supported, run on 4 threads
            this.setNumThreads(4)
        }
    }

    val interpreter = Interpreter(model, options)

    // Run inference
    writeToInput(input)
    interpreter.run(input, output)
    readFromOutput(output)
      

Ява

    import org.tensorflow.lite.Interpreter;
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Interpreter.Options options = new Interpreter.Options();
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        GpuDelegate.Options delegateOptions = compatList.getBestOptionsForThisDevice();
        GpuDelegate gpuDelegate = new GpuDelegate(delegateOptions);
        options.addDelegate(gpuDelegate);
    } else {
        // if the GPU is not supported, run on 4 threads
        options.setNumThreads(4);
    }

    Interpreter interpreter = new Interpreter(model, options);

    // Run inference
    writeToInput(input);
    interpreter.run(input, output);
    readFromOutput(output);
      

Делегат GPU также можно использовать с привязкой модели ML в Android Studio. Дополнительные сведения см. в разделе Создание интерфейсов модели с помощью метаданных .

Расширенная поддержка графического процессора

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

C/C++ API для Android

Используйте делегат графического процессора TensorFlow Lite для 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() а затем изменить их по мере необходимости.

Делегат графического процессора TensorFlow Lite для 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() .

Квантовые модели

Библиотеки делегатов графического процессора Android по умолчанию поддерживают квантованные модели. Вам не нужно вносить какие-либо изменения в код, чтобы использовать квантованные модели с делегатом графического процессора. В следующем разделе объясняется, как отключить поддержку квантования для тестирования или экспериментальных целей.

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

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

Ява

GpuDelegate delegate = new GpuDelegate(new GpuDelegate.Options().setQuantizedModelsAllowed(false));

Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

С++

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

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

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