Delegatët mundësojnë përshpejtimin harduerik të modeleve LiteRT duke shfrytëzuar përshpejtuesit në pajisje, siç janë GPU dhe Procesori i Sinjalit Dixhital (DSP) .
Si parazgjedhje, LiteRT përdor bërthama të CPU-së që janë të optimizuara për grupin e udhëzimeve ARM Neon . Megjithatë, CPU është një procesor shumëfunksional që nuk është domosdoshmërisht i optimizuar për aritmetikën e rëndë që zakonisht gjendet në modelet e Mësimit Automatik (për shembull, matematika e matricës e përfshirë në konvolucion dhe shtresa të dendura).
Nga ana tjetër, shumica e telefonave celularë modernë përmbajnë çipa që janë më të mirë në përballimin e këtyre operacioneve të rënda. Përdorimi i tyre për operacionet e rrjeteve nervore ofron përfitime të mëdha në aspektin e latencës dhe efikasitetit të energjisë. Për shembull, GPU-të mund të ofrojnë një shpejtësi deri në 5 herë më të madhe të latencës.
Secili prej këtyre përshpejtuesve ka API-të e shoqëruara që mundësojnë llogaritjet e personalizuara, të tilla si OpenCL ose OpenGL ES për GPU-të mobile. Zakonisht, do të duhej të shkruanit shumë kod të personalizuar për të ekzekutuar një rrjet nervor përmes këtyre ndërfaqeve. Gjërat bëhen edhe më të ndërlikuara kur merrni parasysh se çdo përshpejtues ka pro dhe kundrat e tij dhe nuk mund të ekzekutojë çdo operacion në një rrjet nervor. API-ja Delegate e TensorFlow Lite zgjidh këtë problem duke vepruar si një urë midis kohës së ekzekutimit të TFLite dhe këtyre API-ve të nivelit më të ulët.

