feat: add optional parallel processing and disk cache for scan_templates#7
feat: add optional parallel processing and disk cache for scan_templates#7MariusYvard wants to merge 1 commit into
Conversation
|
Bonjour Marius, Je regarderai plus dans le détails dans quelque semaine (deadline importante en approche). Deux questions rapides :
|
|
Bonjour Claudio, Merci ! Bonne chance pour ta deadline, et ne t'inquiète pas, ce n'est pas pressé.
À bientôt, |
|
Salut Marius, je me suis fait aider par Copilot pour créer un mécanisme pour sérialiser / désérialiser l'objet Je te laisse regarder le code dans config.py et me dire si cela peut t'aider avec Merci d'avance ! |
31146ef to
cdf0635
Compare
Dispatch template-scan time chunks to a pool of worker processes so the CPU-bound cross-correlation runs across cores and FDSN downloads overlap. Each worker rebuilds the config singleton from a pickle-safe snapshot (config.to_picklable_config_dict) and reuses the same _scan_family_template as the serial scan, so detections are identical. Overlap-zone duplicates are removed by the existing database UNIQUE(family_number, trace_id, evid) constraint. Serial behaviour is unchanged: template_scan_nprocs / --nprocs default to auto-detection (0); set to 1 to force the serial path, mirroring the scan_catalog --nprocs convention. Adds tests/unit/test_scan_templates_parallel.py.
7ac30f1 to
083dbaa
Compare
|
Salut Claudio, Merci beaucoup, ton mécanisme de sérialisation est exactement ce qu'il fallait. J'en ai profité pour réécrire la PR sur le
Un point sur lequel je veux ton avis : le worker réutilise J'ai ajouté un test unitaire ( Pour la PR du stage (NCC ondes S, dégénérescence des templates, format FDSN 1998-2002, seuils combinés), je m'en occupe séparément comme convenu. À bientôt, |
Salut Claudio,
Je te soumets une feature sur laquelle j'ai travaillé après le stage, en partant directement des observations faites sur FDF, MPOM et BIM pendant la détection des séismes répétés dans les Petites Antilles.
Contexte
Le scan séquentiel devient le goulot d'étranglement dès qu'on dépasse quelques années de données continues. Sur 20 ans de données FDF, les runs prenaient plusieurs jours même avec le chunking et la décimation optimisés (chunk = 24 h, taux = 2). L'idée ici est de paralléliser le dispatch des chunks temporels en gardant le comportement séquentiel intact par défaut (
n_jobs = 1).Ce que j'ai ajouté
requake/parallel_utils.py(nouveau module) :parallel_map()— wrapper léger autour deProcessPoolExecutor, utilisable dansscan_catalog.pypour les paires sérialisablesn_jobsidentique à joblib (−1 = tous les CPUs, etc.)concurrent.futuresethashlibde la stdlibrequake/scan/scan_templates.py(ajouts uniquement, original intact) :_split_time_range()— découpe avec chevauchement aux bords (marge = durée du template, 120 s par défaut) pour éviter de couper un pic de CC à cheval sur deux chunks_merge_detections()— déduplique les détections dans les zones de chevauchement en gardant la CC la plus haute_scan_chunk_threaded()— worker thread-safe avec cache local par threadscan_templates()étendue : mode séquentiel (n_jobs=1) inchangé, mode parallèle viaThreadPoolExecutorquandn_jobs > 1requake/config/configspec.conf(ajouts en bas) :Comportement par défaut inchangé
Sans toucher à la config,
n_jobs = 1maintient le mode séquentiel exact — le blocif n_jobs == 1appelle le code original ligne pour ligne.Ce que j'ai testé
N'hésite pas à me dire si tu préfères une organisation différente (ex. intégrer les helpers directement dans
scan_catalog.pyplutôt qu'un module séparé, ou renommern_jobspour coller à une convention existante dans Requake). Je suis dispo pour adapter.Marius