Mjetet e standardeve
Mjetet e standardeve LiteRT aktualisht matin dhe llogaritin statistikat për metrikat e mëposhtme të rëndësishme të performancës:
- Koha e inicializimit
- Koha e konkluzionit të gjendjes së ngrohjes
- Koha e konkluzionit të gjendjes së qëndrueshme
- Përdorimi i memories gjatë kohës së inicializimit
- Përdorimi i përgjithshëm i kujtesës
Mjetet e standardeve janë të disponueshme si aplikacione standarde për Android dhe iOS dhe si binare vendase të linjës së komandës dhe të gjithë ndajnë të njëjtën logjikë thelbësore të matjes së performancës. Vini re se opsionet e disponueshme dhe formatet e daljes janë paksa të ndryshme për shkak të ndryshimeve në mjedisin e kohës së ekzekutimit.
Aplikacioni standard Android
Ekzistojnë dy mundësi për të përdorur mjetin e standardeve me Android. Njëri është një binar standard standard dhe tjetri është një aplikacion standard i Android, një matës më i mirë se si do të performonte modeli në aplikacion. Sido që të jetë, numrat nga mjeti i standardit do të ndryshojnë ende pak nga kur ekzekutoni konkluzionet me modelin në aplikacionin aktual.
Ky aplikacion standard Android nuk ka ndërfaqe. Instaloni dhe ekzekutoni atë duke përdorur komandën adb
dhe merrni rezultatet duke përdorur komandën adb logcat
.
Shkarkoni ose ndërtoni aplikacionin
Shkarkoni aplikacionet standarde Android të para-ndërtuara çdo natë duke përdorur lidhjet më poshtë:
Sa për aplikacionet standarde të Android që mbështesin funksionet TF përmes delegatit Flex , përdorni lidhjet më poshtë:
Ju gjithashtu mund ta ndërtoni aplikacionin nga burimi duke ndjekur këto udhëzime .
Përgatitni standardin
Përpara se të ekzekutoni aplikacionin e standardeve, instaloni aplikacionin dhe shtyni skedarin e modelit në pajisje si më poshtë:
adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp
Ekzekutimi i standardit
adb shell am start -S \
-n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
--es args '"--graph=/data/local/tmp/your_model.tflite \
--num_threads=4"'
graph
është një parametër i kërkuar.
-
graph
:string
Rruga për në skedarin e modelit TFLite.
Mund të specifikoni më shumë parametra opsionale për ekzekutimin e standardit.
-
num_threads
:int
(default=1)
Numri i temave që do të përdoren për ekzekutimin e interpretuesit TFLite. -
use_gpu
:bool
(default=false)
Përdorni delegatin e GPU-së . -
use_xnnpack
:bool
(default=false
)
Përdorni delegatin XNNPACK .
Në varësi të pajisjes që po përdorni, disa nga këto opsione mund të mos jenë të disponueshme ose të mos kenë efekt. Referojuni parametrave për më shumë parametra të performancës që mund të ekzekutoni me aplikacionin e standardeve.
Shikoni rezultatet duke përdorur komandën logcat
:
adb logcat | grep "Inference timings"
Rezultatet e standardeve raportohen si:
... tflite : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2
Binar standard standard
Mjeti i referencës ofrohet gjithashtu si një benchmark_model
binar standard. Ju mund ta ekzekutoni këtë mjet nga një linjë komande shell në Linux, Mac, pajisjet e integruara dhe pajisjet Android.
Shkarkoni ose ndërtoni binarin
Shkarkoni binarët e linjës së komandës të ndërtuar paraprakisht çdo natë duke ndjekur lidhjet më poshtë:
Sa i përket binarëve të para-ndërtuar çdo natë që mbështesin funksionet TF përmes delegatit Flex , përdorni lidhjet më poshtë:
Ju gjithashtu mund të ndërtoni binarin bazë të standardit nga burimi në kompjuterin tuaj.
bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model
Për të ndërtuar me zinxhirin e veglave Android NDK, së pari duhet të konfiguroni mjedisin e ndërtimit duke ndjekur këtë udhëzues ose përdorni imazhin e dokerit siç përshkruhet në këtë udhëzues .
bazel build -c opt --config=android_arm64 \
//tensorflow/lite/tools/benchmark:benchmark_model
Ekzekutimi i standardit
Për të ekzekutuar standardet në kompjuterin tuaj, ekzekutoni binarin nga guaska.
path/to/downloaded_or_built/benchmark_model \
--graph=your_model.tflite \
--num_threads=4
Ju mund të përdorni të njëjtin grup parametrash siç u përmend më lart me binarin vendas të linjës së komandës.
Opsionet e modelit të profilizimit
Modeli binar i standardeve ju lejon gjithashtu të profilizoni funksionet e modelit dhe të merrni kohën e ekzekutimit të secilit operator. Për ta bërë këtë, kaloni flamurin --enable_op_profiling=true
në benchmark_model
gjatë thirrjes. Detajet janë shpjeguar këtu .
Binar standard standard për opsione të shumta të performancës në një ekzekutim të vetëm
Një binar i përshtatshëm dhe i thjeshtë C++ ofrohet gjithashtu për të krahasuar opsionet e shumta të performancës në një ekzekutim të vetëm. Ky binar është ndërtuar bazuar në mjetin e lartpërmendur të standardit që mund të krahasojë vetëm një opsion të vetëm të performancës në të njëjtën kohë. Ata ndajnë të njëjtin proces ndërtimi/instalimi/ ekzekutimi, por emri i synuar BUILD i këtij binar është benchmark_model_performance_options
dhe kërkon disa parametra shtesë. Një parametër i rëndësishëm për këtë binar është:
perf_options_list
: string
(e parazgjedhur='të gjitha')
Një listë e ndarë me presje e opsioneve të performancës TFLite për të vlerësuar.
Ju mund të merrni binare të para-ndërtuara çdo natë për këtë mjet siç renditet më poshtë:
Aplikacioni standard i iOS
Për të ekzekutuar standardet në pajisjen iOS, duhet të ndërtoni aplikacionin nga burimi . Vendosni skedarin e modelit LiteRT në drejtorinë benchmark_data të pemës burimore dhe modifikoni skedarin benchmark_params.json
. Ata skedarë paketohen në aplikacion dhe aplikacioni lexon të dhënat nga drejtoria. Vizitoni aplikacionin standard iOS për udhëzime të hollësishme.
Standardet e performancës për modelet e njohura
Ky seksion liston standardet e performancës LiteRT kur ekzekutohen modele të njohura në disa pajisje Android dhe iOS.
Standardet e performancës së Android
Këta numra të standardeve të performancës u krijuan me binarin bazë të standardit .
Për standardet e Android, afiniteti i CPU-së është caktuar të përdorë bërthama të mëdha në pajisje për të reduktuar variancën (shih detajet ).
Supozon se modelet janë shkarkuar dhe zbërthyer në drejtorinë /data/local/tmp/tflite_models
. Binar i standardit është ndërtuar duke përdorur këto udhëzime dhe supozohet të jetë në drejtorinë /data/local/tmp
.
Për të ekzekutuar standardin:
adb shell /data/local/tmp/benchmark_model \
--num_threads=4 \
--graph=/data/local/tmp/tflite_models/${GRAPH} \
--warmup_runs=1 \
--num_runs=50
Për të ekzekutuar me delegat GPU, vendosni --use_gpu=true
.
Vlerat e performancës më poshtë maten në Android 10.
Emri i modelit | Pajisja | CPU, 4 fije | GPU |
---|---|---|---|
Mobilenet_1.0_224 (lundrues) | Pixel 3 | 23,9 ms | 6,45 ms |
Pixel 4 | 14,0 ms | 9,0 ms | |
Mobilenet_1.0_224 (sasi) | Pixel 3 | 13.4 ms | --- |
Pixel 4 | 5.0 ms | --- | |
celular NASNet | Pixel 3 | 56 ms | --- |
Pixel 4 | 34.5 ms | --- | |
SqueezeNet | Pixel 3 | 35.8 ms | 9,5 ms |
Pixel 4 | 23,9 ms | 11.1 ms | |
Inception_ResNet_V2 | Pixel 3 | 422 ms | 99.8 ms |
Pixel 4 | 272.6 ms | 87.2 ms | |
Inception_V4 | Pixel 3 | 486 ms | 93 ms |
Pixel 4 | 324.1 ms | 97,6 ms |
Standardet e performancës iOS
Këta numra të standardeve të performancës u krijuan me aplikacionin e standardeve iOS .
Për të ekzekutuar standardet e iOS, aplikacioni i standardeve u modifikua për të përfshirë modelin e duhur dhe benchmark_params.json
u modifikua për të vendosur num_threads
në 2. Për të përdorur delegatin e GPU, "use_gpu" : "1"
dhe "gpu_wait_type" : "aggressive"
benchmark_params.json
u shtuan gjithashtu për të benj.
Emri i modelit | Pajisja | CPU, 2 fije | GPU |
---|---|---|---|
Mobilenet_1.0_224 (lundrues) | iPhone XS | 14.8 ms | 3.4 ms |
Mobilenet_1.0_224 (sasi) | iPhone XS | 11 ms | --- |
celular NASNet | iPhone XS | 30.4 ms | --- |
SqueezeNet | iPhone XS | 21.1 ms | 15,5 ms |
Inception_ResNet_V2 | iPhone XS | 261.1 ms | 45.7 ms |
Inception_V4 | iPhone XS | 309 ms | 54.4 ms |
Gjurmoni pjesët e brendshme të LiteRT
Gjurmoni pjesët e brendshme të LiteRT në Android
Ngjarjet e brendshme nga përkthyesi LiteRT i një aplikacioni Android mund të kapen nga mjetet e gjurmimit të Android . Ato janë të njëjtat ngjarje me Android Trace API, kështu që ngjarjet e kapura nga kodi Java/Kotlin shihen së bashku me ngjarjet e brendshme LiteRT.
Disa shembuj të ngjarjeve janë:
- Thirrja e operatorit
- Modifikimi i grafikut nga delegati
- Alokimi i tensorit
Ndër opsionet e ndryshme për kapjen e gjurmëve, ky udhëzues mbulon profilin e CPU-së së Android Studio dhe aplikacionin "Sistemi Gjurmimi". Referojuni veglës së linjës së komandës Perfetto ose mjetit të linjës së komandës Systrace për opsione të tjera.
Shtimi i gjurmëve të ngjarjeve në kodin Java
Ky është një copë kodi nga aplikacioni shembull i Klasifikimit të Imazheve . Interpretuesi LiteRT ekzekutohet në seksionin recognizeImage/runInference
. Ky hap është opsional, por është i dobishëm për të ndihmuar në njoftimin se ku bëhet thirrja e konkluzionit.
Trace.beginSection("recognizeImage");
...
// Runs the inference call.
Trace.beginSection("runInference");
tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
Trace.endSection();
...
Trace.endSection();
Aktivizo gjurmimin e LiteRT
Për të aktivizuar gjurmimin LiteRT, caktoni veçorinë e sistemit Android debug.tflite.trace
në 1 përpara se të nisni aplikacionin Android.
adb shell setprop debug.tflite.trace 1
Nëse kjo veti është caktuar kur inicializohet përkthyesi LiteRT, ngjarjet kryesore (p.sh. thirrja e operatorit) nga përkthyesi do të gjurmohen.
Pasi të keni kapur të gjitha gjurmët, çaktivizoni gjurmimin duke vendosur vlerën e vetive në 0.
adb shell setprop debug.tflite.trace 0
Profili i CPU-së në Android Studio
Regjistroni gjurmët me profilin e CPU-së në Android Studio duke ndjekur hapat e mëposhtëm:
Zgjidhni Run > Profile 'app' nga menutë e sipërme.
Klikoni kudo në afatin kohor të CPU-së kur të shfaqet dritarja Profiler.
Zgjidhni "Gjurmimi i thirrjeve të sistemit" midis mënyrave të Profilizimit të CPU.
Shtypni butonin 'Regjistro'.
Shtypni butonin 'Stop'.
Hetoni rezultatin e gjurmës.
Në këtë shembull, ju mund të shihni hierarkinë e ngjarjeve në një thread dhe statistikat për çdo kohë operatori dhe gjithashtu të shihni rrjedhën e të dhënave të të gjithë aplikacionit midis temave.
Aplikacioni i gjurmimit të sistemit
Regjistroni gjurmët pa Android Studio duke ndjekur hapat e detajuar në aplikacionin "Sistemi Gjurmimi" .
Në këtë shembull, të njëjtat ngjarje TFLite u kapën dhe u ruajtën në formatin Perfetto ose Systrace në varësi të versionit të pajisjes Android. Skedarët e gjurmëve të kapur mund të hapen në Perfetto UI .
Gjurmoni pjesët e brendshme të LiteRT në iOS
Ngjarjet e brendshme nga përkthyesi LiteRT i një aplikacioni iOS mund të regjistrohen nga mjeti Instruments i përfshirë me Xcode. Ato janë ngjarjet e sinjalistikës iOS, kështu që ngjarjet e kapura nga kodi Swift/Objective-C shihen së bashku me ngjarjet e brendshme të LiteRT.
Disa shembuj të ngjarjeve janë:
- Thirrja e operatorit
- Modifikimi i grafikut nga delegati
- Alokimi i tensorit
Aktivizo gjurmimin e LiteRT
Vendosni variablin e mjedisit debug.tflite.trace
duke ndjekur hapat e mëposhtëm:
Zgjidhni Produkt > Skema > Ndrysho skemën... nga menytë e sipërme të Xcode.
Klikoni "Profili" në panelin e majtë.
Zgjedhni kutinë e zgjedhjes "Përdorni argumentet dhe variablat e mjedisit të veprimit Run".
Shto
debug.tflite.trace
nën seksionin "Variablet e mjedisit".
Nëse dëshironi të përjashtoni ngjarjet LiteRT kur profilizoni aplikacionin iOS, çaktivizoni gjurmimin duke hequr variablin e mjedisit.
Instrumentet XCode
Kapni gjurmët duke ndjekur hapat e mëposhtëm:
Zgjidhni Produkt > Profili nga menytë kryesore të Xcode.
Kliko Regjistrimi midis shablloneve të profilizimit kur lansohet mjeti Instruments.
Shtypni butonin 'Start'.
Shtypni butonin 'Stop'.
Kliko 'os_signpost' për të zgjeruar artikujt e nënsistemit të Regjistrimit të OS.
Klikoni 'org.tensorflow.lite' nënsistemin e Regjistrimit të OS.
Hetoni rezultatin e gjurmës.
Në këtë shembull, ju mund të shihni hierarkinë e ngjarjeve dhe statistikave për çdo kohë operatori.
Duke përdorur të dhënat e gjurmimit
Të dhënat e gjurmimit ju lejojnë të identifikoni pengesat e performancës.
Këtu janë disa shembuj të njohurive që mund të merrni nga profilisti dhe zgjidhjet e mundshme për të përmirësuar performancën:
- Nëse numri i bërthamave të disponueshme të CPU-së është më i vogël se numri i thread-ve të konkluzionit, atëherë shpenzimet e përgjithshme të planifikimit të CPU-së mund të çojnë në performancë nën nivel. Mund të riplanifikoni detyra të tjera intensive të CPU-së në aplikacionin tuaj për të shmangur mbivendosjen me konkluzionet e modelit tuaj ose për të rregulluar numrin e temave të përkthyesit.
- Nëse operatorët nuk delegohen plotësisht, atëherë disa pjesë të grafikut të modelit ekzekutohen në CPU dhe jo në përshpejtuesin e pritshëm të harduerit. Ju mund të zëvendësoni operatorët e pambështetur me operatorë të ngjashëm të mbështetur.