kwantyzacja po treningu

kwantyzacja po treningu jest techniką konwersji, która może zmniejszyć rozmiar modelu, poprawiając również opóźnienie procesora i akceleratora sprzętowego, z niewielką degradacją w dokładności modelu. Możesz skwantować już wytrenowany model floatTensorFlow po przekonwertowaniu go do formatu TensorFlow Lite za pomocą konwertera sensorflow Lite.

metody optymalizacji

istnieje kilka opcji kwantyzacji po treningu do wyboru. Oto sumaryczna tabela wyborów i korzyści, jakie zapewniają:

Technika zalety Sprzęt
dynamiczna rangequantization 4X mniejsze, 2x-3x speedup procesor
Pełna integerquantyzacja 4X mniejsze, 3x + speedup CPU, Edge TPU, mikrokontrolery
kwantyzacja Float16 2x mniejsze, GPUacceleration CPU, GPU

poniższe drzewo decyzyjne może pomóc w określeniu, która metoda kwantyzacji po treningu jest najlepsza dla Twojego przypadku użycia:

opcje optymalizacji potreningowej

kwantyzacja zakresu dynamicznego

najprostsza forma kwantyzacji potreningowej kwantyzuje statycznie tylko wagi od zmiennoprzecinkowej do całkowitej, która ma 8-bitową precyzję:

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.optimizations = tflite_quant_model = converter.convert()

przy wnioskowaniu wagi są konwertowane z 8-bitowej precyzji na punkt zmiennoprzecinkowy i obliczane przy użyciu jąder zmiennoprzecinkowych. Ta konwersja jest wykonywana raz iw celu zmniejszenia opóźnienia.

aby jeszcze bardziej poprawić opóźnienia, operatorzy „dynamic-range” dynamicznie kwantyzują na podstawie ich zakresu do 8 bitów i wykonują obliczenia z 8-bitowymi wagami i aktywacjami. Ta optymalizacja dostarcza opóźnień zbliżonych do wnioskowania w pełni ustalonego punktu. Jednak wyjścia są nadal przechowywane za pomocą floatingpoint tak, że przyspieszenie z dynamic-range ops jest mniejsze niż pełna stała-pointcomputation.

pełna kwantyzacja liczb całkowitych

możesz uzyskać dalsze ulepszenia opóźnień, zmniejszenie szczytowego zużycia pamięci i kompatybilność z urządzeniami sprzętowymi lub akceleratorami tylko w liczbie całkowitej, dzięki czemu cała matematyka modelu jest kwantyzowana liczbami całkowitymi.

aby uzyskać pełną kwantyzację całkowitą, musisz skalibrować lub oszacować zakres, tj.(min, max) wszystkich tensorów zmiennoprzecinkowych w modelu. W przeciwieństwie do tensorów stałych, takich jak wagi i odchylenia, tensory zmienne, takie jak wejście modelu, aktywacje(wyjścia warstw pośrednich) i wyjście modelu, nie mogą być skalibrowane, chyba że nie było kilku cykli wnioskowania. W rezultacie konwerter wymaga reprezentatywnego zestawu do kalibracji. Ten zbiór danych może być małym podzbiorem (około ~100-500 próbek) danych treningowych lub walidacyjnych. Patrz poniżej funkcja representative_dataset().

def representative_dataset(): for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100): yield 

do celów testowych można użyć fałszywego zestawu danych w następujący sposób:

def representative_dataset(): for _ in range(100): data = np.random.rand(1, 244, 244, 3) yield 

Integer with float fallback (using default float input/output)

w celu pełnej kwantyzacji modelu, ale użyj operatorów float, gdy nie mają implementacji integer (aby zapewnić płynną konwersję), użyj następujących kroków:

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.optimizations = converter.representative_dataset = representative_datasettflite_quant_model = converter.convert()

tylko liczba całkowita

tworzenie modeli tylko liczba całkowita jest powszechnym przypadkiem użycia forTensorFlow Lite dla mikrokontrolerów i Coral Edge TPU.

dodatkowo, aby zapewnić kompatybilność z urządzeniami tylko integer (takimi jak 8-bitmicrocontrollers) i akceleratorami (takimi jak Coral Edge TPU), możesz wykonać pełną kwantyzację całkowitą dla wszystkich operacji, w tym wejścia i wyjścia, stosując następujące kroki:

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.optimizations = converter.representative_dataset = representative_datasetconverter.target_spec.supported_ops = converter.inference_input_type = tf.int8 # or tf.uint8converter.inference_output_type = tf.int8 # or tf.uint8tflite_quant_model = converter.convert()

kwantyzacja Float16

