Odpowiedz już dziś na lokalne wydarzenie TensorFlow Everywhere!
Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Delegaci TensorFlow Lite

Wprowadzenie

Delegaci umożliwiają akcelerację sprzętową modeli TensorFlow Lite, wykorzystując akceleratory na urządzeniu, takie jak GPU i procesor sygnału cyfrowego (DSP) .

Domyślnie TensorFlow Lite wykorzystuje jądra procesora zoptymalizowane pod kątem zestawu instrukcji ARM Neon . Jednak procesor jest procesorem wielozadaniowym, który niekoniecznie jest zoptymalizowany pod kątem trudnych działań arytmetycznych typowych dla modeli uczenia maszynowego (na przykład matematyki macierzowej związanej ze splotem i gęstymi warstwami).

Z drugiej strony większość nowoczesnych telefonów komórkowych zawiera chipy, które lepiej radzą sobie z tak ciężkimi operacjami. Wykorzystanie ich do operacji w sieci neuronowej zapewnia ogromne korzyści w zakresie opóźnień i wydajności energetycznej. Na przykład układy GPU mogą zapewnić nawet 5-krotne przyspieszenie opóźnienia, podczas gdy Qualcomm® Hexagon DSP wykazał w naszych eksperymentach zmniejszenie zużycia energii nawet o 75%.

Każdy z tych akceleratorów ma powiązane interfejsy API, które umożliwiają niestandardowe obliczenia, takie jak OpenCL lub OpenGL ES dla mobilnych GPU i Qualcomm® Hexagon SDK dla DSP. Zwykle trzeba by napisać dużo niestandardowego kodu, aby uruchomić sieć neuronową za pośrednictwem tych interfejsów. Sprawa komplikuje się jeszcze bardziej, gdy weźmie się pod uwagę, że każdy akcelerator ma swoje wady i zalety i nie może wykonać każdej operacji w sieci neuronowej. Delegate API TensorFlow Lite rozwiązuje ten problem, działając jako pomost między środowiskiem wykonawczym TFLite a tymi interfejsami API niższego poziomu.

środowisko uruchomieniowe z delegatami

Wybór delegata

TensorFlow Lite obsługuje wielu delegatów, z których każdy jest zoptymalizowany pod kątem określonych platform i określonych typów modeli. Zwykle będzie wielu delegatów mających zastosowanie do twojego przypadku użycia, w zależności od dwóch głównych kryteriów: platformy (Android lub iOS?), Na którą kierujesz, oraz typu modelu (zmiennoprzecinkowy lub kwantowany?), Który próbujesz przyspieszyć. .

Delegaci według platformy

Wiele platform (Android i iOS)

  • Delegat GPU - delegat GPU może być używany zarówno w systemie Android, jak i iOS. Jest zoptymalizowany do uruchamiania 32-bitowych i 16-bitowych modeli opartych na liczbach zmiennoprzecinkowych, w których dostępny jest procesor graficzny. Obsługuje również 8-bitowe modele skwantyzowane i zapewnia wydajność GPU na równi z ich wersjami pływającymi. Aby uzyskać szczegółowe informacje na temat delegata GPU, zobacz TensorFlow Lite na GPU . Aby zapoznać się z samouczkami krok po kroku dotyczącymi korzystania z delegata GPU w systemach Android i iOS, zobacz TensorFlow Lite GPU Delegate Tutorial .

Android

  • Delegat NNAPI dla nowszych urządzeń z systemem Android - delegat NNAPI może być używany do przyspieszania modeli na urządzeniach z systemem Android z dostępnymi GPU, DSP i / lub NPU. Jest dostępny w systemie Android 8.1 (API 27+) lub nowszym. Aby zapoznać się z omówieniem delegata NNAPI, instrukcjami krok po kroku i najlepszymi praktykami, zobacz delegat TensorFlow Lite NNAPI .
  • Delegat Hexagon dla starszych urządzeń z Androidem - delegat Hexagon może być używany do przyspieszania modeli na urządzeniach z Androidem z Qualcomm Hexagon DSP. Można go używać na urządzeniach ze starszymi wersjami Androida, które nie obsługują NNAPI. Aby uzyskać więcej informacji, zobacz delegata TensorFlow Lite Hexagon .

iOS

  • Delegat Core ML dla nowszych iPhone'ów i iPadów - W przypadku nowszych iPhone'ów i iPadów, w których dostępny jest Neural Engine, możesz użyć delegata Core ML do przyspieszenia wnioskowania dla 32-bitowych lub 16-bitowych modeli zmiennoprzecinkowych. Neural Engine jest dostępny dla urządzeń mobilnych Apple z A12 SoC lub wyższym. Aby zapoznać się z omówieniem delegata Core ML i instrukcjami krok po kroku, zobacz delegat TensorFlow Lite Core ML .

Delegaci według typu modelu

Każdy akcelerator jest zaprojektowany z myślą o określonej szerokości bitowej danych. Jeśli podasz delegatowi model zmiennoprzecinkowy, który obsługuje tylko 8-bitowe operacje kwantowane (na przykład delegat Hexagon ), odrzuci on wszystkie swoje operacje, a model będzie działał całkowicie na procesorze. Aby uniknąć takich niespodzianek, poniższa tabela zawiera przegląd wsparcia delegatów w oparciu o typ modelu:

Typ modelu GPU NNAPI Sześciokąt CoreML
Liczba zmiennoprzecinkowa (32 bity) tak tak Nie tak
Kwantyzacja float16 po treningu tak Nie Nie tak
Kwantyzacja zakresu dynamicznego po treningu tak tak Nie Nie
Kwantyzacja liczb całkowitych po treningu tak tak tak Nie
Szkolenie uwzględniające kwantyzację tak tak tak Nie

