Paketa e Testimit të Përshpejtuesit LiteRT (ATS)

Paketa e Testimit të Përshpejtuesit LiteRT (ATS) është një mjet gjithëpërfshirës që përdoret për të validuar korrektësinë funksionale dhe për të matur performancën e implementimeve të përshpejtuesve të personalizuar të integruar me kornizën LiteRT.

Përmbledhje dhe Funksionalitete Thelbësore

Funksioni kryesor i ATS është të ekzekutojë modele të paracaktuara të të mësuarit automatik kundrejt një përshpejtuesi të synuar dhe të krahasojë rezultatet me backend-in standard të CPU-së LiteRT.

  • Validimi: Paketa kryen validimin numerik duke krahasuar tenzorët e daljes (aktivizimet) e prodhuara nga përshpejtuesi me ato të prodhuara nga backend-i i CPU-së i njohur si i mirë. Kjo siguron që implementimi i përshpejtuesit ruan saktësinë dhe korrektësinë e kërkuar.
  • Metrikat e Performancës: Ai kap dhe regjistron automatikisht detajet kritike të performancës, duke përfshirë vonesën dhe metrika të tjera relevante, të cilat i vihen në dispozicion përdoruesit.
  • Ekzekutimi: Testet zakonisht ekzekutohen në një pajisje të synuar (p.sh., një telefon Android) dhe menaxhohen nga një mbështjellës skripti shell që trajton transferimet dhe konfigurimin e skedarëve duke përdorur mjetin adb (Android Debug Bridge).

Të dhënat e testimit (modelet)

Paketa ATS përdor një koleksion modelesh .tflite të përdorura gjerësisht si të dhëna testimi. Të dhënat hyrëse gjenerohen rastësisht bazuar në llojin e të dhënave dhe mund të mbillen sipas nevojës.

Modelet e përfshira

Modelet e mëposhtme përfshihen dhe shkarkohen automatikisht për testim (mund të ndryshojnë):

  • 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

Marrja manuale e modelit

Ndërsa modelet shkarkohen automatikisht gjatë një bazel run , ju mund të merrni manualisht të gjithë grupin e modeleve duke përdorur wget :

wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz

Përcaktimi i një ATS Suite me Bazel

Përdorni makron litert_define_ats Bazel për të konfiguruar dhe përcaktuar një objektiv testimi ATS specifik për përshpejtuesin e tyre.

Makroja krijon automatikisht dy objektiva të ekzekutueshëm:

  1. Testi standard JIT në pajisje (për ekzekutim dhe validim).
  2. Një test i dedikuar i modalitetit AOT "vetëm përpilim" (për përpilimin pritës).

Shembull Përdorimi i litert_define_ats

Shembulli përcakton një suitë ATS të quajtur example_ats për një përshpejtues me emrin e backend-it 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 = "",
)

Ekzekutim

