Programmazione GPU con Python

Programmazione GPU con Python
In questo articolo, ci immergeremo nella programmazione GPU con Python. Usando la facilità di Python, puoi sbloccare l'incredibile potenza di calcolo della GPU della tua scheda video (unità di elaborazione grafica). In questo esempio, lavoreremo con la biblioteca CUDA di Nvidia.

Requisiti

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

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

Preferisco il .Download basato su Deb e questi esempi presuteranno che tu abbia scelto quel percorso. Il file che scarichi è un .pacchetto deb ma non ha un .estensione di deb, quindi rinominarlo per avere un .Deb alla fine il suo utile. Quindi lo installi con:

sudo dpkg -i pacchetto nome.Deb

Se ti viene richiesto l'installazione di una chiave GPG, seguire le istruzioni fornite per farlo.

Ora dovrai installare il pacchetto CUDA stesso. Per farlo, corri:

Sudo Apt-get Aggiornamento
sudo apt -get install cuda -y

Questa parte può richiedere un po 'di tempo, quindi potresti voler prendere una tazza di caffè. Una volta terminato, consiglio di riavviare per garantire che tutti i moduli vengano ricaricati correttamente.

Successivamente, avrai bisogno della distribuzione di 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 sia eseguito indipendentemente dalla versione minore)

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

Alla fine dell'installazione, ti verrà richiesto di decidere se desideri aggiungere Anaconda al tuo percorso. Rispondi sì qui per semplificare l'esecuzione dei comandi necessari. Per garantire che questa modifica avvenga, dopo che il programma di installazione termina completamente, disconnersi, quindi accedere al tuo account.

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

Finalmente dovremo installare numba. Numba utilizza il compilatore LLVM per compilare Python al codice macchina. Ciò non solo migliora le prestazioni del normale codice Python, ma fornisce anche la colla necessaria per inviare istruzioni alla GPU in forma binaria. Per fare questo, corri:

Conda Installa Numba

Limitazioni e vantaggi della programmazione GPU

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

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

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

Codice di esempio

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

Importa Numpy come NP
da timeit import default_timer come timer
Da Numba Import Vectorize
# Questo dovrebbe essere un valore sostanzialmente alto. Sulla mia macchina di prova, questo ha preso
# 33 secondi per funzionare tramite la CPU e poco più di 3 secondi sulla GPU.
Num_elements = 100000000
# Questa è la versione CPU.
def vector_add_cpu (a, b):
c = np.ZEROS (NUM_ELEMENTS, DTYPE = NP.float32)
per i in gamma (num_elements):
c [i] = a [i] + b [i]
restituzione c
# Questa è la versione GPU. Nota il decoratore @VectoRize. Questo dice
# numba per trasformare questo in una funzione vettorializzata GPU.
@vectoRize (["float32 (float32, float32)"], target = 'cuda')
def vector_add_gpu (a, b):
restituire a + b;
def main ():
a_source = np.quelli (num_elements, dtype = np.float32)
b_source = np.quelli (num_elements, dtype = np.float32)
# Ora la funzione CPU
start = timer ()
vector_add_cpu (a_source, b_source)
vector_add_cpu_time = timer () - start
# Ora la funzione GPU
start = timer ()
vector_add_gpu (a_source, b_source)
vector_add_gpu_time = timer () - start
# Tempi di segnalazione
Stampa ("La funzione CPU ha richiesto %f secondi." % vector_add_cpu_time)
Stampa ("La funzione GPU ha richiesto %f secondi." % vector_add_gpu_time)
restituzione 0
Se __Name__ == "__main__":
principale()

Per eseguire l'esempio, digita:

Python GPU-Example.Py

NOTA: se si esegue i problemi durante l'esecuzione del programma, prova a utilizzare "Contrastal Accelerate".

Come puoi vedere, la versione CPU funziona molto più lenta.

In caso contrario, le tue iterazioni sono troppo piccole. Regola i num. Questo perché la configurazione della GPU richiede una piccola ma evidente tempo, quindi per rendere l'operazione degno di essere necessario un carico di lavoro più elevato. Dopo averlo sollevato al di sopra della soglia per la tua macchina, noterai sostanziali miglioramenti delle prestazioni della versione GPU sulla versione CPU.

Conclusione

Spero che ti sia piaciuta la nostra introduzione di base nella programmazione GPU con Python. Sebbene l'esempio sopra sia banale, fornisce il framework necessario per prendere le tue idee utilizzando ulteriormente il potere della tua GPU.