Uczenie maszynowe w systemach wbudowanych

Pojawienie się takich internetowych, interaktywnych usług jak Apple Siri i Amazon Echo zwróciło uwagę konsumentów na rozwój sztucznej inteligencji i uczenia maszynowego. O ile usługi tego typu działają w oparciu o różnorodne systemy wbudowane, najważniejsze algorytmy sztucznej inteligencji musza pracować w chmurze. Ale nie należy się spodziewać, że zawsze tak będzie, gdyż wiele aplikacji uczenia maszynowego powinno w przyszłości pracować bezpośrednio w systemach wbudowanych.

Autonomiczne samochody uczą się, jak radzić sobie z przeszkodami, bazując na dostarczanych im przykładach w ramach symulacji oraz działania w świecie rzeczywistym. Podobnie, roboty mogą teraz być programowane poprzez poruszanie nimi w docelowej aplikacji, zamiast za pomocą tworzenia kodu programu w laboratorium. I o ile wiele z tych systemów mogłoby korzystać z chmury by uzyskać dostęp do pewnych usług, główne algorytmy uczenia maszynowego będą musiały pracować lokalnie, gdyż czas dostępu do chmury byłby zbyt długi.

Będzie też wiele systemów, które po prostu nie będą miały wygodnego dostępu do chmury. Przykładowo, maszyny wiertnicze często zlokalizowane są w odległych miejscach, z dala od szybkiej infrastruktury bezprzewodowej. Ale ich operatorzy coraz częściej zaczynają żądać dostępu do potencjału uczenia maszynowego, by móc mieć większy wgląd w to, co dzieje się z maszynami i wykrywać ewentualne symptomy zbliżających się problemów. Konwencjonalne algorytmy, działające w zamkniętej pętli często nie są na tyle elastyczne by radzić sobie z wieloma potencjalnymi źródłami problemów i interakcjami z otoczeniem. Użycie uczenia maszynowego do nauczenia systemów jak przebiegają interakcje w rzeczywistym świecie pozwoli zwiększyć niezawodność urządzeń.

Monitoring to kolejny obszar, w którym lokalne przetwarzanie danych będzie potrzebne by błyskawicznie identyfikować zagrożenia, ale gdzie można odwoływać się do chmury by wykonywać dodatkowe przetwarzanie danych i sprawdzać informacje w bazach. Np. – by dowiedzieć się, czy konieczne jest podjęcie jakichś dodatkowych akcji. Nawet same łącza bezprzewodowe zaczynają obecnie korzystać z uczenia maszynowego do swojej pracy. Przykładowo, parametry sterujące pracą modemów bezprzewodowych 5G są na tyle złożone, że niektórzy z ich twórców korzystają z uczenia maszynowego by dostrajać je w oparciu o zebrane dotąd doświadczenia i pomiary.

Podobnie jak liczne są potencjalne aplikacje uczenia maszynowego, tak wiele jest podejść do tego tematu. Dziś większość inżynierów pracujących nad sztuczną inteligencją koncentruje się na algorytmach głębokich sieci neuronowych (DNN – Deep Neural Network). To one sprawiły, że sieci neuronowe zaczęły mieć praktyczne zastosowanie w klasyfikacji oraz rozpoznawaniu obrazów i dźwięków, a następnie ich warianty, takie jak konkurujące i rekurencyjne głębokie sieci neuronowe zaczęły mieć znaczenie w zadaniach sterowania w czasie rzeczywistym.

Początkowo, sieci neuronowe miały dosyć płaską strukturę, z nie więcej niż jedną ukrytą warstwą pomiędzy warstwą wejściową a wyjściową, złożonymi z symulowanych neuronów. W połowie lat 2000 badacze opracowali bardziej efektywne techniki szkolenia sieci. O ile proces był wciąż bardzo wymagający pod względem obliczeń, stało się możliwe zwiększenie liczby ukrytych warstw – czasem do setek – i dzięki temu, złożoność danych z którymi sieci neuronowe sobie radzą znacznie wzrosła.

