Pomiar skuteczności

Narzędzia do analizy porównawczej

Narzędzia porównawcze TensorFlow Lite mierzą obecnie i obliczają statystyki dotyczące tych ważnych wskaźników wydajności:

  • Czas inicjowania
  • Czas wnioskowania stanu rozgrzewki
  • Czas wnioskowania w stanie stabilnym
  • Wykorzystanie pamięci podczas inicjowania
  • Ogólne wykorzystanie pamięci

Narzędzia do analizy porównawczej są dostępne jako aplikacje porównawcze na Androida i iOS oraz jako natywne pliki binarne wiersza poleceń. Wszystkie opierają się na tej samej podstawowej logice pomiaru wydajności. Pamiętaj, że dostępne opcje i formaty wyjściowe różnią się nieco ze względu na różnice w środowisku wykonawczym.

Aplikacja testowa Androida

Z testu porównawczego możesz korzystać w przypadku Androida na 2 sposoby. Pierwszy to natywny plik binarny, a drugi to aplikacja do testów porównawczych na Androida, która pozwala lepiej ocenić skuteczność modelu w aplikacji. W obu przypadkach liczby uzyskane w narzędziu do analizy porównawczej będą się nieco różnić od tych uzyskanych podczas wnioskowania z modelem w aplikacji.

Ta aplikacja do analizy porównawczej Androida nie ma interfejsu. Zainstaluj i uruchom go za pomocą polecenia adb oraz pobierz wyniki za pomocą polecenia adb logcat.

Pobierz lub utwórz aplikację

Pobierz gotowe aplikacje do analizy porównawczej Androida, korzystając z tych linków:

Jeśli chodzi o aplikacje porównawcze na Androida, które obsługują operacje TF za pomocą przekazywania dostępu Flex, skorzystaj z tych linków:

Możesz też utworzyć aplikację na podstawie tych instructions.

Przygotuj analizę porównawczą

Zanim uruchomisz aplikację do analizy porównawczej, zainstaluj ją i wypchnij plik modelu na urządzenie w ten sposób:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

Wykonaj test porównawczy

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph jest parametrem wymaganym.

  • graph: string
    Ścieżka do pliku modelu TFLite.

Możesz podać więcej parametrów opcjonalnych na potrzeby testu porównawczego.

  • num_threads: int (wartość domyślna=1)
    Liczba wątków używanych do uruchomienia tłumaczenia TFLite.
  • use_gpu: bool (wartość domyślna=fałsz)
    Użyj delegata GPU.
  • use_xnnpack: bool (wartość domyślna=false)
    Użyj delegata XNNPACK.

W zależności od używanego urządzenia niektóre z tych opcji mogą być niedostępne lub nie działać. Więcej parametrów wydajności, które możesz uruchomić w aplikacji do analizy porównawczej, znajdziesz w sekcji Parametry.

Wyświetl wyniki za pomocą polecenia logcat:

adb logcat | grep "Inference timings"

Wyniki testu porównawczego są widoczne w raportach:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

Plik binarny reklamy natywnej

Narzędzie do analizy porównawczej jest też dostępne w postaci natywnego pliku binarnego benchmark_model. To narzędzie można uruchomić z poziomu wiersza poleceń powłoki na urządzeniach z systemem Linux i macOS, a także na urządzeniach wbudowanych i na urządzeniach z Androidem.

Pobierz lub utwórz plik binarny

Pobierz gotowe, natywne pliki binarne wiersza poleceń, klikając te linki:

Jeśli chodzi o gotowe pliki binarne, które obsługują operacje TF za pomocą delegata Flex, skorzystaj z tych linków:

Możesz też utworzyć natywny plik binarny testu porównawczego na podstawie danych ze źródła na komputerze.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Aby utworzyć kompilację z użyciem łańcucha narzędzi Android NDK, musisz najpierw skonfigurować środowisko kompilacji, postępując zgodnie z tym przewodnikiem, lub użyć obrazu Dockera zgodnie z opisem w tym przewodniku.

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

Wykonaj test porównawczy

Aby przeprowadzić testy na komputerze, uruchom plik binarny z powłoki.

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

Możesz używać tego samego zbioru parametrów co powyżej z natywnym plikiem binarnym wiersza poleceń.

Profilowanie operacji modelu

Plik binarny modelu porównawczego umożliwia też profilowanie operacji modelu i uzyskiwanie czasu wykonywania każdego operatora. Aby to zrobić, podczas wywoływania przekaż flagę --enable_op_profiling=true do benchmark_model. Szczegóły znajdziesz tutaj.

Natywny plik binarny testu porównawczego dla wielu opcji wydajności jednocześnie

