Scienza dei dati

Programmazione GPU con Python

Programmazione GPU con Python

In questo articolo, ci addentreremo nella programmazione GPU con Python. Utilizzando la semplicità di Python, puoi sbloccare l'incredibile potenza di calcolo della GPU (unità di elaborazione grafica) della tua scheda video. In questo esempio, lavoreremo con la libreria CUDA di NVIDIA.

Requisiti

Per questo esercizio, avrai bisogno di una macchina fisica con Linux e una GPU basata su NVIDIA oppure di avviare un'istanza basata su GPU su Amazon Web Services. Entrambi dovrebbero funzionare bene, ma se scegli di utilizzare una macchina fisica, dovrai assicurarti di avere i driver proprietari NVIDIA installati, vedi le istruzioni: https://linuxhint.com/install-nvidia-drivers-linux

Avrai anche bisogno di CUDA Toolkit installato. Questo esempio usa Ubuntu 16.04 LTS in particolare, ma sono disponibili download per la maggior parte delle principali distribuzioni Linux al seguente URL: https://developer.nvidia.com/cuda-downloads

io preferisco il .download basato su deb e questi esempi presumeranno che tu abbia scelto quella rotta. Il file che scarichi è un .pacchetto deb ma non ha un .deb, quindi rinominandolo per avere a .deb alla fine è utile. Quindi lo installi con:

sudo dpkg -i nome-pacchetto.deb

Se ti viene chiesto di installare una chiave GPG, segui le istruzioni fornite per farlo.

Ora dovrai installare il pacchetto cuda stesso. Per farlo, esegui:

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

Questa parte può richiedere un po' di tempo, quindi potresti voler prendere una tazza di caffè. Al termine, ti consiglio di riavviare per assicurarti che tutti i moduli vengano ricaricati correttamente.

Successivamente, avrai bisogno della distribuzione Anaconda Python. Puoi scaricarlo qui:  https://www.anaconda.com/download/#linux

Prendi la versione a 64 bit e installala in questo modo:

sh Anaconda*.sh

(la stella nel comando sopra assicurerà che il comando venga eseguito indipendentemente dalla versione secondaria)

Il percorso di installazione predefinito dovrebbe andare bene e in questo tutorial lo useremo. Per impostazione predefinita, si installa su ~/anaconda3

Alla fine dell'installazione, ti verrà chiesto di decidere se desideri aggiungere Anaconda al tuo percorso. Rispondi sì qui per rendere più semplice l'esecuzione dei comandi necessari. Per garantire che questa modifica abbia luogo, al termine del programma di installazione, disconnettiti, quindi accedi nuovamente al tuo account.

Maggiori informazioni sull'installazione di Anaconda: https://linuxhint.com/install-anaconda-python-on-ubuntu/

Infine dovremo installare Numba. Numba usa il compilatore LLVM per compilare Python in codice macchina. Ciò non solo migliora le prestazioni del normale codice Python, ma fornisce anche la colla necessaria per inviare istruzioni alla GPU in formato binario. Per fare ciò, esegui:

conda install numba

Limitazioni e vantaggi della programmazione GPU

È allettante pensare che possiamo convertire qualsiasi programma Python in un programma basato su GPU, accelerando notevolmente le sue prestazioni. Tuttavia, la GPU su una scheda video funziona in modo notevolmente diverso rispetto a una CPU standard in un computer.

Le CPU gestiscono molti input e output diversi e hanno un vasto assortimento di istruzioni per affrontare queste situazioni. Sono anche responsabili dell'accesso alla memoria, della gestione del bus di sistema, della gestione degli anelli di protezione, della segmentazione e della funzionalità di input/output. Sono multitasker estremi senza un focus specifico.

Le GPU d'altra parte sono costruite per elaborare funzioni semplici con una velocità accecante. Per ottenere ciò, si aspettano uno stato più uniforme di input e output. Specializzandosi in funzioni scalari. Una funzione scalare prende uno o più input ma restituisce solo un singolo output. Questi valori devono essere tipi predefiniti da numpy.

Codice di esempio

In questo esempio, creeremo una semplice funzione che prende un elenco di valori, li somma e restituisce la somma. Per dimostrare la potenza della GPU, eseguiremo una di queste funzioni sulla CPU e una sulla GPU e visualizzeremo i tempi. Il codice documentato è di seguito:

import numpy as np from timeit import default_timer as timer from numba import vectorize # Dovrebbe essere un valore sostanzialmente alto. Sulla mia macchina di prova, ci sono voluti # 33 secondi per essere eseguito tramite la CPU e poco più di 3 secondi sulla GPU. NUM_ELEMENTS = 10000000 # Questa è la versione della CPU. def vector_add_cpu(a, b): c = np.zeros(NUM_ELEMENTS, dtype=np.float32) for i in range(NUM_ELEMENTS): c[i] = a[i] + b[i] return c # Questa è la versione della GPU. Nota il decoratore @vectorize. Questo dice a # numba di trasformarlo in una funzione vettorializzata della GPU. @vectorize(["float32(float32, float32)"], target="cuda") def vector_add_gpu(a, b): return a + b; def main(): a_source = np.one(NUM_ELEMENTS, dtype=np.float32) b_source = np.one(NUM_ELEMENTS, dtype=np.float32) # Ora della funzione CPU start = timer() vector_add_cpu(a_source, b_source) vector_add_cpu_time = timer() - start # Ora della funzione GPU start = timer() vector_add_gpu(a_source, b_source) vector_add_gpu_time = timer() - start # Report times print("La funzione CPU ha impiegato %f secondi." % vector_add_cpu_time) print("La funzione GPU ha impiegato %f secondi." % vector_add_gpu_time) restituisce 0 if __name__ == "__main__": main() 

Per eseguire l'esempio, digitare:

python gpu-esempio.pi

NOTA: se si verificano problemi durante l'esecuzione del programma, provare a utilizzare "conda install accelerate".

Come puoi vedere, la versione per CPU è notevolmente più lenta.

In caso contrario, le tue iterazioni sono troppo piccole. Regola NUM_ELEMENTS su un valore più grande (sul mio, il segno di pareggio sembrava essere di circa 100 milioni). Questo perché l'installazione della GPU richiede una quantità di tempo piccola ma notevole, quindi per far valere l'operazione è necessario un carico di lavoro maggiore. Una volta che lo innalzi al di sopra della soglia per la tua macchina, noterai miglioramenti sostanziali delle prestazioni della versione GPU rispetto alla versione CPU.

Conclusione

Spero che ti sia piaciuta la nostra introduzione di base alla programmazione GPU con Python. Sebbene l'esempio sopra sia banale, fornisce il framework di cui hai bisogno per portare le tue idee ulteriormente utilizzando la potenza della tua GPU.

I 10 migliori giochi da giocare su Ubuntu
La piattaforma Windows è stata una delle piattaforme dominanti per i giochi a causa dell'enorme percentuale di giochi che si stanno sviluppando oggi p...
I 5 migliori giochi arcade per Linux
Al giorno d'oggi, i computer sono macchine serie utilizzate per i giochi. Se non riesci a ottenere il nuovo punteggio più alto, saprai cosa intendo. I...
Battaglia per Wesnoth 1.13.6 Sviluppo rilasciato
Battaglia per Wesnoth 1.13.6 rilasciato il mese scorso, è la sesta versione di sviluppo nella 1.13.x e offre una serie di miglioramenti, in particolar...