artykuły

Praktyczne zastosowania sztucznej inteligencji w komputerze osobistym

15
7 marca 2020, 14:01 Mateusz Brzostek

Trzy rodzaje przyspieszania SI w Ice Lake

Choć strona internetowa Intela informuje o „mocy SI w laptopach z procesorami dziesiątej generacji”, w rzeczywistości chodzi o różne funkcje w różnych procesorach oraz rozwiązania programowe, które mogą działać na każdym sprzęcie, nawet nie-Intela. Najwięcej sprzętowych cech umożliwiających akcelerację SI mają procesory z rodziny Ice Lake, czyli wybrane modele spośród wszystkich nazywanych marketingowo „dziesiątej generacji”.

Intel DL Boost – zestaw instrukcji AVX512-VNNI

Rdzenie x86 o mikroarchitekturze Sunny Cove oraz Cascade Lake mogą wykonywać instrukcje z zestawu AVX512-VNNI (skrót od Vector Neural Network Instructions). To tylko dwie instrukcje w różnych wariantach: VPDPBUSD oraz VPDPWSSD. Obie są formą wektorowego mnożenia połączonego z dodawaniem (FMA). Pierwsza z nich pozwala pomnożyć 64 8-bitowe liczby całkowite z pierwszego operandu przez inne 64 liczby 8-bitowe z drugiego operandu, zsumować wyniki grupami po cztery, i dodać każdy do 32-bitowej liczby zmiennoprzecinkowej z trzeciego operandu.

Druga instrukcja robi to samo, ale z 16-bitowymi liczbami zmiennoprzecinkowymi; obie mają też wersje 256-bitowe i 128-bitowe oraz z nasyceniem lub bezW arytmetyce bez nasycenia, jeśli wynik przekracza zakres, jaki można przechowywać w danym rejestrze, „licznik się przekręca” – zapisywane są tylko najmłodsze bity. W arytmetyce z nasyceniem wynik przyjmuje maksymalną lub minimalną wartość, czyli tą spośród możliwych do przedstawienia, która jest najbliższa prawdzie.. Jeśli to wygląda na bardzo wąsko wyspecjalizowane operacje, to dlatego, że tak jest: jedna z tych instrukcji może zastąpić sekwencję trzech instrukcji z podstawowego zestawu AVX512, która niezwykle często występuje w mnożeniu tensorów. Oczywiście nie ma wzrostu wydajności za darmo. Mnożenie spakowanych 8-bitowych liczb może być 4 razy szybsze od mnożenia 32-bitowych liczb zmiennoprzecinkowych, ale tylko wtedy, kiedy nie potrzebujemy wysokiej precyzji. Tak się składa, że we wnioskowaniu na podstawie sieci neuronowych można zwykle obniżyć precyzję do 8-bitowej bez utraty trafności, ale model musi być odpowiednio przygotowany. Również organizacja danych w pamięci musi być odpowiednia, żeby przepustowość RAM-u i pamięci podręcznej nie były ograniczeniem.

Instrukcje AVX512-VNNI oczywiście mogą być wykorzystane bezpośrednio przez kompilator lub programistę, ale w praktyce służą głównie do przyspieszania aplikacji używających bibliotek OpenVINO. Te zawierają zoptymalizowane przez Intela sposoby wykonywania potrzebnych we wnioskowaniu operacji. Innymi słowy, żeby uzyskać jakąś korzyść z AVX512-VNNI, trzeba przygotować sieć neuronową i skompilować aplikację z myślą o tym.

Obliczenia na GPU

Drugim sposobem na przyspieszenie obliczeń związanych z sieciami neuronowymi jest wykorzystanie GPU. To nic nowego w świecie SI: procesory graficzne są od dawna wykorzystywane jako akceleratory, zarówno uczenia jak i wnioskowania. Mnożenie i dodawanie mnóstwa liczb to coś, do czego są stworzone. Jak wszystkie nieprofesjonalne GPU, Gen11 jest przystosowany najlepiej do obliczeń z precyzją FP16. 32-bitowe liczby zmiennoprzecinkowe może obrabiać 8 razy wolniejW kartach profesjonalnych ten stosunek to 1:2, w Radeonie VII: 1:4, w większości konsumenckich kart AMD: 1:16, w konsumenckich kartach Nvidii: 1:32..

