Implementacja sieci neuronowych na karcie graficznej

Transkrypt

Implementacja sieci neuronowych na karcie graficznej
Implementacja sieci
neuronowych na karcie graficznej
Waldemar Pawlaszek
Motywacja
Czyli po co to wszystko?
Motywacja
Procesor graficzny
GPU (Graphics Processing Unit)
• Wydajność
• Elastyczność i precyzja
Motywacja
Wydajność
• 3 GHz Pentium 4
teoretycznie: 6 GFLOPs
• GeForce FX 5900
Zaobserwowano: 20 GFLOPs
• GeForce 6800 Ultra
Zaobserwowano: 40 GFLOPs
Motywacja
Wydajność
•
CPU
•
Roczny wzrost mocy ~1.5x / dziesięciolecie ~60x
(Prawo Moora)
•
GPU
•
Roczny wzrost mocy >2x / dziesięciolecie ~1000x
(Znacznie szybciej niż prawo Moora)
Motywacja
Wydajność
Dlaczego GPU jest wydajniejszy?
•
•
Specjalizacja
Ekonomia
Motywacja
Elastyczność
•
Potok graficzny jest wysoce
programowalny
•
Programowanie w językach wysokiego
poziomu
Motywacja
Precyzja
•
32-bitowe obliczenia
zmiennoprzecinkowe w całym potoku
Wady
•
•
•
Trudne w użyciu
GPU jest zaprojektowany do obliczeń
graficznych
Obliczenia są z natury równoległe
Kody z CPU nie można po prostu
„przeportować”
Wady
Trudne w użyciu
(częściowy ratunek)
BrookGPU
http://graphics.stanford.edu/projects/brookgpu/
Zapewnia abstrakcje od warstwy graficznej
Przykłady
GPGPU
Programowanie ogólnego przeznaczenia
wykorzystując sprzęt graficzny
http://www.gpgpu.org/
Architektura
Procesor graficzny służy do rysowania
prymitywów w prostokątnym obszarze
pamięci
•
•
•
Punkty
Proste
Trójkąty
Dwie jednostki
•
Jednostka wierzchołków
oblicza docelowe pozycje
i parametry prymitywów
•
Jednostka fragmentów
oblicza wartość
dla każdego elementu prymitywu
Przebieg rysowania
Wierzchołki po
transformacjach
Składanie
prymitywów
Rasteryzacja
Interpolacja
danych
wierzchołków
Program
wierzchołków
Przebieg rysowania
Wierzchołki po
transformacjach
Składanie
prymitywów
Wykonywany
raz na wierzchołek
Rasteryzacja
Program
fragmentów
Interpolacja
danych
wierzchołków
Wykonywany
raz na fragment
Schemat potoku rysującego
Interpolacja
danych
Aplikacja
Program
wierzchołków
Dane z bufora
wierzchołków
Program
fragmentów
Dane z tekstur
Bufor
docelowy
To tylko rysowanie.
Jak to może nam pomóc w obliczeniach?
Cała moc tkwi w procesorze fragmentów:
Możemy generować jedną macierz
(bufor docelowy)
na podstawie wielu macierzy wejściowych
(tekstur)
To tylko rysowanie.
Jak to może nam pomóc w obliczeniach?
Dla każdego pola macierzy docelowej
wywoływany jest osobny program
mogący zapisywać tylko do tego pola.
Jak to wygląda w praktyce?
Procesorem wierzchołków nie interesujemy
się za bardzo.
(0,1)
(1,1)
Konfigurujemy go, aby rysował
dwa trójkąty o takich
współrzędnych, aby zapełnić
cały bufor docelowy.
oraz
(0,0)
(1,0)
aby przekazywał na wejście
procesora fragmentów pozycję
obliczanego punktu
Przykład prostego kodu fragmentów
void main (float2 vPos
:TEXCOORD0,
out float4 oColor :COLOR0)
{
oColor = float4(vPos, 0, 0);
}
Przykład prostego kodu fragmentów
sampler s0;
void main (float2 vPos
:TEXCOORD0,
out float4 oColor :COLOR0)
{
oColor = tex2D(s0, vPos);
}
Przykład prostego kodu fragmentów
sampler s0;
void main (float2 vPos
:TEXCOORD0,
out float4 oColor :COLOR0)
{
oColor = 1 - tex2D(s0, vPos);
}
Przykład prostego kodu fragmentów
sampler s0;
void main (float2 vPos
:TEXCOORD0,
out float4 oColor :COLOR0)
{
oColor = tex2D(s0, vPos * 2);
}
Przykład prostego kodu fragmentów
sampler s0;
sampler s1;
void main (float2 vPos
out float4 oColor
{
if (vPos.x < 0.5)
oColor = tex2D(s0,
else
oColor = tex2D(s1,
}
:TEXCOORD0,
:COLOR0)
vPos);
vPos);
Przykład prostego kodu fragmentów
sampler s0;
sampler s1;
void main (float2 vPos
:TEXCOORD0,
out float4 oColor :COLOR0)
{
oColor = tex2D(s0, vPos)
+ tex2D(s1, vPos);
}
Co można obliczać?
• Kod procesora fragmentów może zawierać
praktycznie dowolne operacje
zmiennoprzecinkowe
• Na wejściu można ustawić do 16 tekstur
• Ograniczeniem jest limit instrukcji
W najnowszych kartach wynosi on 512 instrukcji. Można
jednak robić pętle i podprocedury. Limit instrukcji
wykonywanych dla jednego fragmentu to 65535
Co można obliczać?
Procesor fragmentów może operować na wielu
formatach danych:
• 8-bitowe liczby naturalne widziane jako liczby z
przedziału 0.0 – 1.0
• 16-bitowe liczby zmiennoprzecinkowe
• 32-bitowe liczny zmiennoprzecinkowe
A teraz sieci neuronowe
sumator
funkcja aktywacji
np. funkcja sigmoidalna
W sieciach jednokierunkowych
•
•
•
Wyjście każdego neuronu obliczane jest niezależnie
Obliczenia sprowadzają się do wymnożenia macierzy
przez wektor (i dodania biasu) oraz zaaplikowania do
wyniku nieliniowej funkcji aktywacji
Przy wielu danych wejściowych obliczenia możemy
złożyć do mnożenia macierzy
Wagi jako macierz
M – ilość wyjść (ilość neuronów w warstwie)
N – ilość wejść (wielkość danych wejściowych)
Dane wejściowe jako macierz
L – ilość danych wejściowych (wektorów wejściowych)
N – ilość wejść (wielkość danych wejściowych)
Bias jako macierz
M – ilość wyjść (ilość neuronów w warstwie)
Wynik sumatora
Ogólny przebieg mnożenia macierzy
Kod dla pojedynczego fragmentu
(w uproszczeniu)
sampler sX;
sampler sW;
sampler sB;
float N, beta;
void main (float2 vPos
: TEXCOORD0,
out float4 oColor : COLOR0)
{
float s = 0;
for (int i = 0; i < N; i++)
s += tex2D(sX, float2(vPos.x, i/N))
* tex2D(sW, float2(i/N, vPos.y));
s += tex1D(sB, pos.y);
oColor.x = 1/(1+exp(beta*s));
}
Co w przypadku wielu warstw?
• Wynikiem działania procesora fragmentów jest
bufor, który można użyć jako tekstury.
• Wystarczy zastosować kilka przebiegów.
Jakieś wyniki?
Kyoung-Su Oh i Keechul Jung
w pracy
„GPU implementation of neural networks”
podają, że karta
RADEON 9700 PRO
liczyła 20-razy szybciej niż procesor
(Ale nie podali jaki)
Jakieś wyniki?
Teoretyczne wyliczenia szybkości obliczeń nie
uwzględniają często ilości czytań z tekstury
(które jednak jest kosztowne) oraz czasu
potrzebnego na załadowanie danych do karty
graficznej oraz odebrania wyników (z tym jest
coraz lepiej: PCI-E).
Dla zainteresowanych
http://developer.nvidia.com
http://developer.ati.com
http://www.gpgpu.org
Inne ciekawe obliczenia na GPU
Symulacja płynów metodą
Naviera-Stokesa
~120 fps
przy rozmiarach 256x256
na GeForce 6800 Ultra
Inne ciekawe obliczenia na GPU
Symulacja oddziaływań
N-Ciał
Metoda Brute force
N = 4096 cząsteczek
N2 obliczeń grawitacji
16M obliczeń siły / ramke
~25 instrukcji
zminnoprzecinkowych na siłę
17 ramek na sekundę

Podobne dokumenty