Delegaci TensorFlow Lite

Przedstawiciele umożliwiają akcelerację sprzętową modeli TensorFlow Lite, korzystając z akceleratorów działających na urządzeniu, takich jak GPU i procesor sygnału cyfrowego.

Domyślnie TensorFlow Lite korzysta z jąder procesora zoptymalizowanego pod kątem zestawu instrukcji ARM Neon. Procesor jest jednak wielofunkcyjny, który nie jest optymalizowany do obsługi intensywnych operacji arytmetycznych, które zwykle występują w modelach uczenia maszynowego (np. matrycy macierzy dostępnej w splotach i gęstych warstwach).

Z drugiej strony większość nowoczesnych telefonów komórkowych zawiera układy scalone, które lepiej sobie radzą z takimi ciężkimi operacjami. Zastosowanie ich do operacji sieci neuronowej daje ogromne korzyści pod względem czasu oczekiwania i oszczędności energii. Na przykład procesory GPU mogą zapewnić nawet 5-krotne przyspieszenie opóźnienia.

Każdy z tych akceleratorów ma powiązane interfejsy API, które umożliwiają wykonywanie niestandardowych obliczeń, np. OpenCL lub OpenGL ES w przypadku mobilnych GPU. Zwykle trzeba napisać dużo niestandardowego kodu, aby uruchomić sieć neuronowa przez te interfejsy. Sprawa się komplikuje, gdy weźmie się pod uwagę, że każdy akcelerator ma swoje wady i zalety i nie może wykonywać wszystkich operacji w sieci neuronowej. Interfejs Delegate API w TensorFlow Lite rozwiązuje ten problem, działając jako most między środowiskiem wykonawczym TFLite a tymi interfejsami API niższego poziomu.

środowisko wykonawcze z przedstawicielami

Wybór przedstawiciela

TensorFlow Lite obsługuje wiele przedstawicieli, z których każdy jest zoptymalizowany pod kątem określonych platform i konkretnych typów modeli. W zależności od 2 głównych kryteriów: platformy (Android czy iOS?) oraz typu modelu (zmiennoprzecinkowego lub kwantowego), który chcesz przyspieszyć.

Delegaci według platformy

Wiele platform (Android i iOS)

  • Delegacja GPU – może być używany zarówno w przypadku urządzeń z Androidem, jak i iOS. Jest zoptymalizowana pod kątem obsługi 32- i 16-bitowych modeli zmiennoprzecinkowych, w których dostępny jest GPU. Obsługuje również 8-bitowe modele kwantowe i zapewnia wydajność GPU na poziomie porównywalnym do ich wersji zmiennoprzecinkowych. Szczegółowe informacje o przekazywaniu GPU znajdziesz w artykule TensorFlow Lite w GPU.

iOS

  • Przekazywanie dostępu do Core ML na nowszych iPhone'ach i iPadach – w przypadku nowszych iPhone'ów i iPadów z dostępem do funkcji Neural Engine możesz użyć polecenia Core ML, aby przyspieszyć wnioskowanie dla 32- lub 16-bitowych modeli zmiennoprzecinkowych. Neural Engine działa na urządzeniach mobilnych Apple z układem SoC A12 lub nowszym. Omówienie przedstawiciela Core ML i szczegółowe instrukcje znajdziesz w artykule o delegacji do TensorFlow Lite Core ML.

Delegacje według typu modelu

Każdy akcelerator został zaprojektowany z myślą o określonej szerokości bitów. Jeśli udostępnisz delegatowi model zmiennoprzecinkowy, który obsługuje tylko 8-bitowe operacje kwantowe, odrzuci on wszystkie jego operacje, a model będzie w całości działać na CPU. Aby uniknąć takich niespodzianek, w tabeli poniżej znajdziesz omówienie pomocy delegowanej na podstawie typu modelu:

Typ modelu GPU CoreML
Liczba zmiennoprzecinkowa (32-bitowa) Tak Tak
Kwantyzacja obiektu float16 po zakończeniu trenowania Tak Tak
Kwantyzacja zakresu dynamicznego po trenowaniu Tak Nie
Kwantyzacja liczb całkowitych po trenowaniu Tak Nie
Szkolenie z myślą o kwantyzacji Tak Nie

Sprawdzanie skuteczności

Informacje w tej sekcji są tylko wstępną wskazówką, by utworzyć listę przedstawicieli, którzy mogą ulepszyć Twoje zgłoszenie. Warto jednak zauważyć, że każdy przedstawiciel ma wstępnie zdefiniowany zestaw obsługiwanych operacji, które mogą działać różnie w zależności od modelu i urządzenia. Dlatego zwykle zalecamy przeprowadzenie testów porównawczych, aby ocenić przydatność przedstawiciela w przypadku Twoich potrzeb. Pomaga to również uzasadnić zwiększenie rozmiaru plików binarnych związanych z dołączeniem przedstawiciela do środowiska wykonawczego TensorFlow Lite.

TensorFlow Lite ma rozbudowane narzędzia do oceny wydajności i dokładności, dzięki którym deweloperzy mogą bez obaw używać przedstawicieli w swojej aplikacji. Omówimy te narzędzia w następnej sekcji.

