|
1 | 1 | # Performance & Threads |
2 | 2 |
|
3 | | -EPM can run multiple scenarios in parallel using the `--cpu` flag. This page explains how to size that correctly for your machine. |
| 3 | +EPM peut lancer plusieurs scénarios en parallèle avec le flag `--cpu`. Cette page explique comment dimensionner correctement ce paramètre selon votre machine. |
4 | 4 |
|
5 | 5 | --- |
6 | 6 |
|
7 | | -## Key concepts |
| 7 | +## Concepts clés |
8 | 8 |
|
9 | | -| Term | What it means | |
| 9 | +| Terme | Signification | |
10 | 10 | |---|---| |
11 | | -| **Core** | A physical compute unit on the CPU | |
12 | | -| **Thread** | A stream of execution; with hyperthreading, one core handles 2 threads | |
13 | | -| **vCPU** | In cloud/VM environments, one vCPU ≈ one thread | |
| 11 | +| **Core** | Unité de calcul physique du processeur | |
| 12 | +| **Thread** | Flux d'exécution ; avec hyperthreading, un core gère 2 threads | |
| 13 | +| **vCPU** | En cloud/VM, 1 vCPU ≈ 1 thread | |
| 14 | +| **`--cpu`** | Nombre de scénarios EPM lancés simultanément | |
| 15 | +| **`threads`** | Nombre de threads alloués à chaque solve CPLEX, défini dans le fichier d'options du solveur | |
14 | 16 |
|
15 | | -> A machine with "8 vCPUs" can run 8 parallel tasks, but memory is usually the real bottleneck. |
| 17 | +> **Note** — Le flag `--cpu` contrôle en réalité le nombre de **jobs parallèles**, pas les CPUs directement. Ce nom sera renommé dans une prochaine version pour éviter la confusion. |
16 | 18 |
|
17 | 19 | --- |
18 | 20 |
|
19 | | -## How to size your parallel runs |
| 21 | +## Les deux plafonds à respecter |
20 | 22 |
|
21 | | -The limiting factor is almost always **RAM**, not CPU. |
| 23 | +Lancer `--cpu N` signifie que N scénarios tournent en même temps. Chaque scénario consomme de la RAM **et** des threads CPU. Il y a donc **deux plafonds indépendants** : |
22 | 24 |
|
23 | | -**Step 1:Check available RAM** |
24 | | -Note your total system memory (e.g. 128 GB). |
| 25 | +``` |
| 26 | +Plafond RAM = RAM totale ÷ RAM par scénario |
| 27 | +Plafond CPU = vCPU totaux ÷ threads par scénario |
| 28 | +
|
| 29 | +--cpu = min(Plafond RAM, Plafond CPU) |
| 30 | +``` |
| 31 | + |
| 32 | +Le plafond le plus bas est celui qui limite. Dépasser l'un ou l'autre provoque une contention des ressources et ralentit l'ensemble des jobs. |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## Comment calculer en pratique |
| 37 | + |
| 38 | +**Étape 1 — Connaître votre machine** |
25 | 39 |
|
26 | | -**Step 2:Measure memory per simulation** |
27 | | -Run one scenario and check the `.lst` file or GAMS Studio console for `ProcTreeMemMonitor` → `VSS` (Virtual Set Size). This is the peak memory footprint per run. |
| 40 | +Notez la RAM totale et le nombre de vCPU disponibles. |
| 41 | +Sur Linux : `free -h` (RAM) et `nproc` (vCPU). |
28 | 42 |
|
29 | | -**Step 3:Calculate max parallel jobs** |
| 43 | +**Étape 2 — Mesurer la RAM par scénario** |
30 | 44 |
|
| 45 | +Lancez un scénario seul et cherchez dans le fichier `.lst` ou la console GAMS Studio : |
31 | 46 | ``` |
32 | | -Max parallel jobs = Total RAM / Memory per simulation |
| 47 | +ProcTreeMemMonitor → VSS |
33 | 48 | ``` |
| 49 | +C'est l'empreinte mémoire maximale de ce scénario. Utilisez cette valeur. |
34 | 50 |
|
35 | | -**Step 4:Set threads per simulation** |
| 51 | +**Étape 3 — Connaître votre `threads`** |
36 | 52 |
|
| 53 | +Regardez votre fichier d'options CPLEX (`cplex_baseline.opt`) : |
37 | 54 | ``` |
38 | | -Threads per simulation = Total threads / Max parallel jobs |
| 55 | +threads = 8 |
39 | 56 | ``` |
| 57 | +Si la ligne est absente, CPLEX utilise tous les threads disponibles — à éviter en contexte parallèle. |
| 58 | +Voir [Options du solveur](options_solver.md) pour modifier cette valeur. |
40 | 59 |
|
41 | | -Set this in your CPLEX option file: `threads = <value>` (see [Solver Options](options_solver.md)). |
| 60 | +**Étape 4 — Calculer `--cpu`** |
| 61 | + |
| 62 | +``` |
| 63 | +Plafond RAM = RAM totale ÷ RAM par scénario |
| 64 | +Plafond CPU = vCPU totaux ÷ threads |
| 65 | +
|
| 66 | +--cpu = min(Plafond RAM, Plafond CPU) |
| 67 | +``` |
42 | 68 |
|
43 | 69 | --- |
44 | 70 |
|
45 | | -## Example |
| 71 | +## Exemple concret |
46 | 72 |
|
47 | | -| Parameter | Value | |
48 | | -|---|---| |
49 | | -| Total RAM | 128 GB | |
50 | | -| Memory per simulation (VSS) | 32 GB | |
51 | | -| Max parallel jobs (`--cpu`) | 4 | |
52 | | -| Total threads | 8 | |
53 | | -| Threads per simulation (`threads`) | 2 | |
| 73 | +Machine : **256 Go RAM, 32 vCPU**, scénario de ~32 Go, `threads = 8` |
| 74 | + |
| 75 | +``` |
| 76 | +Plafond RAM = 256 ÷ 32 = 8 jobs |
| 77 | +Plafond CPU = 32 ÷ 8 = 4 jobs |
| 78 | +
|
| 79 | +--cpu = min(8, 4) = 4 |
| 80 | +``` |
| 81 | + |
| 82 | +Ici le CPU est limitant. On lance avec `--cpu 4`, ce qui laisse ~64 Go de RAM inutilisée. |
54 | 83 |
|
55 | 84 | ```sh |
56 | 85 | python epm.py --folder_input my_country --config config.csv --scenarios --cpu 4 |
57 | 86 | ``` |
| 87 | + |
| 88 | +--- |
| 89 | + |
| 90 | +## Arbitrage : threads vs. scénarios parallèles |
| 91 | + |
| 92 | +Le nombre de threads par solve est un paramètre à ajuster selon votre usage. |
| 93 | + |
| 94 | +**Beaucoup de scénarios à passer (longue file)** |
| 95 | +→ Préférez **moins de threads, plus de jobs parallèles**. |
| 96 | +La parallélisation entre scénarios est quasi parfaite (chaque job indépendant), alors que le gain en threads dans un solve est à rendement décroissant — passer de 4 à 8 threads accélère peu un solve donné. Davantage de solves en parallèle finissent une longue file plus rapidement. |
| 97 | + |
| 98 | +*Exemple : baisser à `threads = 5` → Plafond CPU = 32 ÷ 5 = 6 jobs → `--cpu 6` au lieu de 4.* |
| 99 | + |
| 100 | +**Peu de scénarios lourds (MIP sans `--simple`)** |
| 101 | +→ Préférez **plus de threads, moins de jobs parallèles**. |
| 102 | +Concentrez les ressources sur chaque solve pour le terminer plus vite. |
| 103 | + |
| 104 | +> **Note** — Il est possible de dépasser légèrement le plafond CPU (ex. `--cpu 6` avec `threads = 8` sur 32 vCPU). L'OS partage alors le temps CPU entre les threads et les jobs s'exécutent plus lentement. Les résultats restent corrects mais le débit global est réduit par rapport à une allocation équilibrée. |
| 105 | +
|
| 106 | +--- |
| 107 | + |
| 108 | +## Récapitulatif |
| 109 | + |
| 110 | +| Situation | Recommandation | |
| 111 | +|---|---| |
| 112 | +| Longue file de scénarios RMIP | Baisser `threads`, augmenter `--cpu` | |
| 113 | +| Peu de scénarios MIP lourds | Garder `threads` élevé, `--cpu` plus bas | |
| 114 | +| Machine partagée (2 modélisateurs) | Diviser `--cpu` par 2 | |
0 commit comments