Zgjedhja e një delegati
LiteRT mbështet delegatë të shumtë, secili prej të cilëve është i optimizuar për platforma të caktuara dhe lloje të veçanta modelesh. Zakonisht, do të ketë delegatë të shumtë të zbatueshëm për rastin tuaj të përdorimit, varësisht nga dy kritere kryesore: Platforma (Android apo iOS?) që synoni dhe lloji i modelit (me pikë lundruese apo i kuantizuar?) që po përpiqeni të përshpejtoni.
Delegatët sipas Platformës
Platforma të ndryshme (Android dhe iOS)
- Delegati i GPU-së - Delegati i GPU-së mund të përdoret si në Android ashtu edhe në iOS. Është i optimizuar për të ekzekutuar modele 32-bit dhe 16-bit të bazuara në modalitetin lundrues, aty ku është i disponueshëm një GPU. Ai gjithashtu mbështet modele të kuantizuara 8-bit dhe ofron performancë GPU-je në të njëjtin nivel me versionet e tyre lundruese. Për detaje mbi delegatin e GPU-së, shihni LiteRT mbi GPU-në .
iOS
- Delegati Core ML për iPhone dhe iPad më të rinj - Për iPhone dhe iPad më të rinj ku është i disponueshëm Neural Engine, mund të përdorni delegatin Core ML për të përshpejtuar inferencën për modelet me pikë lundruese 32-bit ose 16-bit. Neural Engine është i disponueshëm në pajisjet mobile Apple me A12 SoC ose më të lartë. Për një përmbledhje të delegatit Core ML dhe udhëzimeve hap pas hapi, shihni LiteRT Core ML delegate .
Delegatët sipas llojit të modelit
Çdo përshpejtues është projektuar duke pasur parasysh një gjerësi të caktuar të të dhënave në bit. Nëse i ofroni një model me pikë lundruese një delegati që mbështet vetëm operacione të kuantizuara 8-bit, ai do t'i refuzojë të gjitha operacionet e tij dhe modeli do të funksionojë tërësisht në CPU. Për të shmangur surpriza të tilla, tabela më poshtë ofron një pasqyrë të përgjithshme të mbështetjes së delegatit bazuar në llojin e modelit:
| Lloji i modelit | GPU | CoreML |
|---|---|---|
| Pikë lundruese (32 bit) | Po | Po |
| Kuantizimi float16 pas trajnimit | Po | Po |
| Kuantizimi i diapazonit dinamik pas trajnimit | Po | Jo |
| Kuantizimi i numrave të plotë pas trajnimit | Po | Jo |
| Trajnim i vetëdijshëm për kuantizimin | Po | Jo |
Validimi i performancës
Informacioni në këtë seksion shërben si një udhëzues i përafërt për përzgjedhjen e delegatëve që mund të përmirësojnë aplikacionin tuaj. Megjithatë, është e rëndësishme të theksohet se secili delegat ka një grup të paracaktuar operacionesh që mbështet dhe mund të kryejë ndryshe në varësi të modelit dhe pajisjes. Prandaj, zakonisht rekomandohet që të kryeni disa krahasime për të vlerësuar se sa i dobishëm është një delegat për nevojat tuaja. Kjo gjithashtu ndihmon në justifikimin e rritjes së madhësisë binare që shoqërohet me bashkëngjitjen e një delegati në kohën e ekzekutimit të LiteRT.
LiteRT ka mjete të gjera për vlerësimin e performancës dhe saktësisë që mund t'i fuqizojnë zhvilluesit të jenë të sigurt në përdorimin e delegatëve në aplikacionin e tyre. Këto mjete diskutohen në seksionin tjetër.
Mjete për Vlerësim
Latencia dhe gjurma e kujtesës
Mjeti i krahasimit i LiteRT mund të përdoret me parametra të përshtatshëm për të vlerësuar performancën e modelit, duke përfshirë vonesën mesatare të nxjerrjes së përfundimeve, mbingarkesën e inicializimit, gjurmën e memories, etj. Ky mjet mbështet flamuj të shumtë për të përcaktuar konfigurimin më të mirë të delegatit për modelin tuaj. Për shembull, --gpu_backend=gl mund të specifikohet me --use_gpu për të matur ekzekutimin e GPU-së me OpenGL. Lista e plotë e parametrave të delegatit të mbështetur është përcaktuar në dokumentacionin e detajuar .
Ja një shembull ekzekutimi për një model të kuantizuar me GPU nëpërmjet adb :
adb shell /data/local/tmp/benchmark_model \
--graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
--use_gpu=true
Mund të shkarkoni versionin e parapërgatitur të këtij mjeti për Android, arkitekturë ARM 64-bit këtu ( më shumë detaje ).
Saktësia dhe korrektësia
Delegatët zakonisht kryejnë llogaritjet me një saktësi të ndryshme nga homologët e tyre të CPU-së. Si rezultat, ekziston një kompromis saktësie (zakonisht i vogël) i lidhur me përdorimin e një delegati për përshpejtimin e harduerit. Vini re se kjo nuk është gjithmonë e vërtetë; për shembull, meqenëse GPU përdor saktësi me pikë lundruese për të ekzekutuar modele të kuantizuara, mund të ketë një përmirësim të lehtë të saktësisë (për shembull, <1% përmirësim në 5 vendet e para në klasifikimin e imazhit ILSVRC).
LiteRT ka dy lloje mjetesh për të matur se sa saktë sillet një delegat për një model të caktuar: Bazuar në Detyra dhe Agnostik ndaj Detyrave . Të gjitha mjetet e përshkruara në këtë seksion mbështesin parametrat e avancuar të delegimit të përdorur nga mjeti i krahasimit nga seksioni i mëparshëm. Vini re se nënseksionet më poshtë përqendrohen në vlerësimin e delegatit (A kryen delegati njësoj si CPU-ja?) në vend të vlerësimit të modelit (A është vetë modeli i mirë për detyrën?).
Vlerësimi i Bazuar në Detyra
LiteRT ka mjete për të vlerësuar saktësinë në dy detyra të bazuara në imazhe:
ILSVRC 2012 (Klasifikimi i Imazheve) me saktësi maksimale
Zbulimi i Objekteve COCO (me kuti kufizuese) me Precizion Mesatar mesatar (mAP)
Skedarët binarë të parapërgatitur të këtyre mjeteve (Android, arkitekturë ARM 64-bit), së bashku me dokumentacionin mund të gjenden këtu:
Shembulli më poshtë tregon vlerësimin e klasifikimit të imazhit me GPU në një Pixel 4:
adb shell /data/local/tmp/run_eval \
--model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
--ground_truth_images_path=/data/local/tmp/ilsvrc_images \
--ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
--model_output_labels=/data/local/tmp/model_output_labels.txt \
--output_file_path=/data/local/tmp/accuracy_output.txt \
--num_images=0 # Run on all images. \
--use_gpu=true
Rezultati i pritur është një listë e metrikave Top-K nga 1 deri në 10:
Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333
Vlerësimi Agnostik i Detyrave
Për detyrat ku nuk ka një mjet të vendosur vlerësimi në pajisje, ose nëse po eksperimentoni me modele të personalizuara, LiteRT ka mjetin Inference Diff . (Android, binar me arkitekturë binare ARM 64-bit këtu )
Inference Diff krahason ekzekutimin e LiteRT (në aspektin e latencës dhe devijimit të vlerës së daljes) në dy cilësime:
- Përfundimi i CPU-së me një fije të vetme
- Përfundimi i përcaktuar nga përdoruesi - i përcaktuar nga këto parametra
Për ta bërë këtë, mjeti gjeneron të dhëna të rastësishme Gaussiane dhe i kalon ato përmes dy Interpretuesve TFLite - njëri që përdor bërthama CPU me një fije të vetme dhe tjetri i parametrizuar nga argumentet e përdoruesit.
Ai mat latencën e të dyve, si dhe ndryshimin absolut midis tensorëve të daljes nga secili Interpretues, në bazë të çdo elementi.
Për një model me një tensor të vetëm dalës, rezultati mund të duket kështu:
Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06
Kjo do të thotë që për tensorin e daljes në indeksin 0 , elementët nga dalja e CPU-së ndryshojnë nga dalja e delegatit me një mesatare prej 1.96e-05 .
Vini re se interpretimi i këtyre numrave kërkon njohuri më të thella të modelit dhe asaj që përfaqëson secili tensor i daljes. Nëse është një regresion i thjeshtë që përcakton një lloj rezultati ose ngulitjeje, ndryshimi duhet të jetë i ulët (përndryshe është një gabim me delegatin). Megjithatë, daljet si ajo e 'klasës së zbulimit' nga modelet SSD janë pak më të vështira për t'u interpretuar. Për shembull, mund të tregojë një ndryshim duke përdorur këtë mjet, por kjo mund të mos nënkuptojë diçka vërtet të gabuar me delegatin: merrni në konsideratë dy klasa (të rreme): "TV (ID: 10)", "Monitor (ID: 20)" - Nëse një delegat është paksa larg të vërtetës së artë dhe tregon monitor në vend të TV, ndryshimi i daljes për këtë tensor mund të jetë diçka deri në 20-10 = 10.