Набор тестов LiteRT Accelerator Test Suite (ATS)

Набор тестов 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, специфичного для вашего акселератора.

Макрос автоматически создает два исполняемых целевого объекта:

  1. Стандартный JIT-тест на устройстве (для выполнения и проверки).
  2. Специальный тест в режиме "только компиляция" 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 с этим ускорителем.

Этапы регистрации

  1. Определите функцию BackendSpec : создайте функцию, которая возвращает словарь, содержащий спецификацию вашего нового акселератора.

  2. Укажите библиотеки ( libs ): это список кортежей, содержащих путь к разделяемой библиотеке в Bazel и переменную среды ( LD_LIBRARY_PATH ), необходимую компоновщику устройства для ее поиска.

    • Библиотека диспетчеризации: необходима для выполнения во время выполнения.
    • Библиотека плагинов компилятора: необходима для режима AOT-компиляции.
  3. Укажите названия библиотек ( plugin , dispatch ): укажите имена файлов библиотек плагина и dispatch.

  4. Зарегистрируйте спецификацию: объедините новую функцию спецификации с основной функцией _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 ) приведет к следующему:

  1. Соберите исполняемый файл example_bin на C++.
  2. Загрузите на устройство исполняемый файл libLiteRtDispatch_Example.so , файл libLiteRtCompilerPlugin_Example.so и файл .tflite .
  3. Запустите исполняемый файл с помощью adb shell .

Примечание о путях к устройству: каноническое расположение файлов на устройстве соответствует дереву исполняемых файлов Bazel, а именно /data/local/tmp/runfiles/runfiles_relative_path . Скрипт устройства автоматически обрабатывает установку соответствующих путей для динамического компоновщика.

Режим компиляции (AOT)

Для ускорителей, поддерживающих этап предварительной компиляции (AOT) , ATS может выполняться в специальном «режиме компиляции» .

  • Назначение: Этот режим предназначен для запуска на рабочей станции (хост-машине), а не на целевом устройстве. Он компилирует модели для указанного целевого оборудования без их выполнения.
  • Результат: Все скомпилированные модели выводятся в указанную директорию на рабочей станции.
  • Активация: Макросы сборки ATS будут создавать конкретную цель для AOT, где библиотеки будут собираться для хост-платформы. Этот процесс можно включить для любого бинарного файла с помощью флага --compile_mode , но он автоматически привязывается к аргументам сборки AOT.

Будущее расширение

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