Description
Apprenez et mettez en œuvre des techniques de l’écosystème Python pour optimiser, accélérer et répartir vos traitements.
Public cible
- développeurs, chercheurs, ingénieurs confrontés à des problèmes d’optimisation de temps de traitement
- débutants s’abstenir
Tarifs (inter)
1200 € HT par stagiaire (pauses et repas inclus)
Durée
2 jours, 14 heures
Objectifs
- Découvrir et explorer les différentes techniques de traitements parallèles.
- Acquérir les concepts de la programmation parallèle, de synchronisation et de partages de données
- Sachez identifier les portions de programme qui sont parallélisables
- Sachez repérer les goulots d’étranglements dans votre code
- Identifier les parties de code consommatrices en temps de traitement, en ressources, qui sont candidates à des optimisations
Théorie / pratique
Chaque concept présenté est suivi d’une série d’exercices pour une mise en situation efficace.
35% théorie / 65% pratique
Prérequis
- Bonne maîtrise et bonne pratique du langage Python
- Connaissance de la problématique de la parallélisation dans d’autres langages sera clairement un avantage
Experts animant cette formation
Programme
Rappels et bibliothèques d’outils
- Mesurer les performances
- Analyser les temps de réponses
- Les profilers de la bibliothèque standard python (timeit, cprofile)
- Les profilers tiers
- Techniques de visualisation
- Examiner la consommation mémoire (gestion des structures complexes, le garbage collector, la bibliothèque externe memory_profiler)
- Rappel sur la gestion des erreurs
- Concept et mise en œuvre des exceptions
Principe de programmation concurrente et première mise en œuvre
- Présentation des cas d’utilisation (découpage des temps de traitement, répartition de l’utilisation mémoire, gestion des taches longues ou bloquantes)
- Contrôler l’accès aux ressources
- Utiliser les temps d’attente liés aux entrées / sorties pour effectuer d’autres traitements
- Répartir la charge des traitements lourds, longs.
- Présentation des différents concepts et du vocabulaire
Introduction à la programmation concurrente avec la bibliothèque « threading »
- Rappel sur la gestion mémoire
- Création de Threads en Python (fonctions et classes)
- La communication inter-tâche
- Principe
- Les outils : verrou, sémaphore, évènement, queue
- Cas d’usages et limitations
- Les traces en multi-tâche
- Arrêt propre des Threads
La programmation multi-processus : la bibliothèque « multiprocessing »
- Cas d’usages et architecture map / reduce
- Notion de Pools
- Les traces en multi-processus
La programmation asynchrone : la bibliothèque « asyncio »
- Principe et cas d’usage
- Les « futures », les tasks
- Le lancement des futures, la gestion des futures
- La boucle locale
- La gestion des tâches longues
Initiation aux traitements répartis (sur plusieurs machines)
- Mise en œuvre en python natif :
- Avec la bibliothèque « multiprocessing » et les managers
- Autres mises en œuvre existantes
- La bibliothèque externe « RPyc»
- La bibliothèque externe « ray »
- Découverte des bibliothèques externes “Dask”
- Allez plus loin (discussion autour de Spark, Airflow)
Synthèse sur les cas d’usage
- Dans quels cas utiliser le multithreading, le multiprocessing, la programmation asynchrone et la programmation répartie ?
- Réflexions sur le SPMD (Single Program Multiple Data), MPSD (Multple Instructions Single Data)
- Discussion sur les temps incompressibles (loi d'Amdahl) et la séparabilité des données