Dziękujemy za zapoznanie się z Google I/O. Zobacz wszystkie sesje na żądanie Oglądaj na żądanie

Najlepsze praktyki dotyczące wydajności, najlepsze praktyki dotyczące wydajności

Urządzenia mobilne i wbudowane mają ograniczone zasoby obliczeniowe, dlatego ważne jest, aby aplikacja była wydajna pod względem zasobów. Przygotowaliśmy listę najlepszych praktyk i strategii, których możesz użyć, aby poprawić wydajność swojego modelu TensorFlow Lite.

Wybierz najlepszy model do zadania

W zależności od zadania będziesz musiał dokonać kompromisu między złożonością modelu a rozmiarem. Jeśli Twoje zadanie wymaga dużej dokładności, możesz potrzebować dużego i złożonego modelu. Do zadań wymagających mniejszej precyzji lepiej jest użyć mniejszego modelu, ponieważ nie tylko zajmują mniej miejsca na dysku i mniej pamięci, ale są też generalnie szybsze i bardziej energooszczędne. Na przykład poniższe wykresy przedstawiają kompromisy dotyczące dokładności i opóźnienia dla niektórych popularnych modeli klasyfikacji obrazów.

Graph of model size vs accuracy

Graph of accuracy vs latency

Jednym z przykładów modeli zoptymalizowanych pod kątem urządzeń mobilnych są MobileNets , które są zoptymalizowane pod kątem mobilnych aplikacji wizyjnych. TensorFlow Hub wymienia kilka innych modeli, które zostały zoptymalizowane specjalnie pod kątem urządzeń mobilnych i wbudowanych.

Wymienione modele można przeszkolić we własnym zbiorze danych, korzystając z uczenia transferu. Zapoznaj się z samouczkami dotyczącymi transferu za pomocą TensorFlow Lite Model Maker .

Profiluj swój model

Po wybraniu odpowiedniego dla danego zadania modelu kandydata, dobrą praktyką jest profilowanie i porównywanie modelu. Narzędzie do benchmarkingu TensorFlow Lite ma wbudowany profiler, który pokazuje statystyki profilowania na operatora. Może to pomóc w zrozumieniu wąskich gardeł wydajności i tego, którzy operatorzy dominują w czasie obliczeń.

Możesz również użyć śledzenia TensorFlow Lite , aby profilować model w aplikacji na Androida, używając standardowego śledzenia systemu Android, i wizualizować wywołania operatora według czasu za pomocą narzędzi profilowania opartych na GUI.

Profiluj i optymalizuj operatorów na wykresie

Jeśli określony operator często pojawia się w modelu i na podstawie profilowania okaże się, że zajmuje on najwięcej czasu, możesz przyjrzeć się optymalizacji tego operatora. Ten scenariusz powinien być rzadki, ponieważ TensorFlow Lite ma zoptymalizowane wersje dla większości operatorów. Jednak możesz być w stanie napisać szybszą wersję niestandardowej operacji, jeśli znasz ograniczenia, w których wykonywany jest operator. Zapoznaj się z przewodnikiem operatorów niestandardowych .

Zoptymalizuj swój model

Optymalizacja modeli ma na celu tworzenie mniejszych modeli, które są na ogół szybsze i bardziej energooszczędne, aby można je było wdrażać na urządzeniach mobilnych. TensorFlow Lite obsługuje wiele technik optymalizacji, takich jak kwantyzacja.

Zapoznaj się z dokumentacją dotyczącą optymalizacji modelu , aby uzyskać szczegółowe informacje.

Dostosuj liczbę wątków

TensorFlow Lite obsługuje jądra wielowątkowe dla wielu operatorów. Możesz zwiększyć liczbę wątków i przyspieszyć wykonywanie operatorów. Zwiększenie liczby wątków spowoduje jednak, że Twój model będzie zużywał więcej zasobów i mocy.

