Matja e performancës, Matja e performancës

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=truebenchmark_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:

  1. Zgjidhni Run > Profile 'app' nga menutë e sipërme.

  2. Klikoni kudo në afatin kohor të CPU-së kur të shfaqet dritarja Profiler.

  3. Zgjidhni "Gjurmimi i thirrjeve të sistemit" midis mënyrave të Profilizimit të CPU.

    Zgjidhni "Gjurmoni thirrjet e sistemit"

  4. Shtypni butonin 'Regjistro'.

  5. Shtypni butonin 'Stop'.

  6. Hetoni rezultatin e gjurmës.

    Gjurmë Android Studio

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 .

Gjurmë perfetto

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:

  1. Zgjidhni Produkt > Skema > Ndrysho skemën... nga menytë e sipërme të Xcode.

  2. Klikoni "Profili" në panelin e majtë.

  3. Zgjedhni kutinë e zgjedhjes "Përdorni argumentet dhe variablat e mjedisit të veprimit Run".

  4. Shto debug.tflite.trace nën seksionin "Variablet e mjedisit".

    Vendos ndryshoren 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:

  1. Zgjidhni Produkt > Profili nga menytë kryesore të Xcode.

  2. Kliko Regjistrimi midis shablloneve të profilizimit kur lansohet mjeti Instruments.

  3. Shtypni butonin 'Start'.

  4. Shtypni butonin 'Stop'.

  5. Kliko 'os_signpost' për të zgjeruar artikujt e nënsistemit të Regjistrimit të OS.

  6. Klikoni 'org.tensorflow.lite' nënsistemin e Regjistrimit të OS.

  7. Hetoni rezultatin e gjurmës.

    Gjurmimi i Instrumenteve Xcode

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.