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:
- Testi standard JIT në pajisje (për ekzekutim dhe validim).
- 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
Përcaktoni një funksion
BackendSpec: Krijoni një funksion që kthen një fjalor që përmban specifikimin e përshpejtuesit tuaj të ri.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.
Specifikoni Emrat e Bibliotekave (
plugin,dispatch): Jepni emrat e skedarëve të bibliotekave të plugin-it dhe dispatch.Regjistro Specifikimin: Bashkoni funksionin tuaj të ri të specifikimeve me funksionin kryesor
_Specspë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ë:
- Ndërtoni skedarin binar C++
example_bin. - Vendos skedarin binar,
libLiteRtDispatch_Example.so,libLiteRtCompilerPlugin_Example.sodhe skedarin.tflitenë pajisje. - 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.