Gegevenswetenschap

GPU-programmering met Python

GPU-programmering met Python

In dit artikel duiken we in GPU-programmering met Python. Met het gemak van Python kun je de ongelooflijke rekenkracht van de GPU van je videokaart (grafische verwerkingseenheid) ontgrendelen. In dit voorbeeld werken we met NVIDIA's CUDA-bibliotheek.

Vereisten

Voor deze oefening heb je een fysieke machine met Linux en een op NVIDIA gebaseerde GPU nodig, of je start een op GPU gebaseerde instantie op Amazon Web Services. Beide zouden goed moeten werken, maar als je ervoor kiest om een ​​fysieke machine te gebruiken, moet je ervoor zorgen dat je de eigen NVIDIA-stuurprogramma's hebt geïnstalleerd, zie instructies: https://linuxhint.com/install-nvidia-drivers-linux

Je moet ook de CUDA Toolkit geïnstalleerd hebben. Dit voorbeeld gebruikt Ubuntu 16.04 LTS specifiek, maar er zijn downloads beschikbaar voor de meeste grote Linux-distributies op de volgende URL: https://developer.nvidia.com/cuda-downloads

ik geef de voorkeur aan de .deb-gebaseerde download, en deze voorbeelden gaan ervan uit dat je die route hebt gekozen. Het bestand dat u downloadt is een .deb-pakket maar heeft geen' .deb-extensie, dus hernoem het naar a .deb aan het einde zijn behulpzaam. Dan installeer je het met:

sudo dpkg -i pakketnaam.deb

Als u wordt gevraagd om een ​​GPG-sleutel te installeren, volg dan de instructies die worden gegeven om dit te doen.

Nu moet je het cuda-pakket zelf installeren. Voer hiervoor het volgende uit:

sudo apt-get update sudo apt-get install cuda -y 

Dit onderdeel kan even duren, dus misschien wil je een kopje koffie pakken. Als het klaar is, raad ik aan om opnieuw op te starten om ervoor te zorgen dat alle modules correct opnieuw worden geladen.

Vervolgens heb je de Anaconda Python-distributie nodig. Je kunt dat hier downloaden:  https://www.anaconda.com/download/#linux

Pak de 64-bits versie en installeer deze als volgt:

sh Anaconda*.sh

(de ster in de bovenstaande opdracht zorgt ervoor dat de opdracht wordt uitgevoerd, ongeacht de secundaire versie)

De standaard installatielocatie zou in orde moeten zijn, en in deze tutorial zullen we deze gebruiken. Standaard wordt het geïnstalleerd op ~/anaconda3

Aan het einde van de installatie wordt u gevraagd om te beslissen of u Anaconda aan uw pad wilt toevoegen. Antwoord hier ja om het uitvoeren van de benodigde commando's gemakkelijker te maken. Om ervoor te zorgen dat deze wijziging plaatsvindt nadat het installatieprogramma volledig is voltooid, logt u uit en vervolgens weer in op uw account.

Meer info over het installeren van Anaconda: https://linuxhint.com/install-anaconda-python-on-ubuntu/

Eindelijk moeten we Numba . installeren. Numba gebruikt de LLVM-compiler om Python naar machinecode te compileren. Dit verbetert niet alleen de prestaties van reguliere Python-code, maar biedt ook de lijm die nodig is om instructies in binaire vorm naar de GPU te sturen. Voer hiervoor het volgende uit:

conda installeer numba

Beperkingen en voordelen van GPU-programmering

Het is verleidelijk om te denken dat we elk Python-programma kunnen omzetten in een GPU-gebaseerd programma, waardoor de prestaties aanzienlijk worden versneld. De GPU op een videokaart werkt echter aanzienlijk anders dan een standaard CPU in een computer.

CPU's verwerken veel verschillende inputs en outputs en hebben een breed assortiment aan instructies om met deze situaties om te gaan. Ze zijn ook verantwoordelijk voor toegang tot geheugen, omgaan met de systeembus, omgaan met beveiligingsringen, segmentering en invoer / uitvoer-functionaliteit. Het zijn extreme multitaskers zonder specifieke focus.

