Набор тестов LiteRT Accelerator Test Suite (ATS) — это комплексный инструмент, используемый для проверки функциональной корректности и измерения производительности пользовательских реализаций ускорителей, интегрированных с фреймворком LiteRT.
Обзор и основные функции
Основная функция ATS заключается в выполнении предопределенных моделей машинного обучения на целевом ускорителе и сравнении результатов со стандартным бэкендом LiteRT для ЦП .
- Валидация: Пакет программ выполняет численную валидацию , сравнивая выходные тензоры (активации), полученные ускорителем, с тензорами, полученными от заведомо исправного процессора. Это гарантирует, что реализация ускорителя сохраняет требуемую точность и корректность.
- Показатели производительности: система автоматически собирает и записывает важные данные о производительности, включая задержку и другие соответствующие показатели, которые предоставляются пользователю.
- Выполнение: Тесты обычно выполняются на целевом устройстве (например, телефоне Android) и управляются скриптом-оболочкой , который обрабатывает передачу файлов и настройку с помощью инструмента
adb(Android Debug Bridge).
Тестовые данные (модели)
В качестве тестовых данных пакет ATS использует набор широко распространенных моделей .tflite . Входные данные генерируются случайным образом в зависимости от типа данных и могут быть инициализированы по мере необходимости.
Включенные модели
Следующие модели автоматически включены и загружаются для тестирования (список может меняться):
-
hf_all_minilm_l6_v2 -
hf_mobilevit_small -
qai_hub_midas -
qai_hub_real_esrgan_x4plus -
torchvision_mobilenet_v2 -
torchvision_resnet18 -
torchvision_squeezenet1_1 -
u2net_lite -
whisper_tiny_decoder -
whisper_tiny_encoder -
yamnet -
yolo11n
Ручное извлечение модели
Хотя модели автоматически загружаются во время bazel run , вы можете вручную получить весь набор моделей с помощью wget :
wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz
Создание пакета инструментов ATS с помощью Bazel
Используйте макрос Bazel litert_define_ats для настройки и определения целевого объекта тестирования ATS, специфичного для вашего акселератора.
Макрос автоматически создает два исполняемых целевого объекта:
- Стандартный JIT-тест на устройстве (для выполнения и проверки).
- Специальный тест в режиме "только компиляция" AOT (для компиляции на хост-системе).
Пример использования функции litert_define_ats
В примере определен набор тестов ATS с именем example_ats для акселератора с именем бэкэнда example :
# Emits aot-mode and jit-mode test targets, one for running compilation test on host
# and another for running JIT and inference on device
# These targets are named with their respective suffix attribute.
litert_define_ats(
name = "example_ats",
backend = "example",
compile_only_suffix = "_aot",
do_register = [
"*mobilenet*",
],
extra_flags = ["--limit=1"],
jit_suffix = "",
)
Исполнение
Для выполнения стандартного теста, предназначенного для Android (который обрабатывает все операции adb ):
# Handles environment setup, and build + push of library and data dependencies to the device,
# executes the suite on the target.
bazel run -c opt --config=android_arm64 :example_ats
Для выполнения теста компиляции AOT:
# Handle environment setup, and builds library dependencies for host platform.
# Executes the ats compile only flow. The "--compile_mode" flag is already
# bound to the program arguments.
bazel run :example_ats_aot
Выполнение в Linux (на хосте)
Для запуска под Linux, когда ATS работает на той же машине, что и сборка, пользователям потребуется использовать бинарный файл :ats напрямую:
bazel run -c opt :ats
Выполнение задач в сфере Интернета вещей
Для реализации IoT-приложений пользователям потребуется собрать исполняемый файл на хосте и вручную загрузить его на своё устройство.
Флаги командной строки
Исполняемый файл ats принимает несколько флагов для детального управления тестированием и формированием отчетов.
| Флаг | Тип | Описание |
|---|---|---|
--backend | std::string | Обязательно. Какой бэкэнд LiteRT использовать в качестве тестируемого ускорителя («фактического»). Варианты: cpu , npu или gpu . |
--compile_mode | bool | Если значение равно true, этап AOT-компиляции выполняется на рабочей станции, а не на устройстве. ПРИМЕЧАНИЕ: этот параметр автоматически привязан к целевому объекту сборки "aot" и не требует явной настройки. |
--models_out | std::string | Путь к каталогу, где сохраняются сериализованные (скомпилированные) модели с побочными эффектами. Актуально только для AOT или JIT-компиляции. |
--dispatch_dir | std::string | Путь к каталогу, содержащему библиотеку диспетчеризации ускорителя (актуально для NPU). |
--plugin_dir | std::string | Путь к каталогу, содержащему библиотеку плагинов компилятора ускорителя (актуально для NPU). |
--soc_manufacturer | std::string | Производителя SOC, на которого следует ориентироваться при компиляции AOT (актуально для компиляции NPU). |
--soc_model | std::string | Целевая модель SOC для компиляции AOT (актуально для компиляции NPU). |
--iters_per_test | size_t | Количество итераций для выполнения каждого теста, каждая из которых использует разные рандомизированные тензорные данные. |
--max_ms_per_test | int64_t | Максимальное время в миллисекундах, необходимое для выполнения каждого теста до истечения таймаута. |
--fail_on_timeout | bool | Должен ли тест завершаться неудачей, если истекает время выполнения. |
--csv | std::string | Путь к файлу для сохранения подробного отчета в формате CSV. |
--dump_report | bool | Следует ли выводить все подробности отчета непосредственно в консоль пользователя. |
--data_seed | std::optional<int> | Единый источник для генерации глобальных данных. |
--do_register | std::vector<std::string> | Регулярные выражения для явного включения конкретных тестов (например, *mobilenet* ). |
--dont_register | std::vector<std::string> | Регулярные выражения для исключения определенных тестов. |
--extra_models | std::vector<std::string> | Необязательный список каталогов или файлов моделей для добавления в набор тестов. |
--limit | int32_t | Ограничьте общее количество зарегистрированных и запущенных тестов. |
--quiet | bool | Сведите к минимуму вывод логов во время выполнения теста. |
Использование утилит сборки litert_device_script для ATS
В число целей ATS, которые пользователи запускают автоматически, входит точка входа в оболочку, которая обрабатывает всю настройку среды и отправку необходимых библиотек, если целевое устройство отличается от хоста, на котором была завершена сборка (например adb push ).
Эта функциональность предоставляется в общем виде через утилиты litert_device_script , которые используются в сборках ATS. Для доступа к этой функциональности сборки необходимо пройти процедуру регистрации ускорителей. Помимо поддержки ats , эти утилиты можно использовать в автономном режиме для имитации выполнения cc_binary и cc_test на устройстве, отличном от хоста сборки, требующего загрузки зависимостей.
Регистрация в бэкэнде
Для включения нового ускорителя для использования с litert_device_script (и, следовательно, с ATS), необходимые для него библиотеки должны быть зарегистрированы в файле Bazel litert_device_common.bzl . Регистрация основана на уникальном имени «бэкенда» , которое соответствует набору скомпилированных или предварительно скомпилированных библиотек, необходимых для работы LiteRT с этим ускорителем.
Этапы регистрации
Определите функцию
BackendSpec: создайте функцию, которая возвращает словарь, содержащий спецификацию вашего нового акселератора.Укажите библиотеки (
libs): это список кортежей, содержащих путь к разделяемой библиотеке в Bazel и переменную среды (LD_LIBRARY_PATH), необходимую компоновщику устройства для ее поиска.- Библиотека диспетчеризации: необходима для выполнения во время выполнения.
- Библиотека плагинов компилятора: необходима для режима AOT-компиляции.
Укажите названия библиотек (
plugin,dispatch): укажите имена файлов библиотек плагина и dispatch.Зарегистрируйте спецификацию: объедините новую функцию спецификации с основной функцией
_Specs, чтобы сделать ее доступной по уникальному идентификатору в бэкэнде.
Пример регистрации ( _ExampleSpec )
Следующий фрагмент кода из litert_device_common.bzl демонстрирует, как регистрируется акселератор "example":
def _ExampleSpec():
return {
# The unique backend ID
"example": BackendSpec(
id = "example",
libs = [
# Dispatch Library and how to find it on device
("//third_party/odml/litert/litert/vendors/examples:libLiteRtDispatch_Example.so", "LD_LIBRARY_PATH"),
# Compiler Plugin Library
("//third_party/odml/litert/litert/vendors/examples:libLiteRtCompilerPlugin_Example.so", "LD_LIBRARY_PATH"),
],
plugin = "libLiteRtCompilerPlugin_Example.so",
dispatch = "libLiteRtDispatch_Example.so",
),
}
# ... (Other specs are defined here)
def _Specs(name):
# Your new spec function must be included here
return (_QualcommSpec() | _GoogleTensorSpec() | _MediatekSpec() | _CpuSpec() | _GpuSpec() | _ExampleSpec())[name]
Использование регистрации с помощью litert_device_exec
После регистрации используйте макрос litert_device_exec и связанные с ним макросы с новым backend_id . Этот макрос автоматически включает необходимые библиотеки и любые указанные файлы данных в целевой исполняемый файл.
cc_binary(
name = "example_bin",
srcs = ["example_bin.cc"],
)
litert_device_exec(
name = "example_bin_device",
backend_id = "example", # Uses the libraries registered under "example"
data = [
"//third_party/odml/litert/litert/test:testdata/constant_output_tensor.tflite",
],
target = ":example_bin",
)
Запуск этой цели ( bazel run ... :example_bin_device ) приведет к следующему:
- Соберите исполняемый файл
example_binна C++. - Загрузите на устройство исполняемый файл
libLiteRtDispatch_Example.so, файлlibLiteRtCompilerPlugin_Example.soи файл.tflite. - Запустите исполняемый файл с помощью
adb shell.
Примечание о путях к устройству: каноническое расположение файлов на устройстве соответствует дереву исполняемых файлов Bazel, а именно
/data/local/tmp/runfiles/runfiles_relative_path. Скрипт устройства автоматически обрабатывает установку соответствующих путей для динамического компоновщика.
Режим компиляции (AOT)
Для ускорителей, поддерживающих этап предварительной компиляции (AOT) , ATS может выполняться в специальном «режиме компиляции» .
- Назначение: Этот режим предназначен для запуска на рабочей станции (хост-машине), а не на целевом устройстве. Он компилирует модели для указанного целевого оборудования без их выполнения.
- Результат: Все скомпилированные модели выводятся в указанную директорию на рабочей станции.
- Активация: Макросы сборки ATS будут создавать конкретную цель для AOT, где библиотеки будут собираться для хост-платформы. Этот процесс можно включить для любого бинарного файла с помощью флага
--compile_mode, но он автоматически привязывается к аргументам сборки AOT.
Будущее расширение
Планируется расширить набор тестов, включив в него, помимо полномасштабных моделей, специализированные тесты для отдельных операций (опций) .