Udostępniamy też wygodny i prosty plik binarny C++, który umożliwia porównanie wielu opcji wydajności naraz. Ten plik binarny opiera się na wspomnianym wcześniej narzędziu porównawczym, które może porównywać tylko jedną opcję skuteczności w danym momencie. Korzystają one z tego samego procesu kompilacji, instalacji i uruchamiania, ale nazwa docelowa BUILD tego pliku binarnego to benchmark_model_performance_options i wymaga dodatkowych parametrów. Ważny parametr tego pliku binarnego:

perf_options_list: string (default='all')
Rozdzielona przecinkami lista opcji wydajności TFLite do porównania.

Co noc możesz pobrać gotowe pliki binarne dla tego narzędzia:

Aplikacja porównawcza na iOS

Aby przeprowadzić testy porównawcze na urządzeniu z iOS, musisz utworzyć aplikację ze źródła. Umieść plik modelu TensorFlow Lite w katalogu benchmark_data w drzewie źródłowym i zmodyfikuj plik benchmark_params.json. Takie pliki są umieszczane w aplikacji, a aplikacja odczytuje dane z katalogu. Szczegółowe instrukcje znajdziesz w aplikacji porównawczej na iOS.

Testy porównawcze skuteczności dobrze znanych modeli

W tej sekcji znajdziesz testy porównawcze wydajności TensorFlow Lite w przypadku korzystania z znanych modeli na niektórych urządzeniach z Androidem i iOS.

Testy wydajności na Androidzie

Te wartości testów porównawczych skuteczności zostały wygenerowane za pomocą natywnego pliku binarnego analizy porównawczej.

W przypadku testów porównawczych Androida koligacja procesora jest ustawiona tak, aby używać dużych rdzeni na urządzeniu, aby zmniejszyć wariancję (zobacz szczegóły).

Przyjmuje się, że modele zostały pobrane i rozpakowane do katalogu /data/local/tmp/tflite_models. Plik binarny do testu porównawczego jest tworzony z wykorzystaniem tych instrukcji i zakładamy, że znajduje się w katalogu /data/local/tmp.

Aby przeprowadzić analizę porównawczą:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

Aby uruchomić z przekazywaniem GPU, ustaw --use_gpu=true.

Poniższe wartości wydajności są mierzone na Androidzie 10.

Nazwa modelu Urządzenie Procesor, 4 wątki GPU
Mobilenet_1.0_224(float) Pixel 3 23,9 ms 6,45 ms
Pixel 4 14,0 ms 9,0 ms
Mobilenet_1.0_224 (kwota) Pixel 3 13,4 ms ---
Pixel 4 5,0 ms ---
NASNet dla telefonów komórkowych 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

Testy porównawcze skuteczności iOS

Te wartości testów porównawczych skuteczności zostały wygenerowane w aplikacji porównawczej na iOS.

Aby można było przeprowadzić testy porównawcze na iOS, aplikacja do testów porównawczych została zmodyfikowana, aby zawierała odpowiedni model, a w elemencie benchmark_params.json zmieniono wartość num_threads na 2. Aby można było korzystać z delegata GPU, do interfejsu benchmark_params.json dodaliśmy też opcje "use_gpu" : "1" i "gpu_wait_type" : "aggressive".

Nazwa modelu Urządzenie Procesor, 2 wątki GPU
Mobilenet_1.0_224(float) iPhone XS 14,8 ms 3,4 ms
Mobilenet_1.0_224 (kwota) iPhone XS 11 ms ---
NASNet dla telefonów komórkowych 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

Śledzenie wewnętrznych elementów TensorFlow Lite

Śledzenie wewnętrznych zasobów TensorFlow Lite na Androidzie

Zdarzenia wewnętrzne z interpretera TensorFlow Lite aplikacji na Androida mogą być przechwytywane przez narzędzia do śledzenia na Androidzie. Są to te same zdarzenia z interfejsem API Trace Androida, więc przechwycone zdarzenia z kodu Java/Kotlin są widoczne razem z wewnętrznymi zdarzeniami TensorFlow Lite.

Oto kilka przykładów zdarzeń:

  • Wywoływanie operatora
  • Modyfikacja wykresu przez przedstawiciela
  • Alokacja Tensor

Wśród różnych opcji rejestrowania śladów w tym przewodniku opisujemy program profilujący CPU w Android Studio i aplikację Śledzenie systemu. Informacje o innych opcjach znajdziesz w artykułach o narzędziu wiersza poleceń Perfetto lub narzędziu wiersza poleceń Systrace.

Dodawanie zdarzeń śledzenia w kodzie Java

To jest fragment kodu z przykładowej aplikacji do klasyfikacji obrazów. Tłumacz TensorFlow Lite działa w sekcji recognizeImage/runInference. Ten krok jest opcjonalny, ale warto go ułatwić zauważenie, gdzie wykonywane jest wywołanie wnioskowania.

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

Włącz śledzenie TensorFlow Lite

Aby włączyć śledzenie TensorFlow Lite, ustaw właściwość systemową Androida debug.tflite.trace na 1 przed uruchomieniem aplikacji na Androida.