GPU's daarentegen zijn gebouwd om eenvoudige functies met verblindend hoge snelheid te verwerken. Om dit te bereiken, verwachten ze een meer uniforme staat van input en output. Door zich te specialiseren in scalaire functies. Een scalaire functie heeft een of meer invoer nodig, maar retourneert slechts één uitvoer. Deze waarden moeten typen zijn die vooraf zijn gedefinieerd door numpy.

Voorbeeldcode:

In dit voorbeeld maken we een eenvoudige functie die een lijst met waarden nodig heeft, deze bij elkaar optelt en de som retourneert. Om de kracht van de GPU te demonstreren, zullen we een van deze functies op de CPU en een op de GPU uitvoeren en de tijden weergeven. De gedocumenteerde code staat hieronder:

importeer numpy als np van timeit importeer default_timer als timer van numba import vectorize # Dit zou een substantieel hoge waarde moeten zijn. Op mijn testmachine duurde dit 33 seconden om via de CPU te draaien en iets meer dan 3 seconden op de GPU. NUM_ELEMENTS = 100000000 # Dit is de CPU-versie. def vector_add_cpu(a, b): c = np.nullen(NUM_ELEMENTS, dtype=np.float32) for i in range(NUM_ELEMENTS): c[i] = a[i] + b[i] return c # Dit is de GPU-versie. Let op de @vectorize decorateur. Dit vertelt # numba om dit om te zetten in een GPU-gevectoriseerde functie. @vectorize(["float32(float32, float32)"], target="cuda") def vector_add_gpu(a, b): retourneer a + b; def main(): a_source = np.degenen(NUM_ELEMENTS, dtype=np.float32) b_source = np.degenen(NUM_ELEMENTS, dtype=np.float32) # Starttijd van de CPU-functie = timer() vector_add_cpu(a_source, b_source) vector_add_cpu_time = timer() - start # Starttijd van de GPU-functie = timer() vector_add_gpu(a_source, b_source) vector_add_gpu_time = timer() - start # Rapport times print("CPU-functie duurde %f seconden." % vector_add_cpu_time) print("GPU-functie duurde %f seconden." % vector_add_gpu_time) retourneer 0 als __name__ == "__main__": main() 

Typ het volgende om het voorbeeld uit te voeren:

python gpu-voorbeeld.py

OPMERKING: als u problemen ondervindt bij het uitvoeren van uw programma, probeer dan "conda install acceleratie" te gebruiken.

Zoals je kunt zien, werkt de CPU-versie aanzienlijk langzamer.

Zo niet, dan zijn je iteraties te klein. Pas de NUM_ELEMENTS aan naar een grotere waarde (bij de mijne leek het break-eventeken rond de 100 miljoen te zijn). Dit komt omdat het instellen van de GPU een kleine maar merkbare hoeveelheid tijd kost, dus om de operatie de moeite waard te maken, is een hogere werkbelasting nodig. Zodra u het boven de drempel voor uw machine brengt, zult u aanzienlijke prestatieverbeteringen van de GPU-versie opmerken ten opzichte van de CPU-versie.

Conclusie

Ik hoop dat je genoten hebt van onze basisintroductie in GPU-programmeren met Python. Hoewel het bovenstaande voorbeeld triviaal is, biedt het het raamwerk dat je nodig hebt om je ideeën verder uit te werken door gebruik te maken van de kracht van je GPU.

Installeer de nieuwste Dolphin Emulator voor Gamecube & Wii op Linux
Met de Dolphin Emulator kun je de door jou gekozen Gamecube- en Wii-spellen spelen op Linux Personal Computers (pc). Omdat het een vrij beschikbare e...
Hoe de GameConqueror Cheat Engine in Linux te gebruiken
Het artikel bevat een handleiding over het gebruik van de GameConqueror cheat-engine in Linux. Veel gebruikers die games op Windows spelen, gebruiken ...
Beste gameconsole-emulators voor Linux
Dit artikel bevat een lijst van populaire emulatiesoftware voor gameconsoles die beschikbaar is voor Linux. Emulatie is een softwarecompatibiliteitsla...