Urządzenia brzegowe często mają ograniczoną pamięć lub moc obliczeniową. Do modeli można zastosować różne optymalizacje, aby można je było uruchomić w ramach tych ograniczeń. Ponadto niektóre optymalizacje pozwalają na użycie specjalistycznego sprzętu do przyspieszonego wnioskowania.
TensorFlow Lite i zestaw narzędzi do optymalizacji modelu TensorFlow zapewniają narzędzia minimalizujące złożoność wnioskowania optymalizacyjnego.
Zaleca się rozważenie optymalizacji modelu podczas procesu tworzenia aplikacji. W tym dokumencie opisano niektóre najlepsze praktyki optymalizacji modeli TensorFlow pod kątem wdrażania na sprzęcie brzegowym.
Dlaczego modele należy optymalizować
Istnieje kilka głównych sposobów, w jakie optymalizacja modelu może pomóc w tworzeniu aplikacji.
Zmniejszenie rozmiaru
Aby zmniejszyć rozmiar modelu, można zastosować niektóre formy optymalizacji. Mniejsze modele mają następujące zalety:
- Mniejszy rozmiar pamięci: mniejsze modele zajmują mniej miejsca na urządzeniach użytkowników. Na przykład aplikacja na Androida korzystająca z mniejszego modelu będzie zajmować mniej miejsca na urządzeniu mobilnym użytkownika.
- Mniejszy rozmiar pobierania: mniejsze modele wymagają mniej czasu i przepustowości do pobrania na urządzenia użytkowników.
- Mniejsze zużycie pamięci: Mniejsze modele zużywają mniej pamięci RAM podczas działania, co zwalnia pamięć dla innych części aplikacji i może przełożyć się na lepszą wydajność i stabilność.
We wszystkich tych przypadkach kwantyzacja może zmniejszyć rozmiar modelu, potencjalnie kosztem pewnej dokładności. Przycinanie i grupowanie może zmniejszyć rozmiar modelu do pobrania, ułatwiając jego kompresję.
Redukcja opóźnień
Opóźnienie to czas potrzebny na wykonanie pojedynczego wnioskowania dla danego modelu. Niektóre formy optymalizacji mogą zmniejszyć ilość obliczeń wymaganych do uruchomienia wnioskowania przy użyciu modelu, co skutkuje mniejszymi opóźnieniami. Opóźnienie może mieć również wpływ na zużycie energii.
Obecnie kwantyzację można zastosować w celu zmniejszenia opóźnień poprzez uproszczenie obliczeń wykonywanych podczas wnioskowania, potencjalnie kosztem pewnej dokładności.
Kompatybilność z akceleratorami
Niektóre akceleratory sprzętowe, takie jak Edge TPU , mogą niezwykle szybko uruchamiać wnioskowanie w przypadku poprawnie zoptymalizowanych modeli.
Ogólnie rzecz biorąc, tego typu urządzenia wymagają kwantyzacji modeli w określony sposób. Zobacz dokumentację każdego akceleratora sprzętowego, aby dowiedzieć się więcej o jego wymaganiach.
Kompromisy
Optymalizacje mogą potencjalnie skutkować zmianami w dokładności modelu, co należy wziąć pod uwagę podczas procesu tworzenia aplikacji.
Zmiany dokładności zależą od optymalizowanego indywidualnego modelu i trudno je przewidzieć z wyprzedzeniem. Ogólnie rzecz biorąc, modele zoptymalizowane pod kątem rozmiaru lub opóźnienia stracą niewielką ilość dokładności. W zależności od aplikacji może to mieć wpływ na wygodę użytkowników lub nie. W rzadkich przypadkach niektóre modele mogą zyskać pewną dokładność w wyniku procesu optymalizacji.
Rodzaje optymalizacji
TensorFlow Lite obsługuje obecnie optymalizację poprzez kwantyzację, przycinanie i grupowanie.
Stanowią one część zestawu narzędzi do optymalizacji modelu TensorFlow , który zapewnia zasoby dotyczące technik optymalizacji modelu zgodnych z TensorFlow Lite.
Kwantyzacja
Kwantyzacja polega na zmniejszeniu precyzji liczb używanych do reprezentowania parametrów modelu, które domyślnie są 32-bitowymi liczbami zmiennoprzecinkowymi. Skutkuje to mniejszym rozmiarem modelu i szybszymi obliczeniami.
W TensorFlow Lite dostępne są następujące typy kwantyzacji:
Technika | Wymagania dotyczące danych | Zmniejszenie rozmiaru | Dokładność | Obsługiwany sprzęt |
---|---|---|---|---|
Kwantyzacja typu float16 po treningu | Brak danych | Do 50% | Nieznaczna utrata dokładności | Procesor, karta graficzna |
Kwantyzacja zakresu dynamicznego po treningu | Brak danych | Do 75% | Najmniejsza utrata dokładności | Procesor, karta graficzna (Android) |
Kwantyzacja liczb całkowitych po treningu | Nieoznakowana próbka reprezentatywna | Do 75% | Mała utrata dokładności | Procesor, procesor graficzny (Android), EdgeTPU, Hexagon DSP |
Szkolenie uwzględniające kwantyzację | Oznaczone dane szkoleniowe | Do 75% | Najmniejsza utrata dokładności | Procesor, procesor graficzny (Android), EdgeTPU, Hexagon DSP |
Poniższe drzewo decyzyjne pomaga wybrać schematy kwantyzacji, których możesz chcieć użyć w swoim modelu, po prostu w oparciu o oczekiwany rozmiar i dokładność modelu.
Poniżej znajdują się wyniki opóźnień i dokładności kwantyzacji po treningu i treningu uwzględniającego kwantyzację w kilku modelach. Wszystkie opóźnienia są mierzone na urządzeniach Pixel 2 z jednym dużym rdzeniem procesora. W miarę ulepszania zestawu narzędzi poprawią się także liczby tutaj:
Model | Dokładność na najwyższym poziomie (oryginał) | Dokładność na najwyższym poziomie (kwantyzowana po treningu) | Dokładność na najwyższym poziomie (szkolenie uwzględniające kwantyzację) | Opóźnienie (oryginalne) (ms) | Opóźnienie (skwantowane po treningu) (ms) | Opóźnienie (trening uwzględniający kwantyzację) (ms) | Rozmiar (oryginał) (MB) | Rozmiar (zoptymalizowany) (MB) |
---|---|---|---|---|---|---|---|---|
Mobilenet-v1-1-224 | 0,709 | 0,657 | 0,70 | 124 | 112 | 64 | 16.9 | 4.3 |
Mobilenet-v2-1-224 | 0,719 | 0,637 | 0,709 | 89 | 98 | 54 | 14 | 3.6 |
Incepcja_v3 | 0,78 | 0,772 | 0,775 | 1130 | 845 | 543 | 95,7 | 23.9 |
Resnet_v2_101 | 0,770 | 0,768 | Nie dotyczy | 3973 | 2868 | Nie dotyczy | 178,3 | 44,9 |
Pełna kwantyzacja liczb całkowitych z aktywacjami int16 i wagami int8
Kwantyzacja z aktywacjami int16 to pełny schemat kwantyzacji liczb całkowitych z aktywacjami w int16 i wagami w int8. Ten tryb może poprawić dokładność skwantowanego modelu w porównaniu do pełnego schematu kwantyzacji na liczbach całkowitych, przy czym zarówno aktywacje, jak i wagi w int8 utrzymują podobny rozmiar modelu. Jest to zalecane, gdy aktywacje są wrażliwe na kwantyzację.
UWAGA: Obecnie w TFLite dla tego schematu kwantyzacji dostępne są tylko niezoptymalizowane referencyjne implementacje jądra, więc domyślnie wydajność będzie niska w porównaniu z jądrami int8. Dostęp do pełnych zalet tego trybu można obecnie uzyskać za pośrednictwem specjalistycznego sprzętu lub niestandardowego oprogramowania.
Poniżej znajdują się wyniki dokładności dla niektórych modeli korzystających z tego trybu. Model Typ metryki dokładności Dokładność (aktywacje float32) Dokładność (aktywacje int8) Dokładność (aktywacje int16) List Wav2 WER 6,7% 7,7% 7,2% DeepSpeech 0.5.1 (rozwinięty) CER 6,13% 43,67% 6,52% YoloV3 mAP(IOU=0,5) 0,577 0,563 0,574 MobileNetV1 Dokładność na najwyższym poziomie 0,7062 0,694 0,6936 MobileNetV2 Dokładność na najwyższym poziomie 0,718 0,7126 0,7137 MobileBert F1 (dokładne dopasowanie) 88,81(81,23) 2,08(0) 88,73(81,15)
Przycinanie
Oczyszczanie polega na usuwaniu parametrów z modelu, które mają jedynie niewielki wpływ na jego przewidywania. Oczyszczone modele mają ten sam rozmiar na dysku i takie same opóźnienia w czasie wykonywania, ale można je kompresować bardziej efektywnie. Dzięki temu oczyszczanie jest użyteczną techniką zmniejszania rozmiaru pobieranego modelu.
W przyszłości TensorFlow Lite zapewni redukcję opóźnień w przypadku przyciętych modeli.
Grupowanie
Grupowanie polega na grupowaniu wag każdej warstwy modelu w predefiniowaną liczbę skupień, a następnie udostępnianiu wartości centroidów dla wag należących do każdego pojedynczego skupienia. Zmniejsza to liczbę unikalnych wartości wag w modelu, zmniejszając w ten sposób jego złożoność.
W rezultacie modele klastrowe można skuteczniej kompresować, zapewniając korzyści wdrożeniowe podobne do czyszczenia.
Przepływ prac programistycznych
Na początek sprawdź, czy modele w modelach hostowanych mogą działać w Twojej aplikacji. Jeśli nie, zalecamy, aby użytkownicy zaczęli od narzędzia kwantyzacji potreningowej, ponieważ ma ono szerokie zastosowanie i nie wymaga danych szkoleniowych.
W przypadkach, gdy cele dotyczące dokładności i opóźnień nie są spełnione lub ważna jest obsługa akceleratora sprzętowego, lepszym rozwiązaniem jest szkolenie uwzględniające kwantyzację . Zobacz dodatkowe techniki optymalizacji w zestawie narzędzi do optymalizacji modelu TensorFlow .
Jeśli chcesz jeszcze bardziej zmniejszyć rozmiar modelu, możesz spróbować przycinania i/lub grupowania przed kwantyzacją modeli.