Szybkie przekazywanie danych pomiędzy warstwami neuronów w układzie scalonym

Ilustracja 1: Szybkie przekazywanie danych pomiędzy warstwami neuronów w układzie scalonym

Natura warstw sama w sobie zmieniła się wraz z wprowadzeniem warstw konwolucyjnych i poolingujących. Nie są one łączone w taki sam sposób, jak łączone były warstwy w pierwotnych architekturach sieci. Realizują one lokalne filtrowanie i łączenie wejść, co pomaga w ekstrakcji najważniejszych cech i redukcji liczby sygnałów, dzięki czemu głęboka sieć neuronowa jest w stanie klasyfikować dane o bardzo złożonych wejściach.

Istnieje wiele więcej typów algorytmów uczenia maszynowego. Niektóre systemy mogą korzystać z więcej niż jednej techniki na raz. Co więcej, jednym z obecnie stosowanych podejść w badaniach nad uczeniem maszynowym w krytycznych systemach jest wykorzystanie drugiego algorytmu jako zapasowego. Od momentu ich wprowadzenia, narastały obawy odnośnie niezawodności głębokich sieci neuronowych, pracujących w trudnych warunkach oraz podatności takich sieci na odwrotne przypadki; sytuacje, które spowodują, że wyszkolony system zignoruje lub błędnie rozpozna – np. znaki drogowe. Prostsze algorytmy, które mają bardziej przewidywalne zachowanie, nawet jeśli są mniej zdolne do pracy w zaawansowanych przypadkach, mogą funkcjonować jako zapasowe mechanizmy, zapobiegające niepożądanemu zachowaniu na poziomie całego systemu.

Zanim tworzenie głębokich sieci neuronowych stało się możliwe, często stosowało się maszyny wektorów nośnych (Support Vector Machine – SVM), które miały zastosowanie w klasyfikacji obrazów i sygnałów. Zdolność głębokich sieci neuronowych do radzenia sobie z bardzo skomplikowanymi, opierającymi się na bardzo wielu wejściach danych uczyniły wiele implementacji SVM redundantnymi. Ale w przypadku danych o mniejszej liczbie wymiarów, maszyny wektorów nośnych mogą wciąż być efektywne, szczególnie w systemach kontroli, które mają chaotyczną dynamikę. Maszyny wektorów nośnych traktują swoje dane jako zestaw wielowymiarowych wektorów i próbują określić hiperpłaszczyznę pomiędzy poszczególnymi grupami danych.

Od czasu prowadzenia pierwszych eksperymentów na temat sztucznej inteligencji, znaczenie miały także drzewa decyzyjne. Początkowo były one tworzone ręcznie, za pomocą wiedzy eksperckiej, która pozwalała na definiowanie zasad dla maszyny odnośnie sposobu przetwarzania danych. Metoda „random forest” łączy w sobie koncepcję drzew decyzyjnych z uczeniem maszynowym. Algorytm działa tworząc wiele drzew decyzyjnych w oparciu o dane treningowe, biorąc uśrednione wyjście – typ w przypadku zadań klasyfikacji albo średnią w zadaniach regresji – i podaje tę pojedynczą wartość.

Drzewa decyzyjne stworzone w oparciu o dane treningowe

lustracja 2: Drzewa decyzyjne stworzone w oparciu o dane treningowe – źródło: Premier Farnell

Procesy gaussowskie to kolejne narzędzie uczenia maszynowego, które może być użyte jako zapasowe względem głębokich sieci neuronowych, ponieważ bazuje na teorii prawdopodobieństwa i w związku z tym nie tylko podaje szacunki w oparciu o dane treningowe, ale też jest w stanie określić pewność swojej predykcji. Wykorzystanie tej informacji pozwala na bardziej ostrożne traktowanie wyjścia z systemu uczenia maszynowego i podejmowanie odpowiednich działań.

