Datalogi

GPU-programmering med Python

GPU-programmering med Python

I denne artikel dykker vi ned i GPU-programmering med Python. Ved hjælp af Pythons lethed kan du låse op for den utrolige computerkraft på dit grafikkorts GPU (grafikbehandlingsenhed). I dette eksempel arbejder vi med NVIDIAs CUDA-bibliotek.

Krav

Til denne øvelse skal du enten bruge en fysisk maskine med Linux og en NVIDIA-baseret GPU eller starte en GPU-baseret forekomst på Amazon Web Services. Enten skal fungere fint, men hvis du vælger at bruge en fysisk maskine, skal du sørge for at have de NVIDIA-proprietære drivere installeret, se instruktioner: https: // linuxhint.com / install-nvidia-drivers-linux

Du skal også have CUDA Toolkit installeret. Dette eksempel bruger Ubuntu 16.04 LTS specifikt, men der er downloads tilgængelige til de fleste større Linux-distributioner på følgende URL: https: // udvikler.nvidia.com / cuda-downloads

Jeg foretrækker .deb-baseret download, og disse eksempler antager, at du valgte den rute. Den fil, du downloader, er en .deb-pakke, men har ikke en .deb-udvidelse, så at omdøbe den til at have en .deb i slutningen hans hjælpsomme. Derefter installerer du det med:

sudo dpkg -i pakke-navn.deb

Hvis du bliver bedt om at installere en GPG-nøgle, skal du følge instruktionerne for at gøre det.

Nu skal du installere selve cuda-pakken. For at gøre det skal du køre:

sudo apt-get opdater sudo apt-get install cuda -y 

Denne del kan tage et stykke tid, så du vil måske få fat i en kop kaffe. Når det er gjort, anbefaler jeg genstart for at sikre, at alle moduler genindlæses korrekt.

Dernæst skal du bruge Anaconda Python-distributionen. Du kan downloade det her: https: // www.anakonda.com / download / # linux

Tag fat i 64-bit versionen og installer den sådan:

sh Anaconda *.sh

(stjernen i ovenstående kommando vil sikre, at kommandoen køres uanset den mindre version)

Standardinstallationsplaceringen skal være fin, og i denne vejledning bruger vi den. Som standard installeres det til ~ / anaconda3

I slutningen af ​​installationen bliver du bedt om at beslutte, om du vil tilføje Anaconda til din sti. Svar ja her for at gøre det nemmere at køre de nødvendige kommandoer. For at sikre, at denne ændring finder sted, når installationsprogrammet er færdig, skal du logge ud og derefter logge ind på din konto igen.

Mere info om installation af Anaconda: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Endelig skal vi installere Numba. Numba bruger LLVM-kompilatoren til at kompilere Python til maskinkode. Dette forbedrer ikke kun ydeevnen for almindelig Python-kode, men giver også den nødvendige lim til at sende instruktioner til GPU'en i binær form. For at gøre dette skal du køre:

conda installere numba

Begrænsninger og fordele ved GPU-programmering

Det er fristende at tro, at vi kan konvertere ethvert Python-program til et GPU-baseret program, hvilket dramatisk fremskynder dets ydeevne. GPU'en på et grafikkort fungerer dog betydeligt anderledes end en standard CPU på en computer.

CPU'er håndterer mange forskellige input og output og har et bredt udvalg af instruktioner til håndtering af disse situationer. De er også ansvarlige for adgang til hukommelse, håndtering af systembussen, håndtering af beskyttelsesringe, segmentering og input / output-funktionalitet. De er ekstreme multitaskere uden specifikt fokus.

GPU'er er derimod bygget til at behandle enkle funktioner med blændende hurtig hastighed. For at opnå dette forventer de en mere ensartet tilstand af input og output. Ved at specialisere sig i skalære funktioner. En skalarfunktion tager en eller flere input, men returnerer kun en enkelt output. Disse værdier skal være typer, der er foruddefineret med numpy.

Eksempel kode

I dette eksempel opretter vi en simpel funktion, der tager en liste over værdier, tilføjer dem sammen og returnerer summen. For at demonstrere kraften i GPU'en kører vi en af ​​disse funktioner på CPU'en og en på GPU'en og viser tidspunkterne. Den dokumenterede kode er nedenfor:

importer numpy som np fra timeit import default_timer som timer fra numba import vectorize # Dette skal være en væsentlig høj værdi. På min testmaskine tog det # 33 sekunder at køre via CPU'en og lidt over 3 sekunder på GPU'en. NUM_ELEMENTS = 100000000 # Dette er CPU-versionen. def vector_add_cpu (a, b): c = np.nuller (NUM_ELEMENTS, dtype = np.float32) for i inden for rækkevidde (NUM_ELEMENTS): c [i] = a [i] + b [i] return c # Dette er GPU-versionen. Bemærk @vectorize-dekoratøren. Dette fortæller # numba at gøre dette til en GPU-vektoriseret funktion. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): returner a + b; def main (): a_source = np.dem (NUM_ELEMENTS, dtype = np.float32) b_source = np.dem (NUM_ELEMENTS, dtype = np.float32) # Tid CPU-funktion start = timer () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # Tid GPU-funktion start = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer () - start # Rapport gange udskrivning ("CPU-funktion tog% f sekunder."% vector_add_cpu_time) print (" GPU-funktion tog% f sekunder."% vector_add_gpu_time) return 0 if __name__ ==" __main__ ": main () 

For at køre eksemplet skal du skrive:

python gpu-eksempel.py

BEMÆRK: Hvis du støder på problemer, når du kører dit program, så prøv at bruge "conda install accelerate".

Som du kan se, kører CPU-versionen betydeligt langsommere.

Hvis ikke, så er dine gentagelser for små. Juster NUM_ELEMENTS til en større værdi (på min. Syntes breakeven-mærket at være omkring 100 millioner). Dette skyldes, at opsætningen af ​​GPU'en tager en lille, men mærkbar tid, så for at gøre operationen det værd, er der behov for en højere arbejdsbyrde. Når du først hæver det over tærsklen for din maskine, vil du bemærke betydelige forbedringer af GPU-versionen i forhold til CPU-versionen.

Konklusion

Jeg håber, du har nydt vores grundlæggende introduktion til GPU-programmering med Python. Selvom eksemplet ovenfor er trivielt, giver det den ramme, du har brug for for at tage dine ideer videre ved at udnytte kraften i din GPU.

Sådan fjernes filer i Linux
Tjære er et ganske populært arkivformat, især på Linux. I mange tilfælde bruger distroer tjærearkiver til at levere pakkeopdateringer. Tjærearkiver er...
Top 10 filkomprimeringsværktøjer på Linux
Overførsel af filer mellem en computer til en anden eller lagring af dem er en vigtig opgave for både normale og professionelle brugere. Nogle gange e...
Sådan udtrækkes og åbnes en .gz-fil i Linux-kommandolinjen
Vi ved, at en fil i et computersystem kan være så lille som et par Bytes eller så stor som tusind Gigabyte. Når du vil sende en fil fra den ene ende t...