Układ graficzny w procesorach Ice Lake jest zbudowany w architekturze o nazwie roboczej Gen11 i jest lepiej przystosowany do obliczeń, niż inne zintegrowane GPU Intela. Po pierwsze, GPU Gen11 mają znacznie więcej jednostek obliczeniowych, niż odpowiadające im GPU poprzedniej generacji. Podczas gdy GPU w procesorach Skylake, Coffee Lake i Comet Lake miały od 12 do 48 jednostek obliczeniowych (w zależności od modelu), w Ice Lake to od 32 do 64 jednostek.

EU są pogrupowane po 8 (subslice), a 8 takich grup tworzy plaster (slice). W GPU Intela poprzedniej generacji maksymalnie 24 EU miały wspólną pulę pamięci podręcznej, a w Gen11 nawet 64 EU ma wspólną L3 (chodzi o 3. poziom pamięci podręcznej GPU, odrębny od wspólnej dla rdzeni CPU i GPU pamięci podręcznej całego układu). Dzięki temu każdy wątek ma potencjalnie dostęp do większej puli pamięci podręcznej i może również tą drogą wymienić dane z większą liczbą innych wątków.

GPU Gen11 jest wykorzystywane do obliczeń za pomocą API OpenCL. W bibliotekach Intela nie wszystkie operacje często spotykane w sieciach neuronowych mogą być przyspieszane przez GPU – niektóre muszą być wykonane przez procesor. Wymiana danych między CPU a GPU może się odbywać za pośrednictwem wspólnej pamięci i mechanizmu zero-copy, w którym obszar pamięci jest przekazywany pod kontrolę drugiego urządzenia bez kopiowania danych. Nawet ta technika zajmuje trochę czasu i wymaga przerwania obliczeń, dlatego użycie obliczeń na GPU w Ice Lake wymaga starannej optymalizacji, żeby dało dobry efekt.

GNA i akceleracja przetwarzania głosu

Trzecim sposobem na przyspieszanie sieci neuronowych w Ice lake jest wykorzystanie GNA – Gaussian Neural Accelerator. Nazwa pochodzi od gaussian mixture model, techniki matematycznej i statystycznej, która pozwala modelować populację statystyczną jako sumę kilku mniejszych populacji, każdej o rozkładzie normalnym (Gaussa). GMM jest wykorzystywany do rozpoznawania, co w strumieniu dźwięku jest hałasem, a co mową, oraz do dzielenia głosek na kategorie. Większość współczesnych metod rozpoznawania mowy wykorzystuje tę technikę.

Czerwona linia to rozkład wszystkich zebranych punktów danych. Przerywane linie przedstawiają trzy osobne populacje, każdą o rozkładzie normalnym, które – jak zakładamy – utworzyły zaobserwowany stan.

GNA to rozwinięta wersja akceleratora GMM wbudowanego w procesory Skylake. Tamten był prymitywniejszy i w mniejszym stopniu programowalny. GNA wbudowano w procesory z rodzin Ice Lake Cannon Lake oraz Gemini Lake (Pentium Silver 5000 i inne). Ten akcelerator działa jako koprocesor wbudowany w SoC w pobliżu obecnego w większości procesorów Intela kontrolera multimediów. Nie jest częścią GPU ani CPU, nie jest podłączony do magistrali pierścieniowej i nie korzysta ze wspólnej pamięci podręcznej LLC.

GNA jest celowo wyodrębniony w taki sposób: to ma umożliwić przełączenie rdzeni CPU w stan uśpienia, podczas gdy kontroler multimediów i GNA nasłuchują, i oszczędzenie energii. W przeciwnym przypadku czuwający komputer, oczekując na polecenie głosowe, musiałby cały czas wykorzystywać CPU do analizowania napływających danych.

GNA działa jak typowy koprocesor podłączony do łącza PCI-E. Wymaga osobnego sterownika; topologia sieci neuronowej jest mu przekazywana przez procesor, a dane wejściowe są pobierane z kontrolera multimediów. GNA jest taktowany z prędkością 400 MHz (duże procesory: Ice Lake i Cannon Lake) lub 200 MHz (małe procesory: Pentium, Celeron, Atom). W przeprowadzonych przez Intela eksperymentach z GNA, uzyskuje trafny wynik 3-krotnie szybciej niż 1-gigahercowy rdzeń Atom, a do tego zużywa mniej energii.

Choć GNA jest w pewnym stopniu programowalny i może służyć do różnych zadań, jest wykorzystywany tylko do rozpoznawania mowy. Można przyspieszyć swoją aplikację z tej dziedziny używając bibliotek Kaldi i OpenVINO.

 

Trzy wymienione techniki przyspieszania wnioskowania na podstawie sieci neuronowych są w dużym stopniu rozłączne; występują w różnych kombinacjach i w różnych procesorach i są zwykle używane jedna na raz.

2