Narzędzia do oceny

Czas oczekiwania i wykorzystanie pamięci

Narzędzia do analizy porównawczej TensorFlow Lite można używać z odpowiednimi parametrami do szacowania wydajności modelu, takimi jak średni czas oczekiwania na wnioskowanie, narzut związany z inicjowaniem, wykorzystanie pamięci itp. Narzędzie obsługuje wiele flag, aby znaleźć najlepszą konfigurację delegacji dla Twojego modelu. Na przykład --gpu_backend=gl można określić za pomocą --use_gpu, aby mierzyć wykonywanie GPU za pomocą OpenGL. Pełną listę obsługiwanych parametrów delegowania znajdziesz w szczegółowej dokumentacji.

Oto przykład uruchomienia modelu kwantyzowanego z użyciem GPU w adb:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Gotową wersję tego narzędzia na Androida z 64-bitową architekturą ARM możesz pobrać tutaj (więcej informacji).

Dokładność i poprawność

Przedstawiciele zwykle wykonują obliczenia z inną precyzją niż ich odpowiedniki z procesora. W efekcie wykorzystanie przedstawiciela do akceleracji sprzętowej wiąże się z (zwykle nieznaczną) kompromisem w zakresie dokładności. Pamiętaj, że to nie jest zawsze prawda.Na przykład, ponieważ GPU używa precyzji zmiennoprzecinkowej do uruchamiania modeli kwantowych, może wystąpić niewielka poprawa precyzji (np. <1% – poprawa klasyfikacji obrazów ILSVRC o najwyższych 5 punktach).

W TensorFlow Lite są dostępne 2 rodzaje narzędzi do mierzenia, jak dokładnie zachowuje się przedstawiciel w danym modelu: Task-Based i Task-Agnostic (oparty na zadaniach). Wszystkie narzędzia opisane w tej sekcji obsługują zaawansowane parametry przekazywania używane przez narzędzie do analizy porównawczej z poprzedniej sekcji. Pamiętaj, że poniższe podsekcje skupiają się na ocenie delegowanej (czy delegat wykonuje to samo co procesor?), a nie na ocenie modelu (czy sam model jest odpowiedni dla tego zadania?).

Ocena oparta na zadaniu

TensorFlow Lite zawiera narzędzia do oceny poprawności w 2 zadaniach opartych na obrazach:

Gotowe pliki binarne tych narzędzi (Android, 64-bitowa architektura ARM) wraz z dokumentacją znajdziesz tutaj:

Poniższy przykład pokazuje ocenę klasyfikacji obrazów z użyciem GPU w Pixelu 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

Oczekiwanym wynikiem jest lista danych Top-K z zakresu od 1 do 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Ocena niezależna od zadania

W przypadku zadań, dla których nie ma gotowego narzędzia do oceny na urządzeniu lub jeśli eksperymentujesz z modelami niestandardowymi, TensorFlow Lite udostępnia narzędzie Inference Diff. (Android, plik binarny z 64-bitową architekturą binarną ARM tutaj)

Różnica wnioskowania porównuje wykonanie w TensorFlow Lite (pod względem czasu oczekiwania i odchylenia wartości wyjściowej) w 2 ustawieniach:

  • Jednowątkowa wnioskowanie o procesor
  • Wniosek zdefiniowany przez użytkownika – definiowany przez te parametry.

W tym celu narzędzie generuje losowe dane Gaussa i przekazuje je przez 2 interpretery TFLite – jeden z jednowątkowym procesorem CPU i drugi z parametrami określonymi przez argumenty użytkownika.

Mierzy czas oczekiwania obu tych parametrów, a także bezwzględną różnicę między tensorami wyjściowymi z każdego interpretera w odniesieniu do poszczególnych elementów.

W przypadku modelu z pojedynczym tensorem wyjściowym dane wyjściowe mogą wyglądać tak:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Oznacza to, że dla tensora wyjściowego w pozycji 0 elementy wyjściowe procesora różnią się średnio o 1.96e-05 od danych wyjściowych delegowanego.

Pamiętaj, że interpretacja tych liczb wymaga głębszej wiedzy o modelu i znaczeniu każdego tensora wyjściowego. Jeśli jest to prosta regresja, która określa pewien rodzaj wyniku lub wektora dystrybucyjnego, różnica powinna być niewielka (w przeciwnym razie będzie to błąd dotyczący przedstawiciela). Jednak dane wyjściowe, takie jak „klasa wykrywania” z modeli SSD, są trochę trudniejsze do zinterpretowania. Na przykład użycie tego narzędzia może wykazać różnicę, ale nie musi to oznaczać, że coś jest nie tak z delegatem. Rozważ użycie dwóch (fałszywych) klas: „TV (identyfikator: 10)” i „Monitor (ID:20)” – jeśli przedstawiciel nieco odbiega od rzeczywistości i pokazuje monitor zamiast telewizora, różnica wyjścia dla tego tensora może wynosić od 0 do 0.