Kluczowym problemem w implementacji uczenia maszynowego w systemach wbudowanych, dotyczących wszystkich, oprócz jedynie najprostszych technik, jest wydajność. Kluczem do przyjęcia głębokich sieci neuronowych przez środowisko naukowe, a następnie przez głównych operatorów chmur, był sposób, w jaki przetwarzanie danych mogło zostać przyspieszone przez jednostki obliczeniowe zaawansowanych kart graficznych. Liczne, równolegle pracujące jednostki zmiennoprzecinkowe, dostępne w GPU, pozwalają uzyskać znacznie większą przepustowość na potrzeby typowych zadań głębokich sieci neuronowych, zarówno w trakcie uczenia, jak i docelowego używania. W świecie systemów wbudowanych, dostawcy tacy jak nVidia z jej układem Tegra X1 oraz NXP w ramach rodziny i.MX, wprowadzają jednostki GPU, które są w stanie przetwarzać zadania głębokich sieci neuronowych i innych intensywnych obliczeniowo obciążeń.

Obawą użytkowników jednostek GPU, stosowanych na potrzeby uczenia maszynowego jest zużycie energii. Relatywnie mała ilość lokalnej pamięci, do której dostęp mają rdzenie obliczeniowe, może powodować że konieczna staje się wymiana wielu danych z główną pamięcią. Aby pomóc poradzić sobie z wymaganiami co do pamięci, operatorzy serwerów w chmurze poszukują procesorów specjalizowanych pod kątem dostępu do pamięci w sposób taki, w jaki robią to głębokie sieci neuronowe, co pozwoli ograniczyć ilość energii zużywaną na odwoływanie się do zewnętrznej pamięci RAM. Przykładem jest układ Google Tensorflow Processing Unit (TPU). Podobne, specjalizowane procesory są obecnie wprowadzane na potrzeby systemów wbudowanych. Przykładem jest procesor do uczenia maszynowego, dostępny w ramach platformy Qualcomm SnapDragon.

Specjalizowane układy na potrzeby głębokich sieci neuronowych korzystają z optymalizacji, które są możliwe dla typowych aplikacji wbudowanych. W typowym scenariuszu, szkolenie wymaga znacznie większej liczby obliczeń, niż korzystanie z gotowej sieci. W rezultacie coraz częstszym sposobem stosowanym do uczenia maszynowego w systemach wbudowanych jest przekazać szkolenie serwerowi pracującemu w chmurze, a sprzętowi docelowemu powierzyć jedynie pracy gotowej sieci.

Naukowcy odkryli, że pełna rozdzielczość, oferowana przez jednostki zmiennoprzecinkowe GPU i procesorów ogólnego przeznaczenia, nie jest potrzebna w wielu sytuacjach normalnej pracy sieci neuronowej. Skuteczność w przypadku wielu głębokich sieci neuronowych jedynie nieznacznie spada przy zastosowaniu aproksymacji. Oznacza to, że można zredukować rozdzielczość obliczeń do 8 bitów, albo nawet do mniejszej. Niektóre głębokie sieci neuronowe korzystają wręcz z wag przypisanych neuronom, które mogą przyjmować tylko jedną z dwóch czy trzech dyskretnych wartości.

Kolejną optymalizacją jest przycinanie sieci. Bazuje ono na analizie sieci po jej wyszkoleniu, by zlikwidować te połączenia pomiędzy neuronami, które mają mały albo niemal żaden wpływ na wyjście. Usunięcie ich pozwala uniknąć wykonywania niepotrzebnych obliczeń i dodatkowo znacząco zmniejsza ilość energii zużywanej na dostęp do pamięci.

Układy programowalne FPGA mają cechy, które sprawiają, że optymalizacje takie jak wprowadzenie obliczeń przybliżonych świetnie usprawniają pracę w docelowej aplikacji. O ile układy z rdzeniem ARM i inne implementacje mikroprocesorów mogą teraz wykonywać pojedyncze instrukcje na wielu danych, zoptymalizowanych pod kątem liczb całkowitych o małej rozdzielczości – nawet zmniejszonej do 8 bitów, układy FPGA można dostosowywać z dokładnością do pojedynczych bitów. Wg firmy Xilinx, redukcja precyzji z pracy na liczbach 8-bitowych do liczb 1-bitowych, 40-krotnie zmniejsza wykorzystanie komórek LUT układu FPGA.

