Intel Neural Compute Stick 2 – akcelerowane uczenie maszynowe

Współczesne telefony komórkowe, inteligentne telewizory, urządzenia Internetu rzeczy itp. to tylko namiastka urządzeń w czasie pracy z którymi bardziej lub mniej świadomie wykorzystujemy algorytmy uczenia maszynowego. Pamiętajmy jednak o tym, że zanim jakieś rozwiązanie oparte o uczenie maszynowe trafi na urządzenie dla użytkownika końcowego musi odbyć daleką drogę.

Ogólnie o uczeniu maszynowym

Typowo do wytrenowania modelu, który jest w stanie realizować jakieś zadanie np. klasyfikacji, potrzebna jest bardzo duża ilość danych zawierająca setki tysięcy a nawet czasem miliony próbek w zależności od zastosowania. Praca z tak dużymi zbiorami danych implikuje to, że niezbędne są do tego bardzo wydajne zasoby obliczeniowe, a same modele nierzadko rozrastają się do niebotycznych rozmiarów. Przykładem tego mogą być choćby chińskie modele ASR (rozpoznawania mowy) opracowane przez Baidu. Zgodnie z oficjalnymi informacjami ich ASR został wytrenowany z użyciem 4TB danych treningowych i wymaga 20 exaflopów obliczeniowych.

Jak uruchomić to np. na urządzeniu mobilnym, aby działało w czasie rzeczywistym i nie pożerało transferu danych?

Odpowiedzią jest tzw. inferencja.

Proces wnioskowania

Niezbędnym wymaganiem na urządzeniach konsumenckich jest to, aby działały one być może w wąsko wyspecjalizowanej dziedzinie, lecz także na danych, których wcześniej nie widziały i błyskawicznie w czasie bliskim do rzeczywistego zwracały wyniki. Zapewnia to właśnie inferencja, inaczej zwana wnioskowaniem. Choć pojęcie jest relatywnie nowe w branży informatycznej można wyszczególnić dwa przodujące podejścia, w których dochodzi do modyfikowania sieci neuronowych pod kątem szybkości i opóźnień. Przede wszystkim możliwy jest tzw. pruning, który polega na tym, iż bada się, które fragmenty sieci neuronowej są rzadko aktywowane, co daje możliwość oczyszczenia modelu z takich fragmentów. Oczywiście proces ten jest okupiony stratą jakości przewidywań, która na ogół nie jest większa niż 4%.

Drugie podejście polega na redukcji wielkości sieci neuronowych w taki sposób, aby połączyć ze sobą różne warstwy sieci neuronowych w mniejszą ilość kroków obliczeniowych. Zabieg ten powoduje jednocześnie zmniejszenie ilości wag i parametrów, a co za tym idzie także i cech, które muszą być przekazane do sieci neuronowej. Proces ten można porównać do stratnej kompresji obrazu, gdzie znacznie redukujemy rozmiar pliku okupując to niewielką, często niezauważalną stratą jakości. Podobnie w przypadku wnioskowania powinniśmy uzyskać zbliżoną dokładność prognozy, jednak z użyciem modelu zoptymalizowanego pod kątem wydajności.

Optymalizacja parametrów

Wyobraźmy sobie, że sieć neuronowa ma za zadanie rozpoznawać marki oraz numery rejestracyjne samochodów przejeżdżających przez bramki celem naliczenia opłat. Teoretycznie byłoby możliwe przesłanie całego zebranego materiału lub pojedynczych jego klatek na serwer w chmurze i tam go przetwarzać, lecz nie jest to dobry pomysł, choćby ze względu na przepustowość łączy internetowych czy opłaty transmisyjne. Między innymi z tych powodów nie byłoby to efektywne, a ręcz nadmiarowe, w szczególności w kontekście urządzeń mobilnych. W praktyce wydajniej byłoby przekazywać po prostu przetworzone już dane w formie parametrów.

Z pozoru prosta koncepcja nie jest taka trywialna, ponieważ nierzadko może wymagać przekazywania nawet milionów parametrów i to nawet kilka razy na sekundę dla zapewnienia płynności. W przypadku urządzeń mobilnych należy także rozważyć obciążenie jednostek obliczeniowych, a także skrócenie czasu pracy na baterii. Podsumowując, taki proces nie powinien być dłuższy niż kilkaset milisekund. Niestety procesory ogólnego przeznaczenia przy obecnym stanie techniki nie są wstanie sprostać temu zadaniu. Powoduje to, że niezbędne jest tworzenie wysoko wyspecjalizowanych procesorów, które są dostosowane do bardzo konkretnych typów operacji, dzięki czemu w tych zadaniach pracują błyskawicznie. Przykładem w ten sposób wyspecjalizowanego układu jest właśnie Intel Neural Compute Stick 2 (NCS2), który testujemy w tym artykule.

Intel Neural Compute Stick 2 – akcelerowane uczenie maszynowe

Akcelerator NCS2

NCS2 możemy nazwać właśnie wyspecjalizowanym akceleratorem dedykowanym programistom zajmującym się sztuczną inteligencją (SI). W tym przypadku mamy do czynienia z urządzeniem, które oferuje miniaturową sieć neuronową, która jest w stanie przyspieszyć niektóre działania związane z uczeniem maszynowym. Warto zaznaczyć, iż jest to już druga wersja tego urządzenia, wcześniejsza była znana pod nazwą Movidius Neural Compute Stick.

