Data Science

Programování GPU v Pythonu

Programování GPU v Pythonu

V tomto článku se ponoříme do programování GPU pomocí Pythonu. S využitím jazyka Python můžete odemknout neuvěřitelný výpočetní výkon grafického procesoru grafické karty (grafická procesorová jednotka) vaší grafické karty. V tomto příkladu budeme pracovat s knihovnou CUDA společnosti NVIDIA.

Požadavky

Pro toto cvičení budete potřebovat buď fyzický stroj s Linuxem a GPU založeným na NVIDIA, nebo spustit instanci založenou na GPU na Amazon Web Services. Buď by mělo fungovat dobře, ale pokud se rozhodnete použít fyzický stroj, budete se muset ujistit, že máte nainstalované proprietární ovladače NVIDIA, viz pokyny: https: // linuxhint.com / install-nvidia-drivers-linux

Budete také potřebovat nainstalovanou sadu CUDA Toolkit. Tento příklad používá Ubuntu 16.04 LTS konkrétně, ale pro většinu hlavních distribucí Linuxu jsou k dispozici soubory ke stažení na následující adrese URL: https: // vývojář.nvidia.com / cuda-stahování

Dávám přednost .stahování založené na deb a tyto příklady předpokládají, že jste zvolili tuto cestu. Stažený soubor je .deb balíček, ale nemá .přípona deb, takže ji přejmenujte, aby měla .deb na konci jeho užitečné. Poté jej nainstalujete pomocí:

sudo dpkg -i název-balíčku.deb

Pokud se zobrazí výzva k instalaci klíče GPG, postupujte podle uvedených pokynů.

Nyní budete muset nainstalovat samotný balíček cuda. Chcete-li tak učinit, spusťte:

sudo apt-get update sudo apt-get nainstalovat cuda -y 

Tato část může chvíli trvat, takže možná budete chtít popadnout šálek kávy. Jakmile je hotovo, doporučuji restartovat, abyste se ujistili, že jsou všechny moduly správně načteny.

Dále budete potřebovat distribuci Anaconda Python. Můžete si je stáhnout zde: https: // www.anakonda.com / download / # linux

Popadněte 64bitovou verzi a nainstalujte ji takto:

sh Anaconda *.sh

(hvězdička ve výše uvedeném příkazu zajistí spuštění příkazu bez ohledu na podřízenou verzi)

Výchozí umístění instalace by mělo být v pořádku a v tomto kurzu jej použijeme. Ve výchozím nastavení se instaluje do ~ / anaconda3

Na konci instalace budete vyzváni, abyste se rozhodli, zda chcete přidat Anacondu na svou cestu. Odpovězte zde, abyste usnadnili spouštění potřebných příkazů. Abyste zajistili, že k této změně dojde, odhlaste se a poté se znovu přihlaste ke svému účtu.

Další informace o instalaci aplikace Anaconda: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Nakonec budeme muset nainstalovat Numbu. Numba používá kompilátor LLVM ke kompilaci Pythonu do strojového kódu. To nejen zvyšuje výkon běžného kódu Pythonu, ale také poskytuje lepidlo potřebné k odesílání pokynů na GPU v binární podobě. Chcete-li to provést, spusťte:

conda nainstalovat numba

Omezení a výhody programování GPU

Je lákavé si myslet, že můžeme libovolný program v Pythonu převést na program založený na GPU, což dramaticky zrychlí jeho výkon. GPU na grafické kartě však funguje podstatně odlišně než standardní CPU v počítači.

CPU zpracovávají mnoho různých vstupů a výstupů a mají širokou škálu pokynů pro řešení těchto situací. Jsou také zodpovědní za přístup k paměti, zacházení se systémovou sběrnicí, za manipulaci s ochrannými kroužky, segmentaci a funkci vstupu / výstupu. Jsou to extrémní multitaskery bez konkrétního zaměření.

Naproti tomu GPU jsou konstruovány pro zpracování jednoduchých funkcí s oslnivě vysokou rychlostí. K dosažení tohoto cíle očekávají jednotnější stav vstupu a výstupu. Specializací na skalární funkce. Skalární funkce přijímá jeden nebo více vstupů, ale vrací pouze jeden výstup. Tyto hodnoty musí být typy předdefinované numpy.

Příklad kódu

V tomto příkladu vytvoříme jednoduchou funkci, která vezme seznam hodnot, přidá je dohromady a vrátí součet. Abychom předvedli výkon GPU, spustíme jednu z těchto funkcí na CPU a jednu na GPU a zobrazíme časy. Dokumentovaný kód je uveden níže:

import numpy jako np z timeit import default_timer jako časovač z numba import vectorize # To by měla být podstatně vysoká hodnota. Na mém testovacím stroji trvalo běh přes CPU # 33 sekund a na GPU něco přes 3 sekundy. NUM_ELEMENTS = 100000000 # Toto je verze CPU. def vector_add_cpu (a, b): c = np.nuly (NUM_ELEMENTS, dtype = np.float32) pro i v rozsahu (NUM_ELEMENTS): c [i] = a [i] + b [i] návrat c # Toto je verze GPU. Všimněte si dekorátoru @vectorize. To řekne # numbě, aby z toho udělala vektorizovanou funkci GPU. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): vrátit a + b; def main (): a_source = np.jedny (NUM_ELEMENTS, dtype = np.float32) b_source = np.jedny (NUM_ELEMENTS, dtype = np.float32) # Čas spuštění funkce CPU = timer () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # Čas spuštění funkce GPU = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer () - start # Report krát tisk ("Funkce CPU trvala% f sekund."% vector_add_cpu_time) print (" Funkce GPU zabrala% f sekund."% vector_add_gpu_time) vrátit 0, pokud __name__ ==" __main__ ": main () 

Chcete-li spustit příklad, zadejte:

python gpu-příklad.py

POZNÁMKA: Pokud při spuštění programu narazíte na problémy, zkuste použít „conda install accelerate“.

Jak vidíte, verze CPU běží podstatně pomaleji.

Pokud ne, pak jsou vaše iterace příliš malé. Upravte NUM_ELEMENTS na větší hodnotu (na mně se zdálo, že zlomová značka je kolem 100 milionů). Je to proto, že nastavení GPU zabere malé, ale znatelné množství času, takže aby operace stála za to, je potřeba vyšší pracovní zátěž. Jakmile ji zvýšíte nad prahovou hodnotu pro váš stroj, všimnete si podstatného zlepšení výkonu verze GPU oproti verzi CPU.

Závěr

Doufám, že se vám náš základní úvod do programování GPU v Pythonu líbil. Ačkoli výše uvedený příklad je triviální, poskytuje rámec, který potřebujete, abyste mohli své nápady dále využívat s využitím výkonu vašeho GPU.

Jak používat funkci potrubí v jazyce C
Trubka je médium pro komunikaci mezi procesy. Jeden proces zapisuje data do kanálu a jiný proces čte data z kanálu. V tomto článku uvidíme, jak se fun...
Jak používat funkci mmap v jazyce C?
The mmap () Funkce se používá pro mapování mezi adresovým prostorem procesu a soubory nebo zařízeními. Když je soubor namapován na adresní prostor pro...
Jak používat inotify API v jazyce C
Inotify je linuxové API používané pro monitorování událostí souborového systému. Tento článek vám ukáže, jak se Inotify používá ke sledování vytváření...