Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
formation:cbp20190606gpu [2019/06/03 18:04] equemene |
formation:cbp20190606gpu [2019/06/11 10:37] (Version actuelle) equemene [Conclusion] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== CBP 2019 : le GPU par la pratique ====== | ====== CBP 2019 : le GPU par la pratique ====== | ||
- | Cette session pratique accompagne le cours du 6 juin au matin réalisé par Emmanuel Quémener. | + | Cette session pratique accompagne le [[http://www.cbp.ens-lyon.fr/emmanuel.quemener/documents/PresentationGPU_190606_EQ.pdf|cours]] du 6 juin au matin réalisé par Emmanuel Quémener. |
+ | ===== Déroulement de la journée ===== | ||
+ | |||
+ | * 08h30-09h00 Accueil devant la salle M7-1H104 | ||
+ | |||
+ | * 09h00-10h30 Cours d'introduction aux GPU | ||
+ | * 10h30-10h45 Pause | ||
+ | * 10h45-12h30 TP première partie | ||
+ | |||
+ | * 12h30-13h30 Repas salle 116 | ||
+ | |||
+ | * 13h30-15h15 TP seconde partie | ||
+ | * 15h30-15h45 Pause | ||
+ | * 15h45-17h30 TP troisième partie | ||
===== CQQCOQP : Comment ? Qui ? Quand ? Combien ? Où ? Quoi ? Pourquoi ? ===== | ===== CQQCOQP : Comment ? Qui ? Quand ? Combien ? Où ? Quoi ? Pourquoi ? ===== | ||
Ligne 45: | Ligne 58: | ||
* **p100alpha**, **p100beta** : stations virtuelles disposant d'une Nvidia Tesla P100 | * **p100alpha**, **p100beta** : stations virtuelles disposant d'une Nvidia Tesla P100 | ||
* **k40m** : station virtuelle disposant d'une Nvidia Tesla K40m | * **k40m** : station virtuelle disposant d'une Nvidia Tesla K40m | ||
+ | * **r740gpu1** : station disposant de 2 Tesla P100 (appartenant au PSMN) | ||
Jetez un coup d'oeil sur [[http://styx.cbp.ens-lyon.fr/ganglia/?r=hour&cs=&ce=&m=load_one&s=by+name&c=Workstations|Monitoring des stations de travail]] avant de lancer vos tâches ! De grosses requêtes concurrentielles peuvent entraîner des DoS ! | Jetez un coup d'oeil sur [[http://styx.cbp.ens-lyon.fr/ganglia/?r=hour&cs=&ce=&m=load_one&s=by+name&c=Workstations|Monitoring des stations de travail]] avant de lancer vos tâches ! De grosses requêtes concurrentielles peuvent entraîner des DoS ! | ||
Ligne 208: | Ligne 222: | ||
Comme nous l'avons vu dans l'introduction sur le GPU, leur programmation peut-être réalisée par différentes voies. La première, pour les périphériques Nvidia, est d'utiliser l'environnement CUDA. Le problème sera qu'il est impossible de réexploiter votre programme sur une autre plate-forme (un CPU) ou la comparer avec d'autres GPU. [[https://www.khronos.org/opencl/|OpenCL]] reste une approche beaucoup plus polyvalente ! | Comme nous l'avons vu dans l'introduction sur le GPU, leur programmation peut-être réalisée par différentes voies. La première, pour les périphériques Nvidia, est d'utiliser l'environnement CUDA. Le problème sera qu'il est impossible de réexploiter votre programme sur une autre plate-forme (un CPU) ou la comparer avec d'autres GPU. [[https://www.khronos.org/opencl/|OpenCL]] reste une approche beaucoup plus polyvalente ! | ||
- | Sur les stations du CBP, la majorité des implémentations de OpenCL sont disponibles, autant sur CBP que sur GPU. | + | Sur les stations du CBP, la majorité des implémentations de OpenCL sont disponibles, autant sur CPU que sur GPU. |
La commande ''clinfo'' récupère des informations liées à tous les périphériques OpenCL disponibles. | La commande ''clinfo'' récupère des informations liées à tous les périphériques OpenCL disponibles. | ||
Ligne 1316: | Ligne 1330: | ||
export DATADIR=/local/$USER | export DATADIR=/local/$USER | ||
sed -i "s|tfds\.load(name|tfds\.load(data_dir\=\'$DATADIR\'\,name|g" cifar10_input.py | sed -i "s|tfds\.load(name|tfds\.load(data_dir\=\'$DATADIR\'\,name|g" cifar10_input.py | ||
+ | # Modification du dossier de sauvegarde de l'apprentissage | ||
+ | sed -i 's/\/tmp\//$DATADIR/g' cifar10_train.py | ||
# Réduction du nombre d'itérations de 100000 à 10000 | # Réduction du nombre d'itérations de 100000 à 10000 | ||
sed -i 's/100000/10000/g' cifar10_train.py | sed -i 's/100000/10000/g' cifar10_train.py | ||
Ligne 1325: | Ligne 1341: | ||
</code> | </code> | ||
- | Le souci, c'est que le temps écoulé ici comprend (la première fois) le téléchargement et l'expansion des archives. | + | Voici la sortie sur une machine équipée de GPUs Nvidia RTX 2080 Ti et GTX 1660 Ti. |
+ | |||
+ | <code> | ||
+ | TIME Command being timed: "python3 cifar10_train.py" | ||
+ | TIME User time (seconds): 889.04 | ||
+ | TIME System time (seconds): 597.06 | ||
+ | TIME Elapsed (wall clock) time : 234.10 | ||
+ | TIME Percent of CPU this job got: 634% | ||
+ | TIME Average shared text size (kbytes): 0 | ||
+ | TIME Average unshared data size (kbytes): 0 | ||
+ | TIME Average stack size (kbytes): 0 | ||
+ | TIME Average total size (kbytes): 0 | ||
+ | TIME Maximum resident set size (kbytes): 5098888 | ||
+ | TIME Average resident set size (kbytes): 0 | ||
+ | TIME Major (requiring I/O) page faults: 329 | ||
+ | TIME Minor (reclaiming a frame) page faults: 1227196 | ||
+ | TIME Voluntary context switches: 15535406 | ||
+ | TIME Involuntary context switches: 8247917 | ||
+ | TIME Swaps: 0 | ||
+ | TIME File system inputs: 10117019 | ||
+ | TIME File system outputs: 1282614 | ||
+ | TIME Socket messages sent: 0 | ||
+ | TIME Socket messages received: 0 | ||
+ | TIME Signals delivered: 0 | ||
+ | TIME Page size (bytes): 4096 | ||
+ | TIME Exit status: 0 | ||
+ | </code> | ||
+ | |||
+ | Le souci, c'est que le temps écoulé ici comprend (la première fois) le téléchargement et l'expansion des archives. Pour disposer d'une comparaison objective du temps de calcul pour 10000 itérations, il faut relancer l'apprentissage. | ||
+ | |||
+ | Une relance du même apprentissage offre la sortie suivante : | ||
+ | |||
+ | <code> | ||
+ | TIME Command being timed: "python3 cifar10_train.py" | ||
+ | TIME User time (seconds): 827.48 | ||
+ | TIME System time (seconds): 592.54 | ||
+ | TIME Elapsed (wall clock) time : 123.09 | ||
+ | TIME Percent of CPU this job got: 1153% | ||
+ | TIME Average shared text size (kbytes): 0 | ||
+ | TIME Average unshared data size (kbytes): 0 | ||
+ | TIME Average stack size (kbytes): 0 | ||
+ | TIME Average total size (kbytes): 0 | ||
+ | TIME Maximum resident set size (kbytes): 4100296 | ||
+ | TIME Average resident set size (kbytes): 0 | ||
+ | TIME Major (requiring I/O) page faults: 0 | ||
+ | TIME Minor (reclaiming a frame) page faults: 933283 | ||
+ | TIME Voluntary context switches: 15603184 | ||
+ | TIME Involuntary context switches: 8643170 | ||
+ | TIME Swaps: 0 | ||
+ | TIME File system inputs: 5857597 | ||
+ | TIME File system outputs: 49573 | ||
+ | TIME Socket messages sent: 0 | ||
+ | TIME Socket messages received: 0 | ||
+ | TIME Signals delivered: 0 | ||
+ | TIME Page size (bytes): 4096 | ||
+ | TIME Exit status: 0 | ||
+ | </code> | ||
+ | |||
+ | Dans le cas d'une exécution uniquement sur CPU (ici 2 Xeon E5-2637 v4 @ 3.50GHz), nous avons comme sortie : | ||
+ | |||
+ | <code> | ||
+ | TIME Command being timed: "python3 cifar10_train.py" | ||
+ | TIME User time (seconds): 21180.80 | ||
+ | TIME System time (seconds): 1391.54 | ||
+ | TIME Elapsed (wall clock) time : 1711.02 | ||
+ | TIME Percent of CPU this job got: 1319% | ||
+ | TIME Average shared text size (kbytes): 0 | ||
+ | TIME Average unshared data size (kbytes): 0 | ||
+ | TIME Average stack size (kbytes): 0 | ||
+ | TIME Average total size (kbytes): 0 | ||
+ | TIME Maximum resident set size (kbytes): 2804244 | ||
+ | TIME Average resident set size (kbytes): 0 | ||
+ | TIME Major (requiring I/O) page faults: 0 | ||
+ | TIME Minor (reclaiming a frame) page faults: 283823921 | ||
+ | TIME Voluntary context switches: 26722288 | ||
+ | TIME Involuntary context switches: 6182435 | ||
+ | TIME Swaps: 0 | ||
+ | TIME File system inputs: 5857601 | ||
+ | TIME File system outputs: 83979 | ||
+ | TIME Socket messages sent: 0 | ||
+ | TIME Socket messages received: 0 | ||
+ | TIME Signals delivered: 0 | ||
+ | TIME Page size (bytes): 4096 | ||
+ | TIME Exit status: 0 | ||
+ | </code> | ||
<note warning>Exercice #26 : appliquez les commandes ci-dessus | <note warning>Exercice #26 : appliquez les commandes ci-dessus | ||
Ligne 1335: | Ligne 1435: | ||
- définissez la variable ''TIME'' pour sa métrologie | - définissez la variable ''TIME'' pour sa métrologie | ||
- déplacez vous dans le dossier ''models/tutorials/image/cifar10'' | - déplacez vous dans le dossier ''models/tutorials/image/cifar10'' | ||
- | - modifiez comme précisé le dossier de téléchargement de TensorFlow | + | - modifiez comme précisé les dossiers de téléchargement et de sauvegarde |
- modifiez le nombre d'itérations | - modifiez le nombre d'itérations | ||
* Lancez une première fois l'apprentissage avec ''cifar10_train.py'' | * Lancez une première fois l'apprentissage avec ''cifar10_train.py'' | ||
Ligne 1344: | Ligne 1444: | ||
* Lancez une seconde fois l'apprentissage | * Lancez une seconde fois l'apprentissage | ||
- notez les informations de sortie préfixées par ''TIME'' | - notez les informations de sortie préfixées par ''TIME'' | ||
- | * Lancez une seconde fois l'apprentissage avec ''CUDA_VISIBLE_DEVICES="" '' | + | * Lancez une seconde fois l'apprentissage avec ''CUDA_VISIBLE_DEVICES=' ' '' |
- notez les informations de sortie | - notez les informations de sortie | ||
* Comparez les résultats | * Comparez les résultats | ||
- | * Qu'apporte le GPU comme performance par rapport au processeur ? | + | * Qu'apporte le GPU comme gain de performance par rapport au processeur ? |
</note> | </note> | ||
Ligne 1367: | Ligne 1467: | ||
</note> | </note> | ||
- | En cas de difficultés, appliquez la [[formation:insa2018gpu:insa2018gromacs4stretch|recette de Gromacs pour Debian Stretch]] ;-) | + | En cas de difficultés, appliquez la [[formation:cbp20190606gpu:gromacs4stretch|recette de Gromacs pour Debian Stretch]] ;-) |
<note warning>Exercice #28 : Exécutez l'exemple ''1536'' | <note warning>Exercice #28 : Exécutez l'exemple ''1536'' | ||
Ligne 1404: | Ligne 1504: | ||
</note> | </note> | ||
- | En cas de difficultés, appliquez la [[formation:insa2018gpu:insa2018pkdgrav4stretch|recette d'un PKDGRAV3 pour Debian Stretch]] ;-) | + | En cas de difficultés, appliquez la [[formation:cbp20190606gpu:pkdgrav4stretch|recette d'un PKDGRAV3 pour Debian Stretch]] ;-) |
===== Conclusion ===== | ===== Conclusion ===== | ||
Ligne 1412: | Ligne 1512: | ||
L'exploitation de "codes métier" vous aura aussi permis d'entrevoir la difficulté d'intégrer et d'exécuter des programmes dans des environnements pourtant bien homogènes : toutes les stations exploitées ont exactement le même système d'exploitation, [[developpement:productions:SIDUS|SIDUS]]. Les "astuces" permettant de simplement pouvoir exécuter les programmes illustraient aussi que, sans expérience, difficile de s'en sortir. | L'exploitation de "codes métier" vous aura aussi permis d'entrevoir la difficulté d'intégrer et d'exécuter des programmes dans des environnements pourtant bien homogènes : toutes les stations exploitées ont exactement le même système d'exploitation, [[developpement:productions:SIDUS|SIDUS]]. Les "astuces" permettant de simplement pouvoir exécuter les programmes illustraient aussi que, sans expérience, difficile de s'en sortir. | ||
- | --- //[[emmanuel.quemener@ens-lyon.fr|Emmanuel Quemener]] CC BY-NC-SA 2018/11/26 15:37// | + | --- //[[emmanuel.quemener@ens-lyon.fr|Emmanuel Quemener]] CC BY-NC-SA 2019-06-11// |