Programmation GPU avec Python

Programmation GPU avec Python
Dans cet article, nous plongerons dans la programmation GPU avec Python. En utilisant la facilité de Python, vous pouvez déverrouiller l'incroyable puissance de calcul du GPU de votre carte vidéo (Graphics Processing Unit). Dans cet exemple, nous travaillerons avec la bibliothèque CUDA de Nvidia.

Exigences

Pour cet exercice, vous aurez besoin d'une machine physique avec Linux et un GPU basé sur NVIDIA, soit lancer une instance basée sur GPU sur Amazon Web Services. Soit devrait fonctionner bien, mais si vous choisissez d'utiliser une machine physique, vous devrez vous assurer que les pilotes propriétaires de Nvidia sont installés, voir les instructions: https: // linuxhint.com / install-nvidia-pilote-linux

Vous aurez également besoin de la boîte à outils CUDA installée. Cet exemple utilise Ubuntu 16.04 LTS spécifiquement, mais il existe des téléchargements disponibles pour la plupart des principales distributions Linux à l'URL suivante: https: // développeur.nvidia.com / Cuda-Downloads

Je préfère le .Téléchargement basé sur Deb, et ces exemples supposeront que vous avez choisi cette route. Le fichier que vous téléchargez est un .package deb mais n'a pas de .extension deb, alors le renommant pour avoir un .Deb à la fin son utile. Ensuite, vous l'installez avec:

Sudo dpkg -i package-name.deb

Si vous êtes invité à installer une clé GPG, veuillez suivre les instructions données pour le faire.

Vous devrez maintenant installer le package CUDA lui-même. Pour ce faire, courez:

Mise à jour Sudo apt-get
sudo apt-get install cuda -y

Cette partie peut prendre un certain temps, donc vous voudrez peut-être prendre une tasse de café. Une fois terminé, je recommande de redémarrer pour s'assurer que tous les modules sont correctement rechargés.

Ensuite, vous aurez besoin de la distribution Anaconda Python. Vous pouvez le télécharger ici: https: // www.anaconda.com / download / # linux

Prenez la version 64 bits et installez-la comme ceci:

sh anaconda *.shot

(L'étoile dans la commande ci-dessus garantira que la commande est exécutée quelle que soit la version mineure)

L'emplacement d'installation par défaut devrait être bien, et dans ce tutoriel, nous l'utiliserons. Par défaut, il s'installe sur ~ / anaconda3

À la fin de l'installation, vous serez invité à décider si vous souhaitez ajouter Anaconda à votre chemin. Réponse oui ici pour faciliter l'exécution des commandes nécessaires. Pour vous assurer que ce changement a lieu, une fois l'installateur terminé complètement, déconnectez-vous puis reconnectez-vous à votre compte.

Plus d'informations sur l'installation d'Anaconda: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Enfin, nous devrons installer Numba. Numba utilise le compilateur LLVM pour compiler Python sur le code machine. Cela améliore non seulement les performances du code Python ordinaire, mais fournit également la colle nécessaire pour envoyer des instructions au GPU sous forme binaire. Pour ce faire, courez:

Conda Install Numba

Limitations et avantages de la programmation GPU

Il est tentant de penser que nous pouvons convertir n'importe quel programme Python en un programme basé sur GPU, accélérant considérablement ses performances. Cependant, le GPU sur une carte vidéo fonctionne considérablement différemment d'un CPU standard dans un ordinateur.

Les processeurs gèrent de nombreuses entrées et sorties différentes et ont un large assortiment d'instructions pour traiter ces situations. Ils sont également responsables de l'accès à la mémoire, du traitement du bus système, de la gestion des anneaux de protection, de la segmentation et de la fonctionnalité d'entrée / sortie. Ce sont des multitastes extrêmes sans objectif spécifique.

Les GPU en revanche sont conçus pour traiter des fonctions simples à une vitesse aveuglante. Pour ce faire, ils s'attendent à un état plus uniforme de saisie et de sortie. En se spécialisant dans les fonctions scalaires. Une fonction scalaire prend une ou plusieurs entrées mais ne renvoie qu'une seule sortie. Ces valeurs doivent être des types prédéfinis par Numpy.

Exemple de code

Dans cet exemple, nous créerons une fonction simple qui prend une liste de valeurs, les additionne et renvoie la somme. Pour démontrer la puissance du GPU, nous exécuterons l'une de ces fonctions sur le CPU et une sur le GPU et afficherons le temps. Le code documenté est ci-dessous:

Importer Numpy comme NP
De TimeIt Import Default_timer en tant que minuterie
à partir de Numba Import Vectorize
# Cela devrait être une valeur sensiblement élevée. Sur ma machine d'essai, cela a pris
# 33 secondes pour fonctionner via le CPU et un peu plus de 3 secondes sur le GPU.
Num_elements = 100000000
# C'est la version CPU.
def vector_add_cpu (a, b):
c = np.zéros (num_elements, dtype = np.float32)
pour i dans la plage (num_elements):
c [i] = a [i] + b [i]
retour c
# C'est la version GPU. Notez le décorateur @vectorize. Cela raconte
# Numba pour transformer cela en une fonction vectorisée GPU.
@Vectrize (["float32 (float32, float32)"], cible = 'cuda')
def vector_add_gpu (a, b):
retourner a + b;
def main ():
a_source = np.ceux (num_elements, dtype = np.float32)
b_source = np.ceux (num_elements, dtype = np.float32)
# Heure la fonction CPU
start = timer ()
vector_add_cpu (a_source, b_source)
vector_add_cpu_time = timer () - Démarrer
# Heure la fonction GPU
start = timer ()
vector_add_gpu (a_source, b_source)
vector_add_gpu_time = timer () - Démarrer
# Heures de rapport
Print ("La fonction CPU a pris% F secondes."% vector_add_cpu_time)
Print ("La fonction GPU a pris% F secondes."% vector_add_gpu_time)
retour 0
Si __name__ == "__main__":
principal()

Pour exécuter l'exemple, tapez:

Exemple de GPU Python.py

Remarque: Si vous rencontrez des problèmes lorsque vous exécutez votre programme, essayez d'utiliser «Conda Installer Accelerate».

Comme vous pouvez le voir, la version CPU fonctionne considérablement plus lente.

Sinon, alors vos itérations sont trop petites. Ajustez les num_elements à une valeur plus grande (sur la mienne, la marque d'équilibre semblait être d'environ 100 millions). En effet. Une fois que vous l'avez soulevé au-dessus du seuil de votre machine, vous remarquerez des améliorations de performances substantielles de la version GPU sur la version CPU.

Conclusion

J'espère que vous avez apprécié notre introduction de base dans la programmation GPU avec Python. Bien que l'exemple ci-dessus soit trivial, il fournit le cadre dont vous avez besoin pour prendre vos idées davantage en utilisant la puissance de votre GPU.