LiteRT 가속기 테스트 모음 (ATS)

LiteRT 가속기 테스트 모음 (ATS)은 LiteRT 프레임워크와 통합된 맞춤 가속기 구현의 기능적 정확성을 검증하고 성능을 측정하는 데 사용되는 포괄적인 도구입니다.

개요 및 핵심 기능

ATS의 기본 기능은 타겟 가속기에 대해 사전 정의된 머신러닝 모델을 실행하고 결과를 LiteRT 표준 CPU 백엔드와 비교하는 것입니다.

  • 유효성 검사: 이 도구 모음은 액셀러레이터에서 생성된 출력 텐서 (활성화)를 정상으로 알려진 CPU 백엔드에서 생성된 텐서와 비교하여 숫자 유효성 검사를 실행합니다. 이렇게 하면 가속기 구현이 필요한 정밀도와 정확성을 유지할 수 있습니다.
  • 성능 측정항목: 지연 시간 및 기타 관련 측정항목을 비롯한 중요한 성능 세부정보를 자동으로 캡처하고 기록하여 사용자에게 제공합니다.
  • 실행: 테스트는 일반적으로 타겟 기기 (예: Android 휴대전화)에서 실행되며 adb (Android 디버그 브리지) 도구를 사용하여 파일 전송 및 설정을 처리하는 셸 스크립트 래퍼에 의해 관리됩니다.

테스트 데이터 (모델)

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

Bazel로 ATS 모음 정의

litert_define_ats Bazel 매크로를 사용하여 가속기별 ATS 테스트 타겟을 구성하고 정의합니다.

매크로는 실행 가능한 타겟을 두 개 자동으로 만듭니다.

  1. 표준 기기 내 JIT 테스트 (실행 및 검증용)
  2. 전용 AOT '컴파일만' 모드 테스트 (호스트 컴파일용)

litert_define_ats 사용 예시

이 예에서는 백엔드 이름이 example인 가속기의 example_ats라는 ATS 스위트를 정의합니다.

# 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 = "",
)

실행

모든 adb 작업을 처리하는 Android용 표준 테스트를 실행하려면 다음을 실행하세요.

# 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 실행 (호스트)

빌드를 실행하는 동일한 머신에서 ATS를 실행하는 Linux의 경우 사용자는 :ats 바이너리를 직접 사용해야 합니다.

bazel run -c opt :ats

IoT 실행

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 AOT 컴파일의 타겟 SOC 제조업체입니다 (NPU 컴파일과 관련됨).
--soc_model std::string AOT 컴파일의 타겟 SOC 모델입니다 (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 테스트 실행 중에 로깅 출력을 최소화합니다.

ATS용 litert_device_script 빌드 유틸리티 사용

ATS 타겟 사용자는 환경 설정을 모두 처리하고 타겟 기기가 빌드가 완료된 호스트와 다른 경우 (예: adb push) 필수 라이브러리 푸시를 처리하는 셸 진입점을 자동으로 포함합니다.

이 기능은 ATS 빌드에서 내부적으로 사용하는 litert_device_script 유틸리티를 통해 일반적으로 제공됩니다. 이 빌드 기능에 액세스하기 위해 등록 절차를 거쳐야 하는 액셀러레이터가 있습니다. ats를 지원하는 것 외에도 이러한 유틸리티는 빌드 호스트와 다른 기기에서 실행되도록 설계되어 푸시된 종속 항목이 필요한 cc_binarycc_test를 시뮬레이션하기 위해 독립형 방식으로 사용할 수 있습니다.

백엔드 등록

litert_device_script (따라서 ATS)와 함께 사용할 새 액셀러레이터를 사용 설정하려면 필수 라이브러리가 litert_device_common.bzl Bazel 파일에 등록되어야 합니다. 등록은 LiteRT가 해당 가속기와 함께 작동하는 데 필요한 빌드 가능 또는 사전 컴파일된 라이브러리 집합에 매핑되는 고유한 '백엔드' 이름을 기반으로 합니다.

등록 단계

  1. BackendSpec 함수 정의: 새 액셀러레이터의 사양이 포함된 사전을 반환하는 함수를 만듭니다.

  2. 라이브러리 지정 (libs): 공유 라이브러리의 Bazel 타겟 경로와 기기 링커가 이를 찾는 데 필요한 환경 변수(LD_LIBRARY_PATH)를 자세히 설명하는 튜플 목록입니다.

    • 디스패치 라이브러리: 런타임 실행에 필요합니다.
    • 컴파일러 플러그인 라이브러리: AOT 컴파일 모드에 필요합니다.
  3. 라이브러리 이름 지정 (plugin, dispatch): 플러그인 및 디스패치 라이브러리의 파일 이름을 제공합니다.

  4. 사양 등록: 새 사양 함수를 기본 _Specs 함수에 병합하여 고유한 백엔드 ID로 사용할 수 있도록 합니다.

등록 예 (_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를 사용한 등록 활용

등록한 후 새 backend_id와 함께 litert_device_exec 및 관련 매크로를 사용합니다. 이 매크로는 필요한 라이브러리와 지정된 데이터 파일을 타겟 바이너리와 자동으로 번들로 묶습니다.

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의 runfile 트리, 특히 /data/local/tmp/runfiles/runfiles_relative_path를 반영합니다. 기기 스크립트는 동적 링커의 적절한 경로 설정을 자동으로 처리합니다.

컴파일 모드 (AOT)

Ahead-of-Time (AOT) 컴파일 단계를 지원하는 액셀러레이터의 경우 ATS를 전용 '컴파일 모드'에서 실행할 수 있습니다.

  • 목적: 이 모드는 타겟 기기가 아닌 워크스테이션 (호스트 머신)에서 실행되도록 설계되었습니다. 모델을 실행하지 않고 지정된 타겟 하드웨어용으로 컴파일합니다.
  • 출력: 컴파일된 모든 모델이 워크스테이션의 지정된 디렉터리에 출력됩니다.
  • 활성화: ATS 빌드 매크로는 라이브러리가 호스트 플랫폼용으로 빌드되는 aot의 특정 타겟을 내보냅니다. 이 흐름은 --compile_mode 플래그가 있는 모든 바이너리에서 사용 설정할 수 있지만 aot 빌드의 인수에 자동으로 바인딩됩니다.

추후 확대 예정

이 도구 모음은 전체 모델 외에도 단일 작업 (ops) 전용 테스트를 포함하도록 확장될 예정입니다.