możesz zmniejszyć rozmiar modelu zmiennoprzecinkowego poprzez kwantyzację wag tofloat16, standardu IEEE dla 16-bitowych liczb zmiennoprzecinkowych. Aby włączyć float16quantyzację wag, wykonaj następujące kroki:

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.optimizations = converter.target_spec.supported_types = tflite_quant_model = converter.convert()

zalety kwantyzacji float16 są następujące:

  • zmniejsza rozmiar modelu nawet o połowę(ponieważ wszystkie wagi stają się o połowę mniejsze).
  • powoduje minimalną utratę dokładności.
  • wspiera niektórych delegatów (np. delegat GPU), który może działać bezpośrednio na danych float16, co skutkuje szybszym wykonaniem niż komputery Float32.

wady kwantyzacji float16 są następujące:

  • nie zmniejsza opóźnień tak bardzo, jak kwantyzacja do matematyki o stałym punkcie.
  • domyślnie skwantowany model float16 „dequantize” wartości wag dla float32 podczas uruchamiania na procesorze. (Zauważ, że delegat GPU nie wykona tej dequantyzacji, ponieważ może działać na danych float16.)

tylko liczba całkowita: 16-bitowe aktywacje z 8-bitowymi wagami (eksperymentalne)

jest to eksperymentalny schemat kwantyzacji. Jest on podobny do schematu „tylko liczba całkowita”, ale aktywacje są kwantyzowane w oparciu o ich zakres do 16-bitów, wagi są kwantyzowane w 8-bitowej liczbie całkowitej, a bias jest kwantyzowany w 64-bitowej liczbie całkowitej. Dalej nazywa się to kwantyzacją 16×8.

główną zaletą tej kwantyzacji jest to, że może znacznie poprawić dokładność, ale tylko nieznacznie zwiększyć rozmiar modelu.

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.representative_dataset = representative_datasetconverter.optimizations = converter.target_spec.supported_ops = tflite_quant_model = converter.convert()

jeśli kwantyzacja 16×8 nie jest obsługiwana dla niektórych operatorów w modelu,to model nadal może być kwantyzowany, ale nieobsługiwane operatory przechowywane w float.Aby to umożliwić, do target_spec należy dodać następującą opcję.

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.representative_dataset = representative_datasetconverter.optimizations = converter.target_spec.supported_ops = tflite_quant_model = converter.convert()

przykłady przypadków użycia, w których poprawa dokładności zapewniona przez ten schemat kwantyzacji obejmuje: * superrozdzielczość, * przetwarzanie sygnału audio, takie jak redukcja szumów i kształtowanie wiązki, * usuwanie hałasu, * rekonstrukcja HDR z jednego obrazu.

wadą tej kwantyzacji jest:

  • obecnie wnioskowanie jest zauważalnie wolniejsze niż 8-bitowa pełna liczba całkowita ze względu na brak zoptymalizowanej implementacji jądra.
  • obecnie jest niezgodny z istniejącymi przyspieszanymi sprzętowo TFLitedelegates.

tutorial dla tego trybu kwantyzacji można znaleźć tutaj.

dokładność modelu

ponieważ wagi są skwantowane po treningu, może wystąpić utrata dokładności, szczególnie w przypadku mniejszych sieci. Wstępnie przeszkolone w pełni skwantowane modele są przewidziane dla określonych sieci w repozytorium modeli sensorflow Lite. Ważne jest, aby sprawdzić dokładność skwantowanego modelu, aby sprawdzić, czy jakiekolwiek pogorszenie dokładności jest w dopuszczalnych granicach. Istnieją narzędzia do oceny dokładności modelu netensorflow Lite.

alternatywnie, jeśli spadek dokładności jest zbyt wysoki, rozważ użycie szkolenia quantization aware. Wymaga to jednak modyfikacji podczas treningu modelowego w celu dodania węzłów fakequantyzacyjnych, podczas gdy techniki kwantyzacji po treningu na tym etapie wykorzystują istniejący wcześniej wytrenowany model.

reprezentacja dla skwantowanych tensorów

8-bitowa kwantyzacja przybliża wartości zmiennoprzecinkowe za pomocą następującej formuły.

$$real\_value = (int8\_value-zero\_point) \ times scale$$

reprezentacja składa się z dwóch głównych części:

  • wagi Per-axis (inaczej per-channel) lub per-tensor reprezentowane przez wartości dwójkowe int8 w zakresie z punktem zerowym równym 0.

  • aktywacje/wejścia Per-tensorowe reprezentowane przez wartości dopełniacza INT8 two w zakresie, z punktem zerowym w zakresie .

aby uzyskać szczegółowy widok naszego schematu kwantyzacji, zobacz specyfikację kwantyzacji. Dostawcy sprzętu, którzy chcą podłączyć do interfejsu delegata TensorFlow Lite, są zachęcani do wdrożenia opisanego tam schematu kwantyzacji.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.