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:
  lines = f.read().replace("'", "").splitlines()
  lines[0] = lines[0][1:]
  lines[-1] = lines[-1][:-1]
  assert len(lines) == 1000
  labels_dict = dict()
  for line in lines:
    key, value = line.split(":")
    labels_dict[int(key)] = value

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)