Sprawdzone metody 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 wykorzystania zasobów. Przygotowaliśmy listę sprawdzonych metod i strategii, które możesz wykorzystać, aby zwiększyć skuteczność modelu TensorFlow Lite.

Wybierz najlepszy model do danego zadania

W zależności od zadania musisz znaleźć kompromis między złożonością a rozmiarem modelu. Jeśli zadanie wymaga dużej dokładności, może być potrzebny duży i złożony model. W przypadku zadań, które wymagają mniejszej precyzji, lepiej jest używać mniejszego modelu, ponieważ nie tylko zajmuje on mniej miejsca na dysku i pamięci, ale jest też zwykle szybszy i bardziej energooszczędny. Na przykład wykresy poniżej pokazują kompromisy między dokładnością a opóźnieniem w przypadku niektórych popularnych modeli klasyfikacji obrazów.

Wykres rozmiaru modelu w porównaniu z dokładnością

Wykres dokładności w porównaniu z opóźnieniem

Przykładem modeli zoptymalizowanych pod kątem urządzeń mobilnych są MobileNets, które są zoptymalizowane pod kątem aplikacji do rozpoznawania obrazów na urządzeniach mobilnych. Na stronie Kaggle Models znajdziesz kilka innych modeli zoptymalizowanych specjalnie pod kątem urządzeń mobilnych i wbudowanych.

Możesz ponownie wytrenować wymienione modele na własnym zbiorze danych, korzystając z uczenia transferowego.

Profilowanie modelu

Po wybraniu odpowiedniego modelu warto go profilować i testować. Narzędzie LiteRT do testów porównawczych ma wbudowany profiler, który wyświetla statystyki profilowania poszczególnych operatorów. Może to pomóc w zrozumieniu wąskich gardeł wydajności i określeniu, które operatory dominują w czasie obliczeń.

Możesz też użyć śledzenia LiteRT, aby profilować model w aplikacji na Androida za pomocą standardowego śledzenia systemu Android, a także wizualizować wywołania operatorów w czasie za pomocą narzędzi do profilowania opartych na GUI.

Profilowanie i optymalizowanie operatorów na wykresie

Jeśli w modelu często występuje określony operator i na podstawie profilowania stwierdzisz, że zużywa on najwięcej czasu, możesz spróbować go zoptymalizować. Ten scenariusz powinien być rzadki, ponieważ TensorFlow Lite ma zoptymalizowane wersje większości operatorów. Możesz jednak napisać szybszą wersję niestandardowego działania, jeśli znasz ograniczenia, w których jest ono wykonywane. Zapoznaj się z przewodnikiem po operatorach niestandardowych.

Zoptymalizuj model

Optymalizacja modelu ma na celu tworzenie mniejszych modeli, które są zwykle szybsze i bardziej energooszczędne, dzięki czemu można je wdrażać na urządzeniach mobilnych. LiteRT obsługuje wiele technik optymalizacji, takich jak kwantyzacja.

Szczegółowe informacje znajdziesz w dokumentacji optymalizacji modelu.

Dostosowywanie liczby wątków

LiteRT obsługuje wielowątkowe jądra w przypadku 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 model będzie zużywał więcej zasobów i energii.

W przypadku niektórych zastosowań opóźnienie może być ważniejsze niż efektywność energetyczna. Możesz zwiększyć liczbę wątków, ustawiając liczbę wątków interpretera. Wielowątkowe wykonywanie wiąże się jednak ze zwiększoną zmiennością wydajności w zależności od tego, co jeszcze jest wykonywane równolegle. Dotyczy to szczególnie aplikacji mobilnych. Na przykład testy w izolacji mogą wykazać 2-krotne przyspieszenie w porównaniu z wątkiem pojedynczym, ale jeśli w tym samym czasie działa inna aplikacja, może to spowodować gorszą wydajność niż w przypadku wątku pojedynczego.

Usuwanie zbędnych kopii

Jeśli aplikacja nie jest starannie zaprojektowana, podczas przekazywania danych wejściowych do modelu i odczytywania danych wyjściowych z modelu mogą pojawić się zbędne kopie. Usuń zduplikowane kopie. Jeśli używasz interfejsów API wyższego poziomu, np. Javy, dokładnie zapoznaj się z dokumentacją, aby poznać ograniczenia wydajności. Na przykład interfejs Java API działa znacznie szybciej, jeśli jako dane wejściowe są używane ByteBuffers.

Profilowanie aplikacji za pomocą narzędzi specyficznych dla platformy

Narzędzia specyficzne dla platformy, takie jak profiler AndroidaInstruments, dostarczają wiele informacji o profilowaniu, które można wykorzystać do debugowania aplikacji. Czasami błąd wydajności może nie występować w modelu, ale w częściach kodu aplikacji, które wchodzą z nim w interakcję. Zapoznaj się z narzędziami do profilowania i sprawdzonymi metodami dotyczącymi Twojej platformy.

Sprawdź, czy Twój model korzysta z akceleratorów sprzętowych dostępnych na urządzeniu.

LiteRT ma nowe sposoby przyspieszania działania modeli za pomocą szybszego sprzętu, takiego jak procesory graficzne, procesory DSP i akceleratory sieci neuronowych. Zazwyczaj akceleratory te są udostępniane za pomocą podmodułów delegate, które przejmują części wykonywania interpretera. LiteRT może korzystać z przekazywania dostępu w ten sposób:

  • Delegat GPU jest dostępny na Androidzie i iOS, korzystając odpowiednio z OpenGL/OpenCL i Metal. Aby je wypróbować, zapoznaj się z informacjami o delegacie GPU.
  • Jeśli masz dostęp do niestandardowego sprzętu, możesz utworzyć własnego delegata. Więcej informacji znajdziesz w sekcji Delegaci LiteRT.

Pamiętaj, że niektóre akceleratory lepiej sprawdzają się w przypadku różnych typów modeli. Niektóre delegaty obsługują tylko modele zmiennoprzecinkowe lub modele zoptymalizowane w określony sposób. Ważne jest, aby sprawdzić każdego delegata i ocenić, czy jest on odpowiedni dla Twojej aplikacji. Jeśli na przykład masz bardzo mały model, delegowanie go do procesora GPU może być nieopłacalne. Akceleratory są z kolei doskonałym wyborem w przypadku dużych modeli o wysokiej intensywności obliczeniowej.