Sprawdzanie wydajności

Informacje w tej sekcji służą jako przybliżone wytyczne dotyczące tworzenia krótkiej listy delegatów, którzy mogą ulepszyć aplikację. Należy jednak pamiętać, że każdy delegat ma predefiniowany zestaw obsługiwanych operacji i może wykonywać różne czynności w zależności od modelu i urządzenia; na przykład delegat NNAPI może zdecydować się na używanie Google Edge-TPU na telefonie Pixel podczas korzystania z DSP na innym urządzeniu. Dlatego zwykle zaleca się wykonanie pewnych testów porównawczych, aby ocenić, jak przydatny jest delegat dla Twoich potrzeb. Pomaga to również w uzasadnieniu wzrostu rozmiaru binarnego związanego z dołączeniem delegata do środowiska wykonawczego TensorFlow Lite.

TensorFlow Lite oferuje rozbudowane narzędzia do oceny wydajności i dokładności, które mogą dać programistom pewność korzystania z delegatów w ich aplikacjach. Narzędzia te omówiono w następnej sekcji.

Narzędzia do oceny

Opóźnienie i ślad pamięci

TensorFlow Lite narzędzie odniesienia może być stosowany z odpowiednimi parametrami, aby oszacować wydajność modelu, w tym średnia wnioskowania latencji, inicjującym głową, zużycie pamięci, itp to narzędzie obsługuje wiele flag, aby dowiedzieć się najlepszej konfiguracji Delegat modelu. Na przykład --gpu_backend=gl można określić za pomocą --use_gpu aby zmierzyć wykonanie GPU w OpenGL. Pełna lista obsługiwanych parametrów delegatów jest zdefiniowana w szczegółowej dokumentacji .

Oto przykład uruchomienia skwantowanego modelu z GPU przez adb :

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

Możesz pobrać gotową wersję tego narzędzia dla Androida, 64-bitową architekturę ARM tutaj ( więcej szczegółów ).

Dokładność i poprawność

Delegaci zwykle wykonują obliczenia z inną precyzją niż ich odpowiedniki na procesorze. W rezultacie występuje (zwykle niewielki) kompromis w zakresie dokładności związany z wykorzystaniem delegata do przyspieszania sprzętowego. Zauważ, że nie zawsze jest to prawdą; na przykład, ponieważ GPU używa precyzji zmiennoprzecinkowej do uruchamiania skwantowanych modeli, może nastąpić niewielka poprawa precyzji (np. <1% poprawa klasyfikacji obrazów w pierwszej piątce w ILSVRC).

TensorFlow Lite oferuje dwa rodzaje narzędzi do pomiaru dokładności zachowania delegata dla danego modelu: Zadaniowe i Zadaniowe . Wszystkie narzędzia opisane w tej sekcji obsługują zaawansowane parametry delegowania używane przez narzędzie do testów porównawczych z poprzedniej sekcji. Zwróć uwagę, że poniższe podsekcje koncentrują się na ocenie delegata (czy delegat wykonuje to samo co procesor?), A nie na ocenie modelu (czy sam model jest dobry do zadania?).

Ocena zadaniowa

TensorFlow Lite zawiera narzędzia do oceny poprawności dwóch zadań opartych na obrazach:

Gotowe pliki binarne tych narzędzi (Android, 64-bitowa architektura ARM) wraz z dokumentacją można znaleźć tutaj:

Poniższy przykład ilustruje ocenę klasyfikacji obrazu za pomocą NNAPI z wykorzystaniem Google Edge-TPU na 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_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

Oczekiwanym wynikiem jest lista najważniejszych metryk 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 narzędzia do oceny na urządzeniu lub jeśli eksperymentujesz z modelami niestandardowymi, TensorFlow Lite oferuje narzędzie Inference Diff . (Android, 64-bitowy ARM architektura binarny binarny tutaj )

Inference Diff porównuje wykonanie TensorFlow Lite (pod względem opóźnienia i odchylenia wartości wyjściowej) w dwóch ustawieniach:

  • Wnioskowanie o procesorze jednowątkowym
  • Wnioskowanie zdefiniowane przez użytkownika - definiowane przez te parametry

Aby to zrobić, narzędzie generuje losowe dane Gaussa i przekazuje je przez dwa interpretery TFLite - jeden z jądrem jednowątkowym procesora, a drugi parametryzowany przez argumenty użytkownika.

Mierzy opóźnienie obu, a także bezwzględną różnicę między tensorami wyjściowymi każdego interpretera, na podstawie każdego elementu.

W przypadku modelu z pojedynczym tensorem wyjściowym dane wyjściowe mogą wyglądać następująco:

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 o indeksie 0 elementy z wyjścia procesora różnią się od wyjścia delegata o średnią 1.96e-05 .

Zauważ, że interpretacja tych liczb wymaga głębszej wiedzy o modelu i co oznacza każdy tensor wyjściowy. Jeśli jest to prosta regresja, która określa jakiś rodzaj oceny lub osadzania, różnica powinna być mała (w przeciwnym razie jest to błąd z delegatem). Jednak wyniki takie jak „klasa wykrywania” z modeli SSD są nieco trudniejsze do zinterpretowania. Na przykład może pokazać różnicę przy użyciu tego narzędzia, ale może to nie oznaczać czegoś naprawdę nie tak z delegatem: rozważ dwie (fałszywe) klasy: „TV (ID: 10)”, „Monitor (ID: 20)” - Jeśli delegat nieco odbiega od złotej prawdy i pokazuje monitor zamiast telewizora, różnica wyjściowa dla tego tensora może wynosić nawet 20-10 = 10.