adb shell setprop debug.tflite.trace 1

Jeśli ta właściwość została skonfigurowana podczas inicjowania interpretera TensorFlow Lite, śledzone będą kluczowe zdarzenia (np. wywołanie operatora) z interpretera.

Po zarejestrowaniu wszystkich logów czasu wyłącz śledzenie, ustawiając wartość właściwości na 0.

adb shell setprop debug.tflite.trace 0

Program profilujący CPU w Android Studio

Przechwytuj logi czasu za pomocą programu profilującego CPU w Android Studio, wykonując te czynności:

  1. W menu u góry wybierz Uruchom > Profil „aplikacja”.

  2. Gdy pojawi się okno programu profilującego, kliknij dowolne miejsce na osi czasu procesora.

  3. Wybierz „Śledź wywołania systemu” wśród trybów profilowania procesora.

    Wybierz „Śledź połączenia systemowe”.

  4. Naciśnij przycisk „Nagraj”.

  5. Naciśnij przycisk „Zatrzymaj”.

  6. Zbadaj wynik logu czasu.

    Śledzenie Android Studio

W tym przykładzie pokazujemy hierarchię zdarzeń w wątku i statystyki dla każdego operatora, a także przepływ danych między wątkami w całej aplikacji.

Aplikacja do śledzenia systemu

Przechwytuj logi czasu bez Android Studio, wykonując czynności opisane w sekcji Aplikacja do śledzenia systemu.

W tym przykładzie te same zdarzenia TFLite zostały zarejestrowane i zapisane w formacie Perfetto lub Systrace zależnie od wersji urządzenia z Androidem. Przechwycone pliki śledzenia można otworzyć w interfejsie Perfetto.

ślad Perfetto

Śledzenie zasobów wewnętrznych TensorFlow Lite w iOS

Zdarzenia wewnętrzne z interpretera TensorFlow Lite aplikacji na iOS można przechwytywać za pomocą narzędzia Instruments dołączonego do Xcode. Są to zdarzenia signpost w iOS, więc przechwycone zdarzenia z kodu Swift/Objective-C są wyświetlane razem z wewnętrznymi zdarzeniami TensorFlow Lite.

Oto kilka przykładów zdarzeń:

  • Wywoływanie operatora
  • Modyfikacja wykresu przez przedstawiciela
  • Alokacja Tensor

Włącz śledzenie TensorFlow Lite

Ustaw zmienną środowiskową debug.tflite.trace, wykonując te czynności:

  1. Z górnego menu Xcode wybierz Produkt > Schemat > Edytuj schemat...

  2. W okienku po lewej stronie kliknij „Profil”.

  3. Odznacz pole wyboru „Użyj argumentów i zmiennych środowiskowych działania uruchamiania”.

  4. W sekcji „Zmienne środowiskowe” dodaj debug.tflite.trace.

    Ustawianie zmiennej środowiskowej

Jeśli podczas profilowania aplikacji na iOS chcesz wykluczyć zdarzenia TensorFlow Lite, wyłącz śledzenie, usuwając zmienną środowiskową.

Instrumenty XCode

Przechwyć ślady, wykonując te czynności:

  1. Z górnego menu Xcode wybierz Product > Profile (Produkt > Profil).

  2. Po uruchomieniu narzędzia Instruments kliknij Logging (Logowanie) obok szablonów profilowania.

  3. Naciśnij przycisk „Start”.

  4. Naciśnij przycisk „Zatrzymaj”.

  5. Kliknij „os_signpost”, aby rozwinąć elementy podsystemu logowania systemu operacyjnego.

  6. Kliknij podsystem OS Logging „org.tensorflow.lite”.

  7. Zbadaj wynik logu czasu.

    Śledzenie Xcode Instruments

W tym przykładzie pokazujemy hierarchię zdarzeń i statystyk dla każdego czasu operatora.

Wykorzystanie danych śledzenia

Dane śledzenia umożliwiają wykrywanie wąskich gardeł wydajności.

Oto kilka przykładów statystyk dostępnych w narzędziu do profilowania oraz potencjalnych rozwiązań pozwalających na zwiększenie skuteczności:

  • Jeśli liczba dostępnych rdzeni procesora jest mniejsza niż liczba wątków wnioskowania, obciążenia związane z planowaniem procesora mogą obniżyć wydajność. Możesz przełożyć inne zadania w aplikacji obciążające procesor, aby uniknąć nakładania się na wnioskowanie modelu, lub zwiększyć liczbę wątków tłumaczenia rozmowy.
  • Jeśli operatory nie są w pełni delegowane, niektóre części grafu modelu są wykonywane na procesorze, a nie na oczekiwanym akceleratorze sprzętowym. Nieobsługiwane operatory możesz zastąpić podobnymi obsługiwanymi operatorami.