W przypadku niektórych aplikacji opóźnienie może być ważniejsze niż wydajność energetyczna. Możesz zwiększyć liczbę wątków, ustawiając liczbę wątków interpretera. Wykonywanie wielowątkowe wiąże się jednak z kosztem zwiększonej zmienności wydajności w zależności od tego, co jeszcze jest wykonywane jednocześnie. Dotyczy to w szczególności aplikacji mobilnych. Na przykład izolowane testy mogą wykazywać 2-krotne przyspieszenie w porównaniu z jednowątkowym, ale jeśli w tym samym czasie działa inna aplikacja, może to skutkować gorszą wydajnością niż jednowątkowa.

Wyeliminuj zbędne kopie

Jeśli Twoja aplikacja nie jest starannie zaprojektowana, mogą pojawić się nadmiarowe kopie podczas wprowadzania danych wejściowych do modelu i odczytywania wyników z modelu. Upewnij się, że wyeliminowałeś zbędne kopie. Jeśli używasz interfejsów API wyższego poziomu, takich jak Java, upewnij się, że dokładnie zapoznałeś się z dokumentacją pod kątem ostrzeżeń dotyczących wydajności. Na przykład interfejs Java API jest znacznie szybszy, jeśli jako dane wejściowe używane są ByteBuffers .

Profiluj swoją aplikację za pomocą narzędzi specyficznych dla platformy

Narzędzia specyficzne dla platformy, takie jak profiler systemu Android i instrumenty , zapewniają bogactwo informacji o profilowaniu, których można użyć do debugowania aplikacji. Czasami błąd wydajności może nie dotyczyć modelu, ale części kodu aplikacji, które wchodzą w interakcję z modelem. Upewnij się, że zapoznałeś się z narzędziami do profilowania specyficznymi dla platformy i najlepszymi praktykami dla Twojej platformy.

Oceń, czy Twój model korzysta z akceleratorów sprzętowych dostępnych w urządzeniu

TensorFlow Lite dodał nowe sposoby przyspieszania modeli za pomocą szybszego sprzętu, takiego jak GPU, DSP i akceleratory neuronowe. Zazwyczaj te akceleratory są udostępniane przez submoduły delegatów , które przejmują części wykonania interpretera. TensorFlow Lite może używać delegatów poprzez:

  • Korzystanie z interfejsu API sieci neuronowych systemu Android . Możesz wykorzystać te backendy akceleratorów sprzętowych, aby poprawić szybkość i wydajność swojego modelu. Aby włączyć interfejs API sieci neuronowych, zapoznaj się z przewodnikiem dotyczącym delegatów NNAPI .
  • Delegat GPU jest dostępny w systemach Android i iOS, używając odpowiednio OpenGL/OpenCL i Metal. Aby je wypróbować, zapoznaj się z samouczkiem i dokumentacją delegata GPU .
  • Delegat Hexagon jest dostępny w systemie Android. Wykorzystuje procesor Qualcomm Hexagon DSP, jeśli jest dostępny na urządzeniu. Zobacz samouczek delegata Hexagon , aby uzyskać więcej informacji.
  • Możliwe jest utworzenie własnego delegata, jeśli masz dostęp do niestandardowego sprzętu. Zobacz delegatów TensorFlow Lite , aby uzyskać więcej informacji.

Należy pamiętać, że niektóre akceleratory działają lepiej z różnymi typami modeli. Niektórzy delegaci obsługują tylko modele zmiennoprzecinkowe lub modele zoptymalizowane w określony sposób. Ważne jest, aby przeprowadzić test porównawczy każdego delegata, aby sprawdzić, czy jest to dobry wybór dla Twojej aplikacji. Na przykład, jeśli masz bardzo mały model, delegowanie modelu do interfejsu API NN lub GPU może nie być opłacalne. I odwrotnie, akceleratory to świetny wybór dla dużych modeli, które mają dużą intensywność arytmetyczną.

Potrzebujesz więcej pomocy

Zespół TensorFlow z przyjemnością pomoże zdiagnozować i rozwiązać konkretne problemy z wydajnością, z którymi możesz się spotkać. Zgłoś problem w serwisie GitHub , podając szczegóły problemu.