07 - Inferencja sieci neuronowej z wykorzystaniem Raspberry Pi i ONNX Runtime
Systemy Wbudowane i Przetwarzanie Brzegowe
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 7: Inferencja sieci neuronowej z wykorzystaniem Raspberry Pi i ONNX Runtime
Powrót do spisu treści ćwiczeń laboratoryjnych
ONNX Runtime
Biblioteka ONNX Runtime jest to projekt open-source rozwijany przez firmę Microsoft, który umożliwia optymalizację i akcelerację modeli uczenia maszynowego w formacie ONNX na różnych platformach sprzętowych. Pakiet ten wspiera obecnie następujące akceleratory:
NVIDIA CUDA | NVIDIA TensorRT | Intel OpenVIN | Intel oneDNN | Windows DirectML | Qualcomm - SNPE |
Android NNAPI | Apple CoreML | XNNPACK | AMD - MIGRraphX | AMD - ROCm | Cloud - Azure |
Arm - ACL | Arm - Arm NN | Apache - TVM | Rockchip - RKNPU | Xilinx - Vitis AI | Huawei - CANN |
Źródło grafiki: ONNX Runtime GitHub
Zadania do samodzielnej realizacji
Zadanie 1. Korzystając z polecenie instalacyjnego z powyższej sekcji zainstaluj bibliotekę TensorFlow Lite na Raspberry Pi. Następnie korzystając z funkcji random_inference_tflite
z poprzednich zajęć oraz instrukcji Quickstart for Linux-based devices with Python przygotuj skrypt pozwalający na inferencję sieci neuronowej bezpośrednio na Raspberry Pi. Wykorzystując model w formacie FLOAT 32 przetestuj działanie modelu na losowych danych (zmień pierwszy wymiar zmiennej random_input
na 1) i zmierz średni czas inferencji przypadający na jedną próbkę danych przy 100 wywołaniach.
Zadanie 2. Przeprowadź powyższą analizę dla modeli w formacie FLOAT 16 oraz INT 8. Pamiętaj o przekształceniu danych wejściowych do odpowiedniego formatu. Porównaj wyniki uzyskane dla modeli w różnych formatach. Czy można zauważyć znaczącą różnicę w czasie inferencji pomiędzy formatami?
Na podstawie wyników przeprowadzonej analizy przygotuj wykres słupkowy pokazujący zależność czasu inferencji od formatu modelu.
Zadanie 3. Przygotuj skrypt, który wykorzysta zdjęcie z kamery Raspberry Pi do przeprowadzenia predykcji klasy ze zbioru ImageNet. Do obsługi kamery wykorzystaj bibliotekę OpenCV. Predykcję modelu nałóż na zdjęcie wykorzystując metodę cv2.putText()
, a numery klas zdekoduj wykorzystując plik imagenet1000_clsidx_to_labels.txt. Mimo formatu txt w nazwie, plik można bez problemu wczytać przy pomocy biblioteki json.
with open("imagenet1000_clsidx_to_labels.txt", "r") as f:
= f.read().replace("'", "").splitlines()
lines 0] = lines[0][1:]
lines[-1] = lines[-1][:-1]
lines[assert len(lines) == 1000
= dict()
labels_dict for line in lines:
= line.split(":")
key, value int(key)] = value labels_dict[
Zadanie 4. Zmodyfikuj skrypt tak aby możliwa była inferencja modelu na Raspberry Pi w czasie rzeczywistym przy użyciu kamery. Predykcję modelu wyświetlaj w konsoli. Sprawdź jak poszczególne modele radzą sobie z predykcją w czasie rzeczywistym.
Materiały dodatkowe
Jak można zauważyć po powyższych ćwiczeniach, czasy wnioskowania sieci neuronowej na urządzeniu o ograniczonej mocy obliczeniowej jakim jest Raspberry Pi są znacznie dłuższe niż na komputerze stacjonarnym i w środowisku chmurowym. Niemniej jednak, zalety prztwarzania brzegowego są na tyle duże, że warto je stosować mimo takich ograniczeń. W sytuacji, gdy jednak czas wnioskowania jest krytyczny, można skorzystać z dodatkowych, zewnętrznych akceleratorów obliczeń. Jako najczęściej stosowane, dostępne na rynku rozwiązania można wymienić:
1. Google Coral Edge TPU USB Accelerator
Google Coral Edge TPU USB Accelerator jest to koprocessor oparty o rdzeń Edge TPU służący do zrównoleglania i akceleracji obliczeń sieci neuronowych na urządzeniach brzegowych. Jak nazwa wskazuje, komunikacja odbywa się po interfejsie USB 3. Koprocessor został zaprojektowany tak, by był kompatybilny z biblioteką TensorFLow Lite. Urządzenie wspiera modele zkwantyzowane do 8 bitów w formacie INT8, a następnie skompilowane przy użyciu kompilatora Edge TPU Compiler.
Szczegółowe jak korzystać z koprocessora Google Coral Edge TPU USB Accelerator można znaleźć w dokumentacji:
Źródło grafiki: The Coral USB Accelerator
2. Intel Neural Compute Stick 2 (NCS2)
Intel Neural Compute Stick 2 to akcelerator USB oparty o układ obliczeniowy Intel® Movidius™ Myriad™ X Vision Processing Unit (VPU) przeznaczony do prototypowania i testowania rozwiązań opartych o sieci neuronowe (w szczególności o sieci konwolucyjne) na urządzeniach brzegowych takich jak np. Raspberry Pi. Domyślnie do konwersji algorytmu opartego o sieć neuronową wykorzystywane jest narzędzie OpenVINO, które wspiera konwersję, optymalizację oraz wdrożenie na urządzenia oparte o architekturę firmy Intel. Alternatywnie można skorzystać z biblioteki ONNX Runtime oraz z dostępnego w niej modułu OpenVINO™ Execution Provider.
Źródło grafiki: Intel® Neural Compute Stick 2 (Intel® NCS2)