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 uruchamiać w ramach tych ograniczeń. Ponadto niektóre optymalizacje pozwalają na użycie specjalistycznego sprzętu do przyspieszonego wnioskowania.
TensorFlow Lite i TensorFlow Model Optimization Toolkit dostarczają narzędzi, które minimalizują złożoność optymalizacji wnioskowania.
Zaleca się rozważenie optymalizacji modelu podczas procesu tworzenia aplikacji. W tym dokumencie przedstawiono kilka najlepszych praktyk dotyczących optymalizacji modeli TensorFlow pod kątem wdrażania na sprzęcie brzegowym.
Dlaczego modele powinny być optymalizowane
Istnieje kilka głównych sposobów, w jakie optymalizacja modelu może pomóc w tworzeniu aplikacji.
Zmniejszenie rozmiaru
Niektóre formy optymalizacji można wykorzystać do zmniejszenia rozmiaru modelu. 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 zajmie 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, gdy są uruchamiane, co zwalnia pamięć do wykorzystania przez inne części aplikacji i może przełożyć się na lepszą wydajność i stabilność.
Kwantyzacja może zmniejszyć rozmiar modelu we wszystkich tych przypadkach, 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 do uruchomienia pojedynczego wnioskowania z danym modelem. Niektóre formy optymalizacji mogą zmniejszyć ilość obliczeń wymaganych do uruchomienia wnioskowania przy użyciu modelu, co skutkuje mniejszym opóźnieniem. Opóźnienie może również mieć wpływ na zużycie energii.
Obecnie kwantyzację można wykorzystać do zmniejszenia opóźnień poprzez uproszczenie obliczeń występujących podczas wnioskowania, potencjalnie kosztem pewnej dokładności.
Kompatybilność z akceleratorem
Niektóre akceleratory sprzętowe, takie jak Edge TPU , mogą działać bardzo szybko w przypadku prawidłowo zoptymalizowanych modeli.
Generalnie tego typu urządzenia wymagają kwantyzacji modeli w określony sposób. Zapoznaj się z dokumentacją każdego akceleratora sprzętowego, aby dowiedzieć się więcej o jego wymaganiach.
Kompromisy
Optymalizacje mogą potencjalnie spowodować zmiany w dokładności modelu, co należy wziąć pod uwagę podczas procesu tworzenia aplikacji.
Zmiany dokładności zależą od optymalizowanego modelu i są trudne do przewidzenia 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 wrażenia użytkowników. 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 klastrowanie.
Są one częścią TensorFlow Model Optimization Toolkit , który zapewnia zasoby do technik optymalizacji modeli, które są kompatybilne 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. Powoduje to mniejszy rozmiar modelu i szybsze obliczenia.
W TensorFlow Lite dostępne są następujące rodzaje kwantyzacji:
Technika | Wymagania dotyczące danych | Zmniejszenie rozmiaru | Precyzja | Obsługiwany sprzęt |
---|---|---|---|---|
Kwantyzacja po treningu float16 | Brak danych | Do 50% | Nieznaczna utrata dokładności | CPU, GPU |
Kwantyzacja zakresu dynamicznego po treningu | Brak danych | Do 75% | Najmniejsza utrata dokładności | CPU, GPU (Android) |
Kwantyzacja liczb całkowitych po treningu | Próbka reprezentatywna bez etykiety | Do 75% | Mała utrata dokładności | CPU, GPU (Android), EdgeTPU, Hexagon DSP |
Szkolenie uwzględniające kwantyzację | Oznaczone dane treningowe | Do 75% | Najmniejsza utrata dokładności | CPU, GPU (Android), EdgeTPU, Hexagon DSP |
Poniższe drzewo decyzyjne pomaga wybrać schematy kwantyzacji, których możesz chcieć użyć dla swojego modelu, po prostu w oparciu o oczekiwany rozmiar i dokładność modelu.
Poniżej znajdują się wyniki dotyczące opóźnienia i dokładności kwantyzacji po treningu i treningu uwzględniającego kwantyzację na kilku modelach. Wszystkie wartości opóźnień są mierzone na urządzeniach Pixel 2 przy użyciu jednego procesora o dużym rdzeniu. Wraz z poprawą zestawu narzędzi ulegną również poniższe liczby:
Model | Dokładność Top-1 (oryginalna) | Dokładność Top-1 (kwantyzacja po szkoleniu) | Dokładność Top-1 (szkolenie uwzględniające kwantyzację) | Opóźnienie (oryginalne) (ms) | Opóźnienie (kwantyzacja po treningu) (ms) | Opóźnienie (szkolenie uwzględniające kwantyzację) (ms) | Rozmiar (oryginalny) (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 |
Początek_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 jest pełnym schematem 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 liczb całkowitych, przy czym zarówno aktywacje, jak i wagi w int8 zachowują podobny rozmiar modelu. Jest zalecany, gdy aktywacje są wrażliwe na kwantyzację.
UWAGA: Obecnie dla tego schematu kwantyzacji w TFLite dostępne są tylko niezoptymalizowane referencyjne implementacje jądra, więc domyślnie wydajność będzie niska w porównaniu z jądrami int8. Pełne zalety tego trybu są obecnie dostępne za pośrednictwem specjalistycznego sprzętu lub niestandardowego oprogramowania.
Poniżej znajdują się wyniki dokładności dla niektórych modeli, które korzystają z tego trybu. Model Typ metryki dokładności Dokładność (aktywacje Float32) Dokładność (aktywacje int8) Dokładność (aktywacje int16) Wav2letter 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 Najwyższa dokładność 0,7062 0,694 0,6936 MobileNetV2 Najwyższa dokładność 0,718 0,7126 0,7137 Telefon komórkowyBert F1 (dokładne dopasowanie) 88,81 (81.23) 2.08(0) 88,73 (81.15)
Przycinanie
Przycinanie działa poprzez usuwanie parametrów w modelu, które mają tylko niewielki wpływ na jego przewidywania. Modele przycinane mają ten sam rozmiar na dysku i mają takie same opóźnienia w czasie wykonywania, ale można je bardziej efektywnie skompresować. To sprawia, że przycinanie jest użyteczną techniką zmniejszania rozmiaru pobieranego modelu.
W przyszłości TensorFlow Lite zapewni redukcję opóźnień w modelach przycinanych.
Grupowanie
Grupowanie polega na grupowaniu wag każdej warstwy w modelu we wstępnie zdefiniowaną liczbę klastrów, a następnie udostępnianiu wartości centroid dla wag należących do każdego indywidualnego klastra. 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 bardziej efektywnie kompresować, zapewniając korzyści związane z wdrożeniem podobne do przycinania.
Przepływ pracy w programowaniu
Na początek sprawdź, czy modele w hostowanych modelach mogą działać w Twojej aplikacji. Jeśli nie, zalecamy, aby użytkownicy zaczęli od narzędzia do kwantyzacji po szkoleniu, ponieważ ma ono szerokie zastosowanie i nie wymaga danych szkoleniowych.
W przypadkach, w których cele dotyczące dokładności i opóźnień nie są osiągane lub ważna jest obsługa akceleratorów sprzętowych, lepszym rozwiązaniem jest szkolenie uwzględniające kwantyzację . Zobacz dodatkowe techniki optymalizacji w zestawie narzędzi TensorFlow Model Optimization Toolkit .
Jeśli chcesz jeszcze bardziej zmniejszyć rozmiar modelu, możesz spróbować przycinania i/lub grupowania przed kwantyzacją modeli.