Skip to content

Commit fa08b07

Browse files
mbaronnetclaude
andcommitted
docs: rewrite Performance & Threads page with dual-bottleneck model
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a4eac35 commit fa08b07

1 file changed

Lines changed: 83 additions & 26 deletions

File tree

docs/run/options_thread.md

Lines changed: 83 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,114 @@
11
# Performance & Threads
22

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.
44

55
---
66

7-
## Key concepts
7+
## Concepts clés
88

9-
| Term | What it means |
9+
| Terme | Signification |
1010
|---|---|
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 |
1416

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.
1618
1719
---
1820

19-
## How to size your parallel runs
21+
## Les deux plafonds à respecter
2022

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** :
2224

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**
2539

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).
2842

29-
**Step 3:Calculate max parallel jobs**
43+
**Étape 2 — Mesurer la RAM par scénario**
3044

45+
Lancez un scénario seul et cherchez dans le fichier `.lst` ou la console GAMS Studio :
3146
```
32-
Max parallel jobs = Total RAM / Memory per simulation
47+
ProcTreeMemMonitor → VSS
3348
```
49+
C'est l'empreinte mémoire maximale de ce scénario. Utilisez cette valeur.
3450

35-
**Step 4:Set threads per simulation**
51+
**Étape 3 — Connaître votre `threads`**
3652

53+
Regardez votre fichier d'options CPLEX (`cplex_baseline.opt`) :
3754
```
38-
Threads per simulation = Total threads / Max parallel jobs
55+
threads = 8
3956
```
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.
4059

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+
```
4268

4369
---
4470

45-
## Example
71+
## Exemple concret
4672

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.
5483

5584
```sh
5685
python epm.py --folder_input my_country --config config.csv --scenarios --cpu 4
5786
```
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

Comments
 (0)