.. _l-feuille-de-route-2020-3A: Feuille de route 2020-2021 (3A) =============================== .. contents:: :local: :depth: 1 :ref:`Page principale du cours ` 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. .. contents:: :local: Séance 1 ^^^^^^^^ * `Introduction to Algorithms `_ * `Latency Numbers Every Programmer Should Know `_ * `What Every Computer Scientist Should Know About Floating-Point Arithmetic `_ * `What Every Programmer Should Know About Memory `_ * `Introduction to High Performance Scientific Computing `_ Séance 2 ^^^^^^^^ * `Introduction to CUDA C `_ * `Comment apprendre aux ordinateurs à comprendre les images `_ (TED) * `Scaling up Machine Learning: Parallel and Distributed Approaches `_ Chapitre 16 et 17 * `Understanding Convolution in Deep Learning `_ * `General-purpose computing on graphics processing units `_ * `La technologie GPGPU – 1ère partie : Le côté obscur de la (Ge)Force `_ * `NVIDIA Ampere Architecture In-Depth `_ Séance 3 ^^^^^^^^ * `Bitcoin and Cryptocurrency Technologies `_ * `Delivery versus payment on a blockchain `_ * `ETHEREUM DEVELOPER RESOURCES `_ * `Monnaie, finance et économie réelle `_ Séance 4 ^^^^^^^^ Séance 5 ^^^^^^^^ Parallelisation CPU * `Threads `_ * `Processus `_ * `sérialisation `_ * Plusieurs machines * `AVX `_ * `Cache `_ Cython * `Presentation `_ * Compilateur (`Windows `_ (VS), `Linux `_ (gcc), `MacOs `_ (xcode)) * `manylinux `_ sur pypi * `C et Cython `_ * Fichier `pyx `_ et `setup.py `_ * `GIL `_ (voir aussi `GIL `_) Example * `td3a_cpp `_ - multiplication de matrices `PR TD 2021/01 `_ * `git `_ (Windows) * Fonction c, fonction pythons dans un pyx * `prange `_ Profiling * `py-spy `_ * `pyinstrument `_ * Fonctionnement Libraires pour aller plus vite sur CPU * Librairies `BLAS `_, `LAPACK `_ - des algorithmes hyper-optimisés au long des décennies de leur existence * `Pybind11 `_ * `Cffi `_ * `Numba `_ (`JIT `_) * `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) * `Quantization `_ * `Sparse `_ * Train / Predict, `ONNX `_ * Sur plusieurs machines : `dask `_, `spark `_, `mpi `_ (https://pytorch.org/docs/stable/distributed.html) Demain * CPU, GPU (Nvidia, `A100 `_), ARM * `cupy `_, `minpy `_, `numpy + GPU? `_ * Librairies de calculs : * paralléliser efficacement nécessite une bonne connaissance des processeurs * Calculs matriciel sur CPU GPU * Des gagnants et des perdants * `Trends pytorch,tensorflow,numpy `_ * `NVidia Stock `_ * `Intel Stock `_ Liens `pytorch `_: * `CUSTOM C++ AND CUDA EXTENSIONS `_ * `Convert Torch Tensor to flattened C++ array `_ * `TORCH.FROM_NUMPY `_ **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)