Optymalizacja modelu

Urządzenia brzegowe często mają ograniczoną pamięć lub moc obliczeniową. Aby umożliwić działanie modeli w obrębie tych ograniczeń, można stosować do nich różne optymalizacje. Dodatkowo niektóre optymalizacje umożliwiają użycie specjalistycznego sprzętu do przyspieszonego wnioskowania.

TensorFlow Lite i TensorFlow Model Optimization Toolkit udostępniają narzędzia, które zmniejszają złożoność optymalizacji wnioskowania.

Podczas tworzenia aplikacji zalecamy rozważenie optymalizacji modelu. Ten dokument przedstawia sprawdzone metody optymalizacji modeli TensorFlow pod kątem wdrażania na sprzęcie brzegowym.

Dlaczego warto optymalizować modele

Optymalizacja modelu może pomóc w tworzeniu aplikacji na kilka głównych sposobów.

Zmniejszenie rozmiaru

Aby zmniejszyć rozmiar modelu, można użyć niektórych form optymalizacji. Mniejsze modele mają te zalety:

  • Mniejszy rozmiar pamięci masowej: mniejsze modele zajmują mniej miejsca na urządzeniach użytkowników. Na przykład aplikacja na Androida z mniejszym modelem będzie zajmować mniej miejsca na urządzeniu mobilnym użytkownika.
  • Mniejszy rozmiar pobierania: pobieranie mniejszych modeli wymaga mniej czasu i krótszej przepustowości podczas pobierania danych na urządzenia użytkowników.
  • Mniejsze wykorzystanie pamięci: mniejsze modele podczas uruchamiania wykorzystują mniej pamięci RAM, co pozwala zwolnić pamięć na potrzeby innych części aplikacji, a także może poprawić wydajność i stabilność.

Kwantyzacja może zmniejszyć rozmiar modelu we wszystkich tych przypadkach, potencjalnie kosztem dokładności. Przycinanie i grupowanie może zmniejszyć rozmiar modelu do pobrania, ponieważ ułatwia jego kompresję.

Skrócenie czasu oczekiwania

Czas oczekiwania to czas potrzebny na przeprowadzenie pojedynczego wnioskowania na podstawie danego modelu. Niektóre formy optymalizacji mogą zmniejszyć ilość obliczeń wymaganych do przeprowadzenia wnioskowania za pomocą modelu, co skraca czas oczekiwania. Na zużycie energii może też wpływać opóźnienie.

Obecnie kwantyfikacja może pomóc w zmniejszeniu czasu oczekiwania przez uproszczenie obliczeń wykonywanych podczas wnioskowania, co może prowadzić do utraty części dokładności.

Zgodność akceleratora

Niektóre akceleratory sprzętowe, takie jak Edge TPU, mogą bardzo szybko wnioskować, korzystając z modeli, które zostały prawidłowo zoptymalizowane.

Ogólnie rzecz biorąc, urządzenia tego rodzaju wymagają kwantyzacji modeli w określony sposób. Aby dowiedzieć się więcej o wymaganiach danego akceleratora sprzętowego, zapoznaj się z jego dokumentacją.

Kompromis

Optymalizacje mogą potencjalnie spowodować zmiany w dokładności modelu, co należy wziąć pod uwagę podczas tworzenia aplikacji.

Zmiany dokładności zależą od optymalizacji konkretnego modelu i trudno jest przewidzieć z wyprzedzeniem. Zwykle modele zoptymalizowane pod kątem rozmiaru lub czasu opóźnienia tracą małą dokładność. W zależności od aplikacji może to mieć wpływ na wrażenia użytkowników lub nie. W rzadkich przypadkach pewne modele mogą zwiększyć dokładność w wyniku procesu optymalizacji.

Rodzaje optymalizacji

TensorFlow Lite obsługuje obecnie optymalizację przez kwantyzację, przycinanie i klastrowanie.

Należą one do pakietu TensorFlow Model Optimization Toolkit, który udostępnia zasoby do technik optymalizacji modeli zgodnych z TensorFlow Lite.

Kwantyzacja

Kwantyzacja zmniejsza precyzję liczb używanych do reprezentowania parametrów modelu, które domyślnie są 32-bitowymi liczbami zmiennoprzecinkowymi. Powoduje to mniejszy rozmiar modelu i szybsze obliczenia.

W TensorFlow Lite dostępne są te typy kwantyzacji:

Metoda Wymagania dotyczące danych Zmniejszenie rozmiaru Dokładność Obsługiwany sprzęt
Kwantyzacja float16 po zakończeniu trenowania Brak danych Maksymalnie 50% Nieznaczna utrata dokładności Procesor, GPU
Kwantyfikacja zakresu dynamicznego po zakończeniu trenowania Brak danych Do 75% Najmniejsza utrata dokładności Procesor, GPU (Android)
Kwantyfikacja liczb całkowitych po zakończeniu trenowania Próbka reprezentatywna bez etykiety Do 75% Mała utrata dokładności Procesor, GPU (Android), EdgeTPU
Szkolenie uwzględniające kwantyzację Oznaczone dane treningowe Do 75% Najmniejsza utrata dokładności Procesor, GPU (Android), EdgeTPU

