Использование специализированных процессоров, таких как GPU, NPU или DSP, для аппаратного ускорения может значительно улучшить производительность логических выводов (в некоторых случаях до 10 раз быстрее) и удобство работы с вашим приложением Android с поддержкой машинного обучения. Однако, учитывая разнообразие аппаратного обеспечения и драйверов, которые могут быть у ваших пользователей, выбор оптимальной конфигурации аппаратного ускорения для каждого пользовательского устройства может оказаться сложной задачей. Кроме того, включение неправильной конфигурации на устройстве может ухудшить работу пользователя из-за высокой задержки или, в некоторых редких случаях, ошибок во время выполнения или проблем с точностью, вызванных несовместимостью оборудования.
Acceleration Service для Android — это API, который помогает выбрать оптимальную конфигурацию аппаратного ускорения для данного пользовательского устройства и вашей модели .tflite
, сводя к минимуму риск ошибок во время выполнения или проблем с точностью.
Служба ускорения оценивает различные конфигурации ускорения на пользовательских устройствах, выполняя внутренние тесты логического вывода с вашей моделью TensorFlow Lite. Эти тестовые прогоны обычно выполняются за несколько секунд, в зависимости от вашей модели. Вы можете запустить тесты один раз на каждом пользовательском устройстве перед выводом, кэшировать результат и использовать его во время вывода. Эти тесты выполняются вне процесса; что сводит к минимуму риск сбоев в вашем приложении.
Предоставьте свою модель, образцы данных и ожидаемые результаты («золотые» входные и выходные данные), и Служба ускорения выполнит внутренний эталонный анализ TFLite, чтобы предоставить вам рекомендации по оборудованию.
Acceleration Service является частью пользовательского стека машинного обучения Android и работает с TensorFlow Lite в сервисах Google Play .
Добавьте зависимости в свой проект
Добавьте следующие зависимости в файл build.gradle вашего приложения:
implementation "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"
API службы ускорения работает с TensorFlow Lite в сервисах Google Play . Если вы еще не используете среду выполнения TensorFlow Lite, предоставляемую через Play Services, вам необходимо обновить свои зависимости .
Как использовать API службы ускорения
Чтобы использовать службу ускорения, начните с создания конфигурации ускорения, которую вы хотите оценить для своей модели (например, GPU с OpenGL). Затем создайте конфигурацию проверки с вашей моделью, некоторыми демонстрационными данными и ожидаемыми выходными данными модели. Наконец, вызовите validateConfig()
для передачи конфигурации ускорения и конфигурации проверки.
Создание конфигураций ускорения
Конфигурации ускорения — это представления конфигураций оборудования, которые преобразуются в делегаты во время выполнения. После этого служба ускорения будет использовать эти конфигурации для выполнения тестовых выводов.
На данный момент служба ускорения позволяет вам оценивать конфигурации графического процессора (преобразованные в делегат графического процессора во время выполнения) с помощью GpuAccelerationConfig и вывода ЦП (с помощью CpuAccelerationConfig ). Мы работаем над поддержкой большего числа делегатов для доступа к другому оборудованию в будущем.
Конфигурация ускорения графического процессора
Создайте конфигурацию ускорения графического процессора следующим образом:
AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
.setEnableQuantizedInference(false)
.build();
Вы должны указать, использует ли ваша модель квантование, с помощью setEnableQuantizedInference()
.
Конфигурация ускорения процессора
Создайте ускорение процессора следующим образом:
AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
.setNumThreads(2)
.build();
Используйте метод setNumThreads()
, чтобы определить количество потоков, которые вы хотите использовать для оценки логического вывода ЦП.
Создание конфигураций проверки
Конфигурации проверки позволяют определить, как служба ускорения должна оценивать выводы. Вы будете использовать их для прохождения:
- входные образцы,
- ожидаемые результаты,
- логика проверки точности.
Обязательно предоставьте входные образцы, для которых вы ожидаете хорошей производительности вашей модели (также известные как «золотые» образцы).
Создайте ValidationConfig
с помощью CustomValidationConfig.Builder
следующим образом:
ValidationConfig validationConfig = new CustomValidationConfig.Builder()
.setBatchSize(5)
.setGoldenInputs(inputs)
.setGoldenOutputs(outputBuffer)
.setAccuracyValidator(new MyCustomAccuracyValidator())
.build();
Укажите количество золотых образцов с помощью setBatchSize()
. Передайте входные данные ваших золотых образцов, используя setGoldenInputs()
. Предоставьте ожидаемый результат для ввода, переданного с помощью setGoldenOutputs()
.
Вы можете определить максимальное время вывода с помощью setInferenceTimeoutMillis()
(по умолчанию 5000 мс). Если вывод занимает больше времени, чем вы определили, конфигурация будет отклонена.
При желании вы также можете создать собственный AccuracyValidator
следующим образом:
class MyCustomAccuracyValidator implements AccuracyValidator {
boolean validate(
BenchmarkResult benchmarkResult,
ByteBuffer[] goldenOutput) {
for (int i = 0; i < benchmarkResult.actualOutput().size(); i++) {
if (!goldenOutputs[i]
.equals(benchmarkResult.actualOutput().get(i).getValue())) {
return false;
}
}
return true;
}
}
Обязательно определите логику проверки, которая работает для вашего варианта использования.
Обратите внимание: если данные проверки уже встроены в вашу модель, вы можете использовать EmbeddedValidationConfig
.
Создание выходных данных проверки
Золотые выходы необязательны, и если вы предоставляете золотые входные данные, Служба ускорения может внутренне генерировать золотые выходные данные. Вы также можете определить конфигурацию ускорения, используемую для создания этих золотых выходных данных, вызвав setGoldenConfig()
:
ValidationConfig validationConfig = new CustomValidationConfig.Builder()
.setBatchSize(5)
.setGoldenInputs(inputs)
.setGoldenConfig(customCpuAccelerationConfig)
[...]
.build();
Проверить конфигурацию ускорения
После того, как вы создали конфигурацию ускорения и конфигурацию проверки, вы можете оценить их для своей модели.
Убедитесь, что среда выполнения TensorFlow Lite с Play Services правильно инициализирована и делегат графического процессора доступен для устройства, запустив:
TfLiteGpu.isGpuDelegateAvailable(context)
.onSuccessTask(gpuAvailable -> TfLite.initialize(context,
TfLiteInitializationOptions.builder()
.setEnableGpuDelegateSupport(gpuAvailable)
.build()
)
);
Создайте экземпляр AccelerationService
, вызвав AccelerationService.create()
.
Затем вы можете проверить конфигурацию ускорения для своей модели, вызвав validateConfig()
:
InterpreterApi interpreter;
InterpreterOptions interpreterOptions = InterpreterApi.Options();
AccelerationService.create(context)
.validateConfig(model, accelerationConfig, validationConfig)
.addOnSuccessListener(validatedConfig -> {
if (validatedConfig.isValid() && validatedConfig.benchmarkResult().hasPassedAccuracyTest()) {
interpreterOptions.setAccelerationConfig(validatedConfig);
interpreter = InterpreterApi.create(model, interpreterOptions);
});
Вы также можете проверить несколько конфигураций, вызвав validateConfigs()
и передав объект Iterable<AccelerationConfig>
в качестве параметра.
validateConfig()
вернет Task<
ValidatedAccelerationConfigResult
>
из Task Api сервисов Google Play, который включает асинхронные задачи.
Чтобы получить результат проверки, добавьте обратный вызов addOnSuccessListener()
.
Используйте проверенную конфигурацию в вашем интерпретаторе
После проверки правильности ValidatedAccelerationConfigResult
, возвращенного в обратном вызове, вы можете установить проверенную конфигурацию в качестве конфигурации ускорения для вашего интерпретатора, interpreterOptions.setAccelerationConfig()
.
Кэширование конфигурации
Оптимальная конфигурация ускорения для вашей модели вряд ли изменится на устройстве. Поэтому, как только вы получите удовлетворительную конфигурацию ускорения, вы должны сохранить ее на устройстве и позволить своему приложению получить ее и использовать для создания InterpreterOptions
во время следующих сеансов вместо того, чтобы запускать еще одну проверку. Методы serialize()
и deserialize()
в ValidatedAccelerationConfigResult
упрощают процесс хранения и извлечения.
Образец заявления
Чтобы ознакомиться с интеграцией Acceleration Service на месте, взгляните на пример приложения .
Ограничения
Служба ускорения имеет следующие текущие ограничения:
- На данный момент поддерживаются только конфигурации ускорения CPU и GPU,
- Он поддерживает TensorFlow Lite только в сервисах Google Play, и вы не можете использовать его, если используете связанную версию TensorFlow Lite,
- Он не поддерживает библиотеку задач TensorFlow Lite, поскольку вы не можете напрямую инициализировать
BaseOptions
с помощью объектаValidatedAccelerationConfigResult
. - Acceleration Service SDK поддерживает только уровень API 22 и выше.
Предостережения
Внимательно ознакомьтесь со следующими предостережениями, особенно если вы планируете использовать этот пакет SDK в рабочей среде:
Прежде чем выйти из бета-версии и выпустить стабильную версию API службы ускорения, мы опубликуем новый SDK, который может иметь некоторые отличия от текущей бета-версии. Чтобы продолжить использование службы ускорения, вам необходимо перейти на этот новый пакет SDK и своевременно отправить обновление для своего приложения. Несоблюдение этого требования может привести к поломке, так как бета-версия SDK может перестать быть совместима с сервисами Google Play через некоторое время.
Нет никакой гарантии, что конкретная функция API службы ускорения или API в целом когда-либо станет общедоступной. Он может оставаться в бета-версии на неопределенный срок, быть закрыт или объединен с другими функциями в пакеты, предназначенные для определенной аудитории разработчиков. Некоторые функции с Acceleration Service API или весь API со временем могут стать общедоступными, но для этого нет фиксированного графика.
Условия и конфиденциальность
Условия использования
Использование API службы ускорения регулируется Условиями обслуживания API Google .
Кроме того, API-интерфейсы службы ускорения в настоящее время находятся в стадии бета-тестирования, и поэтому, используя их, вы признаете потенциальные проблемы, описанные в разделе «Предостережения» выше, и признаете, что служба ускорения может не всегда работать так, как указано.
Конфиденциальность
Когда вы используете API службы ускорения, обработка входных данных (например, изображений, видео, текста) полностью происходит на устройстве, и служба ускорения не отправляет эти данные на серверы Google . В результате вы можете использовать наши API для обработки входных данных, которые не должны покидать устройство.
API службы ускорения могут время от времени связываться с серверами Google, чтобы получать такие вещи, как исправления ошибок, обновленные модели и информацию о совместимости аппаратных ускорителей. API службы ускорения также отправляют в Google показатели производительности и использования API в вашем приложении. Google использует данные этих показателей для измерения производительности, отладки, обслуживания и улучшения API, а также для выявления неправомерного использования или злоупотребления, как описано в нашей Политике конфиденциальности .
Вы несете ответственность за информирование пользователей вашего приложения об обработке Google данных показателей Службы ускорения в соответствии с применимым законодательством.
Данные, которые мы собираем, включают следующее:
- Информация об устройстве (например, производитель, модель, версия ОС и сборка) и доступные аппаратные ускорители машинного обучения (GPU и DSP). Используется для диагностики и анализа использования.
- Информация о приложении (имя пакета/идентификатор пакета, версия приложения). Используется для диагностики и анализа использования.
- Конфигурация API (например, формат и разрешение изображения). Используется для диагностики и анализа использования.
- Тип события (например, инициализация, загрузка модели, обновление, запуск, обнаружение). Используется для диагностики и анализа использования.
- Коды ошибок. Используется для диагностики.
- Показатели эффективности. Используется для диагностики.
- Идентификаторы установки, которые не идентифицируют однозначно пользователя или физическое устройство. Используется для работы удаленной настройки и аналитики использования.
- IP-адреса отправителей сетевых запросов. Используется для удаленной диагностики конфигурации. Собранные IP-адреса временно сохраняются.
Поддержка и обратная связь
Вы можете оставить отзыв и получить поддержку через средство отслеживания проблем TensorFlow. Сообщайте о проблемах и запрашивайте поддержку, используя шаблон проблемы для TensorFlow Lite в сервисах Google Play.