Për të ekzekutuar testin standard të synuar për android (i cili trajton të gjitha operacionet 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

Për të ekzekutuar testin e kompilimit 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

Ekzekutimi i Linux (Host)

Për ekzekutimin në Linux, ku ATS po ekzekutohet në të njëjtën makinë që po kryen ndërtimin, përdoruesit do të duhet të përdorin direkt skedarin binar :ats :

bazel run -c opt :ats

Ekzekutimi i IoT-së

Për ekzekutimin e IoT, përdoruesit do të duhet të ndërtojnë skedarin binar në host dhe ta dërgojnë manualisht në pajisjen e tyre.

Flamujt e Linjës së Komandës

ats ekzekutues ats pranon disa flamuj për kontroll të detajuar mbi testimin dhe raportimin.

Flamuri Lloji Përshkrimi
--backend std::string E detyrueshme. Cilin backend të LiteRT duhet përdorur si përshpejtues nën testim ("aktualin"). Opsionet janë cpu , npu ose gpu .
--compile_mode bool Nëse është e vërtetë, ekzekuton hapin e kompilimit AOT në stacionin e punës në vend të ekzekutimit në pajisje. SHËNIM: ky opsion lidhet automatikisht me objektivin e ndërtimit "aot" dhe nuk ka nevojë të caktohet në mënyrë të qartë.
--models_out std::string Shtegu i direktorisë ku ruhen modelet e serializuara (të kompiluara) me efekte anësore. I rëndësishëm vetëm për kompilimin AOT ose JIT.
--dispatch_dir std::string Shtegu për në drejtorinë që përmban bibliotekën e dërgimit të përshpejtuesit (relevante për NPU-në).
--plugin_dir std::string Shtegu për në direktorinë që përmban bibliotekën e shtojcave të përpiluesit të përshpejtuesit (relevante për NPU-në).
--soc_manufacturer std::string Prodhuesi i SOC-së që duhet të synohet për përpilimin AOT (i rëndësishëm për përpilimin NPU).
--soc_model std::string Modeli SOC që duhet synuar për përpilimin AOT (i rëndësishëm për përpilimin NPU).
--iters_per_test size_t Numri i përsëritjeve që do të ekzekutohen për test, secila me të dhëna të ndryshme tensorike të rastësishme.
--max_ms_per_test int64_t Koha maksimale në milisekonda për të ekzekutuar çdo test para një skadimi kohor.
--fail_on_timeout bool Nëse testi duhet të dështojë nëse koha e ekzekutimit skadon.
--csv std::string Shtegu i skedarit për të ruajtur raportin e detajuar në formatin CSV.
--dump_report bool Nëse të gjitha detajet e raportit do të dërgohen direkt në daljen e konsolës së përdoruesit.
--data_seed std::optional<int> Një farë e vetme për gjenerimin global të të dhënave.
--do_register std::vector<std::string> Regex(e) për përfshirjen në mënyrë të qartë të testeve specifike (p.sh., *mobilenet* ).
--dont_register std::vector<std::string> Regex(e) për të përjashtuar teste specifike.
--extra_models std::vector<std::string> Listë opsionale e drejtorive ose skedarëve të modelit për t'u shtuar në paketën e testimit.
--limit int32_t Kufizoni numrin total të testeve të regjistruara dhe të ekzekutuara.
--quiet bool Minimizo rezultatin e regjistrimit gjatë ekzekutimit të provës.

Duke përdorur shërbimet e ndërtimit litert_device_script për ATS

Përdoruesit e objektivave të ATS që ekzekutojnë automatikisht përfshijnë një pikë hyrjeje në shell që trajton të gjithë konfigurimin e mjedisit dhe çdo shtytje të bibliotekave të kërkuara kur pajisja e synuar ndryshon nga hosti në të cilin është përfunduar ndërtimi (p.sh. adb push ).

Ky funksionalitet ofrohet në mënyrë gjenerike përmes shërbimeve litert_device_script të cilat i përdorin ndërtimet ATS në mënyrë të integruar. Ekziston një proces regjistrimi që duhet të bëjnë përshpejtuesit për të aksesuar këtë funksionalitet ndërtimi. Përveç mbështetjes së ats , këto shërbime mund të përdoren në mënyrë të pavarur për të simuluar cc_binary dhe cc_test të destinuara për t'u ekzekutuar në një pajisje të ndryshme nga hosti i ndërtimit që kërkon varësi të shtyra.

Regjistrimi i Backend-it

Për të aktivizuar një përshpejtues të ri për përdorim me litert_device_script (dhe për rrjedhojë ATS), bibliotekat e kërkuara duhet të regjistrohen në skedarin Bazel litert_device_common.bzl . Regjistrimi bazohet në një emër unik "backend" i cili lidhet me një grup bibliotekash të ndërtueshme ose të para-kompiluara të nevojshme që LiteRT të funksionojë me atë përshpejtues.

Hapat e Regjistrimit

  1. Përcaktoni një funksion BackendSpec : Krijoni një funksion që kthen një fjalor që përmban specifikimin e përshpejtuesit tuaj të ri.

  2. Specifikoni Bibliotekat ( libs ): Kjo është një listë tuple-sh që detajojnë shtegun e synuar të Bazel për bibliotekën e përbashkët dhe variablin e mjedisit ( LD_LIBRARY_PATH ) të nevojshëm që lidhësi i pajisjes ta gjejë atë.

    • Biblioteka e Dispatch: E nevojshme për ekzekutimin në kohën e ekzekutimit.
    • Biblioteka e Shtojcave të Kompiluesit: E nevojshme për modalitetin e kompilimit AOT.
  3. Specifikoni Emrat e Bibliotekave ( plugin , dispatch ): Jepni emrat e skedarëve të bibliotekave të plugin-it dhe dispatch.

  4. Regjistro Specifikimin: Bashkoni funksionin tuaj të ri të specifikimeve me funksionin kryesor _Specs për ta bërë atë të disponueshëm me anë të ID-së së tij unike të backend-it.

Shembull Regjistrimi ( _ExampleSpec )

Kodi i mëposhtëm nga litert_device_common.bzl ilustron se si regjistrohet përshpejtuesi "shembull":

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]

Përdorimi i Regjistrimit me litert_device_exec

Pasi të regjistroheni, përdorni makrot litert_device_exec dhe makrot përkatëse me backend_id e ri. Kjo makro bashkon automatikisht bibliotekat e kërkuara dhe çdo skedar të dhënash të specifikuar me skedarin binar të synuar.

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

Ekzekutimi i këtij objektivi ( bazel run ... :example_bin_device ) do të:

  1. Ndërtoni skedarin binar C++ example_bin .
  2. Vendos skedarin binar, libLiteRtDispatch_Example.so , libLiteRtCompilerPlugin_Example.so dhe skedarin .tflite në pajisje.
  3. Ekzekutoni skedarin binar duke përdorur adb shell .

Shënim mbi Shtigjet e Pajisjeve: Vendndodhja kanonike për skedarët në pajisje pasqyron pemën e skedarëve run të Bazel, konkretisht /data/local/tmp/runfiles/runfiles_relative_path . Skripti i pajisjes merret automatikisht me caktimin e shtigjeve të duhura për lidhësin dinamik.

Modaliteti i Kompilimit (AOT)

Për përshpejtuesit që mbështesin një hap kompilimi paraprak (AOT) , ATS mund të ekzekutohet në një "modalitet kompilimi" të dedikuar.

  • Qëllimi: Ky modalitet është projektuar për t'u ekzekutuar në një stacion pune (makinë pritëse), jo në pajisjen e synuar. Ai kompilon modelet për harduerin e synuar të specifikuar pa i ekzekutuar ato.
  • Dalja: Të gjitha modelet e kompiluara nxirren në një drejtori të caktuar në stacionin e punës.
  • Aktivizimi: Makrot e ndërtimit ATS do të lëshojnë një objektiv specifik për aot ku ndërtohen bibliotekat për platformën pritëse. Ky rrjedhë mund të aktivizohet në çdo skedar binar me flamurin --compile_mode , por është i lidhur automatikisht me argumentet e ndërtimit aot.

Zgjerimi i ardhshëm

Suita është planifikuar të zgjerohet për të përfshirë teste të dedikuara për operacione të vetme (ops) , përveç modeleve të plota.