Platformy takie jak Ultra96board sprawiają, że możliwe jest rozdzielenie przetwarzania danych pomiędzy uniwersalny procesor i obwody programowalne, przy jednoczesnym wsparciu komunikacji pomiędzy jednym a drugim. Bazujące na układzie Xilinx Zynq UltraScale+ MPSoC, platformy te pozwalają na łatwe wdrożenie złożonych, głębokich sieci neuronowych, które korzystają ze specjalnych warstw neuronów. Komórki FPGA wewnątrz układu MPSoC mogą zajmować się realizacją warstw konwolucyjnych i poolingujących oraz wykonywaniem porównań, podczas gdy rdzeń ARM, pracujący pod kontrolą systemu operacyjnego, bazującego na Linuksie i z użyciem dodatkowego oprogramowania, zarządza przepływem danych i przetwarza dane warstw, które cechują się mniej przewidywalnymi odwołaniami do pamięci.

Wewnątrz komórek FPGA takich platform jak płytki Ultra96board, projektanci mogą wprogramowywać obwody DSP, które da się skonfigurować tak, by pracowały jako podwójne 8-bitowe procesory dla liczb całkowitych oraz jako tablice do logicznych obliczeń binarnych lub w systemie o trzech dopuszczalnych wartościach. Kluczową korzyścią, płynącą z wykorzystania programowalnego sprzętu jest możliwość łączenia warstw. Jednostki arytmetyczne można ze sobą połączyć bezpośrednio lub poprzez pamięć RAM, dzięki czemu wyniki obliczeń każdej warstwy są przekazywane dalej bez konieczności stosowania zewnętrznej pamięci, jako bufora. O ile algorytmy uczenia maszynowego mogą być skomplikowane do stworzenia, środowisko naukowe przyjęło idee kodu o otwartych źródłach. W rezultacie istnieje wiele bezpłatnych pakietów, które projektanci mogą wykorzystać by stworzyć własne systemy, przy czym trzeba mieć na uwadze, że większość z tych programów została opracowana z myślą o platformach serwerowych. Producenci tacy jak Xilinx sprawili, że użytkownicy mogą przenosić swoje sieci neuronowe prosto do układów FPGA. Przykładowo, pakiet Xilinx ML Suite może skorzystać z modelu sieci neuronowej Caffe, który został wyszkolony na komputerze stacjonarnym lub w środowisku serwerowym i przenieść go do docelowej platformy, opartej o układ Zynq. Konwerter dzieli algorytmy przetwarzania na kod kompilowany na procesor ARM i na wstępnie zoptymalizowaną, konwolucyjną sieć neuronową, ładowaną do wnętrza komórek FPGA.

xFdnn: Direct Deep Learning Inference środowiska Caffe

Ilustracja 3: xFdnn: Direct Deep Learning Inference środowiska Caffe

W przypadku uczenia maszynowego, ale takiego, które nie bazuje na głębokich sieciach neuronowych, twórcy mogą uzyskać dostęp do szerokiego wyboru algorytmów, a w tym do maszyn wektorów nośnych i implementacji algorytmów typu random forest. Są one dostępne w ramach bibliotek z otwartymi źródłami. Większość tych bibliotek jest przygotowana w języku Python, zamiast w C/C++, mimo że to ten drugi zestaw języków cieszy się większą popularnością w systemach wbudowanych. Jednakże rosnąca popularność Linuksa sprawia, że kod Pythona można względnie łatwo załadować w docelowym środowisku i uruchomić w ramach systemu wbudowanego.

Dzięki połączeniu wysoce wydajnego sprzętu i dostępności narzędzi, które umożliwiają prototypowanie, uczenie maszynowe staje się rzeczywistością także w systemach wbudowanych.

Uczenie maszynowe w systemach wbudowanych - Data publikacji: 15 października 2018 r. przez Farnell