{"id":1237,"date":"2026-08-21T14:28:36","date_gmt":"2026-08-21T14:28:36","guid":{"rendered":"https:\/\/matforge.org\/?p=1237","raw":"https:\/\/matforge.org\/?p=1237"},"modified":"2026-08-21T14:28:36","modified_gmt":"2026-08-21T14:28:36","slug":"reproducible-research-workflows-docker-and-conda-for-simulation-projects","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/","title":{"rendered":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation","raw":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>Les flux de travail de recherche reproductibles garantissent que les r\u00e9sultats de la simulation peuvent \u00eatre exactement recr\u00e9\u00e9s par les autres (ou votre futur moi) en utilisant les m\u00eames donn\u00e9es, codes et environnement de calcul. <strong>Docker<\/strong> fournit une conteneurisation compl\u00e8te au niveau du syst\u00e8me pour une coh\u00e9rence maximale entre les plates-formes, tandis que <strong>CONDA<\/strong> offre un package l\u00e9ger et une gestion de l&rsquo;environnement id\u00e9al pour le calcul scientifique bas\u00e9 sur Python. Pour les projets de simulation, nous recommandons : (1) utiliser CONDA pour le d\u00e9veloppement quotidien et la gestion des d\u00e9pendances, (2) cr\u00e9er des images Docker pour \u00ab\u00a0geler\u00a0\u00bb les environnements de travail pour la publication et la collaboration, et (3) toujours associer au contr\u00f4le de version et \u00e0 une documentation approfondie. \u00c9vitez l&rsquo;erreur courante de se fier uniquement \u00e0 un seul outil : combinez les deux pour une reproductibilit\u00e9 robuste.<\/p>\n<h2>Introduction : L&rsquo;\u00e9cart de reproductibilit\u00e9 dans la recherche en simulation<\/h2>\n<p>Les projets de simulation scientifique souffrent souvent d&rsquo;un mode de d\u00e9faillance silencieux : le code a fonctionn\u00e9 hier, mais aujourd&rsquo;hui, il produit des r\u00e9sultats diff\u00e9rents. La physique sous-jacente n&rsquo;a pas chang\u00e9, votre environnement de calcul l&rsquo;a fait. Les versions de packages manquantes, les d\u00e9pendances de biblioth\u00e8que modifi\u00e9es, les mises \u00e0 jour du syst\u00e8me d&rsquo;exploitation ou m\u00eame diff\u00e9rents interpr\u00e9teurs Python peuvent modifier silencieusement les sorties de simulation, parfois de mani\u00e8re difficile \u00e0 d\u00e9tecter.<\/p>\n<p>C&rsquo;est plus qu&rsquo;un inconv\u00e9nient. <strong>Reproductibilit\u00e9<\/strong> est la pierre angulaire de la science cumulative, la capacit\u00e9 pour d&rsquo;autres chercheurs \u00e0 v\u00e9rifier les r\u00e9clamations et \u00e0 s&rsquo;appuyer sur votre travail. Lorsque les r\u00e9sultats de la simulation ne peuvent pas \u00eatre recr\u00e9\u00e9s de mani\u00e8re fiable, les \u00e9rodes de confiance, les articles sont r\u00e9tract\u00e9s et un temps de recherche pr\u00e9cieux est perdu \u00e0 d\u00e9boguer les probl\u00e8mes environnementaux au lieu de faire progresser les connaissances.<\/p>\n<p>Dans ce guide, nous examinerons comment mettre en \u0153uvre des flux de recherche reproductibles pour des projets de simulation \u00e0 l&rsquo;aide de <strong>Docker<\/strong> et <strong>CONDA<\/strong>&nbsp;: deux outils compl\u00e9mentaires qui, lorsqu&rsquo;ils sont utilis\u00e9s ensemble, fournissent une solution robuste pour la coh\u00e9rence de l&rsquo;environnement, la gestion des d\u00e9pendances et la conservation \u00e0 long terme de M\u00e9thodes informatiques.<\/p>\n<h2>Qu&rsquo;est-ce que la recherche reproductible ? D\u00e9finitions et composants de base<\/h2>\n<p>\u00c0 la base, <strong>recherche reproductible<\/strong> signifie qu&rsquo;un chercheur ind\u00e9pendant peut r\u00e9g\u00e9n\u00e9rer les r\u00e9sultats publi\u00e9s (tableaux, chiffres, r\u00e9sultats quantitatifs) en utilisant uniquement les donn\u00e9es, le code et la documentation d&rsquo;origine. Tel que d\u00e9fini par Turing Way et largement adopt\u00e9 en sciences informatiques, cela n\u00e9cessite :<\/p>\n<ul>\n<li><strong>Donn\u00e9es de donn\u00e9es<\/strong>&nbsp;: les donn\u00e9es d&rsquo;entr\u00e9e brutes sont accessibles (avec des consid\u00e9rations de confidentialit\u00e9 appropri\u00e9es)<\/li>\n<li><strong>Transparence du code<\/strong>&nbsp;: tous les scripts d&rsquo;analyse et de simulation sont partag\u00e9s<\/li>\n<li><strong>Documentation<\/strong>&nbsp;: enregistrements complets des versions du logiciel, des param\u00e8tres et des configurations d&rsquo;environnement<\/li>\n<li><strong>Compute Environmental Control<\/strong>&nbsp;: l&rsquo;environnement d&rsquo;ex\u00e9cution exact est captur\u00e9 et reconstruit<\/li>\n<\/ul>\n<p>La reproductibilit\u00e9 informatique diff\u00e8re de la <strong>replicabilit\u00e9<\/strong> (obtenant des conclusions similaires \u00e0 l&rsquo;aide de nouvelles donn\u00e9es ou de m\u00e9thodes ind\u00e9pendantes). La reproductibilit\u00e9 est la norme minimale : il s&rsquo;agit d&rsquo;obtenir les m\u00eames chiffres des m\u00eames entr\u00e9es, et non de valider les affirmations scientifiques sous-jacentes.<\/p>\n<blockquote>\n<p><strong>Pourquoi c&rsquo;est important pour les projets de simulation<\/strong>&nbsp;: les solveurs PDE, les m\u00e9thodes par \u00e9l\u00e9ments finis et d&rsquo;autres cadres de simulation impliquent souvent des cha\u00eenes de d\u00e9pendance complexes. Un changement de version mineur dans une biblioth\u00e8que num\u00e9rique peut modifier le comportement de discr\u00e9tisation, les crit\u00e8res de convergence ou l&rsquo;arrondi, en produisant des r\u00e9sultats mesurablement diff\u00e9rents. Les flux de travail reproductibles \u00e9liminent cette source d&rsquo;incertitude.<\/p>\n<\/blockquote>\n<h2>Docker pour des simulations scientifiques reproductibles<\/h2>\n<h3>Ce que Docker fournit<\/h3>\n<p><strong>Docker<\/strong> est une plate-forme de conteneurisation qui regroupe une application et l&rsquo;ensemble de son environnement d&rsquo;ex\u00e9cution (syst\u00e8me d&rsquo;exploitation, biblioth\u00e8ques, d\u00e9pendances, fichiers de configuration) dans une image portable et immuable. Lorsque vous ex\u00e9cutez un conteneur Docker, vous ex\u00e9cutez exactement le m\u00eame environnement qui a \u00e9t\u00e9 construit et test\u00e9, quel que soit le syst\u00e8me h\u00f4te.<\/p>\n<p>Pour les projets de simulation, Docker propose :<\/p>\n<ol>\n<li><strong>Coh\u00e9rence environnementale<\/strong>&nbsp;: plus \u00ab\u00a0\u00e7a marche sur ma machine\u00a0\u00bb. Le conteneur comprend des versions sp\u00e9cifiques des compilateurs, des impl\u00e9mentations MPI, des interpr\u00e9teurs Python et des biblioth\u00e8ques num\u00e9riques.<\/li>\n<li><strong>Portabilit\u00e9 de la plate-forme<\/strong>&nbsp;: une image Docker construite sur un ordinateur portable peut fonctionner sur un cluster HPC, une instance cloud ou un poste de travail de coll\u00e8gue sans modification.<\/li>\n<li><strong>isolement<\/strong>&nbsp;: les d\u00e9pendances de simulation n&rsquo;entrent pas en conflit avec les biblioth\u00e8ques syst\u00e8me ou d&rsquo;autres projets.<\/li>\n<li><strong>Snapshots versionn\u00e9s<\/strong>&nbsp;: chaque image Docker est immuable et peut \u00eatre \u00e9tiquet\u00e9e (par exemple, <code>my-sim:paper-v1<\/code>) pour une reproduction exacte future.<\/li>\n<\/ol>\n<h3>Limites de Docker \u00e0 prendre en compte<\/h3>\n<p>Malgr\u00e9 ses atouts, Docker a des contraintes importantes pour le calcul scientifique :<\/p>\n<ul>\n<li><strong>Pas une solution miracle<\/strong>&nbsp;: comme indiqu\u00e9 dans \u00ab\u00a0Docker ne garantit pas la reproductibilit\u00e9\u00a0\u00bb (ARXIV 2026), les conteneurs peuvent toujours pr\u00e9senter un comportement non d\u00e9terministe si le mat\u00e9riel sous-jacent diff\u00e8re (architecture CPU, optimisations en virgule flottante) ou si les services externes (base de donn\u00e9es, fichier syst\u00e8me) varient.<\/li>\n<li><strong>D\u00e9pendance du noyau<\/strong>&nbsp;: les conteneurs Docker partagent le noyau h\u00f4te. Cela signifie que le comportement du conteneur peut toujours \u00eatre affect\u00e9 par la version et la configuration du noyau h\u00f4te.<\/li>\n<li><strong>Size Overhead<\/strong>&nbsp;: les images compl\u00e8tes du syst\u00e8me d&rsquo;exploitation peuvent \u00eatre grandes (des centaines de Mo \u00e0 GB), bien que des images minces comme <code>alpine<\/code> aident.<\/li>\n<li><strong>Restrictions HPC<\/strong>&nbsp;: de nombreux centres HPC n&rsquo;autorisent pas Docker directement en raison de probl\u00e8mes de s\u00e9curit\u00e9&nbsp;; Ils utilisent plut\u00f4t <strong>singularit\u00e9<\/strong> ou <strong>apptainer<\/strong>. Cependant, vous pouvez cr\u00e9er des images de singularit\u00e9 \u00e0 partir d&rsquo;images Docker, faisant de Docker un outil de d\u00e9veloppement viable.<\/li>\n<\/ul>\n<h3>R\u00e9daction de Dockerfiles pour des projets de simulation<\/h3>\n<p>Le <strong>Dockerfile<\/strong> d\u00e9finit comment cr\u00e9er votre conteneur. \u00c0 la suite de \u00ab\u00a0Dix r\u00e8gles simples pour la r\u00e9daction de Dockerfiles for Reproductible Research\u00a0\u00bb (N\u00fcst et al., 2020), les principales pratiques comprennent:<\/p>\n<pre><code class=\"language-dockerfile\"># Start from a minimal, pinned base image\nFROM ubuntu:22.04  # Pin exact version, not :latest\n\n# Set environment variables for reproducibility\nENV LANG=C.UTF-8\nENV LC_ALL=C.UTF-8\n\n# Install system dependencies in one layer to minimize cache issues\nRUN apt-get update &amp;&amp; apt-get install -y \n    python3 \n    python3-pip \n    libopenblas-dev \n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\n# Create and set working directory\nWORKDIR \/simulation\n\n# Copy dependency specifications first (for better caching)\nCOPY requirements.txt environment.yml .\/\n\n# Install Python packages with pinned versions\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy simulation code\nCOPY src\/ .\/src\/\nCOPY scripts\/ .\/scripts\/\nCOPY data\/ .\/data\/\n\n# Define entry point or command\nENTRYPOINT [\"python3\", \"scripts\/run_simulation.py\"]\n<\/code><\/pre>\n<p><strong>R\u00e8gle de cl\u00e9<\/strong>&nbsp;: \u00e9pinglez toutes les versions de mani\u00e8re explicite&nbsp;: image de base, packages de syst\u00e8me d&rsquo;exploitation, packages Python et m\u00eame version PIP. Utilisez <code>requirements.txt<\/code> ou <code>environment.yml<\/code> avec des versions exactes (<code>package==1.2.3<\/code>, pas <code>package&gt;=1.0<\/code>).<\/p>\n<h2>Conda pour la gestion de l&rsquo;environnement dans la recherche<\/h2>\n<h3>Ce que Conda fournit<\/h3>\n<p><strong>CONDA<\/strong> est un gestionnaire de packages et d&rsquo;environnements multi-plateforme qui g\u00e8re non seulement les packages Python, mais \u00e9galement les d\u00e9pendances non Python (biblioth\u00e8ques C\/C++, compilateurs, MPI). Cela le rend particuli\u00e8rement bien adapt\u00e9 \u00e0 la simulation scientifique o\u00f9 vous pourriez avoir besoin de versions sp\u00e9cifiques d&rsquo;OpenMPI, FFTW ou HDF5.<\/p>\n<p>Conda livre :<\/p>\n<ol>\n<li><strong>Agnostique linguistique<\/strong>&nbsp;: installez les biblioth\u00e8ques Python, R, C\/C++ et les outils syst\u00e8me dans un seul environnement.<\/li>\n<li><strong>D\u00e9pendances binaires<\/strong>&nbsp;: les packages pr\u00e9-compil\u00e9s \u00e9vitent la compilation de l&rsquo;enfer sur diff\u00e9rents syst\u00e8mes.<\/li>\n<li><strong>Environnements isol\u00e9s<\/strong>&nbsp;: chaque projet a son propre environnement sans contamination crois\u00e9e.<\/li>\n<li><strong>export\/import<\/strong>&nbsp;: <code>conda env export &gt; environment.yml<\/code> Capture l&rsquo;ensemble de l&rsquo;environnement pour une reproduction exacte.<\/li>\n<\/ol>\n<h3>Meilleures pratiques Conda<\/h3>\n<p>Bas\u00e9 sur les conseils de MSI University of Minnesota et Anaconda :<\/p>\n<ul>\n<li><strong>Ne jamais installer dans <code>base<\/code><\/strong>&nbsp;: cr\u00e9er un nouvel environnement pour chaque projet&nbsp;:\n<pre><code class=\"language-bash\">conda create --name my-simulation python=3.11\nconda activate my-simulation\n<\/code><\/pre>\n<\/li>\n<li><strong>Utiliser les canaux communautaires<\/strong>&nbsp;: pr\u00e9f\u00e8re <code>conda-forge<\/code> aux valeurs par d\u00e9faut pour des packages scientifiques plus \u00e0 jour&nbsp;:\n<pre><code class=\"language-bash\">conda config --add channels conda-forge\nconda config --set channel_priority strict\n<\/code><\/pre>\n<\/li>\n<li><strong>Installer tous les packages \u00e0 la fois<\/strong>&nbsp;: cela \u00e9vite les conflits de d\u00e9pendance&nbsp;:\n<pre><code class=\"language-bash\">conda install numpy scipy matplotlib fipy\n<\/code><\/pre>\n<\/li>\n<li><strong>Ne modifiez pas les environnements existants<\/strong>&nbsp;: si vous avez besoin de nouveaux packages, mettez \u00e0 jour la sp\u00e9cification de l&rsquo;environnement ou cr\u00e9ez un nouvel environnement \u00e0 partir du fichier YAML mis \u00e0 jour.<\/li>\n<li><strong>Exporter proprement <\/strong>&nbsp;: lors du partage, supprimez les packages sp\u00e9cifiques \u00e0 la plate-forme et les \u00e9l\u00e9ments install\u00e9s par PIP qui ne sont pas essentiels&nbsp;:\n<pre><code class=\"language-bash\">conda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<h2>Docker vs Conda : quand choisir lequel<\/h2>\n<p>La question n&rsquo;est pas \u00ab\u00a0Docker ou Conda&nbsp;?\u00a0\u00bb&nbsp;: ils r\u00e9solvent diff\u00e9rents probl\u00e8mes et sont <strong>compl\u00e9mentaires<\/strong>.<\/p>\n<table>\n<thead>\n<tr>\n<th>aspect<\/th>\n<th>Docker<\/th>\n<th>peste<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Scope<\/strong><\/td>\n<td>Syst\u00e8me d&rsquo;exploitation et d&rsquo;ex\u00e9cution complets<\/td>\n<td>Forfait &amp; Responsable environnement<\/td>\n<\/tr>\n<tr>\n<td><strong>Isolation<\/strong><\/td>\n<td>Niveau syst\u00e8me (espace de noms du noyau)<\/td>\n<td>Environnement d&rsquo;espace utilisateur<\/td>\n<\/tr>\n<tr>\n<td><strong>Taille<\/strong><\/td>\n<td>Grand (100&nbsp;Mo\u20131&nbsp;Go+)<\/td>\n<td>Petit (Mbs)<\/td>\n<\/tr>\n<tr>\n<td><strong>Vitesse<\/strong><\/td>\n<td>Plus lent \u00e0 construire\/transf\u00e9rer<\/td>\n<td>Activation instantan\u00e9e<\/td>\n<\/tr>\n<tr>\n<td><strong>Assistance HPC<\/strong><\/td>\n<td>Limit\u00e9 (travaux de singularit\u00e9)<\/td>\n<td>Excellent (natif)<\/td>\n<\/tr>\n<tr>\n<td><strong>Cas d&rsquo;utilisation<\/strong><\/td>\n<td>Publication, partage, d\u00e9ploiement<\/td>\n<td>D\u00e9veloppement quotidien, exploration<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Recommandation pratique<\/h3>\n<ul>\n<li><strong>Utilisez Conda pour le d\u00e9veloppement<\/strong>&nbsp;: cr\u00e9ez rapidement des environnements isol\u00e9s, testez des d\u00e9pendances, it\u00e9rez sur le code. C&rsquo;est l\u00e9ger et rapide.<\/li>\n<li><strong>Utilisez Docker pour la conservation<\/strong>&nbsp;: une fois que votre simulation fonctionne, cr\u00e9ez une image Docker pour \u00ab\u00a0geler\u00a0\u00bb l&rsquo;environnement exact. Partagez cette image avec des collaborateurs, joignez-la \u00e0 des publications ou utilisez-la pour CI\/CD.<\/li>\n<li><strong>Combinez les deux<\/strong>&nbsp;: d\u00e9veloppez en conda, puis cr\u00e9ez un fichier Docker qui&nbsp;:\n<ul>\n<li>copie l&rsquo;environnement conda dans l&rsquo;image, soit<\/li>\n<li>recr\u00e9e l&rsquo;environnement \u00e0 l&rsquo;aide de l&rsquo;export <code>environment.yml<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Cette approche en couches vous donne une agilit\u00e9 de d\u00e9veloppement et une robustesse de publication.<\/p>\n<h2>Int\u00e9gration de Docker et Conda dans les flux de travail scientifiques<\/h2>\n<h3>Strat\u00e9gie&nbsp;1&nbsp;: Conda \u00e0 l&rsquo;int\u00e9rieur de Docker<\/h3>\n<p>L&rsquo;int\u00e9gration la plus courante consiste \u00e0 installer et \u00e0 utiliser Conda dans un conteneur Docker. Cela vous donne la gestion de packages \u00e0 grain fin de Conda dans l&rsquo;isolation du syst\u00e8me de Docker.<\/p>\n<pre><code class=\"language-dockerfile\">FROM ubuntu:22.04\n\n# Install Miniconda\nRUN wget https:\/\/repo.anaconda.com\/miniconda\/Miniconda3-latest-Linux-x86_64.sh \n    &amp;&amp; bash Miniconda3-latest-Linux-x86_64.sh -b -p \/opt\/conda \n    &amp;&amp; rm Miniconda3-latest-Linux-x86_64.sh\nENV PATH=\/opt\/conda\/bin:$PATH\n\n# Create and use a conda environment\nCOPY environment.yml .\nRUN conda env create -f environment.yml\nENV PATH=\/opt\/conda\/envs\/my-sim\/bin:$PATH\n<\/code><\/pre>\n<p><strong>Pros<\/strong>&nbsp;: exploite l&rsquo;\u00e9cosyst\u00e8me de packages scientifiques \u00e9tendu de Conda&nbsp;; Conform\u00e9ment aux workflows de d\u00e9veloppement local.<br \/> <strong>Cons<\/strong>&nbsp;: taille d&rsquo;image plus grande&nbsp;; Nuances d&rsquo;activation de Conda dans Docker.<\/p>\n<h3>Strat\u00e9gie&nbsp;2&nbsp;: Docker pour la capture d&rsquo;environnement<\/h3>\n<p>D\u00e9veloppez localement avec Conda, puis exportez l&rsquo;environnement et cuisez-le dans une image Docker sans ex\u00e9cuter Conda au moment de l&rsquo;ex\u00e9cution&nbsp;:<\/p>\n<pre><code class=\"language-dockerfile\">FROM python:3.11-slim\n\n# Copy pre-built packages or use pip from a frozen requirements.txt\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n<\/code><\/pre>\n<p>Ceci est plus simple mais perd la gestion des d\u00e9pendances non-Python de Conda.<\/p>\n<h3>Strat\u00e9gie&nbsp;3&nbsp;: builds en plusieurs \u00e9tapes pour HPC<\/h3>\n<p>Pour les clusters HPC utilisant Singularity, cr\u00e9ez l&rsquo;image Docker localement, puis convertissez-vous en Singularity&nbsp;:<\/p>\n<pre><code class=\"language-bash\">docker build -t my-sim:latest .\nsingularity build my-sim.sif docker:\/\/my-sim:latest\n<\/code><\/pre>\n<p>Ce flux de travail vous permet de d\u00e9velopper avec Docker (test facile) et de d\u00e9ployer sur HPC (Singularity).<\/p>\n<h2>Des pi\u00e8ges courants et comment les \u00e9viter<\/h2>\n<p>Sur la base de l&rsquo;analyse des d\u00e9fis de la reproductibilit\u00e9 dans la recherche par simulation, voici des erreurs critiques \u00e0 \u00e9viter&nbsp;:<\/p>\n<h3>1. <strong>Documentation manquante ou incompl\u00e8te<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: vous avez une image Docker en \u00e9tat de marche, mais aucune trace de la fa\u00e7on de l&rsquo;utiliser, des entr\u00e9es qu&rsquo;elle attend ou de la mani\u00e8re d&rsquo;interpr\u00e9ter les sorties.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: inclure un <code>README.md<\/code> dans le conteneur (ou \u00e0 c\u00f4t\u00e9 de l&rsquo;image) avec&nbsp;:<\/p>\n<ul>\n<li>Comment ex\u00e9cuter la simulation (arguments de ligne de commande)<\/li>\n<li>Formats de fichiers d&rsquo;entr\u00e9e attendus<\/li>\n<li>Descriptions des fichiers de sortie<\/li>\n<li>Besoin mat\u00e9riel (CPU, m\u00e9moire, GPU)<\/li>\n<li>Limites connues<\/li>\n<\/ul>\n<h3>2. <strong>D\u00e9pendances non \u00e9pingl\u00e9es<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: Utilisation de <code>numpy&gt;=1.0<\/code> ou <code>python=3.x<\/code> Autorise les mises \u00e0 jour automatiques qui peuvent changer de comportement.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: broches exactes des versions <code>environment.yml<\/code> et <code>requirements.txt<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-yaml\">dependencies:\n  - python=3.11.8\n  - numpy=1.26.4\n  - scipy=1.11.4\n  - pip:\n    - my-package==0.3.2\n<\/code><\/pre>\n<h3>3. <strong>Simulations non d\u00e9terministes<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: m\u00eame avec des environnements identiques, les simulations produisent des r\u00e9sultats l\u00e9g\u00e8rement diff\u00e9rents en raison de la non-associativit\u00e9 \u00e0 virgule flottante, des conditions de course parall\u00e8les ou de la m\u00e9moire non initialis\u00e9e.<\/p>\n<p><strong>Solution<\/strong>&nbsp;:<\/p>\n<ul>\n<li>D\u00e9finir des drapeaux d\u00e9terministes le cas \u00e9ch\u00e9ant (par exemple, OpenMP <code>OMP_NUM_THREADS=1<\/code>, threading BLAS)<\/li>\n<li>Utilisez des graines al\u00e9atoires fixes et documentez-les<\/li>\n<li>Testez la reproductibilit\u00e9 en ex\u00e9cutant le conteneur plusieurs fois sur le m\u00eame h\u00f4te<\/li>\n<\/ul>\n<h3>4. <strong>Grands donn\u00e9es \u00e0 l&rsquo;int\u00e9rieur des conteneurs<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: la pr\u00e9paration de grands ensembles de donn\u00e9es de simulation dans les images Docker les gonfle et ralentit la distribution.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: gardez les donn\u00e9es externes. Utilisez des volumes Docker ou des montages de liaison pour joindre des donn\u00e9es au moment de l&rsquo;ex\u00e9cution&nbsp;:<\/p>\n<pre><code class=\"language-bash\">docker run -v \/path\/to\/data:\/data my-sim:latest\n<\/code><\/pre>\n<p>Documenter clairement les attentes.<\/p>\n<h3>5. <strong>Ignorer les contraintes HPC<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: les images Docker qui fonctionnent sur un ordinateur portable tombent en panne sur un cluster HPC en raison de l&rsquo;impl\u00e9mentation MPI manquante, des pilotes incompatibles ou des restrictions de s\u00e9curit\u00e9.<\/p>\n<p><strong>Solution<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Testez t\u00f4t dans un environnement de type cluster<\/li>\n<li>Utilisez la compatibilit\u00e9 avec la singularit\u00e9 lors du ciblage de HPC<\/li>\n<li>\u00c9vitez les mod\u00e8les Docker-In-Docker ; Construisez sur une image de base qui correspond au syst\u00e8me d&rsquo;exploitation du cluster (par exemple, CentOS\/Rocky si le cluster les utilise)<\/li>\n<\/ul>\n<h3>6. <strong>Aucun contr\u00f4le de version pour les fichiers Docker et les fichiers d&rsquo;environnement<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: vous avez une image de travail mais pas d&rsquo;historique des modifications apport\u00e9es au Dockerfile ou <code>environment.yml<\/code>.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: Traitez les sp\u00e9cifications Dockerfile et environnement comme <strong>Code<\/strong>. Stockez-les dans Git \u00e0 c\u00f4t\u00e9 de votre code de simulation. Lib\u00e9rations de balises (par exemple, <code>git tag -a v1.0 -m \"Paper submission\"<\/code>).<\/p>\n<h3>7. <strong>Supervision des services externes<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: votre simulation extrait les donn\u00e9es d&rsquo;une base de donn\u00e9es ou d&rsquo;une API qui change avec le temps, ce qui rompt la reproductibilit\u00e9.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: soit&nbsp;: soit&nbsp;:<\/p>\n<ul>\n<li>Snapshot Donn\u00e9es externes et incluez-les dans votre r\u00e9f\u00e9rentiel ou votre conteneur, ou<\/li>\n<li>Utiliser les points de terminaison d&rsquo;API versionn\u00e9s et documenter la version\/la date exacte d&rsquo;acc\u00e8s<\/li>\n<\/ul>\n<h2>Consid\u00e9rations relatives aux HPC et aux clusters<\/h2>\n<p>Les environnements de calcul haute performance pr\u00e9sentent des d\u00e9fis de reproductibilit\u00e9 suppl\u00e9mentaires :<\/p>\n<h3>Singularity\/AppTainer au lieu de Docker<\/h3>\n<p>La plupart des centres HPC interdisent Docker pour des raisons de s\u00e9curit\u00e9. Au lieu de cela, ils fournissent <strong>singularit\u00e9<\/strong> (ou sa fourchette <strong>apptainer<\/strong>). Les conteneurs Singularity sont construits \u00e0 partir des images Docker :<\/p>\n<pre><code class=\"language-bash\"># On your local machine with Docker\ndocker pull ubuntu:22.04\ndocker tag ubuntu:22.04 my-sim:base\n\n# Build your image as usual\ndocker build -t my-sim:latest .\n\n# Transfer image to HPC and convert\nsingularity build my-sim.sif docker:\/\/my-sim:latest\n<\/code><\/pre>\n<p><strong>Diff\u00e9rence cl\u00e9<\/strong>&nbsp;: Singularity ex\u00e9cute des conteneurs en tant qu&rsquo;utilisateur invoquant (pas de racine), les chemins d&rsquo;installation du package diff\u00e8rent donc. Testez votre Dockerfile avec Singularity pour d\u00e9tecter les probl\u00e8mes plus t\u00f4t.<\/p>\n<h3>Syst\u00e8mes de modules<\/h3>\n<p>De nombreux clusters HPC utilisent des <strong>modules d&rsquo;environnement<\/strong> (LMOD) pour g\u00e9rer les versions logicielles. Vous pouvez soit&nbsp;:<\/p>\n<ul>\n<li>Chargez les modules requis avant d&rsquo;ex\u00e9cuter votre conteneur (si la singularit\u00e9 peut y acc\u00e9der), ou<\/li>\n<li>Cr\u00e9ez votre conteneur sur une image de base qui inclut d\u00e9j\u00e0 les biblioth\u00e8ques n\u00e9cessaires<\/li>\n<\/ul>\n<h3>E\/S parall\u00e8les et MPI<\/h3>\n<p>Si votre simulation utilise MPI (Interface de passage de messages), assurez-vous que votre conteneur inclut une impl\u00e9mentation MPI compatible. Pour Singularity, vous pouvez <strong>bind-mount<\/strong> les biblioth\u00e8ques MPI de l&rsquo;h\u00f4te&nbsp;:<\/p>\n<pre><code class=\"language-bash\">singularity run --nv -B \/usr\/lib\/x86_64-linux-gnu\/openmpi:\/usr\/lib\/x86_64-linux-gnu\/openmpi my-sim.sif\n<\/code><\/pre>\n<p>Vous pouvez \u00e9galement installer MPICH ou OpenMPI \u00e0 l&rsquo;int\u00e9rieur du conteneur et assurez-vous qu&rsquo;il est configur\u00e9 pour utiliser la structure de r\u00e9seau de l&rsquo;h\u00f4te (InfiniBand, etc.).<\/p>\n<h3>Prise en charge du GPU<\/h3>\n<p>Pour les simulations acc\u00e9l\u00e9r\u00e9es par GPU, Docker et Singularity n\u00e9cessitent des drapeaux sp\u00e9ciaux&nbsp;:<\/p>\n<ul>\n<li>Docker&nbsp;: <code>--gpus all<\/code><\/li>\n<li>Singularit\u00e9&nbsp;: <code>--nv<\/code><\/li>\n<\/ul>\n<p>Testez soigneusement la fonctionnalit\u00e9 du GPU dans votre conteneur.<\/p>\n<h2>Guide de mise en \u0153uvre \u00e9tape par \u00e9tape<\/h2>\n<p>Voici un flux de travail pratique pour la mise en \u0153uvre de flux de travail de recherche reproductibles dans votre projet de simulation&nbsp;:<\/p>\n<h3>Phase 1 : Configuration du projet<\/h3>\n<ol>\n<li><strong>Initialiser le contr\u00f4le de version<\/strong> (GIT)&nbsp;:\n<pre><code class=\"language-bash\">git init\ngit add .\ngit commit -m \"Initial project structure\"\n<\/code><\/pre>\n<\/li>\n<li><strong>Cr\u00e9er un environnement conda<\/strong>&nbsp;:\n<pre><code class=\"language-bash\">conda create --name my-sim python=3.11\nconda activate my-sim\n<\/code><\/pre>\n<\/li>\n<li><strong>Installer les d\u00e9pendances<\/strong> et les enregistrer&nbsp;:\n<pre><code class=\"language-bash\">conda install numpy scipy matplotlib fipy  # Example for PDE simulations\nconda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n<\/code><\/pre>\n<\/li>\n<li><strong>Cr\u00e9er une structure de projet<\/strong>&nbsp;:\n<pre><code>my-simulation\/\n\u251c\u2500\u2500 src\/              # Source code\n\u251c\u2500\u2500 scripts\/          # Run scripts, entry points\n\u251c\u2500\u2500 data\/             # Input data (git-ignored if large)\n\u251c\u2500\u2500 outputs\/          # Generated results (git-ignored)\n\u251c\u2500\u2500 docs\/             # Documentation\n\u251c\u2500\u2500 environment.yml   # Conda environment\n\u251c\u2500\u2500 requirements.txt  # Pip-only dependencies (if any)\n\u251c\u2500\u2500 Dockerfile        # Container definition\n\u251c\u2500\u2500 README.md         # Usage instructions\n\u2514\u2500\u2500 .gitignore        # Exclude outputs, large data\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>Phase 2 : D\u00e9veloppement avec Conda<\/h3>\n<ul>\n<li>D\u00e9velopper et tester \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;environnement Conda<\/li>\n<li>Valider les changements de code fr\u00e9quemment<\/li>\n<li>Mettre \u00e0 jour <code>environment.yml<\/code> lors de l&rsquo;ajout\/de la suppression de packages<\/li>\n<li>Utilisez <code>.gitignore<\/code> pour exclure les sorties g\u00e9n\u00e9r\u00e9es et les fichiers volumineux<\/li>\n<\/ul>\n<h3>Phase 3 : construction de l&rsquo;image Docker<\/h3>\n<ol>\n<li><strong>Cr\u00e9er un Dockerfile<\/strong> (voir l&rsquo;exemple ci-dessus)<\/li>\n<li><strong>Construire l&rsquo;image<\/strong>&nbsp;:\n<pre><code class=\"language-bash\">docker build -t my-sim:latest .\n<\/code><\/pre>\n<\/li>\n<li><strong>Testez le conteneur<\/strong>&nbsp;:\n<pre><code class=\"language-bash\">docker run -v $(pwd)\/data:\/data my-sim:latest python scripts\/run_simulation.py --input \/data\/input.h5\n<\/code><\/pre>\n<\/li>\n<li><strong>Tag pour publication<\/strong>&nbsp;:\n<pre><code class=\"language-bash\">docker tag my-sim:latest my-sim:paper-v1.0\n<\/code><\/pre>\n<\/li>\n<li><strong>Pousser vers le registre<\/strong> (facultatif, pour le partage)&nbsp;:\n<pre><code class=\"language-bash\">docker push my-registry.example.com\/my-sim:paper-v1.0\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>Phase 4 : V\u00e9rification et partage<\/h3>\n<ol>\n<li><strong>Testez la reproductibilit\u00e9<\/strong>&nbsp;: demandez \u00e0 un coll\u00e8gue de tirer et d&rsquo;ex\u00e9cuter l&rsquo;image. Ils devraient obtenir des r\u00e9sultats identiques (bit pour bit identiques si la simulation est d\u00e9terministe).<\/li>\n<li><strong>Document<\/strong>&nbsp;: assurez-vous que <code>README.md<\/code> comprend&nbsp;:\n<ul>\n<li>Comment obtenir l&rsquo;image (docker hub, registre ou <code>.sif<\/code> fichier)<\/li>\n<li>Comment l&rsquo;ex\u00e9cuter (commande compl\u00e8te)<\/li>\n<li>Sp\u00e9cifications des fichiers de saisie<\/li>\n<li>Fichiers de sortie attendus et leurs formats<\/li>\n<li>Informations sur les citations<\/li>\n<\/ul>\n<\/li>\n<li><strong>Archive<\/strong>&nbsp;: D\u00e9posez l&rsquo;image Docker (ou Singularity <code>.sif<\/code>) dans une archive \u00e0 long terme comme Zenodo ou FigShare, et incluez le lien dans les m\u00e9thodes de votre article ou la d\u00e9claration de disponibilit\u00e9 des donn\u00e9es.<\/li>\n<\/ol>\n<h3>Phase 5 : Maintenance \u00e0 long terme<\/h3>\n<ul>\n<li>Lorsque vous effectuez des modifications de code, mettez \u00e0 jour l&rsquo;image et la balise Docker avec une nouvelle version (par exemple, <code>v1.1<\/code>)<\/li>\n<li>Conservez les anciennes images\/tags aussi longtemps que vous devez reproduire les anciens r\u00e9sultats<\/li>\n<li>Utilisez des balises git pour corr\u00e9ler les validations de code avec les versions d&rsquo;image Docker<\/li>\n<\/ul>\n<h2>Conclusion et prochaines \u00e9tapes<\/h2>\n<p>La mise en \u0153uvre de workflows de recherche reproductible n&rsquo;est pas une d\u00e9cision d&rsquo;un seul outil, c&rsquo;est une <strong>strat\u00e9gie en couches<\/strong>&nbsp;:<\/p>\n<ul>\n<li><strong>CONDA<\/strong> pour une gestion de l&rsquo;environnement l\u00e9ger et rapide pendant le d\u00e9veloppement<\/li>\n<li><strong>Docker<\/strong> pour des instantan\u00e9s immuables et portables adapt\u00e9s \u00e0 la publication et \u00e0 la collaboration<\/li>\n<li><strong>Git<\/strong> pour le contr\u00f4le de version des sp\u00e9cifications de code, de fichiers DockerFile et d&rsquo;environnement<\/li>\n<li><strong>Documentation<\/strong> pour rendre le flux de travail compr\u00e9hensible et utilisable par d&rsquo;autres<\/li>\n<\/ul>\n<p>Pour les projets de simulation o\u00f9 l&rsquo;exactitude et la v\u00e9rification sont primordiales, cette combinaison fournit une base robuste. Commencez par Conda pour votre prochain projet, et une fois que la simulation fonctionne, investissez du temps pour cr\u00e9er une image Docker. Le co\u00fbt initial rapporte des dividendes lorsque vous (ou d&rsquo;autres) devez r\u00e9ex\u00e9cuter la simulation des mois ou des ann\u00e9es plus tard en toute confiance.<\/p>\n<p><strong>Prochaines \u00e9tapes \u00e0 suivre d\u00e8s aujourd&rsquo;hui&nbsp;:<\/strong><\/p>\n<ol>\n<li>V\u00e9rifier vos projets de simulation actuels&nbsp;: les environnements sont-ils document\u00e9s&nbsp;? Les d\u00e9pendances sont-elles \u00e9pingl\u00e9es&nbsp;?<\/li>\n<li>Convertir un projet existant pour utiliser des environnements Conda avec <code>environment.yml<\/code><\/li>\n<li>Cr\u00e9ez une image Docker pour une simulation de travail et testez-la sur une autre machine<\/li>\n<li>Explorez les strat\u00e9gies de singularit\u00e9 de votre centre HPC et convertissez une image Docker au format Singularity<\/li>\n<li>Incluez les sp\u00e9cifications d&rsquo;environnement et les images de conteneurs dans les documents suppl\u00e9mentaires de votre prochain article.<\/li>\n<\/ol>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"\/managing-research-software-through-tickets\">G\u00e9rer les logiciels de recherche via des tickets<\/a> \u2013 structurer la reproductibilit\u00e9 en tant que probl\u00e8mes et am\u00e9liorations suivis<\/li>\n<li><a href=\"\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\">G\u00e9rer les probl\u00e8mes de PDE \u00e0 grande \u00e9chelle&nbsp;: strat\u00e9gies, solveurs et \u00e9tudes de cas HPC<\/a> \u2013 Faites \u00e9voluer vos simulations tout en conservant la reproductibilit\u00e9<\/li>\n<li><a href=\"\/tracking-long-term-technical-debt-in-research-software\">suivi de la dette technique \u00e0 long terme dans les logiciels de recherche<\/a> \u2013 Utiliser les pratiques CI\/CD pour maintenir la reproductibilit\u00e9 dans le temps<\/li>\n<li><a href=\"\/collaboration-between-developers-and-researchers-turning-innovation-into-scalable-impact\">Collaboration entre d\u00e9veloppeurs et chercheurs<\/a> \u2013 Assurer la reproductibilit\u00e9 au-del\u00e0 des fronti\u00e8res des \u00e9quipes<\/li>\n<\/ul>\n<h2>R\u00e9f\u00e9rences et lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li>Boettiger, C. (2015). <a href=\"https:\/\/doi.org\/10.1145\/2723872.2723882\">Une introduction \u00e0 Docker pour la recherche reproductible<\/a>. <em>Examen des syst\u00e8mes d&rsquo;exploitation ACM SIGOPS<\/em>.<\/li>\n<li>N\u00fcst, D., et al. (2020). <a href=\"https:\/\/doi.org\/10.1371\/journal.pcbi.1008319\">Dix r\u00e8gles simples pour la r\u00e9daction de Dockerfiles pour la science des donn\u00e9es reproductibles<\/a>. <em>biologie computationnelle PLOS<\/em>.<\/li>\n<li>la voie de Turing. <a href=\"https:\/\/book.the-turing-way.org\/reproducible-research\/overview\/overview-definitions\/\">D\u00e9finitions de la recherche reproductible<\/a>.<\/li>\n<li>Fitzpatrick, B.G., et al. (2018). <a href=\"https:\/\/doi.org\/10.3389\/fcomp.2018.00001\">Probl\u00e8mes de recherche sur la simulation reproductible<\/a>. <em>Fronti\u00e8res en informatique<\/em>.<\/li>\n<li>Documentation conda. <a href=\"https:\/\/docs.conda.io\/projects\/conda\/en\/stable\/user-guide\/tasks\/manage-environments.html\">Gestion des environnements<\/a>.<\/li>\n<\/ul>\n","protected":false,"raw":"<p>Les flux de travail de recherche reproductibles garantissent que les r\u00e9sultats de la simulation peuvent \u00eatre exactement recr\u00e9\u00e9s par les autres (ou votre futur moi) en utilisant les m\u00eames donn\u00e9es, codes et environnement de calcul. <strong>Docker<\/strong> fournit une conteneurisation compl\u00e8te au niveau du syst\u00e8me pour une coh\u00e9rence maximale entre les plates-formes, tandis que <strong>CONDA<\/strong> offre un package l\u00e9ger et une gestion de l'environnement id\u00e9al pour le calcul scientifique bas\u00e9 sur Python. Pour les projets de simulation, nous recommandons : (1) utiliser CONDA pour le d\u00e9veloppement quotidien et la gestion des d\u00e9pendances, (2) cr\u00e9er des images Docker pour \"geler\" les environnements de travail pour la publication et la collaboration, et (3) toujours associer au contr\u00f4le de version et \u00e0 une documentation approfondie. \u00c9vitez l'erreur courante de se fier uniquement \u00e0 un seul outil : combinez les deux pour une reproductibilit\u00e9 robuste.<\/p>\n<h2>Introduction : L'\u00e9cart de reproductibilit\u00e9 dans la recherche en simulation<\/h2>\n<p>Les projets de simulation scientifique souffrent souvent d'un mode de d\u00e9faillance silencieux : le code a fonctionn\u00e9 hier, mais aujourd'hui, il produit des r\u00e9sultats diff\u00e9rents. La physique sous-jacente n'a pas chang\u00e9, votre environnement de calcul l'a fait. Les versions de packages manquantes, les d\u00e9pendances de biblioth\u00e8que modifi\u00e9es, les mises \u00e0 jour du syst\u00e8me d'exploitation ou m\u00eame diff\u00e9rents interpr\u00e9teurs Python peuvent modifier silencieusement les sorties de simulation, parfois de mani\u00e8re difficile \u00e0 d\u00e9tecter.<\/p>\n<p>C'est plus qu'un inconv\u00e9nient. <strong>Reproductibilit\u00e9<\/strong> est la pierre angulaire de la science cumulative, la capacit\u00e9 pour d'autres chercheurs \u00e0 v\u00e9rifier les r\u00e9clamations et \u00e0 s'appuyer sur votre travail. Lorsque les r\u00e9sultats de la simulation ne peuvent pas \u00eatre recr\u00e9\u00e9s de mani\u00e8re fiable, les \u00e9rodes de confiance, les articles sont r\u00e9tract\u00e9s et un temps de recherche pr\u00e9cieux est perdu \u00e0 d\u00e9boguer les probl\u00e8mes environnementaux au lieu de faire progresser les connaissances.<\/p>\n<p>Dans ce guide, nous examinerons comment mettre en \u0153uvre des flux de recherche reproductibles pour des projets de simulation \u00e0 l'aide de <strong>Docker<\/strong> et <strong>CONDA<\/strong>&nbsp;: deux outils compl\u00e9mentaires qui, lorsqu'ils sont utilis\u00e9s ensemble, fournissent une solution robuste pour la coh\u00e9rence de l'environnement, la gestion des d\u00e9pendances et la conservation \u00e0 long terme de M\u00e9thodes informatiques.<\/p>\n<h2>Qu'est-ce que la recherche reproductible ? D\u00e9finitions et composants de base<\/h2>\n<p>\u00c0 la base, <strong>recherche reproductible<\/strong> signifie qu'un chercheur ind\u00e9pendant peut r\u00e9g\u00e9n\u00e9rer les r\u00e9sultats publi\u00e9s (tableaux, chiffres, r\u00e9sultats quantitatifs) en utilisant uniquement les donn\u00e9es, le code et la documentation d'origine. Tel que d\u00e9fini par Turing Way et largement adopt\u00e9 en sciences informatiques, cela n\u00e9cessite :<\/p>\n<ul>\n<li><strong>Donn\u00e9es de donn\u00e9es<\/strong>&nbsp;: les donn\u00e9es d'entr\u00e9e brutes sont accessibles (avec des consid\u00e9rations de confidentialit\u00e9 appropri\u00e9es)<\/li>\n<li><strong>Transparence du code<\/strong>&nbsp;: tous les scripts d'analyse et de simulation sont partag\u00e9s<\/li>\n<li><strong>Documentation<\/strong>&nbsp;: enregistrements complets des versions du logiciel, des param\u00e8tres et des configurations d'environnement<\/li>\n<li><strong>Compute Environmental Control<\/strong>&nbsp;: l'environnement d'ex\u00e9cution exact est captur\u00e9 et reconstruit<\/li>\n<\/ul>\n<p>La reproductibilit\u00e9 informatique diff\u00e8re de la <strong>replicabilit\u00e9<\/strong> (obtenant des conclusions similaires \u00e0 l'aide de nouvelles donn\u00e9es ou de m\u00e9thodes ind\u00e9pendantes). La reproductibilit\u00e9 est la norme minimale : il s'agit d'obtenir les m\u00eames chiffres des m\u00eames entr\u00e9es, et non de valider les affirmations scientifiques sous-jacentes.<\/p>\n<blockquote><p><strong>Pourquoi c'est important pour les projets de simulation<\/strong>&nbsp;: les solveurs PDE, les m\u00e9thodes par \u00e9l\u00e9ments finis et d'autres cadres de simulation impliquent souvent des cha\u00eenes de d\u00e9pendance complexes. Un changement de version mineur dans une biblioth\u00e8que num\u00e9rique peut modifier le comportement de discr\u00e9tisation, les crit\u00e8res de convergence ou l'arrondi, en produisant des r\u00e9sultats mesurablement diff\u00e9rents. Les flux de travail reproductibles \u00e9liminent cette source d'incertitude.<\/p><\/blockquote>\n<h2>Docker pour des simulations scientifiques reproductibles<\/h2>\n<h3>Ce que Docker fournit<\/h3>\n<p><strong>Docker<\/strong> est une plate-forme de conteneurisation qui regroupe une application et l'ensemble de son environnement d'ex\u00e9cution (syst\u00e8me d'exploitation, biblioth\u00e8ques, d\u00e9pendances, fichiers de configuration) dans une image portable et immuable. Lorsque vous ex\u00e9cutez un conteneur Docker, vous ex\u00e9cutez exactement le m\u00eame environnement qui a \u00e9t\u00e9 construit et test\u00e9, quel que soit le syst\u00e8me h\u00f4te.<\/p>\n<p>Pour les projets de simulation, Docker propose :<\/p>\n<ol>\n<li><strong>Coh\u00e9rence environnementale<\/strong>&nbsp;: plus \"\u00e7a marche sur ma machine\". Le conteneur comprend des versions sp\u00e9cifiques des compilateurs, des impl\u00e9mentations MPI, des interpr\u00e9teurs Python et des biblioth\u00e8ques num\u00e9riques.<\/li>\n<li><strong>Portabilit\u00e9 de la plate-forme<\/strong>&nbsp;: une image Docker construite sur un ordinateur portable peut fonctionner sur un cluster HPC, une instance cloud ou un poste de travail de coll\u00e8gue sans modification.<\/li>\n<li><strong>isolement<\/strong>&nbsp;: les d\u00e9pendances de simulation n'entrent pas en conflit avec les biblioth\u00e8ques syst\u00e8me ou d'autres projets.<\/li>\n<li><strong>Snapshots versionn\u00e9s<\/strong>&nbsp;: chaque image Docker est immuable et peut \u00eatre \u00e9tiquet\u00e9e (par exemple, <code>my-sim:paper-v1<\/code>) pour une reproduction exacte future.<\/li>\n<\/ol>\n<h3>Limites de Docker \u00e0 prendre en compte<\/h3>\n<p>Malgr\u00e9 ses atouts, Docker a des contraintes importantes pour le calcul scientifique :<\/p>\n<ul>\n<li><strong>Pas une solution miracle<\/strong>&nbsp;: comme indiqu\u00e9 dans \"Docker ne garantit pas la reproductibilit\u00e9\" (ARXIV 2026), les conteneurs peuvent toujours pr\u00e9senter un comportement non d\u00e9terministe si le mat\u00e9riel sous-jacent diff\u00e8re (architecture CPU, optimisations en virgule flottante) ou si les services externes (base de donn\u00e9es, fichier syst\u00e8me) varient.<\/li>\n<li><strong>D\u00e9pendance du noyau<\/strong>&nbsp;: les conteneurs Docker partagent le noyau h\u00f4te. Cela signifie que le comportement du conteneur peut toujours \u00eatre affect\u00e9 par la version et la configuration du noyau h\u00f4te.<\/li>\n<li><strong>Size Overhead<\/strong>&nbsp;: les images compl\u00e8tes du syst\u00e8me d'exploitation peuvent \u00eatre grandes (des centaines de Mo \u00e0 GB), bien que des images minces comme <code>alpine<\/code> aident.<\/li>\n<li><strong>Restrictions HPC<\/strong>&nbsp;: de nombreux centres HPC n'autorisent pas Docker directement en raison de probl\u00e8mes de s\u00e9curit\u00e9&nbsp;; Ils utilisent plut\u00f4t <strong>singularit\u00e9<\/strong> ou <strong>apptainer<\/strong>. Cependant, vous pouvez cr\u00e9er des images de singularit\u00e9 \u00e0 partir d'images Docker, faisant de Docker un outil de d\u00e9veloppement viable.<\/li>\n<\/ul>\n<h3>R\u00e9daction de Dockerfiles pour des projets de simulation<\/h3>\n<p>Le <strong>Dockerfile<\/strong> d\u00e9finit comment cr\u00e9er votre conteneur. \u00c0 la suite de \"Dix r\u00e8gles simples pour la r\u00e9daction de Dockerfiles for Reproductible Research\" (N\u00fcst et al., 2020), les principales pratiques comprennent:<\/p>\n<pre><code class=\"language-dockerfile\"># Start from a minimal, pinned base image\nFROM ubuntu:22.04  # Pin exact version, not :latest\n\n# Set environment variables for reproducibility\nENV LANG=C.UTF-8\nENV LC_ALL=C.UTF-8\n\n# Install system dependencies in one layer to minimize cache issues\nRUN apt-get update &amp;&amp; apt-get install -y \n    python3 \n    python3-pip \n    libopenblas-dev \n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\n# Create and set working directory\nWORKDIR \/simulation\n\n# Copy dependency specifications first (for better caching)\nCOPY requirements.txt environment.yml .\/\n\n# Install Python packages with pinned versions\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy simulation code\nCOPY src\/ .\/src\/\nCOPY scripts\/ .\/scripts\/\nCOPY data\/ .\/data\/\n\n# Define entry point or command\nENTRYPOINT [\"python3\", \"scripts\/run_simulation.py\"]\n<\/code><\/pre>\n<p><strong>R\u00e8gle de cl\u00e9<\/strong>&nbsp;: \u00e9pinglez toutes les versions de mani\u00e8re explicite&nbsp;: image de base, packages de syst\u00e8me d'exploitation, packages Python et m\u00eame version PIP. Utilisez <code>requirements.txt<\/code> ou <code>environment.yml<\/code> avec des versions exactes (<code>package==1.2.3<\/code>, pas <code>package&gt;=1.0<\/code>).<\/p>\n<h2>Conda pour la gestion de l'environnement dans la recherche<\/h2>\n<h3>Ce que Conda fournit<\/h3>\n<p><strong>CONDA<\/strong> est un gestionnaire de packages et d'environnements multi-plateforme qui g\u00e8re non seulement les packages Python, mais \u00e9galement les d\u00e9pendances non Python (biblioth\u00e8ques C\/C++, compilateurs, MPI). Cela le rend particuli\u00e8rement bien adapt\u00e9 \u00e0 la simulation scientifique o\u00f9 vous pourriez avoir besoin de versions sp\u00e9cifiques d'OpenMPI, FFTW ou HDF5.<\/p>\n<p>Conda livre :<\/p>\n<ol>\n<li><strong>Agnostique linguistique<\/strong>&nbsp;: installez les biblioth\u00e8ques Python, R, C\/C++ et les outils syst\u00e8me dans un seul environnement.<\/li>\n<li><strong>D\u00e9pendances binaires<\/strong>&nbsp;: les packages pr\u00e9-compil\u00e9s \u00e9vitent la compilation de l'enfer sur diff\u00e9rents syst\u00e8mes.<\/li>\n<li><strong>Environnements isol\u00e9s<\/strong>&nbsp;: chaque projet a son propre environnement sans contamination crois\u00e9e.<\/li>\n<li><strong>export\/import<\/strong>&nbsp;: <code>conda env export &gt; environment.yml<\/code> Capture l'ensemble de l'environnement pour une reproduction exacte.<\/li>\n<\/ol>\n<h3>Meilleures pratiques Conda<\/h3>\n<p>Bas\u00e9 sur les conseils de MSI University of Minnesota et Anaconda :<\/p>\n<ul>\n<li><strong>Ne jamais installer dans <code>base<\/code><\/strong>&nbsp;: cr\u00e9er un nouvel environnement pour chaque projet&nbsp;: <pre><code class=\"language-bash\">conda create --name my-simulation python=3.11\nconda activate my-simulation\n<\/code><\/pre><\/li>\n<li><strong>Utiliser les canaux communautaires<\/strong>&nbsp;: pr\u00e9f\u00e8re <code>conda-forge<\/code> aux valeurs par d\u00e9faut pour des packages scientifiques plus \u00e0 jour&nbsp;: <pre><code class=\"language-bash\">conda config --add channels conda-forge\nconda config --set channel_priority strict\n<\/code><\/pre><\/li>\n<li><strong>Installer tous les packages \u00e0 la fois<\/strong>&nbsp;: cela \u00e9vite les conflits de d\u00e9pendance&nbsp;: <pre><code class=\"language-bash\">conda install numpy scipy matplotlib fipy\n<\/code><\/pre><\/li>\n<li><strong>Ne modifiez pas les environnements existants<\/strong>&nbsp;: si vous avez besoin de nouveaux packages, mettez \u00e0 jour la sp\u00e9cification de l'environnement ou cr\u00e9ez un nouvel environnement \u00e0 partir du fichier YAML mis \u00e0 jour.<\/li>\n<li><strong>Exporter proprement <\/strong>&nbsp;: lors du partage, supprimez les packages sp\u00e9cifiques \u00e0 la plate-forme et les \u00e9l\u00e9ments install\u00e9s par PIP qui ne sont pas essentiels&nbsp;: <pre><code class=\"language-bash\">conda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n<\/code><\/pre><\/li>\n<\/ul>\n<h2>Docker vs Conda : quand choisir lequel<\/h2>\n<p>La question n'est pas \"Docker ou Conda&nbsp;?\"&nbsp;: ils r\u00e9solvent diff\u00e9rents probl\u00e8mes et sont <strong>compl\u00e9mentaires<\/strong>.<\/p>\n<table>\n<thead>\n<tr>\n<th>aspect<\/th>\n<th>Docker<\/th>\n<th>peste<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Scope<\/strong><\/td>\n<td>Syst\u00e8me d'exploitation et d'ex\u00e9cution complets<\/td>\n<td>Forfait &amp; Responsable environnement<\/td>\n<\/tr>\n<tr>\n<td><strong>Isolation<\/strong><\/td>\n<td>Niveau syst\u00e8me (espace de noms du noyau)<\/td>\n<td>Environnement d'espace utilisateur<\/td>\n<\/tr>\n<tr>\n<td><strong>Taille<\/strong><\/td>\n<td>Grand (100&nbsp;Mo\u20131&nbsp;Go+)<\/td>\n<td>Petit (Mbs)<\/td>\n<\/tr>\n<tr>\n<td><strong>Vitesse<\/strong><\/td>\n<td>Plus lent \u00e0 construire\/transf\u00e9rer<\/td>\n<td>Activation instantan\u00e9e<\/td>\n<\/tr>\n<tr>\n<td><strong>Assistance HPC<\/strong><\/td>\n<td>Limit\u00e9 (travaux de singularit\u00e9)<\/td>\n<td>Excellent (natif)<\/td>\n<\/tr>\n<tr>\n<td><strong>Cas d'utilisation<\/strong><\/td>\n<td>Publication, partage, d\u00e9ploiement<\/td>\n<td>D\u00e9veloppement quotidien, exploration<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Recommandation pratique<\/h3>\n<ul>\n<li><strong>Utilisez Conda pour le d\u00e9veloppement<\/strong>&nbsp;: cr\u00e9ez rapidement des environnements isol\u00e9s, testez des d\u00e9pendances, it\u00e9rez sur le code. C'est l\u00e9ger et rapide.<\/li>\n<li><strong>Utilisez Docker pour la conservation<\/strong>&nbsp;: une fois que votre simulation fonctionne, cr\u00e9ez une image Docker pour \"geler\" l'environnement exact. Partagez cette image avec des collaborateurs, joignez-la \u00e0 des publications ou utilisez-la pour CI\/CD.<\/li>\n<li><strong>Combinez les deux<\/strong>&nbsp;: d\u00e9veloppez en conda, puis cr\u00e9ez un fichier Docker qui&nbsp;: <ul> <li>copie l'environnement conda dans l'image, soit<\/li> <li>recr\u00e9e l'environnement \u00e0 l'aide de l'export <code>environment.yml<\/code><\/li> <\/ul><\/li>\n<\/ul>\n<p>Cette approche en couches vous donne une agilit\u00e9 de d\u00e9veloppement et une robustesse de publication.<\/p>\n<h2>Int\u00e9gration de Docker et Conda dans les flux de travail scientifiques<\/h2>\n<h3>Strat\u00e9gie&nbsp;1&nbsp;: Conda \u00e0 l'int\u00e9rieur de Docker<\/h3>\n<p>L'int\u00e9gration la plus courante consiste \u00e0 installer et \u00e0 utiliser Conda dans un conteneur Docker. Cela vous donne la gestion de packages \u00e0 grain fin de Conda dans l'isolation du syst\u00e8me de Docker.<\/p>\n<pre><code class=\"language-dockerfile\">FROM ubuntu:22.04\n\n# Install Miniconda\nRUN wget https:\/\/repo.anaconda.com\/miniconda\/Miniconda3-latest-Linux-x86_64.sh \n    &amp;&amp; bash Miniconda3-latest-Linux-x86_64.sh -b -p \/opt\/conda \n    &amp;&amp; rm Miniconda3-latest-Linux-x86_64.sh\nENV PATH=\/opt\/conda\/bin:$PATH\n\n# Create and use a conda environment\nCOPY environment.yml .\nRUN conda env create -f environment.yml\nENV PATH=\/opt\/conda\/envs\/my-sim\/bin:$PATH\n<\/code><\/pre>\n<p><strong>Pros<\/strong>&nbsp;: exploite l'\u00e9cosyst\u00e8me de packages scientifiques \u00e9tendu de Conda&nbsp;; Conform\u00e9ment aux workflows de d\u00e9veloppement local.<br> <strong>Cons<\/strong>&nbsp;: taille d'image plus grande&nbsp;; Nuances d'activation de Conda dans Docker.<\/p>\n<h3>Strat\u00e9gie&nbsp;2&nbsp;: Docker pour la capture d'environnement<\/h3>\n<p>D\u00e9veloppez localement avec Conda, puis exportez l'environnement et cuisez-le dans une image Docker sans ex\u00e9cuter Conda au moment de l'ex\u00e9cution&nbsp;:<\/p>\n<pre><code class=\"language-dockerfile\">FROM python:3.11-slim\n\n# Copy pre-built packages or use pip from a frozen requirements.txt\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n<\/code><\/pre>\n<p>Ceci est plus simple mais perd la gestion des d\u00e9pendances non-Python de Conda.<\/p>\n<h3>Strat\u00e9gie&nbsp;3&nbsp;: builds en plusieurs \u00e9tapes pour HPC<\/h3>\n<p>Pour les clusters HPC utilisant Singularity, cr\u00e9ez l'image Docker localement, puis convertissez-vous en Singularity&nbsp;:<\/p>\n<pre><code class=\"language-bash\">docker build -t my-sim:latest .\nsingularity build my-sim.sif docker:\/\/my-sim:latest\n<\/code><\/pre>\n<p>Ce flux de travail vous permet de d\u00e9velopper avec Docker (test facile) et de d\u00e9ployer sur HPC (Singularity).<\/p>\n<h2>Des pi\u00e8ges courants et comment les \u00e9viter<\/h2>\n<p>Sur la base de l'analyse des d\u00e9fis de la reproductibilit\u00e9 dans la recherche par simulation, voici des erreurs critiques \u00e0 \u00e9viter&nbsp;:<\/p>\n<h3>1. <strong>Documentation manquante ou incompl\u00e8te<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: vous avez une image Docker en \u00e9tat de marche, mais aucune trace de la fa\u00e7on de l'utiliser, des entr\u00e9es qu'elle attend ou de la mani\u00e8re d'interpr\u00e9ter les sorties.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: inclure un <code>README.md<\/code> dans le conteneur (ou \u00e0 c\u00f4t\u00e9 de l'image) avec&nbsp;:<\/p>\n<ul>\n<li>Comment ex\u00e9cuter la simulation (arguments de ligne de commande)<\/li>\n<li>Formats de fichiers d'entr\u00e9e attendus<\/li>\n<li>Descriptions des fichiers de sortie<\/li>\n<li>Besoin mat\u00e9riel (CPU, m\u00e9moire, GPU)<\/li>\n<li>Limites connues<\/li>\n<\/ul>\n<h3>2. <strong>D\u00e9pendances non \u00e9pingl\u00e9es<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: Utilisation de <code>numpy&gt;=1.0<\/code> ou <code>python=3.x<\/code> Autorise les mises \u00e0 jour automatiques qui peuvent changer de comportement.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: broches exactes des versions <code>environment.yml<\/code> et <code>requirements.txt<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-yaml\">dependencies:\n  - python=3.11.8\n  - numpy=1.26.4\n  - scipy=1.11.4\n  - pip:\n    - my-package==0.3.2\n<\/code><\/pre>\n<h3>3. <strong>Simulations non d\u00e9terministes<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: m\u00eame avec des environnements identiques, les simulations produisent des r\u00e9sultats l\u00e9g\u00e8rement diff\u00e9rents en raison de la non-associativit\u00e9 \u00e0 virgule flottante, des conditions de course parall\u00e8les ou de la m\u00e9moire non initialis\u00e9e.<\/p>\n<p><strong>Solution<\/strong>&nbsp;:<\/p>\n<ul>\n<li>D\u00e9finir des drapeaux d\u00e9terministes le cas \u00e9ch\u00e9ant (par exemple, OpenMP <code>OMP_NUM_THREADS=1<\/code>, threading BLAS)<\/li>\n<li>Utilisez des graines al\u00e9atoires fixes et documentez-les<\/li>\n<li>Testez la reproductibilit\u00e9 en ex\u00e9cutant le conteneur plusieurs fois sur le m\u00eame h\u00f4te<\/li>\n<\/ul>\n<h3>4. <strong>Grands donn\u00e9es \u00e0 l'int\u00e9rieur des conteneurs<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: la pr\u00e9paration de grands ensembles de donn\u00e9es de simulation dans les images Docker les gonfle et ralentit la distribution.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: gardez les donn\u00e9es externes. Utilisez des volumes Docker ou des montages de liaison pour joindre des donn\u00e9es au moment de l'ex\u00e9cution&nbsp;:<\/p>\n<pre><code class=\"language-bash\">docker run -v \/path\/to\/data:\/data my-sim:latest\n<\/code><\/pre>\n<p>Documenter clairement les attentes.<\/p>\n<h3>5. <strong>Ignorer les contraintes HPC<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: les images Docker qui fonctionnent sur un ordinateur portable tombent en panne sur un cluster HPC en raison de l'impl\u00e9mentation MPI manquante, des pilotes incompatibles ou des restrictions de s\u00e9curit\u00e9.<\/p>\n<p><strong>Solution<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Testez t\u00f4t dans un environnement de type cluster<\/li>\n<li>Utilisez la compatibilit\u00e9 avec la singularit\u00e9 lors du ciblage de HPC<\/li>\n<li>\u00c9vitez les mod\u00e8les Docker-In-Docker ; Construisez sur une image de base qui correspond au syst\u00e8me d'exploitation du cluster (par exemple, CentOS\/Rocky si le cluster les utilise)<\/li>\n<\/ul>\n<h3>6. <strong>Aucun contr\u00f4le de version pour les fichiers Docker et les fichiers d'environnement<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: vous avez une image de travail mais pas d'historique des modifications apport\u00e9es au Dockerfile ou <code>environment.yml<\/code>.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: Traitez les sp\u00e9cifications Dockerfile et environnement comme <strong>Code<\/strong>. Stockez-les dans Git \u00e0 c\u00f4t\u00e9 de votre code de simulation. Lib\u00e9rations de balises (par exemple, <code>git tag -a v1.0 -m \"Paper submission\"<\/code>).<\/p>\n<h3>7. <strong>Supervision des services externes<\/strong><\/h3>\n<p><strong>Probl\u00e8me<\/strong>&nbsp;: votre simulation extrait les donn\u00e9es d'une base de donn\u00e9es ou d'une API qui change avec le temps, ce qui rompt la reproductibilit\u00e9.<\/p>\n<p><strong>Solution<\/strong>&nbsp;: soit&nbsp;: soit&nbsp;:<\/p>\n<ul>\n<li>Snapshot Donn\u00e9es externes et incluez-les dans votre r\u00e9f\u00e9rentiel ou votre conteneur, ou<\/li>\n<li>Utiliser les points de terminaison d'API versionn\u00e9s et documenter la version\/la date exacte d'acc\u00e8s<\/li>\n<\/ul>\n<h2>Consid\u00e9rations relatives aux HPC et aux clusters<\/h2>\n<p>Les environnements de calcul haute performance pr\u00e9sentent des d\u00e9fis de reproductibilit\u00e9 suppl\u00e9mentaires :<\/p>\n<h3>Singularity\/AppTainer au lieu de Docker<\/h3>\n<p>La plupart des centres HPC interdisent Docker pour des raisons de s\u00e9curit\u00e9. Au lieu de cela, ils fournissent <strong>singularit\u00e9<\/strong> (ou sa fourchette <strong>apptainer<\/strong>). Les conteneurs Singularity sont construits \u00e0 partir des images Docker :<\/p>\n<pre><code class=\"language-bash\"># On your local machine with Docker\ndocker pull ubuntu:22.04\ndocker tag ubuntu:22.04 my-sim:base\n\n# Build your image as usual\ndocker build -t my-sim:latest .\n\n# Transfer image to HPC and convert\nsingularity build my-sim.sif docker:\/\/my-sim:latest\n<\/code><\/pre>\n<p><strong>Diff\u00e9rence cl\u00e9<\/strong>&nbsp;: Singularity ex\u00e9cute des conteneurs en tant qu'utilisateur invoquant (pas de racine), les chemins d'installation du package diff\u00e8rent donc. Testez votre Dockerfile avec Singularity pour d\u00e9tecter les probl\u00e8mes plus t\u00f4t.<\/p>\n<h3>Syst\u00e8mes de modules<\/h3>\n<p>De nombreux clusters HPC utilisent des <strong>modules d'environnement<\/strong> (LMOD) pour g\u00e9rer les versions logicielles. Vous pouvez soit&nbsp;:<\/p>\n<ul>\n<li>Chargez les modules requis avant d'ex\u00e9cuter votre conteneur (si la singularit\u00e9 peut y acc\u00e9der), ou<\/li>\n<li>Cr\u00e9ez votre conteneur sur une image de base qui inclut d\u00e9j\u00e0 les biblioth\u00e8ques n\u00e9cessaires<\/li>\n<\/ul>\n<h3>E\/S parall\u00e8les et MPI<\/h3>\n<p>Si votre simulation utilise MPI (Interface de passage de messages), assurez-vous que votre conteneur inclut une impl\u00e9mentation MPI compatible. Pour Singularity, vous pouvez <strong>bind-mount<\/strong> les biblioth\u00e8ques MPI de l'h\u00f4te&nbsp;:<\/p>\n<pre><code class=\"language-bash\">singularity run --nv -B \/usr\/lib\/x86_64-linux-gnu\/openmpi:\/usr\/lib\/x86_64-linux-gnu\/openmpi my-sim.sif\n<\/code><\/pre>\n<p>Vous pouvez \u00e9galement installer MPICH ou OpenMPI \u00e0 l'int\u00e9rieur du conteneur et assurez-vous qu'il est configur\u00e9 pour utiliser la structure de r\u00e9seau de l'h\u00f4te (InfiniBand, etc.).<\/p>\n<h3>Prise en charge du GPU<\/h3>\n<p>Pour les simulations acc\u00e9l\u00e9r\u00e9es par GPU, Docker et Singularity n\u00e9cessitent des drapeaux sp\u00e9ciaux&nbsp;:<\/p>\n<ul>\n<li>Docker&nbsp;: <code>--gpus all<\/code><\/li>\n<li>Singularit\u00e9&nbsp;: <code>--nv<\/code><\/li>\n<\/ul>\n<p>Testez soigneusement la fonctionnalit\u00e9 du GPU dans votre conteneur.<\/p>\n<h2>Guide de mise en \u0153uvre \u00e9tape par \u00e9tape<\/h2>\n<p>Voici un flux de travail pratique pour la mise en \u0153uvre de flux de travail de recherche reproductibles dans votre projet de simulation&nbsp;:<\/p>\n<h3>Phase 1 : Configuration du projet<\/h3>\n<ol>\n<li><strong>Initialiser le contr\u00f4le de version<\/strong> (GIT)&nbsp;: <pre><code class=\"language-bash\">git init\ngit add .\ngit commit -m \"Initial project structure\"\n<\/code><\/pre><\/li>\n<li><strong>Cr\u00e9er un environnement conda<\/strong>&nbsp;: <pre><code class=\"language-bash\">conda create --name my-sim python=3.11\nconda activate my-sim\n<\/code><\/pre><\/li>\n<li><strong>Installer les d\u00e9pendances<\/strong> et les enregistrer&nbsp;: <pre><code class=\"language-bash\">conda install numpy scipy matplotlib fipy  # Example for PDE simulations\nconda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n<\/code><\/pre><\/li>\n<li><strong>Cr\u00e9er une structure de projet<\/strong>&nbsp;: <pre><code>my-simulation\/\n\u251c\u2500\u2500 src\/              # Source code\n\u251c\u2500\u2500 scripts\/          # Run scripts, entry points\n\u251c\u2500\u2500 data\/             # Input data (git-ignored if large)\n\u251c\u2500\u2500 outputs\/          # Generated results (git-ignored)\n\u251c\u2500\u2500 docs\/             # Documentation\n\u251c\u2500\u2500 environment.yml   # Conda environment\n\u251c\u2500\u2500 requirements.txt  # Pip-only dependencies (if any)\n\u251c\u2500\u2500 Dockerfile        # Container definition\n\u251c\u2500\u2500 README.md         # Usage instructions\n\u2514\u2500\u2500 .gitignore        # Exclude outputs, large data\n<\/code><\/pre><\/li>\n<\/ol>\n<h3>Phase 2 : D\u00e9veloppement avec Conda<\/h3>\n<ul>\n<li>D\u00e9velopper et tester \u00e0 l'int\u00e9rieur de l'environnement Conda<\/li>\n<li>Valider les changements de code fr\u00e9quemment<\/li>\n<li>Mettre \u00e0 jour <code>environment.yml<\/code> lors de l'ajout\/de la suppression de packages<\/li>\n<li>Utilisez <code>.gitignore<\/code> pour exclure les sorties g\u00e9n\u00e9r\u00e9es et les fichiers volumineux<\/li>\n<\/ul>\n<h3>Phase 3 : construction de l'image Docker<\/h3>\n<ol>\n<li><strong>Cr\u00e9er un Dockerfile<\/strong> (voir l'exemple ci-dessus)<\/li>\n<li><strong>Construire l'image<\/strong>&nbsp;: <pre><code class=\"language-bash\">docker build -t my-sim:latest .\n<\/code><\/pre><\/li>\n<li><strong>Testez le conteneur<\/strong>&nbsp;: <pre><code class=\"language-bash\">docker run -v $(pwd)\/data:\/data my-sim:latest python scripts\/run_simulation.py --input \/data\/input.h5\n<\/code><\/pre><\/li>\n<li><strong>Tag pour publication<\/strong>&nbsp;: <pre><code class=\"language-bash\">docker tag my-sim:latest my-sim:paper-v1.0\n<\/code><\/pre><\/li>\n<li><strong>Pousser vers le registre<\/strong> (facultatif, pour le partage)&nbsp;: <pre><code class=\"language-bash\">docker push my-registry.example.com\/my-sim:paper-v1.0\n<\/code><\/pre><\/li>\n<\/ol>\n<h3>Phase 4 : V\u00e9rification et partage<\/h3>\n<ol>\n<li><strong>Testez la reproductibilit\u00e9<\/strong>&nbsp;: demandez \u00e0 un coll\u00e8gue de tirer et d'ex\u00e9cuter l'image. Ils devraient obtenir des r\u00e9sultats identiques (bit pour bit identiques si la simulation est d\u00e9terministe).<\/li>\n<li><strong>Document<\/strong>&nbsp;: assurez-vous que <code>README.md<\/code> comprend&nbsp;: <ul> <li>Comment obtenir l'image (docker hub, registre ou <code>.sif<\/code> fichier)<\/li> <li>Comment l'ex\u00e9cuter (commande compl\u00e8te)<\/li> <li>Sp\u00e9cifications des fichiers de saisie<\/li> <li>Fichiers de sortie attendus et leurs formats<\/li> <li>Informations sur les citations<\/li> <\/ul><\/li>\n<li><strong>Archive<\/strong>&nbsp;: D\u00e9posez l'image Docker (ou Singularity <code>.sif<\/code>) dans une archive \u00e0 long terme comme Zenodo ou FigShare, et incluez le lien dans les m\u00e9thodes de votre article ou la d\u00e9claration de disponibilit\u00e9 des donn\u00e9es.<\/li>\n<\/ol>\n<h3>Phase 5 : Maintenance \u00e0 long terme<\/h3>\n<ul>\n<li>Lorsque vous effectuez des modifications de code, mettez \u00e0 jour l'image et la balise Docker avec une nouvelle version (par exemple, <code>v1.1<\/code>)<\/li>\n<li>Conservez les anciennes images\/tags aussi longtemps que vous devez reproduire les anciens r\u00e9sultats<\/li>\n<li>Utilisez des balises git pour corr\u00e9ler les validations de code avec les versions d'image Docker<\/li>\n<\/ul>\n<h2>Conclusion et prochaines \u00e9tapes<\/h2>\n<p>La mise en \u0153uvre de workflows de recherche reproductible n'est pas une d\u00e9cision d'un seul outil, c'est une <strong>strat\u00e9gie en couches<\/strong>&nbsp;:<\/p>\n<ul>\n<li><strong>CONDA<\/strong> pour une gestion de l'environnement l\u00e9ger et rapide pendant le d\u00e9veloppement<\/li>\n<li><strong>Docker<\/strong> pour des instantan\u00e9s immuables et portables adapt\u00e9s \u00e0 la publication et \u00e0 la collaboration<\/li>\n<li><strong>Git<\/strong> pour le contr\u00f4le de version des sp\u00e9cifications de code, de fichiers DockerFile et d'environnement<\/li>\n<li><strong>Documentation<\/strong> pour rendre le flux de travail compr\u00e9hensible et utilisable par d'autres<\/li>\n<\/ul>\n<p>Pour les projets de simulation o\u00f9 l'exactitude et la v\u00e9rification sont primordiales, cette combinaison fournit une base robuste. Commencez par Conda pour votre prochain projet, et une fois que la simulation fonctionne, investissez du temps pour cr\u00e9er une image Docker. Le co\u00fbt initial rapporte des dividendes lorsque vous (ou d'autres) devez r\u00e9ex\u00e9cuter la simulation des mois ou des ann\u00e9es plus tard en toute confiance.<\/p>\n<p><strong>Prochaines \u00e9tapes \u00e0 suivre d\u00e8s aujourd'hui&nbsp;:<\/strong><\/p>\n<ol>\n<li>V\u00e9rifier vos projets de simulation actuels&nbsp;: les environnements sont-ils document\u00e9s&nbsp;? Les d\u00e9pendances sont-elles \u00e9pingl\u00e9es&nbsp;?<\/li>\n<li>Convertir un projet existant pour utiliser des environnements Conda avec <code>environment.yml<\/code><\/li>\n<li>Cr\u00e9ez une image Docker pour une simulation de travail et testez-la sur une autre machine<\/li>\n<li>Explorez les strat\u00e9gies de singularit\u00e9 de votre centre HPC et convertissez une image Docker au format Singularity<\/li>\n<li>Incluez les sp\u00e9cifications d'environnement et les images de conteneurs dans les documents suppl\u00e9mentaires de votre prochain article.<\/li>\n<\/ol>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"\/managing-research-software-through-tickets\">G\u00e9rer les logiciels de recherche via des tickets<\/a> \u2013 structurer la reproductibilit\u00e9 en tant que probl\u00e8mes et am\u00e9liorations suivis<\/li>\n<li><a href=\"\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\">G\u00e9rer les probl\u00e8mes de PDE \u00e0 grande \u00e9chelle&nbsp;: strat\u00e9gies, solveurs et \u00e9tudes de cas HPC<\/a> \u2013 Faites \u00e9voluer vos simulations tout en conservant la reproductibilit\u00e9<\/li>\n<li><a href=\"\/tracking-long-term-technical-debt-in-research-software\">suivi de la dette technique \u00e0 long terme dans les logiciels de recherche<\/a> \u2013 Utiliser les pratiques CI\/CD pour maintenir la reproductibilit\u00e9 dans le temps<\/li>\n<li><a href=\"\/collaboration-between-developers-and-researchers-turning-innovation-into-scalable-impact\">Collaboration entre d\u00e9veloppeurs et chercheurs<\/a> \u2013 Assurer la reproductibilit\u00e9 au-del\u00e0 des fronti\u00e8res des \u00e9quipes<\/li>\n<\/ul>\n<h2>R\u00e9f\u00e9rences et lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li>Boettiger, C. (2015). <a href=\"https:\/\/doi.org\/10.1145\/2723872.2723882\">Une introduction \u00e0 Docker pour la recherche reproductible<\/a>. <em>Examen des syst\u00e8mes d'exploitation ACM SIGOPS<\/em>.<\/li>\n<li>N\u00fcst, D., et al. (2020). <a href=\"https:\/\/doi.org\/10.1371\/journal.pcbi.1008319\">Dix r\u00e8gles simples pour la r\u00e9daction de Dockerfiles pour la science des donn\u00e9es reproductibles<\/a>. <em>biologie computationnelle PLOS<\/em>.<\/li>\n<li>la voie de Turing. <a href=\"https:\/\/book.the-turing-way.org\/reproducible-research\/overview\/overview-definitions\/\">D\u00e9finitions de la recherche reproductible<\/a>.<\/li>\n<li>Fitzpatrick, B.G., et al. (2018). <a href=\"https:\/\/doi.org\/10.3389\/fcomp.2018.00001\">Probl\u00e8mes de recherche sur la simulation reproductible<\/a>. <em>Fronti\u00e8res en informatique<\/em>.<\/li>\n<li>Documentation conda. <a href=\"https:\/\/docs.conda.io\/projects\/conda\/en\/stable\/user-guide\/tasks\/manage-environments.html\">Gestion des environnements<\/a>.<\/li>\n<\/ul>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Les flux de travail de recherche reproductibles garantissent que les r\u00e9sultats de la simulation peuvent \u00eatre exactement recr\u00e9\u00e9s par les autres (ou votre futur moi) en utilisant les m\u00eames donn\u00e9es, codes et environnement de calcul. Docker fournit une conteneurisation compl\u00e8te au niveau du syst\u00e8me pour une coh\u00e9rence maximale entre les plates-formes, tandis que CONDA offre [&hellip;]<\/p>\n","protected":false,"raw":""},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=199","iawp_total_views":1,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1237","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation - matforge.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  11 minutesLes flux de travail de recherche reproductibles garantissent que les r\u00e9sultats de la simulation peuvent \u00eatre exactement recr\u00e9\u00e9s par les autres (ou votre futur moi) en utilisant les m\u00eames donn\u00e9es, codes et environnement de calcul. Docker fournit une conteneurisation compl\u00e8te au niveau du syst\u00e8me pour une coh\u00e9rence maximale entre les plates-formes, tandis que CONDA offre [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:36+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation\",\"datePublished\":\"2026-08-21T14:28:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/\"},\"wordCount\":3318,\"commentCount\":0,\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/\",\"name\":\"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"caption\":\"Tomas Delgado\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/tomas-delgado\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation - matforge.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/","og_locale":"fr_FR","og_type":"article","og_title":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation - matforge.org","og_description":"Reading Time:  11 minutesLes flux de travail de recherche reproductibles garantissent que les r\u00e9sultats de la simulation peuvent \u00eatre exactement recr\u00e9\u00e9s par les autres (ou votre futur moi) en utilisant les m\u00eames donn\u00e9es, codes et environnement de calcul. Docker fournit une conteneurisation compl\u00e8te au niveau du syst\u00e8me pour une coh\u00e9rence maximale entre les plates-formes, tandis que CONDA offre [&hellip;]","og_url":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:36+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Tomas Delgado","Dur\u00e9e de lecture estim\u00e9e":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation","datePublished":"2026-08-21T14:28:36+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/"},"wordCount":3318,"commentCount":0,"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/","url":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/","name":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:36+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Flux de travail de recherche reproductibles : Docker et Conda pour les projets de simulation"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","caption":"Tomas Delgado"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/tomas-delgado\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1237"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1237\/revisions"}],"predecessor-version":[{"id":1353,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1237\/revisions\/1353"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}