Science des données

Programmation GPU avec Python

Programmation GPU avec Python

Dans cet article, nous allons plonger dans la programmation GPU avec Python. En utilisant la facilité de Python, vous pouvez débloquer l'incroyable puissance de calcul du GPU de votre carte vidéo (unité de traitement graphique). Dans cet exemple, nous allons travailler avec la bibliothèque CUDA de NVIDIA.

Conditions

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

Vous aurez également besoin de la boîte à outils CUDA installée. Cet exemple utilise Ubuntu 16.04 LTS en particulier, mais des téléchargements sont disponibles pour la plupart des principales distributions Linux à l'URL suivante : https://developer.nvidia.com/cuda-téléchargements

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 .deb mais n'a pas de .deb, donc renommer pour avoir un .deb à la fin son utile. Ensuite, vous l'installez avec :

sudo dpkg -i nom-paquet.deb

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

Vous devez maintenant installer le paquet cuda lui-même. Pour ce faire, exécutez :

sudo apt-get mise à jour sudo apt-get install cuda -y 

Cette partie peut prendre un certain temps, vous voudrez peut-être prendre une tasse de café. Une fois que c'est fait, 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/télécharger/#linux

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

sh Anaconda*.sh

(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 convenir, et dans ce tutoriel, nous l'utiliserons. Par défaut, il s'installe dans ~/anaconda3

À la fin de l'installation, vous serez invité à décider si vous souhaitez ajouter Anaconda à votre chemin. Répondez oui ici pour faciliter l'exécution des commandes nécessaires. Pour vous assurer que ce changement a lieu, une fois le programme d'installation terminé, 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 aurons besoin d'installer Numba. Numba utilise le compilateur LLVM pour compiler Python en code machine. Cela améliore non seulement les performances du code Python normal, mais fournit également la colle nécessaire pour envoyer des instructions au GPU sous forme binaire. Pour ce faire, exécutez :

conda installer 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 disposent d'un large assortiment d'instructions pour faire face à ces situations. Ils sont également responsables de l'accès à la mémoire, de la gestion du bus système, de la gestion des anneaux de protection, de la segmentation et des fonctionnalités d'entrée/sortie. Ce sont des multitâches extrêmes sans objectif spécifique.

Les GPU, quant à eux, sont conçus pour traiter des fonctions simples à une vitesse aveuglante. Pour ce faire, ils s'attendent à un état d'entrée et de sortie plus uniforme. 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 allons créer une fonction simple qui prend une liste de valeurs, les additionne et renvoie la somme. Pour démontrer la puissance du GPU, nous allons exécuter une de ces fonctions sur le CPU et une sur le GPU et afficher les temps. Le code documenté est ci-dessous :

import numpy as np from timeit import default_timer as timer from numba import vectorize # Cela devrait être une valeur substantiellement élevée. Sur ma machine de test, cela a pris # 33 secondes pour s'exécuter via le CPU et un peu plus de 3 secondes sur le GPU. NUM_ELEMENTS = 100000000 # Ceci est la version du CPU. def vector_add_cpu(a, b): c = np.zéros(NUM_ÉLÉMENTS, dtype=np.float32) for i in range(NUM_ELEMENTS): c[i] = a[i] + b[i] return c # Ceci est la version GPU. Notez le décorateur @vectorize. Cela dit à # numba de le transformer en une fonction vectorisée par GPU. @vectorize(["float32(float32, float32)"], target="cuda") def vector_add_gpu(a, b): renvoie a + b; def main() : a_source = np.uns(NUM_ÉLÉMENTS, dtype=np.float32) b_source = np.uns(NUM_ÉLÉMENTS, dtype=np.float32) # Heure de démarrage de la fonction CPU = timer() vector_add_cpu(a_source, b_source) vector_add_cpu_time = timer() - start # Heure de démarrage de la fonction GPU = timer() vector_add_gpu(a_source, b_source) vector_add_gpu_time = timer() - start # Rapport fois print("La fonction CPU a pris %f secondes." % vector_add_cpu_time) print(" La fonction GPU a pris %f secondes." % vector_add_gpu_time) renvoie 0 si __name__ == "__main__": main() 

Pour exécuter l'exemple, tapez :

python gpu-exemple.py

REMARQUE : Si vous rencontrez des problèmes lors de l'exécution de votre programme, essayez d'utiliser « conda install accélérer ».

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

Si non, alors vos itérations sont trop petites. Ajustez les NUM_ELEMENTS à une valeur plus grande (sur le mien, le seuil de rentabilité semblait être d'environ 100 millions). En effet, la configuration du GPU prend un temps limité mais notable. Par conséquent, pour que l'opération en vaille la peine, une charge de travail plus élevée est nécessaire. Une fois que vous l'augmentez au-dessus du seuil de votre machine, vous remarquerez des améliorations substantielles des performances de la version GPU par rapport à la version CPU.

Conclusion

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

Comment capturer et diffuser votre session de jeu sur Linux
Dans le passé, jouer à des jeux n'était considéré qu'un passe-temps, mais avec le temps, l'industrie du jeu a connu une croissance énorme en termes de...
Meilleurs jeux à jouer avec le suivi des mains
Oculus Quest a récemment introduit l'idée géniale du suivi manuel sans contrôleurs. Avec un nombre toujours croissant de jeux et d'activités qui exécu...
Comment afficher la superposition OSD dans les applications et jeux Linux en plein écran
Jouer à des jeux en plein écran ou utiliser des applications en mode plein écran sans distraction peut vous couper des informations système pertinente...