NCS2 wizualnie przypomina pendrive, który należy podłączyć do portu USB 3.0. Jego zadanie polega na przyspieszaniu niektórych operacji związanych z aplikacjami wykorzystującymi tzw. głębokie sieci neuronowe (DNN), w szczególności w kontekście urządzeń należących do tzw. internetu rzeczy, inteligentnych urządzeń przemysłowych, medycznych, w zastosowaniach amatorskich czy hobbystycznych, ale także uczenia maszynowego ogółem. Z jego pomocą realne staje się zaimplementowanie np. systemu rozpoznawania obrazu już na zwykłym laptopie, nie wymagając przy tym ani połączenia z chmurą ani internetu.

Jednostką obliczeniową napędzającą NCS2 jest układ Intel Movidius Myriad X VPU (Vision Processing Unit). Jest to układ typu SoC posiadający 16 rdzeni typu SHAVE wspierany sprzętowym akceleratorem sieci neuronowej. Wyprodukowany jest on w 16 nanometrowej litografii i posiada taktowanie 700MHz. To zgodnie z zapewnieniami producenta zapewnia wysoką wydajność, szczególnie w czasie inferencji. Zaznaczyć jednak trzeba, iż mimo możliwości wykorzystania w innych zastosowaniach, układ Myriad X jest dedykowany rozpoznawaniu obrazu. Producent zapewnia także iż NCS2 zapewnia nawet 8-krotny wzrost wydajności w porównaniu z Movidiusem. Ważnym aspektem użytkowym jest także to, że do jednego komputera można podpiąć kilka takich urządzeń i używać ich jednocześnie. Aby móc zacząć korzystać z NCS2 wymagany jest 64bitowy system operacyjny, którym może być Windows 10, Ubuntu w wersji 16.04.03 lub nowszy, lub CentOS w wersji przynajmniej 17.04. Cena pojedynczego urządzenia to około 400zł.

Intel Neural Compute Stick 2 – akcelerowane uczenie maszynowe

Sam sprzęt byłby jednak niczym bez dobrego oprogramowania. Niestety nie jest to produkt, który działa zaraz po wyjęciu z pudelka i podłączeniu do komputera. Aby z niego korzystać potrzebne będą pakiety języka programowania Python, CMake, Microsoft Visual Studia oraz OpenVino. Ich instalacja mimo dobrej dokumentacji ze strony firmy Intel niestety dostarcza problemów w szczególności z kompatybilnością różnych wersji pakietów. Nie są to oczywiście rzeczy, z którymi doświadczony użytkownik sobie nie poradzi, jednak psujące trochę doświadczenia użytkownika.

Eksperyment i wnioski

Ze względu na wcześniejsze doświadczenia z Movidiusem, przeprowadziliśmy eksperyment porównujący wydajność w rozpoznawaniu i klasyfikacji obrazu. W tym celu wykorzystano platformę Google Collaboratory udostępniającą do obliczeń kartę graficzną nVidia K80 oraz przeciętnego laptopa, do którego podłączono NCS1 oraz NCS2. Przygotowany przez nas test był relatywnie prosty. Wytrenowaliśmy sieć neuronową przy użyciu bazy danych ImageNet składających się z ponad 14mln fotografii i za jej pomocą klasyfikowaliśmy i rozpoznawaliśmy zdjęcia ze zbioru testowego, decydując jakiej marki jest dany pojazd (Fiat 126p vs Polonez). Przygotowany w tym celu kod źródłowy na Google Collaboratory znajduje się tutaj.

Tak jak widać w kodzie, wykorzystana została architektura Resnet34, dla której natywna rozdzielczość obrazu to raptem 224x224px. Mimo, że pozornie rozdzielczość ta nie wydaje się wysoka, to w przypadku wykorzystania splotowych sieci neuronowych (CNN) okazuje się ona wystarczająca do wykrycia najważniejszych cech danego zdjęcia oraz wystarczająca do tego, aby można było na podstawie tych cech wnioskować na temat zawartości zdjęcia. Niska rozdzielczość w sposób znaczący jednak ogranicza niezbędną moc obliczeniową. Nasze badanie polegało na przeprowadzeniu klasyfikacji z wykorzystaniem 100 obrazków. Dla każdej predykcji zmierzono czas otrzymania odpowiedzi, a następnie wszystkie te czasy uśredniono.

Intel Neural Compute Stick 2 – akcelerowane uczenie maszynowe

Akcelerator NCS1 zwracał odpowiedź średnio po 0,001s, z kolei karta graficzna Tesla K80 potrzebowała mniej czas, bo średnio było to 0,00001s. W przypadku nowszej wersji układu NCS2 wprawdzie nie udało się osiągnąć obiecywanego ośmiokrotnego przyrostu mocy, to jednak przyrost prędkości jest znaczący - przeszło 5,5 krotny ze średnim czasem odpowiedzi wynoszącym 0,00017s.

Intel Neural Compute Stick 2 – akcelerowane uczenie maszynowe

Nasz test potwierdza nie tylko wyższość NCS2 nad poprzednikiem, ale także uwidacznia to, że nie tylko profesjonaliści, ale i pasjonaci nie ponosząc olbrzymich kosztów są w stanie w domowym zaciszu zajmować się uczeniem maszynowym z rozsądnymi czasami odpowiedzi. Do niewątpliwych zalet NCS2 można zaliczyć na pewno dobrą cenę, dobrą efektywność energetyczną oraz zadowalającą wydajność. Na plus zasługuje także powiązanie z popularnym językiem Python3, a co za tym idzie możliwość korzystania z popularnych platform do uczenia maszynowego. Mimo niewątpliwych zalet urządzenia, nie jest to jedyne rozwiązanie tego typu na rynku. Przed ewentualnym zakupem warto pochylić się także nad alternatywnymi produktami tj. choćby CoralUSB Accelerator, Laceli AI Compute Stick czy choćby rozwiązaniami firmy nVidia z serii Jetson.