Podane niżej drzewo decyzyjne ułatwia wybór schematów kwantyzacji, których możesz używać w swoim modelu na podstawie oczekiwanej wielkości i dokładności modelu.

drzewo-decyzji-kwantyzacji

Poniżej znajdziesz wyniki dotyczące czasu oczekiwania i dokładności w przypadku kilku modeli z kwantyzacją i kwantyzacją wykonywaną po zakończeniu trenowania. Wszystkie wartości opóźnień są mierzone na urządzeniach Pixel 2 korzystających z 1 dużego rdzenia. Wraz z rozwojem tego narzędzia dane będą się zmieniać:

Model Dokładność pierwszej kategorii (oryginalna) Dokładność wg 1 najlepsza (wyniki po treningu) Dokładność pierwszej klasy (trenowanie z uwzględnieniem kwantyzacji) Czas oczekiwania (oryginalny) (ms) Czas oczekiwania (wygenerowane po zakończeniu trenowania) (ms) Czas oczekiwania (trenowanie z uwzględnieniem kwantyzacji) (ms) Rozmiar (oryginalny) (MB) Rozmiar (zoptymalizowany) (MB)
Mobilenet-v1-1-2240,7090,6570,70 1241126416,94.3
Mobilenet-v2-1-2240,7190,6370,709 899854143.6
Inception_v30,780,7720,775 113084554395,723,9
Resnet_v2_1010,7700,768Nie dotyczy 39732868Nie dotyczy178,344,9
Tabela 1. Zalety kwantyzacji modeli w wybranych modelach CNN

Pełna kwantyfikacja liczb całkowitych z aktywacjami int16 i wagami int8

Kwantyzacja z aktywacjami int16 to schemat kwantyzacji pełnej liczby całkowitej z aktywacjami w int16 i wagami w obrębie int8. Ten tryb może zwiększyć dokładność modelu skwantyzowanego w porównaniu ze schematem kwantyzacji pełnej liczby całkowitej, w którym zarówno aktywacje, jak i wagi w int8 zachowują podobny rozmiar modelu. Jest to zalecane, gdy aktywacje są wrażliwe na kwantyzację.

UWAGA: dla tego schematu kwantyzacji w TFLite dostępne są obecnie tylko niezoptymalizowane referencyjne implementacje jądra, dlatego domyślnie wydajność będzie wolna w porównaniu z jądrami int8. Wszystkie zalety tego trybu można obecnie uzyskać za pomocą specjalistycznego sprzętu lub niestandardowego oprogramowania.

Poniżej znajdziesz wyniki dokładności w przypadku niektórych modeli korzystających z tego trybu.

Model Typ wskaźnika dokładności Dokładność (aktywacje float32) Dokładność (aktywacje w int8) Dokładność (aktywacje w int16)
Wav2letterWER6,7%7,7% 7,2%
DeepSpeech 0.5.1 (nieprzewinięty)wskaźnik CER6,13%43,67% 6,52%
YoloV3mAP(IOU=0,5)0,5770,563 0,574
MobileNetV1Dokładność pierwszej klasy0,70620,694 0,6936
MobileNetV2Dokładność pierwszej klasy0,7180,7126 0,7137
MobileBertF1(dopasowanie ścisłe)88,81(81,23)2,08(0) 88,73(81,15)
Tabela 2 Zalety kwantyzacji modelu z aktywacjami int16

Przycinanie

Przycinanie polega na usuwaniu w modelu parametrów, które mają niewielki wpływ na prognozy. Przycięte modele mają ten sam rozmiar na dysku i mają taki sam czas oczekiwania w środowisku wykonawczym, ale mogą być efektywniej kompresowane. Dzięki temu przycinanie jest przydatną metodą zmniejszania rozmiaru pobieranego modelu.

W przyszłości TensorFlow Lite będzie zapewniać redukcję opóźnień w przyciętych modelach.

Grupuję

Klasterowanie polega na grupowaniu wag każdej warstwy w modelu we wstępnie zdefiniowanej liczbie klastrów, a następnie udostępnianiu wartości centroidowych wag należących do poszczególnych klastrów. Zmniejsza to liczbę unikalnych wartości wag w modelu, co zmniejsza jego złożoność.

W związku z tym modele scalone można bardziej efektywnie kompresować, zapewniając korzyści podczas wdrożenia podobne do przycinania.

Proces programowania

Na początek sprawdź, czy modele w modelach hostowanych będą działać w Twojej aplikacji. Jeśli nie, zalecamy użytkownikom rozpoczęcie od narzędzia do kwantyzacji po zakończeniu trenowania, ponieważ ma to zastosowanie powszechnie i nie wymaga danych treningowych.

Jeśli cele w zakresie dokładności i czasu oczekiwania nie są osiągane lub gdy istotna jest obsługa akceleratora sprzętowego, lepszym rozwiązaniem jest trenowanie z uwzględnieniem kwantyfikacji. Zapoznaj się z dodatkowymi technikami optymalizacji w ramach pakietu narzędzi do optymalizacji modelu TensorFlow.

Jeśli chcesz jeszcze bardziej zmniejszyć rozmiar modelu, przed kwantyfikacją modeli możesz spróbować przyciąć lub grupować elementy.