Hateno, un outil pour automatiser la gestion de simulations numériques

  • Jérémy Heleine

Rencontre JCJC Développement
Inria Saclay Île-de-France

Mardi 30 novembre 2021

Contexte

Thèse : imagerie micro-ondes

AVC

Étude du problème direct : on fait varier les paramètres de la perturbation et on étudie leur influence sur les mesures.

Pour chaque perturbation, on fixe ses paramètres, on lance le solveur (à distance la plupart du temps), on récupère les résultats.

Tout est manuel, c'est long, et la gestion des doublons n'est pas simple.

Contexte

Un programme est développé pour répondre à ces deux problématiques :
  • un manager gère les simulations et permet de récupérer des copies sans générer de doublons,
  • un générateur automatise l'étape de lancement des simulations.

C'est (très) dépendant de ces travaux en particulier, avec un code un peu moche.

Un outil plus générique : Hateno, développement débuté en décembre 2019.

Sommaire

  1. Contexte
  2. Gestion via les paramètres
  3. Automatisation complète
  4. Recherche de paramètres
  5. État des lieux du projet

Gestion via les paramètres

Gestion via les paramètres

Une description d'une simulation

Utilisation du format JSON pour une description plus naturelle d'une simulation.


							{
								"folder": "simulations/example",
								"settings": {
									"perturbation": {
										"x": 0,
										"y": 0.2,
										"z": 0.1,
										"r": 1
									}
								}
							}
						

Gestion via les paramètres

Sérialisation et gestion

Toute simulation est identifiée par une chaîne de caractères unique (sérialisation de la représentation JSON).

Ajouter une simulation à la base revient à faire le lien entre cet identifiant et les fichiers compressés.

Par la suite, ce même identifiant permet de déterminer si une simulation existe déjà, pour extraire ses fichiers ou pour la supprimer de la base.

Gestion via les paramètres

Doublons et correction

La description de simulations peut être stockée dans un fichier JSON, ou générée via un script Python.


							def generate():
								return [
									{
										'folder': f'simulations/x_{x}',
										'settings': {
											'perturbation': {
												'x': x,
												'y': 0
											}
										}
									}
									for x in (0.8 * k / 9 for k in range(0, 10))
								]
						

Gestion via les paramètres

Doublons et correction

L'identification des paramètres est stricte : '0.0' != '0' !

Les valeurs peuvent être altérées avant d'être utilisées via les fixers (arrondis, conversions, …).

Automatisation complète

Automatisation complète

Générateur

Le manager seul ne permet pas de générer des simulations : une étape (manuelle) d'identification reste nécessaire et peut mener à des erreurs.

Un second module, le générateur, permet de générer une ligne de commande à partir de la description d'une simulation.

Automatisation complète

Générer les simulations

Générer les simulations est a priori facile :

  1. on stocke les lignes dans un fichier,
  2. un script lit la première ligne et l'exécute,
  3. une fois l'exécution finie, il lit la seconde et l'exécute,

Comment les générer en parallèle ?

Pour générer $N$ simulations sur $p$ processus parallèles, on peut découper la liste des simulations en $p$ groupes de $\frac{N}{p}$.

Automatisation complète

Jobs

Deux fichiers sont à la base des jobs :

  1. un fichier listant les lignes de commande,
  2. un compteur indiquant quelle ligne est la suivante à lancer.

ligne 1ligne 2ligne 3Compteur : 1ligne 1ligne 2ligne 3Job 1Compteur : 1ligne 1ligne 2ligne 3Job 1Compteur : 1ligne 1ligne 2ligne 3Job 1Job 2Compteur : 1ligne 1ligne 2ligne 3Job 1Job 2Compteur : 2ligne 1ligne 2ligne 3Job 1Job 2Compteur : 3ligne 1ligne 2ligne 3Job 1Job 2Compteur : 4

Intérêt : plusieurs jobs peuvent tourner en parallèle, avec ajout dynamique possible.

Automatisation complète

Maker

À ce stade plusieurs étapes sont automatisées mais les liens entre eux restent manuels :

  1. on utilise le manager pour extraire des simulations,
  2. on obtient une erreur pour celles qui n'existent pas,
  3. on utilise le générateur pour créer les fichiers nécessaires,
  4. on utilise les jobs pour générer les simulations,
  5. on utilise le manager pour ajouter les nouvelles simulations,
  6. on utilise le manager pour extraire la liste complète.

Un nouveau module fait le lien entre tous : le Maker.

Le Maker boucle jusqu'à avoir toutes les simulations en utilisant les autres modules.

Recherche de paramètres

Recherche de paramètres

Exemple : recherche d'un zéro

Le Maker est utile pour tester des paramètres fixés à l'avance : comment l'utiliser pour déterminer un paramètre optimal ?

Exemple : un script admet pour paramètre un nombre $L$ et stocke les valeurs de la fonction $x \mapsto \cos(Lx)$ pour $x \in [-1,1]$.

On évalue une simulation en sommant les valeurs obtenues (jusqu'à l'avant-dernière) et on recherche le zéro de cette fonction d'évaluation.

Calculer cette somme revient à approcher l'intégrale de $\cos(L\cdot)$ sur $[-1,1]$ (à une constante multiplicative près). Les zéros de cette intégrale sont les multiples de $\pi$.

Recherche de paramètres

Exemple : recherche d'un zéro

Une première idée est d'utiliser le Maker : on teste plusieurs valeurs de $L$, on évalue chaque simulation et on affine l'intervalle de recherche manuellement.

C'est manuel, un peu (beaucoup) ennuyeux, et on stocke des simulations qui ne sont pas forcément nécessaires.

Un autre module permet d'automatiser cette tâche : le Mapper.

Recherche de paramètres

Évaluation d'une simulation

Une fonction d'évaluation est définie par l'utilisateur : elle associe une simulation ou un groupe de simulations à une valeur (généralement un nombre).

Le Mapper permet d'associer des simulations à ces valeurs sans nécessairement les stocker.

Le Mapper utilise le Maker pour générer les simulations décrites, puis appelle la fonction d'évaluation et enfin teste le passage en 0.

Recherche de paramètres

Recherche automatique

Le Mapper peut aussi être utilisé pour affiner l'intervalle de recherche automatiquement.

En utilisant une méthode de dichotomie ou de sécante, le bon paramètre peut être calculé :

  1. on évalue quelques valeurs de paramètres pour commencer,
  2. on teste le passage par la bonne valeur,
  3. on obtient un intervalle qui définit une nouvelle valeur à tester,
  4. la simulation correspondante est générée et évaluée,
  5. et on continue jusqu'à avoir la bonne précision.

État des lieux du projet

État des lieux du projet

Hateno est utilisable, pour générer des simulations ou rechercher des paramètres optimaux.

Le code est instable et le restera jusqu'à la version 1.0 : des ajustements sont parfois nécessaires entre deux versions (exemple : la future version 0.17 qui va encore tout casser).

Ce ne sont pas les idées qui manquent pour la suite :
  • possibilité d'interrompre le Maker,
  • possibilité de générer une documentation,
  • ajout de tags sur les simulations,
  • récupérer des stats sur les jobs,
  • interface graphique.

Merci de votre attention

https://github.com/JeremyHeleine/Hateno