Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Делегат TensorFlow Lite NNAPI

API нейронных сетей Android (NNAPI) доступен на всех устройствах Android под управлением Android 8.1 (уровень API 27) или выше. Он обеспечивает ускорение для моделей TensorFlow Lite на устройствах Android с поддерживаемыми аппаратными ускорителями, включая:

  • Графический процессор (GPU)
  • Цифровой сигнальный процессор (DSP)
  • Блок нейронной обработки (NPU)

Производительность будет зависеть от конкретного оборудования, доступного на устройстве.

На этой странице описывается, как использовать делегат NNAPI с интерпретатором TensorFlow Lite в Java и Kotlin. Для Android C API обратитесь к документации Android Native Developer Kit .

Пробуем делегат NNAPI на вашей собственной модели

Импорт Gradle

Делегат NNAPI является частью интерпретатора Android TensorFlow Lite версии 1.14.0 или выше. Вы можете импортировать его в свой проект, добавив следующее в файл gradle вашего модуля:

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

Инициализация делегата NNAPI

Добавьте код для инициализации делегата NNAPI перед инициализацией интерпретатора TensorFlow Lite.

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

Лучшие практики

Проверьте производительность перед развертыванием

Производительность во время выполнения может значительно различаться из-за архитектуры модели, размера, операций, доступности оборудования и использования оборудования во время выполнения. Например, если приложение интенсивно использует графический процессор для рендеринга, ускорение NNAPI может не улучшить производительность из-за конкуренции за ресурсы. Мы рекомендуем запустить простой тест производительности с помощью средства ведения журнала отладки, чтобы измерить время вывода. Перед включением NNAPI в производственной среде запустите тест на нескольких телефонах с разными наборами микросхем (производитель или модели от одного производителя), которые являются репрезентативными для вашей пользовательской базы.

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

Создайте список исключенных устройств

В производственной среде могут быть случаи, когда NNAPI не работает должным образом. Мы рекомендуем разработчикам вести список устройств, которые не должны использовать ускорение NNAPI в сочетании с определенными моделями. Вы можете создать этот список на основе значения "ro.board.platform" , которое можно получить с помощью следующего фрагмента кода:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

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

Квантование

Квантование уменьшает размер модели за счет использования 8-битных целых чисел или 16-битных чисел с плавающей запятой вместо 32-битных чисел с плавающей запятой для вычислений. Размеры 8-битных целочисленных моделей составляют четверть от 32-битных версий с плавающей запятой; 16-битные числа с плавающей запятой составляют половину размера. Квантование может значительно улучшить производительность, хотя этот процесс может снизить точность модели.

Доступно несколько типов методов квантования после обучения, но для максимальной поддержки и ускорения на текущем оборудовании мы рекомендуем полное целочисленное квантование . Этот подход преобразует вес и операции в целые числа. Для этого процесса квантования требуется репрезентативный набор данных.

Используйте поддерживаемые модели и операции

Если делегат NNAPI не поддерживает некоторые операции или комбинации параметров в модели, инфраструктура запускает только поддерживаемые части графика на ускорителе. Остальное выполняется на ЦП, что приводит к раздельному выполнению. Из-за высокой стоимости синхронизации ЦП / ускорителя это может привести к снижению производительности, чем выполнение всей сети только на ЦП.

NNAPI работает лучше всего, когда модели используют только поддерживаемые операции . Известно, что следующие модели совместимы с NNAPI:

Ускорение NNAPI также не поддерживается, если модель содержит выходные данные динамического размера. В этом случае вы получите предупреждение вроде:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

Включить реализацию ЦП NNAPI

Граф, который не может быть полностью обработан ускорителем, может вернуться к реализации ЦП NNAPI. Однако, поскольку он обычно менее эффективен, чем интерпретатор TensorFlow, этот параметр по умолчанию отключен в делегате NNAPI для Android 10 (уровень API 29) или выше. Чтобы переопределить это поведение, установите для setUseNnapiCpu значение true в объекте NnApiDelegate.Options .