Feuille de route 2020-2021 (3A)#
Plan#
Les cours et séances se déroulent sur 5 séances de 3h mardi après-midi.
Intervenants#
Xavier Dupré, Matthieu Durut.
Notes#
Liens, notebooks prévus pour les séances pratiques.
Séance 1#
Séance 2#
Séance 3#
Séance 4#
Séance 5#
Parallelisation CPU
Plusieurs machines
Cython
manylinux sur pypi
Example
td3a_cpp - multiplication de matrices PR TD 2021/01
git (Windows)
Fonction c, fonction pythons dans un pyx
Profiling
Fonctionnement
Libraires pour aller plus vite sur CPU
Librairies BLAS, LAPACK - des algorithmes hyper-optimisés au long des décennies de leur existence
Torch = numpy + numba + pybind11
Stratégies d’optimisation
Composer à partir de librairies implémentant des calculs standards (matriciel)
Fusionner deux opérations en une seule (transposition + multiplication A B” -> gemm), opt_einsum = recomposition des calculs, nombre accru d’opérations, MLPRegressor
Implémentation spécifiques (graphes, arbres)
Train / Predict, ONNX
Sur plusieurs machines : dask, spark, mpi (https://pytorch.org/docs/stable/distributed.html)
Demain
CPU, GPU (Nvidia, A100), ARM
- Librairies de calculs :
paralléliser efficacement nécessite une bonne connaissance des processeurs
Calculs matriciel sur CPU GPU
- Des gagnants et des perdants
Liens pytorch:
Notes en vrac
Mémoire –> L3 –> L2 –> L1 –> 256o de registres - CPU1, CPU2, CPU3, CPU4 calcul –> L1 –> L2 –> L3 Mémoire
- Program –> Thread principal int A = 1 –> Thread principal
–> thread secondaire
Processus
–> Traitement de texte –> 1 processus –> Python –> 1 processus –> Python –> 1 autre processus
Serialisation Données –> d’une machine à une autre Les machines ne communiquent que par réseau : une séquence d’octets.
Objet en python –> sérialise (pickle) –> zip –> communique –> dézippe –> désérialise
Produit –> 10 multiplication + 9 additions –> instructions AVX
Paralléliser avec : Thread + AVX
- Paralléliser avec des processus:
Calculs compliqués sur des données séquentielles (indépendantes)
4, 5 processus
- Paralléliser avec les threads:
Petits calculs répétés plein de fois et pas nécessairement de manière séquentielle
AVX
Cache –> C, C++, Python –> invisible (assembleur)
7, 8 threads (nombre de cœurs)
- Paralléliser avec les GPU
GPU
128 threads GPU
- Cython prérequis
Interpréteur python (3.7+)
Compilateur (gcc sur linux (clang), Visual Studio Windows (Community Edition), gcc MacOs
- Programme
1 fichier python
1 fichier cython –> cython le convertit en C ou C++ –> compilé (DLL, .pyd, .so) –> prêt à l’emploi
- On veut paralléliser sous linux avec une librairie openmp sous Linux:
« Error: je ne trouve libomp » –> sudo apt-get install libomp (dépendance)
Plus rapide:
Matrice:
- Langage sécurisé
Liste = [1, 4, 5, 6]
Liste[3] = 4 –> remplace un élément
Est-ce que 3 est un index admissible ? (vérification)
Faire une copie ? Object mutable, immutable ?
- Interprétable = portable
Python interprète le code python –> fichier .pyc créé
Liste[3] = 4 –> appelle une fonction python qui modifie l’objet liste
- Le Code peut évoluer dynamiquement –>
Les erreurs de syntaxe ne sont pas toujours découvertes avant l’exécution
- Mémoire
Jamais accès en python à la mémoire directement
- Deux fonctions qui font des calculs :
Transmission d’objet python
En python, on ne manipule que des objets pythons
Objet en C –> créé son double en python pour le manipuler
- Matrice numpy:
Structure en C + Objet python qui le contient
- GIL –> obstacle
GIL = Global Interpreter Lock
- C++ = 1 verrou pour protéger une zone de la mémoire, 2 zones = 2 verrous, 1 thread qui visite une zone, 1 autre thread qui visite l’autre zone,
Verrou: incrémente
GIL = 1 verrou pour toutes les zones mémoires
- GIT
Outils de suivi de source
Historique des modifications (utile comme documentation)
Revenir en arrière
- Faire le programme de deux façons différentes
Branch / fork
Utilisateur –> ajouter l’extension dot1.pyx Utilisateur –> ajouter l’extension dot2.pyx
Deux versions –> dot1.pyx une autre avec dot2.pyx Git –> va fusionner les deux pour avoir une unique avec dot1.pyx + dot2.pyx
- Intégration continue :
S’assurer qu’à chaque modification, aucun bug n’a été créé ailleurs que dans le code modifié
- Cython
- Python setup.py build_ext –inplace
Convertit cython en C/C++
Compiler le code C/C++
Link –> .pyd (Windows) ou .so sous MacOs
M3 est modifiée par deux threads en même temps mais pas au même endroit –> donc pas besoin de verrou
A B C -> (A B ) C ou A (B C)