{"id":1260,"date":"2026-08-21T14:31:40","date_gmt":"2026-08-21T14:31:40","guid":{"rendered":"https:\/\/matforge.org\/?p=1260","raw":"https:\/\/matforge.org\/?p=1260"},"modified":"2026-08-21T14:31:40","modified_gmt":"2026-08-21T14:31:40","slug":"distributed-parallel-computing-patterns-python-mpi-dask-ray","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/","title":{"rendered":"Mod\u00e8les de calculs parall\u00e8les distribu\u00e9s pour Python scientifique : MPI, DASK et RAY","raw":"Mod\u00e8les de calculs parall\u00e8les distribu\u00e9s pour Python scientifique : MPI, DASK et RAY"},"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\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>Vous disposez d&rsquo;une charge de travail de calcul qui ne tient pas sur un seul c\u0153ur. Il s&rsquo;agit peut-\u00eatre d&rsquo;une simulation PDE \u00e0 grande \u00e9chelle, d&rsquo;un lot de balayages de param\u00e8tres ou d&rsquo;un pipeline de traitement de donn\u00e9es qui prend des heures au lieu de minutes. Vous avez entendu parler de MPI, Dask et Ray comme outils de pointe pour mettre \u00e0 l&rsquo;\u00e9chelle le code Python. Mais lequel correspond r\u00e9ellement \u00e0 votre probl\u00e8me&nbsp;?<\/p>\n<p>La r\u00e9ponse courte&nbsp;: cela d\u00e9pend de votre mod\u00e8le de charge de travail. MPI vous donne le plus de contr\u00f4le mais a la courbe d&rsquo;apprentissage la plus raide. DASK vous aide \u00e0 faire \u00e9voluer les pandas familiers et le code NumPy avec des modifications minimales. Ray fonctionne mieux pour les charges de travail mixtes o\u00f9 la formation ML, la planification dynamique et l&rsquo;\u00e9tat distribu\u00e9 existent dans le m\u00eame flux de travail.<\/p>\n<p>La plupart des chercheurs commencent par Dask car il correspond directement au code qu&rsquo;ils connaissent d\u00e9j\u00e0. Ils passent \u00e0 Ray lorsqu&rsquo;ils ont besoin d&rsquo;une formation de mod\u00e8le ou d&rsquo;une orchestration dynamique. Ils choisissent MPI lorsqu&rsquo;ils travaillent avec la d\u00e9composition de domaine pour les PDE coupl\u00e9es et ont besoin d&rsquo;un contr\u00f4le de performance de bas niveau.<\/p>\n<p>Ce guide explique les mod\u00e8les de calcul parall\u00e8les derri\u00e8re chaque cadre. Il vous aide \u00e0 choisir le bon outil t\u00f4t au lieu de reconstruire votre flux de travail apr\u00e8s que la mauvaise impl\u00e9mentation est devenue trop difficile \u00e0 mettre \u00e0 l&rsquo;\u00e9chelle.<\/p>\n<h2>Ce qui rend ces cadres diff\u00e9rents<\/h2>\n<p>Les trois outils r\u00e9solvent le m\u00eame probl\u00e8me de base&nbsp;: la distribution du calcul Python sur plusieurs c\u0153urs ou machines. Ils utilisent des approches tr\u00e8s diff\u00e9rentes parce qu&rsquo;elles ont \u00e9t\u00e9 con\u00e7ues pour diff\u00e9rents \u00e9cosyst\u00e8mes. Ces diff\u00e9rences de conception d\u00e9cident si votre code s&rsquo;ex\u00e9cute en quelques minutes ou devient difficile \u00e0 maintenir.<\/p>\n<p>MPI, ou interface de passage de messages, a \u00e9t\u00e9 con\u00e7u pour le calcul haute performance et le calcul scientifique. Il suit un mod\u00e8le de transmission de messages o\u00f9 les processus s&rsquo;ex\u00e9cutent de mani\u00e8re ind\u00e9pendante et communiquent explicitement. Les d\u00e9veloppeurs Python l&rsquo;utilisent g\u00e9n\u00e9ralement via <code>mpi4py<\/code>, qui enveloppe la biblioth\u00e8que C MPI. Ce mod\u00e8le est explicite, de bas niveau et donne un contr\u00f4le pr\u00e9cis sur la fa\u00e7on dont les donn\u00e9es se d\u00e9placent entre les processus.<\/p>\n<p>Dask a \u00e9t\u00e9 construit pour l&rsquo;\u00e9cosyst\u00e8me de la science des donn\u00e9es Python. Il fournit des versions parall\u00e8les des tableaux NumPy, des trames de donn\u00e9es Pandas et des estimateurs de Scikit-Learn. Il utilise une \u00e9valuation paresseuse. Votre code construit un graphe de t\u00e2ches et Dask optimise et ex\u00e9cute ce graphe en parall\u00e8le. Si vous \u00e9crivez d\u00e9j\u00e0 des pandas ou du code numpy, Dask ne n\u00e9cessite souvent qu&rsquo;une petite modification d&rsquo;importation.<\/p>\n<p>Ray a \u00e9t\u00e9 con\u00e7u pour les applications Python \u00e9volutives avec des charges de travail mixtes. Il utilise deux primitives principales&nbsp;: les t\u00e2ches pour l&rsquo;ex\u00e9cution de fonctions sans \u00e9tat et les acteurs pour les objets distribu\u00e9s avec \u00e9tat. Ray utilise \u00e9galement un magasin d&rsquo;objets \u00e0 m\u00e9moire partag\u00e9e pour d\u00e9placer efficacement les donn\u00e9es entre les n\u0153uds. Il a \u00e9t\u00e9 construit avec des flux de travail d&rsquo;apprentissage automatique \u00e0 l&rsquo;esprit, de sorte qu&rsquo;il comprend des outils pour la formation, le r\u00e9glage et les mod\u00e8les de service.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Dimensions<\/th>\n<th>MPI<\/th>\n<th>t\u00e9n\u00e8bres<\/th>\n<th>Rayon<\/th>\n<\/tr>\n<tr>\n<td>mod\u00e8le d&rsquo;abstraction<\/td>\n<td>Transmission de messages, SPMD<\/td>\n<td>Graphique de t\u00e2ches, \u00e9valuation paresseuse<\/td>\n<td>Primitives d&rsquo;acteurs et de t\u00e2ches<\/td>\n<\/tr>\n<tr>\n<td>le mieux pour<\/td>\n<td>HPC, couplage PDE, d\u00e9composition du domaine<\/td>\n<td>Calculs de tableaux, ETL, Analytics<\/td>\n<td>Formation ML, charges de travail h\u00e9t\u00e9rog\u00e8nes<\/td>\n<\/tr>\n<tr>\n<td>Courbe d&rsquo;apprentissage<\/td>\n<td>Raide<\/td>\n<td>Doux pour les utilisateurs familiers avec les outils de donn\u00e9es Python<\/td>\n<td>Mod\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td>tol\u00e9rance aux pannes<\/td>\n<td>Manuel, niveau application<\/td>\n<td>Gestionnaire de planning<\/td>\n<td>Tests int\u00e9gr\u00e9es<\/td>\n<\/tr>\n<tr>\n<td>Partage des donn\u00e9es<\/td>\n<td>Appels MPI explicites tels que bcast, collecter et disperser<\/td>\n<td>Objets en m\u00e9moire et \u00e9tat partag\u00e9<\/td>\n<td>Magasin d&rsquo;objets distribu\u00e9s et acteurs<\/td>\n<\/tr>\n<tr>\n<td>python-natif<\/td>\n<td>Oui, via MPI4Py<\/td>\n<td>Originaire de<\/td>\n<td>Originaire de<\/td>\n<\/tr>\n<tr>\n<td>Cas d&rsquo;utilisation typique<\/td>\n<td>Solveurs coupl\u00e9s PDE, CFD, science des mat\u00e9riaux<\/td>\n<td>Ing\u00e9nierie des fonctionnalit\u00e9s et pipelines de donn\u00e9es<\/td>\n<td>Pipelines d&rsquo;IA, formation de mod\u00e8les, orchestration<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Quand utiliser MPI pour le code scientifique Python<\/h2>\n<p>MPI est un outil standard en sciences informatiques. Si votre recherche implique la dynamique des fluides, la m\u00e9canique solide, les simulations en champ de phase ou les m\u00e9thodes num\u00e9riques qui d\u00e9composent un domaine entre les processeurs, MPI vous offre un outillage mature et un soutien communautaire solide.<\/p>\n<h3>Le mod\u00e8le SPMD<\/h3>\n<p>MPI suit le mod\u00e8le de donn\u00e9es \u00e0 programme unique et multiple. Chaque processus ex\u00e9cute le m\u00eame code mais fonctionne sur des donn\u00e9es diff\u00e9rentes. La communication se fait par le biais d&rsquo;op\u00e9rations explicites point \u00e0 point ou collectives.<\/p>\n<p>Avec <code>mpi4py<\/code>, une simulation parall\u00e8le de base peut ressembler \u00e0 ceci&nbsp;:<\/p>\n<pre><code class=\"language-python\">from mpi4py import MPI\nimport numpy as np\n\ncomm = MPI.COM_WORLD\nrank = comm.Get_rank()\nsize = comm.Get_size()\n\n# Each process handles a different slice of the domain\nlocal_data = create_domain_slice(rank, size)\nresult = solve_pde(local_data)\n\n# Collective communication to gather results\nall_results = comm.gather(result, root=0)\n\nif rank == 0:\n    # Assemble global solution\n    global_solution = assemble(all_results)\n    report_results(global_solution)\n<\/code><\/pre>\n<h3>Quand MPI a du sens<\/h3>\n<p>Utilisez MPI pour la d\u00e9composition du domaine dans les simulations coupl\u00e9es. Si les processus doivent communiquer souvent au niveau num\u00e9rique, MPI donne le contr\u00f4le requis pour g\u00e9rer ces mod\u00e8les de communication. Ceci est courant dans les EDP coupl\u00e9s, l&rsquo;\u00e9change de conditions limites et les probl\u00e8mes d&rsquo;interface partag\u00e9e.<\/p>\n<p>MPI fonctionne \u00e9galement bien pour le couplage num\u00e9rique dense. Si votre solveur a besoin d&rsquo;une coordination \u00e9troite de processus, comme une it\u00e9ration Newton avec des r\u00e9sidus globaux, des op\u00e9rations collectives MPI comme <code>Allreduce<\/code>, <code>Bcast<\/code> et <code>Scatter<\/code> sont con\u00e7ues pour ce type de travail.<\/p>\n<p>MPI est \u00e9galement le bon choix lorsque les performances maximales sont importantes. Il s&rsquo;ex\u00e9cute directement sur l&rsquo;infrastructure HPC sans couche d&rsquo;abstraction de haut niveau entre votre code et le mat\u00e9riel. Cela donne de bonnes performances, mais cela signifie \u00e9galement que vous g\u00e9rez vous-m\u00eame le parall\u00e9lisme, la communication et l&rsquo;\u00e9quilibre de la charge.<\/p>\n<h3>Le compromis<\/h3>\n<p>Le code MPI peut devenir verbeux. Chaque op\u00e9ration n\u00e9cessite des appels explicites pour envoyer, recevoir, diffuser ou collecter des donn\u00e9es. Il n&rsquo;y a pas d&rsquo;optimisation automatique des graphes de t\u00e2ches. Vous concevez vous-m\u00eame la structure de communication.<\/p>\n<p>Cette complexit\u00e9 est acceptable lorsque la performance est la principale priorit\u00e9. Il est moins attrayant lorsque vous n&rsquo;avez besoin de tester que si la parall\u00e9lisation favorise un flux de travail de recherche. Une r\u00e8gle pratique est simple&nbsp;: choisissez MPI lorsque vous \u00e9crivez une biblioth\u00e8que de solveur ou un code de simulation de production o\u00f9 les performances justifient le co\u00fbt de mise en \u0153uvre.<\/p>\n<h2>Quand utiliser Dask pour le code scientifique Python<\/h2>\n<p>Dask a \u00e9t\u00e9 con\u00e7u pour mettre \u00e0 l&rsquo;\u00e9chelle la pile de donn\u00e9es Python existante sans vous obliger \u00e0 tout r\u00e9\u00e9crire. Si vous utilisez d\u00e9j\u00e0 Pandas, NumPy ou Scikit-Learn, Dask vous permet souvent de conserver le m\u00eame mod\u00e8le mental tout en ajoutant une ex\u00e9cution parall\u00e8le.<\/p>\n<h3>Le mod\u00e8le d&rsquo;\u00e9valuation paresseux<\/h3>\n<p>Dask construit des graphes de t\u00e2ches paresseusement. Lorsque vous appelez des op\u00e9rations DASK, le calcul ne s&rsquo;ex\u00e9cute pas imm\u00e9diatement. Au lieu de cela, vous d\u00e9crivez ce qui devrait arriver. Dask optimise ensuite le graphique, planifie le travail entre les travailleurs et l&rsquo;ex\u00e9cute en parall\u00e8le.<\/p>\n<p>Ce mod\u00e8le paresseux pr\u00e9sente deux avantages importants :<\/p>\n<ol>\n<li>Optimisation du graphique des t\u00e2ches. Dask peut combiner des op\u00e9rations, supprimer le calcul redondant et r\u00e9organiser les t\u00e2ches pour de meilleures performances.<\/li>\n<li>Gestion de la m\u00e9moire. Le calcul \u00e9tant retard\u00e9, Dask peut g\u00e9rer plus efficacement les r\u00e9sultats interm\u00e9diaires.<\/li>\n<\/ol>\n<p>Voici le mod\u00e8le de base :<\/p>\n<pre><code class=\"language-python\">import dask.dataframe as dd\n\n# Lazy: no computation happens yet\ndf = dd.read_parquet(\"simulations\/*.parquet\")\nfiltered = df[df.temperature &gt; 300]\naggregated = filtered.groupby(\"region\").mean()\n\n# This triggers computation across the cluster\nresults = aggregated.compute()\n<\/code><\/pre>\n<h3>Quand Dask a du sens<\/h3>\n<p>DASK fonctionne bien pour les transformations de tableaux et de trames de donn\u00e9es \u00e0 grande \u00e9chelle. Si votre workflow implique une agr\u00e9gation de donn\u00e9es de simulation, une ing\u00e9nierie des fonctionnalit\u00e9s ou une analyse par lots sur des donn\u00e9es structur\u00e9es, DASK s&rsquo;associe naturellement aux pandas existants et aux flux de travail NumPy.<\/p>\n<p>Dask est \u00e9galement fort lorsque le flux de travail a un graphique de t\u00e2ches pr\u00e9visible. Un mod\u00e8le commun est&nbsp;: lire des donn\u00e9es, transformer des donn\u00e9es, agr\u00e9ger les r\u00e9sultats et \u00e9crire la sortie. DASK peut optimiser efficacement cette structure.<\/p>\n<p>Il est \u00e9galement utile pour la parall\u00e9lisation progressive. Vous pouvez commencer par un flux de travail Pandas mono-machine et passer ult\u00e9rieurement \u00e0 une ex\u00e9cution distribu\u00e9e. Cela fait de Dask un point de d\u00e9part pratique pour les chercheurs qui souhaitent un traitement parall\u00e8le sans r\u00e9\u00e9criture compl\u00e8te.<\/p>\n<h3>Le compromis<\/h3>\n<p>DASK est moins adapt\u00e9 aux charges de travail hautement dynamiques ou mixtes. Si votre pipeline comprend une formation de mod\u00e8les, une planification dynamique ou des services \u00e0 long terme, Dask n&rsquo;est peut-\u00eatre pas le mieux adapt\u00e9. Son mod\u00e8le de graphe de t\u00e2ches fonctionne mieux lorsque la structure du flux de travail est connue \u00e0 l&rsquo;avance.<\/p>\n<p>DASK n&rsquo;est pas non plus \u00e0 l&rsquo;\u00e9chelle aussi efficace que le MPI pour un couplage num\u00e9rique serr\u00e9. Si votre simulation n\u00e9cessite un \u00e9change fr\u00e9quent de conditions limites entre les processus, MPI donne g\u00e9n\u00e9ralement de meilleures performances de bas niveau.<\/p>\n<p>Une remarque pratique : la communication DASK peut \u00eatre plus lente sur les r\u00e9seaux \u00e0 haute latence. Si vous utilisez un cluster avec une interconnexion \u00e0 faible latence, MPI peut \u00eatre plus performant. Sur les syst\u00e8mes cloud ou les r\u00e9seaux Ethernet standard, Dask est souvent suffisant pour de nombreux flux de travail de recherche.<\/p>\n<h2>Quand utiliser Ray pour le code scientifique Python<\/h2>\n<p>Ray utilise un mod\u00e8le diff\u00e9rent. Au lieu de se concentrer principalement sur les graphes de t\u00e2ches, il utilise des t\u00e2ches et des acteurs. Les t\u00e2ches ex\u00e9cutent des fonctions parall\u00e8les sans \u00e9tat. Les acteurs sont des objets distribu\u00e9s qui maintiennent l&rsquo;\u00e9tat entre les appels de m\u00e9thode.<\/p>\n<h3>Le mod\u00e8le d&rsquo;acteur<\/h3>\n<p>Les acteurs sont l\u2019une des caract\u00e9ristiques les plus importantes de Ray. Un acteur vit sur un n\u0153ud du cluster et conserve son \u00e9tat interne entre les appels. Ceci est utile lorsque diff\u00e9rentes parties d&rsquo;un flux de travail distribu\u00e9 ont besoin d&rsquo;un \u00e9tat persistant.<\/p>\n<pre><code class=\"language-python\">import ray\n\nray.init()\n\n@ray.remote\nclass SimulationState:\n    def __init__(self):\n        self.state = initialize_state()\n    \n    def step(self, local_data):\n        self.state = evolve(self.state, local_data)\n        return self.state\n    \n    def get_snapshot(self):\n        return self.state\n\n# Actor runs on a specific node\nsim = SimulationState.remote()\nresult = sim.step.remote(local_data)\nsnapshot = ray.get(sim.get_snapshot.remote())\n<\/code><\/pre>\n<h3>Quand Ray a du sens<\/h3>\n<p>Ray fonctionne bien pour les charges de travail h\u00e9t\u00e9rog\u00e8nes. Si votre pipeline de simulation comprend le traitement des donn\u00e9es, la formation de mod\u00e8les, le r\u00e9glage des hyperparam\u00e8tres et la diffusion de mod\u00e8les, Ray peut coordonner ces parties dans un seul syst\u00e8me.<\/p>\n<p>Ray est \u00e9galement utile pour la planification dynamique. Si la structure de votre calcul change lors de l&rsquo;ex\u00e9cution, Ray peut s&rsquo;adapter. Cela aide dans les flux de travail tels que le raffinement du maillage adaptatif, o\u00f9 de nouvelles t\u00e2ches peuvent appara\u00eetre en fonction des r\u00e9sultats interm\u00e9diaires.<\/p>\n<p>Ray prend \u00e9galement en charge des charges de travail mixtes CPU et GPU. Si vous ex\u00e9cutez des solveurs bas\u00e9s sur CPU avec des mod\u00e8les de post-traitement ou de substitution acc\u00e9l\u00e9r\u00e9s par GPU, Ray peut planifier des travaux sur diff\u00e9rentes ressources mat\u00e9rielles.<\/p>\n<p>Un autre cas d&rsquo;utilisation fort est l&rsquo;orchestration des exp\u00e9riences. Ray peut g\u00e9rer de nombreuses configurations de simulation, suivre l&rsquo;\u00e9tat des ex\u00e9cutions et coordonner les r\u00e9sultats distribu\u00e9s.<\/p>\n<h3>Le compromis<\/h3>\n<p>Ray a besoin d&rsquo;une gestion prudente du cycle de vie. Les acteurs doivent \u00eatre cr\u00e9\u00e9s, utilis\u00e9s et lib\u00e9r\u00e9s correctement. Si les acteurs conservent de grandes structures de donn\u00e9es pendant trop longtemps, l&rsquo;utilisation de la m\u00e9moire peut s&rsquo;allonger dans le cluster.<\/p>\n<p>Ray est \u00e9galement moins id\u00e9al pour les transformations de donn\u00e9es d\u00e9terministes pures par lots et simples. Dans ces cas, Dask semble souvent plus naturel et peut n\u00e9cessiter moins de code.<\/p>\n<p>Un point de d\u00e9cision utile est le suivant&nbsp;: Ray est attrayant lorsque la vitesse locale n&rsquo;est pas la seule pr\u00e9occupation. Sa valeur r\u00e9elle appara\u00eet lorsque les charges de travail deviennent distribu\u00e9es, dynamiques, avec \u00e9tat ou apprentissage automatique.<\/p>\n<h2>Comment choisir entre MPI, Dask et Ray<\/h2>\n<p>Vous n&rsquo;avez pas toujours besoin de choisir un seul cadre. De nombreuses \u00e9quipes de recherche utilisent une approche hybride. Chaque framework g\u00e8re la partie du flux de travail qu&rsquo;il s&rsquo;adapte le mieux.<\/p>\n<h3>flux de d\u00e9cision<\/h3>\n<p>\u00c9tape&nbsp;1&nbsp;: Votre charge de travail est-elle principalement des transformations de tableaux ou de dataframes&nbsp;?<\/p>\n<ul>\n<li>Consid\u00e9rez DASK. Il convient parfaitement \u00e0 l&rsquo;agr\u00e9gation de donn\u00e9es de simulation, \u00e0 l&rsquo;ing\u00e9nierie des fonctionnalit\u00e9s, \u00e0 l&rsquo;analyse et aux pipelines de donn\u00e9es structur\u00e9es.<\/li>\n<\/ul>\n<p>\u00c9tape&nbsp;2&nbsp;: Votre charge de travail inclut-elle la planification dynamique, la formation de mod\u00e8les ou les composants avec \u00e9tat&nbsp;?<\/p>\n<ul>\n<li>Consid\u00e9rez Ray. Il s&rsquo;adapte aux workflows qui ont besoin d&rsquo;acteurs, d&rsquo;un \u00e9tat distribu\u00e9, de GPU ou de structures de t\u00e2ches.<\/li>\n<\/ul>\n<p>\u00c9tape&nbsp;3&nbsp;: Avez-vous besoin d&rsquo;un couplage num\u00e9rique ou d&rsquo;une d\u00e9composition de domaine serr\u00e9s pour les PDE&nbsp;?<\/p>\n<ul>\n<li>Consid\u00e9rez MPI. Il est con\u00e7u pour une communication de processus fr\u00e9quente et un contr\u00f4le de bas niveau.<\/li>\n<\/ul>\n<p>\u00c9tape&nbsp;4&nbsp;: Avez-vous plusieurs types de charge de travail&nbsp;?<\/p>\n<ul>\n<li>Envisagez une architecture hybride. Vous pouvez utiliser Dask pour la pr\u00e9paration des donn\u00e9es, Ray pour l&rsquo;orchestration et MPI pour le solveur num\u00e9rique.<\/li>\n<\/ul>\n<h3>Recommandations pratiques<\/h3>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Votre situation<\/th>\n<th>Approche recommand\u00e9e<\/th>\n<th>Pourquoi<\/th>\n<\/tr>\n<tr>\n<td>Simulation unique sur quelques c\u0153urs<\/td>\n<td>Dask avec LocalCluster<\/td>\n<td>Code familier et configuration simple<\/td>\n<\/tr>\n<tr>\n<td>Analyse par lots \u00e0 grande \u00e9chelle<\/td>\n<td>DASK avec un cluster distribu\u00e9<\/td>\n<td>L&rsquo;\u00e9valuation paresseuse permet d&rsquo;optimiser le pipeline<\/td>\n<\/tr>\n<tr>\n<td>ML Pipeline avec formation et service<\/td>\n<td>Rayon<\/td>\n<td>Les acteurs, les t\u00e2ches et la prise en charge des GPU correspondent \u00e0 ce flux de travail<\/td>\n<\/tr>\n<tr>\n<td>Solveur coupl\u00e9 PDE<\/td>\n<td>MPI avec Dask ou Ray pour l&rsquo;orchestration<\/td>\n<td>MPI g\u00e8re le solveur, tandis que les outils Python aident \u00e0 la gestion des donn\u00e9es<\/td>\n<\/tr>\n<tr>\n<td>Raffinement de maillage adaptatif<\/td>\n<td>Rayon<\/td>\n<td>La planification dynamique g\u00e8re la modification des structures de t\u00e2ches<\/td>\n<\/tr>\n<tr>\n<td>D\u00e9ploiement cloud \u00e0 haute latence<\/td>\n<td>Dask ou Ray<\/td>\n<td>MPI a besoin d&rsquo;un r\u00e9glage plus minutieux du r\u00e9seau<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Le cas des architectures hybrides<\/h3>\n<p>Vous n&rsquo;avez pas besoin d&rsquo;utiliser un framework pour l&rsquo;ensemble du workflow. Certaines architectures de calcul scientifique solides combinent plusieurs outils :<\/p>\n<ul>\n<li>MPI pour le solveur, dask pour le post-traitement. Ex\u00e9cutez le solveur PDE avec MPI, puis analysez et visualisez les r\u00e9sultats avec Dask.<\/li>\n<li>MPI pour le solveur, Ray pour l&rsquo;orchestration d&rsquo;exp\u00e9rience. Utilisez MPI pour la simulation num\u00e9rique et le rayon pour g\u00e9rer les configurations, l&rsquo;\u00e9tat et plusieurs ex\u00e9cutions.<\/li>\n<li>DASK pour la pr\u00e9paration des donn\u00e9es, Ray pour la formation des mod\u00e8les. Utilisez DASK pour pr\u00e9parer de grands ensembles de donn\u00e9es, puis utilisez Ray pour la formation de mod\u00e8les ou le d\u00e9veloppement de mod\u00e8les de substitution.<\/li>\n<\/ul>\n<h2>erreurs courantes<\/h2>\n<p>Une erreur courante consiste \u00e0 supposer que Dask met \u00e0 l&rsquo;\u00e9chelle chaque type de charge de travail. DASK est solide pour les flux de travail d\u00e9terministes avec des graphes de t\u00e2ches clairs. Si la structure de la t\u00e2che d\u00e9pend de r\u00e9sultats interm\u00e9diaires, Ray peut mieux g\u00e9rer le flux de travail.<\/p>\n<p>Une autre erreur consiste \u00e0 utiliser MPI o\u00f9 Dask serait plus simple. Si la charge de travail est principalement constitu\u00e9e d&rsquo;analyse de donn\u00e9es ou d&rsquo;ing\u00e9nierie de fonctionnalit\u00e9s, Dask peut gagner beaucoup de temps de mise en \u0153uvre.<\/p>\n<p>Certaines \u00e9quipes n\u00e9gligent \u00e9galement la tol\u00e9rance aux pannes. MPI donne un contr\u00f4le manuel, mais vous devez concevoir vous-m\u00eame la gestion des \u00e9checs. DASK et RAY offrent une prise en charge plus importante au niveau du planificateur pour les tentatives et la r\u00e9cup\u00e9ration.<\/p>\n<p>Les frais g\u00e9n\u00e9raux de communication sont un autre probl\u00e8me. Chaque cadre distribu\u00e9 a des co\u00fbts de r\u00e9seau. MPI rend la communication visible et plus facile \u00e0 optimiser. Dask et Ray cachent une grande partie de cette complexit\u00e9, mais le co\u00fbt existe toujours.<\/p>\n<h2>Ce que nous recommandons<\/h2>\n<p>Pour la plupart des chercheurs scientifiques en Python, commen\u00e7ant par l&rsquo;informatique distribu\u00e9e, Dask est le meilleur point d&rsquo;entr\u00e9e. Il mappe sur le code qu&rsquo;ils \u00e9crivent d\u00e9j\u00e0, n\u00e9cessite moins de changements et donne un parall\u00e9lisme distribu\u00e9 sans un mod\u00e8le de programmation compl\u00e8tement nouveau.<\/p>\n<p>Choisissez MPI lorsque vous \u00e9crivez du code de simulation de production o\u00f9 les performances justifient le co\u00fbt de mise en \u0153uvre. C&rsquo;est le bon outil pour la d\u00e9composition du domaine et le couplage num\u00e9rique serr\u00e9.<\/p>\n<p>Choisissez Ray lorsque le flux de travail est h\u00e9t\u00e9rog\u00e8ne. Ray est fort lorsque le traitement des donn\u00e9es, la formation de mod\u00e8les, la planification dynamique et l&rsquo;\u00e9tat distribu\u00e9 apparaissent dans le m\u00eame syst\u00e8me.<\/p>\n<p>Les cadres ne s&rsquo;excluent pas mutuellement. De nombreuses \u00e9quipes utilisent chaque framework pour la partie du flux de travail qu&rsquo;il g\u00e8re le mieux. La cl\u00e9 est de faire correspondre le mod\u00e8le de charge de travail \u00e0 l&rsquo;abstraction droite.<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Le choix entre MPI, Dask et Ray n&rsquo;est pas de savoir quel framework est le meilleur en g\u00e9n\u00e9ral. Il s&rsquo;agit de la structure qui correspond \u00e0 votre charge de travail.<\/p>\n<ul>\n<li>MPI donne un contr\u00f4le de bas niveau pour un couplage num\u00e9rique serr\u00e9 et une d\u00e9composition de domaine.<\/li>\n<li>Dask met \u00e0 l&rsquo;\u00e9chelle des pandas familiers et des flux de travail NumPy avec des graphes de t\u00e2ches paresseux.<\/li>\n<li>Ray g\u00e8re des charges de travail h\u00e9t\u00e9rog\u00e8nes avec des t\u00e2ches, des acteurs, une planification dynamique et un \u00e9tat distribu\u00e9.<\/li>\n<\/ul>\n<p>Commencez par Dask si votre charge de travail s&rsquo;apparente \u00e0 des transformations Array ou DataFrame. Utilisez MPI si vous avez besoin de d\u00e9composition de domaine ou de couplage num\u00e9rique serr\u00e9. Choisissez Ray si votre pipeline inclut une formation de mod\u00e8le, une planification dynamique ou un \u00e9tat distribu\u00e9.<\/p>\n","protected":false,"raw":"<p>Vous disposez d'une charge de travail de calcul qui ne tient pas sur un seul c\u0153ur. Il s'agit peut-\u00eatre d'une simulation PDE \u00e0 grande \u00e9chelle, d'un lot de balayages de param\u00e8tres ou d'un pipeline de traitement de donn\u00e9es qui prend des heures au lieu de minutes. Vous avez entendu parler de MPI, Dask et Ray comme outils de pointe pour mettre \u00e0 l'\u00e9chelle le code Python. Mais lequel correspond r\u00e9ellement \u00e0 votre probl\u00e8me&nbsp;?<\/p>\n<p>La r\u00e9ponse courte&nbsp;: cela d\u00e9pend de votre mod\u00e8le de charge de travail. MPI vous donne le plus de contr\u00f4le mais a la courbe d'apprentissage la plus raide. DASK vous aide \u00e0 faire \u00e9voluer les pandas familiers et le code NumPy avec des modifications minimales. Ray fonctionne mieux pour les charges de travail mixtes o\u00f9 la formation ML, la planification dynamique et l'\u00e9tat distribu\u00e9 existent dans le m\u00eame flux de travail.<\/p>\n<p>La plupart des chercheurs commencent par Dask car il correspond directement au code qu'ils connaissent d\u00e9j\u00e0. Ils passent \u00e0 Ray lorsqu'ils ont besoin d'une formation de mod\u00e8le ou d'une orchestration dynamique. Ils choisissent MPI lorsqu'ils travaillent avec la d\u00e9composition de domaine pour les PDE coupl\u00e9es et ont besoin d'un contr\u00f4le de performance de bas niveau.<\/p>\n<p>Ce guide explique les mod\u00e8les de calcul parall\u00e8les derri\u00e8re chaque cadre. Il vous aide \u00e0 choisir le bon outil t\u00f4t au lieu de reconstruire votre flux de travail apr\u00e8s que la mauvaise impl\u00e9mentation est devenue trop difficile \u00e0 mettre \u00e0 l'\u00e9chelle.<\/p>\n<h2>Ce qui rend ces cadres diff\u00e9rents<\/h2>\n<p>Les trois outils r\u00e9solvent le m\u00eame probl\u00e8me de base&nbsp;: la distribution du calcul Python sur plusieurs c\u0153urs ou machines. Ils utilisent des approches tr\u00e8s diff\u00e9rentes parce qu'elles ont \u00e9t\u00e9 con\u00e7ues pour diff\u00e9rents \u00e9cosyst\u00e8mes. Ces diff\u00e9rences de conception d\u00e9cident si votre code s'ex\u00e9cute en quelques minutes ou devient difficile \u00e0 maintenir.<\/p>\n<p>MPI, ou interface de passage de messages, a \u00e9t\u00e9 con\u00e7u pour le calcul haute performance et le calcul scientifique. Il suit un mod\u00e8le de transmission de messages o\u00f9 les processus s'ex\u00e9cutent de mani\u00e8re ind\u00e9pendante et communiquent explicitement. Les d\u00e9veloppeurs Python l'utilisent g\u00e9n\u00e9ralement via <code>mpi4py<\/code>, qui enveloppe la biblioth\u00e8que C MPI. Ce mod\u00e8le est explicite, de bas niveau et donne un contr\u00f4le pr\u00e9cis sur la fa\u00e7on dont les donn\u00e9es se d\u00e9placent entre les processus.<\/p>\n<p>Dask a \u00e9t\u00e9 construit pour l'\u00e9cosyst\u00e8me de la science des donn\u00e9es Python. Il fournit des versions parall\u00e8les des tableaux NumPy, des trames de donn\u00e9es Pandas et des estimateurs de Scikit-Learn. Il utilise une \u00e9valuation paresseuse. Votre code construit un graphe de t\u00e2ches et Dask optimise et ex\u00e9cute ce graphe en parall\u00e8le. Si vous \u00e9crivez d\u00e9j\u00e0 des pandas ou du code numpy, Dask ne n\u00e9cessite souvent qu'une petite modification d'importation.<\/p>\n<p>Ray a \u00e9t\u00e9 con\u00e7u pour les applications Python \u00e9volutives avec des charges de travail mixtes. Il utilise deux primitives principales&nbsp;: les t\u00e2ches pour l'ex\u00e9cution de fonctions sans \u00e9tat et les acteurs pour les objets distribu\u00e9s avec \u00e9tat. Ray utilise \u00e9galement un magasin d'objets \u00e0 m\u00e9moire partag\u00e9e pour d\u00e9placer efficacement les donn\u00e9es entre les n\u0153uds. Il a \u00e9t\u00e9 construit avec des flux de travail d'apprentissage automatique \u00e0 l'esprit, de sorte qu'il comprend des outils pour la formation, le r\u00e9glage et les mod\u00e8les de service.<\/p>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Dimensions<\/th>\n<th>MPI<\/th>\n<th>t\u00e9n\u00e8bres<\/th>\n<th>Rayon<\/th>\n<\/tr>\n<tr>\n<td>mod\u00e8le d'abstraction<\/td>\n<td>Transmission de messages, SPMD<\/td>\n<td>Graphique de t\u00e2ches, \u00e9valuation paresseuse<\/td>\n<td>Primitives d'acteurs et de t\u00e2ches<\/td>\n<\/tr>\n<tr>\n<td>le mieux pour<\/td>\n<td>HPC, couplage PDE, d\u00e9composition du domaine<\/td>\n<td>Calculs de tableaux, ETL, Analytics<\/td>\n<td>Formation ML, charges de travail h\u00e9t\u00e9rog\u00e8nes<\/td>\n<\/tr>\n<tr>\n<td>Courbe d'apprentissage<\/td>\n<td>Raide<\/td>\n<td>Doux pour les utilisateurs familiers avec les outils de donn\u00e9es Python<\/td>\n<td>Mod\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td>tol\u00e9rance aux pannes<\/td>\n<td>Manuel, niveau application<\/td>\n<td>Gestionnaire de planning<\/td>\n<td>Tests int\u00e9gr\u00e9es<\/td>\n<\/tr>\n<tr>\n<td>Partage des donn\u00e9es<\/td>\n<td>Appels MPI explicites tels que bcast, collecter et disperser<\/td>\n<td>Objets en m\u00e9moire et \u00e9tat partag\u00e9<\/td>\n<td>Magasin d'objets distribu\u00e9s et acteurs<\/td>\n<\/tr>\n<tr>\n<td>python-natif<\/td>\n<td>Oui, via MPI4Py<\/td>\n<td>Originaire de<\/td>\n<td>Originaire de<\/td>\n<\/tr>\n<tr>\n<td>Cas d'utilisation typique<\/td>\n<td>Solveurs coupl\u00e9s PDE, CFD, science des mat\u00e9riaux<\/td>\n<td>Ing\u00e9nierie des fonctionnalit\u00e9s et pipelines de donn\u00e9es<\/td>\n<td>Pipelines d'IA, formation de mod\u00e8les, orchestration<\/td>\n<\/tr>\n<\/tbody><\/table>\n<h2>Quand utiliser MPI pour le code scientifique Python<\/h2>\n<p>MPI est un outil standard en sciences informatiques. Si votre recherche implique la dynamique des fluides, la m\u00e9canique solide, les simulations en champ de phase ou les m\u00e9thodes num\u00e9riques qui d\u00e9composent un domaine entre les processeurs, MPI vous offre un outillage mature et un soutien communautaire solide.<\/p>\n<h3>Le mod\u00e8le SPMD<\/h3>\n<p>MPI suit le mod\u00e8le de donn\u00e9es \u00e0 programme unique et multiple. Chaque processus ex\u00e9cute le m\u00eame code mais fonctionne sur des donn\u00e9es diff\u00e9rentes. La communication se fait par le biais d'op\u00e9rations explicites point \u00e0 point ou collectives.<\/p>\n<p>Avec <code>mpi4py<\/code>, une simulation parall\u00e8le de base peut ressembler \u00e0 ceci&nbsp;:<\/p>\n<pre><code class=\"language-python\">from mpi4py import MPI\nimport numpy as np\n\ncomm = MPI.COM_WORLD\nrank = comm.Get_rank()\nsize = comm.Get_size()\n\n# Each process handles a different slice of the domain\nlocal_data = create_domain_slice(rank, size)\nresult = solve_pde(local_data)\n\n# Collective communication to gather results\nall_results = comm.gather(result, root=0)\n\nif rank == 0:\n    # Assemble global solution\n    global_solution = assemble(all_results)\n    report_results(global_solution)\n<\/code><\/pre>\n<h3>Quand MPI a du sens<\/h3>\n<p>Utilisez MPI pour la d\u00e9composition du domaine dans les simulations coupl\u00e9es. Si les processus doivent communiquer souvent au niveau num\u00e9rique, MPI donne le contr\u00f4le requis pour g\u00e9rer ces mod\u00e8les de communication. Ceci est courant dans les EDP coupl\u00e9s, l'\u00e9change de conditions limites et les probl\u00e8mes d'interface partag\u00e9e.<\/p>\n<p>MPI fonctionne \u00e9galement bien pour le couplage num\u00e9rique dense. Si votre solveur a besoin d'une coordination \u00e9troite de processus, comme une it\u00e9ration Newton avec des r\u00e9sidus globaux, des op\u00e9rations collectives MPI comme <code>Allreduce<\/code>, <code>Bcast<\/code> et <code>Scatter<\/code> sont con\u00e7ues pour ce type de travail.<\/p>\n<p>MPI est \u00e9galement le bon choix lorsque les performances maximales sont importantes. Il s'ex\u00e9cute directement sur l'infrastructure HPC sans couche d'abstraction de haut niveau entre votre code et le mat\u00e9riel. Cela donne de bonnes performances, mais cela signifie \u00e9galement que vous g\u00e9rez vous-m\u00eame le parall\u00e9lisme, la communication et l'\u00e9quilibre de la charge.<\/p>\n<h3>Le compromis<\/h3>\n<p>Le code MPI peut devenir verbeux. Chaque op\u00e9ration n\u00e9cessite des appels explicites pour envoyer, recevoir, diffuser ou collecter des donn\u00e9es. Il n'y a pas d'optimisation automatique des graphes de t\u00e2ches. Vous concevez vous-m\u00eame la structure de communication.<\/p>\n<p>Cette complexit\u00e9 est acceptable lorsque la performance est la principale priorit\u00e9. Il est moins attrayant lorsque vous n'avez besoin de tester que si la parall\u00e9lisation favorise un flux de travail de recherche. Une r\u00e8gle pratique est simple&nbsp;: choisissez MPI lorsque vous \u00e9crivez une biblioth\u00e8que de solveur ou un code de simulation de production o\u00f9 les performances justifient le co\u00fbt de mise en \u0153uvre.<\/p>\n<h2>Quand utiliser Dask pour le code scientifique Python<\/h2>\n<p>Dask a \u00e9t\u00e9 con\u00e7u pour mettre \u00e0 l'\u00e9chelle la pile de donn\u00e9es Python existante sans vous obliger \u00e0 tout r\u00e9\u00e9crire. Si vous utilisez d\u00e9j\u00e0 Pandas, NumPy ou Scikit-Learn, Dask vous permet souvent de conserver le m\u00eame mod\u00e8le mental tout en ajoutant une ex\u00e9cution parall\u00e8le.<\/p>\n<h3>Le mod\u00e8le d'\u00e9valuation paresseux<\/h3>\n<p>Dask construit des graphes de t\u00e2ches paresseusement. Lorsque vous appelez des op\u00e9rations DASK, le calcul ne s'ex\u00e9cute pas imm\u00e9diatement. Au lieu de cela, vous d\u00e9crivez ce qui devrait arriver. Dask optimise ensuite le graphique, planifie le travail entre les travailleurs et l'ex\u00e9cute en parall\u00e8le.<\/p>\n<p>Ce mod\u00e8le paresseux pr\u00e9sente deux avantages importants :<\/p>\n<ol>\n<li>Optimisation du graphique des t\u00e2ches. Dask peut combiner des op\u00e9rations, supprimer le calcul redondant et r\u00e9organiser les t\u00e2ches pour de meilleures performances.<\/li>\n<li>Gestion de la m\u00e9moire. Le calcul \u00e9tant retard\u00e9, Dask peut g\u00e9rer plus efficacement les r\u00e9sultats interm\u00e9diaires.<\/li>\n<\/ol>\n<p>Voici le mod\u00e8le de base :<\/p>\n<pre><code class=\"language-python\">import dask.dataframe as dd\n\n# Lazy: no computation happens yet\ndf = dd.read_parquet(\"simulations\/*.parquet\")\nfiltered = df[df.temperature &gt; 300]\naggregated = filtered.groupby(\"region\").mean()\n\n# This triggers computation across the cluster\nresults = aggregated.compute()\n<\/code><\/pre>\n<h3>Quand Dask a du sens<\/h3>\n<p>DASK fonctionne bien pour les transformations de tableaux et de trames de donn\u00e9es \u00e0 grande \u00e9chelle. Si votre workflow implique une agr\u00e9gation de donn\u00e9es de simulation, une ing\u00e9nierie des fonctionnalit\u00e9s ou une analyse par lots sur des donn\u00e9es structur\u00e9es, DASK s'associe naturellement aux pandas existants et aux flux de travail NumPy.<\/p>\n<p>Dask est \u00e9galement fort lorsque le flux de travail a un graphique de t\u00e2ches pr\u00e9visible. Un mod\u00e8le commun est&nbsp;: lire des donn\u00e9es, transformer des donn\u00e9es, agr\u00e9ger les r\u00e9sultats et \u00e9crire la sortie. DASK peut optimiser efficacement cette structure.<\/p>\n<p>Il est \u00e9galement utile pour la parall\u00e9lisation progressive. Vous pouvez commencer par un flux de travail Pandas mono-machine et passer ult\u00e9rieurement \u00e0 une ex\u00e9cution distribu\u00e9e. Cela fait de Dask un point de d\u00e9part pratique pour les chercheurs qui souhaitent un traitement parall\u00e8le sans r\u00e9\u00e9criture compl\u00e8te.<\/p>\n<h3>Le compromis<\/h3>\n<p>DASK est moins adapt\u00e9 aux charges de travail hautement dynamiques ou mixtes. Si votre pipeline comprend une formation de mod\u00e8les, une planification dynamique ou des services \u00e0 long terme, Dask n'est peut-\u00eatre pas le mieux adapt\u00e9. Son mod\u00e8le de graphe de t\u00e2ches fonctionne mieux lorsque la structure du flux de travail est connue \u00e0 l'avance.<\/p>\n<p>DASK n'est pas non plus \u00e0 l'\u00e9chelle aussi efficace que le MPI pour un couplage num\u00e9rique serr\u00e9. Si votre simulation n\u00e9cessite un \u00e9change fr\u00e9quent de conditions limites entre les processus, MPI donne g\u00e9n\u00e9ralement de meilleures performances de bas niveau.<\/p>\n<p>Une remarque pratique : la communication DASK peut \u00eatre plus lente sur les r\u00e9seaux \u00e0 haute latence. Si vous utilisez un cluster avec une interconnexion \u00e0 faible latence, MPI peut \u00eatre plus performant. Sur les syst\u00e8mes cloud ou les r\u00e9seaux Ethernet standard, Dask est souvent suffisant pour de nombreux flux de travail de recherche.<\/p>\n<h2>Quand utiliser Ray pour le code scientifique Python<\/h2>\n<p>Ray utilise un mod\u00e8le diff\u00e9rent. Au lieu de se concentrer principalement sur les graphes de t\u00e2ches, il utilise des t\u00e2ches et des acteurs. Les t\u00e2ches ex\u00e9cutent des fonctions parall\u00e8les sans \u00e9tat. Les acteurs sont des objets distribu\u00e9s qui maintiennent l'\u00e9tat entre les appels de m\u00e9thode.<\/p>\n<h3>Le mod\u00e8le d'acteur<\/h3>\n<p>Les acteurs sont l\u2019une des caract\u00e9ristiques les plus importantes de Ray. Un acteur vit sur un n\u0153ud du cluster et conserve son \u00e9tat interne entre les appels. Ceci est utile lorsque diff\u00e9rentes parties d'un flux de travail distribu\u00e9 ont besoin d'un \u00e9tat persistant.<\/p>\n<pre><code class=\"language-python\">import ray\n\nray.init()\n\n@ray.remote\nclass SimulationState:\n    def __init__(self):\n        self.state = initialize_state()\n    \n    def step(self, local_data):\n        self.state = evolve(self.state, local_data)\n        return self.state\n    \n    def get_snapshot(self):\n        return self.state\n\n# Actor runs on a specific node\nsim = SimulationState.remote()\nresult = sim.step.remote(local_data)\nsnapshot = ray.get(sim.get_snapshot.remote())\n<\/code><\/pre>\n<h3>Quand Ray a du sens<\/h3>\n<p>Ray fonctionne bien pour les charges de travail h\u00e9t\u00e9rog\u00e8nes. Si votre pipeline de simulation comprend le traitement des donn\u00e9es, la formation de mod\u00e8les, le r\u00e9glage des hyperparam\u00e8tres et la diffusion de mod\u00e8les, Ray peut coordonner ces parties dans un seul syst\u00e8me.<\/p>\n<p>Ray est \u00e9galement utile pour la planification dynamique. Si la structure de votre calcul change lors de l'ex\u00e9cution, Ray peut s'adapter. Cela aide dans les flux de travail tels que le raffinement du maillage adaptatif, o\u00f9 de nouvelles t\u00e2ches peuvent appara\u00eetre en fonction des r\u00e9sultats interm\u00e9diaires.<\/p>\n<p>Ray prend \u00e9galement en charge des charges de travail mixtes CPU et GPU. Si vous ex\u00e9cutez des solveurs bas\u00e9s sur CPU avec des mod\u00e8les de post-traitement ou de substitution acc\u00e9l\u00e9r\u00e9s par GPU, Ray peut planifier des travaux sur diff\u00e9rentes ressources mat\u00e9rielles.<\/p>\n<p>Un autre cas d'utilisation fort est l'orchestration des exp\u00e9riences. Ray peut g\u00e9rer de nombreuses configurations de simulation, suivre l'\u00e9tat des ex\u00e9cutions et coordonner les r\u00e9sultats distribu\u00e9s.<\/p>\n<h3>Le compromis<\/h3>\n<p>Ray a besoin d'une gestion prudente du cycle de vie. Les acteurs doivent \u00eatre cr\u00e9\u00e9s, utilis\u00e9s et lib\u00e9r\u00e9s correctement. Si les acteurs conservent de grandes structures de donn\u00e9es pendant trop longtemps, l'utilisation de la m\u00e9moire peut s'allonger dans le cluster.<\/p>\n<p>Ray est \u00e9galement moins id\u00e9al pour les transformations de donn\u00e9es d\u00e9terministes pures par lots et simples. Dans ces cas, Dask semble souvent plus naturel et peut n\u00e9cessiter moins de code.<\/p>\n<p>Un point de d\u00e9cision utile est le suivant&nbsp;: Ray est attrayant lorsque la vitesse locale n'est pas la seule pr\u00e9occupation. Sa valeur r\u00e9elle appara\u00eet lorsque les charges de travail deviennent distribu\u00e9es, dynamiques, avec \u00e9tat ou apprentissage automatique.<\/p>\n<h2>Comment choisir entre MPI, Dask et Ray<\/h2>\n<p>Vous n'avez pas toujours besoin de choisir un seul cadre. De nombreuses \u00e9quipes de recherche utilisent une approche hybride. Chaque framework g\u00e8re la partie du flux de travail qu'il s'adapte le mieux.<\/p>\n<h3>flux de d\u00e9cision<\/h3>\n<p>\u00c9tape&nbsp;1&nbsp;: Votre charge de travail est-elle principalement des transformations de tableaux ou de dataframes&nbsp;?<\/p>\n<ul>\n<li>Consid\u00e9rez DASK. Il convient parfaitement \u00e0 l'agr\u00e9gation de donn\u00e9es de simulation, \u00e0 l'ing\u00e9nierie des fonctionnalit\u00e9s, \u00e0 l'analyse et aux pipelines de donn\u00e9es structur\u00e9es.<\/li>\n<\/ul>\n<p>\u00c9tape&nbsp;2&nbsp;: Votre charge de travail inclut-elle la planification dynamique, la formation de mod\u00e8les ou les composants avec \u00e9tat&nbsp;?<\/p>\n<ul>\n<li>Consid\u00e9rez Ray. Il s'adapte aux workflows qui ont besoin d'acteurs, d'un \u00e9tat distribu\u00e9, de GPU ou de structures de t\u00e2ches.<\/li>\n<\/ul>\n<p>\u00c9tape&nbsp;3&nbsp;: Avez-vous besoin d'un couplage num\u00e9rique ou d'une d\u00e9composition de domaine serr\u00e9s pour les PDE&nbsp;?<\/p>\n<ul>\n<li>Consid\u00e9rez MPI. Il est con\u00e7u pour une communication de processus fr\u00e9quente et un contr\u00f4le de bas niveau.<\/li>\n<\/ul>\n<p>\u00c9tape&nbsp;4&nbsp;: Avez-vous plusieurs types de charge de travail&nbsp;?<\/p>\n<ul>\n<li>Envisagez une architecture hybride. Vous pouvez utiliser Dask pour la pr\u00e9paration des donn\u00e9es, Ray pour l'orchestration et MPI pour le solveur num\u00e9rique.<\/li>\n<\/ul>\n<h3>Recommandations pratiques<\/h3>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Votre situation<\/th>\n<th>Approche recommand\u00e9e<\/th>\n<th>Pourquoi<\/th>\n<\/tr>\n<tr>\n<td>Simulation unique sur quelques c\u0153urs<\/td>\n<td>Dask avec LocalCluster<\/td>\n<td>Code familier et configuration simple<\/td>\n<\/tr>\n<tr>\n<td>Analyse par lots \u00e0 grande \u00e9chelle<\/td>\n<td>DASK avec un cluster distribu\u00e9<\/td>\n<td>L'\u00e9valuation paresseuse permet d'optimiser le pipeline<\/td>\n<\/tr>\n<tr>\n<td>ML Pipeline avec formation et service<\/td>\n<td>Rayon<\/td>\n<td>Les acteurs, les t\u00e2ches et la prise en charge des GPU correspondent \u00e0 ce flux de travail<\/td>\n<\/tr>\n<tr>\n<td>Solveur coupl\u00e9 PDE<\/td>\n<td>MPI avec Dask ou Ray pour l'orchestration<\/td>\n<td>MPI g\u00e8re le solveur, tandis que les outils Python aident \u00e0 la gestion des donn\u00e9es<\/td>\n<\/tr>\n<tr>\n<td>Raffinement de maillage adaptatif<\/td>\n<td>Rayon<\/td>\n<td>La planification dynamique g\u00e8re la modification des structures de t\u00e2ches<\/td>\n<\/tr>\n<tr>\n<td>D\u00e9ploiement cloud \u00e0 haute latence<\/td>\n<td>Dask ou Ray<\/td>\n<td>MPI a besoin d'un r\u00e9glage plus minutieux du r\u00e9seau<\/td>\n<\/tr>\n<\/tbody><\/table>\n<h3>Le cas des architectures hybrides<\/h3>\n<p>Vous n'avez pas besoin d'utiliser un framework pour l'ensemble du workflow. Certaines architectures de calcul scientifique solides combinent plusieurs outils :<\/p>\n<ul>\n<li>MPI pour le solveur, dask pour le post-traitement. Ex\u00e9cutez le solveur PDE avec MPI, puis analysez et visualisez les r\u00e9sultats avec Dask.<\/li>\n<li>MPI pour le solveur, Ray pour l'orchestration d'exp\u00e9rience. Utilisez MPI pour la simulation num\u00e9rique et le rayon pour g\u00e9rer les configurations, l'\u00e9tat et plusieurs ex\u00e9cutions.<\/li>\n<li>DASK pour la pr\u00e9paration des donn\u00e9es, Ray pour la formation des mod\u00e8les. Utilisez DASK pour pr\u00e9parer de grands ensembles de donn\u00e9es, puis utilisez Ray pour la formation de mod\u00e8les ou le d\u00e9veloppement de mod\u00e8les de substitution.<\/li>\n<\/ul>\n<h2>erreurs courantes<\/h2>\n<p>Une erreur courante consiste \u00e0 supposer que Dask met \u00e0 l'\u00e9chelle chaque type de charge de travail. DASK est solide pour les flux de travail d\u00e9terministes avec des graphes de t\u00e2ches clairs. Si la structure de la t\u00e2che d\u00e9pend de r\u00e9sultats interm\u00e9diaires, Ray peut mieux g\u00e9rer le flux de travail.<\/p>\n<p>Une autre erreur consiste \u00e0 utiliser MPI o\u00f9 Dask serait plus simple. Si la charge de travail est principalement constitu\u00e9e d'analyse de donn\u00e9es ou d'ing\u00e9nierie de fonctionnalit\u00e9s, Dask peut gagner beaucoup de temps de mise en \u0153uvre.<\/p>\n<p>Certaines \u00e9quipes n\u00e9gligent \u00e9galement la tol\u00e9rance aux pannes. MPI donne un contr\u00f4le manuel, mais vous devez concevoir vous-m\u00eame la gestion des \u00e9checs. DASK et RAY offrent une prise en charge plus importante au niveau du planificateur pour les tentatives et la r\u00e9cup\u00e9ration.<\/p>\n<p>Les frais g\u00e9n\u00e9raux de communication sont un autre probl\u00e8me. Chaque cadre distribu\u00e9 a des co\u00fbts de r\u00e9seau. MPI rend la communication visible et plus facile \u00e0 optimiser. Dask et Ray cachent une grande partie de cette complexit\u00e9, mais le co\u00fbt existe toujours.<\/p>\n<h2>Ce que nous recommandons<\/h2>\n<p>Pour la plupart des chercheurs scientifiques en Python, commen\u00e7ant par l'informatique distribu\u00e9e, Dask est le meilleur point d'entr\u00e9e. Il mappe sur le code qu'ils \u00e9crivent d\u00e9j\u00e0, n\u00e9cessite moins de changements et donne un parall\u00e9lisme distribu\u00e9 sans un mod\u00e8le de programmation compl\u00e8tement nouveau.<\/p>\n<p>Choisissez MPI lorsque vous \u00e9crivez du code de simulation de production o\u00f9 les performances justifient le co\u00fbt de mise en \u0153uvre. C'est le bon outil pour la d\u00e9composition du domaine et le couplage num\u00e9rique serr\u00e9.<\/p>\n<p>Choisissez Ray lorsque le flux de travail est h\u00e9t\u00e9rog\u00e8ne. Ray est fort lorsque le traitement des donn\u00e9es, la formation de mod\u00e8les, la planification dynamique et l'\u00e9tat distribu\u00e9 apparaissent dans le m\u00eame syst\u00e8me.<\/p>\n<p>Les cadres ne s'excluent pas mutuellement. De nombreuses \u00e9quipes utilisent chaque framework pour la partie du flux de travail qu'il g\u00e8re le mieux. La cl\u00e9 est de faire correspondre le mod\u00e8le de charge de travail \u00e0 l'abstraction droite.<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Le choix entre MPI, Dask et Ray n'est pas de savoir quel framework est le meilleur en g\u00e9n\u00e9ral. Il s'agit de la structure qui correspond \u00e0 votre charge de travail.<\/p>\n<ul>\n<li>MPI donne un contr\u00f4le de bas niveau pour un couplage num\u00e9rique serr\u00e9 et une d\u00e9composition de domaine.<\/li>\n<li>Dask met \u00e0 l'\u00e9chelle des pandas familiers et des flux de travail NumPy avec des graphes de t\u00e2ches paresseux.<\/li>\n<li>Ray g\u00e8re des charges de travail h\u00e9t\u00e9rog\u00e8nes avec des t\u00e2ches, des acteurs, une planification dynamique et un \u00e9tat distribu\u00e9.<\/li>\n<\/ul>\n<p>Commencez par Dask si votre charge de travail s'apparente \u00e0 des transformations Array ou DataFrame. Utilisez MPI si vous avez besoin de d\u00e9composition de domaine ou de couplage num\u00e9rique serr\u00e9. Choisissez Ray si votre pipeline inclut une formation de mod\u00e8le, une planification dynamique ou un \u00e9tat distribu\u00e9.<\/p>\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\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Apprenez les mod\u00e8les de calcul parall\u00e8le pour MPI, DASK et Ray dans Scientific Python. D\u00e9couvrez quand chaque framework excelle et comment choisir le bon outil de calcul distribu\u00e9 pour votre simulation.<\/p>\n","protected":false,"raw":"Apprenez les mod\u00e8les de calcul parall\u00e8le pour MPI, DASK et Ray dans Scientific Python. D\u00e9couvrez quand chaque framework excelle et comment choisir le bon outil de calcul distribu\u00e9 pour votre simulation."},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=392","iawp_total_views":5,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1260","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>MPI vs Dask vs Ray pour Python scientifique<\/title>\n<meta name=\"description\" content=\"Comparez MPI, DASK et Ray pour les charges de travail Python scientifiques, y compris les solveurs PDE, les pipelines de donn\u00e9es, la formation ML et l&#039;\u00e9tat distribu\u00e9.\" \/>\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\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MPI vs Dask vs Ray pour Python scientifique\" \/>\n<meta property=\"og:description\" content=\"Comparez MPI, DASK et Ray pour les charges de travail Python scientifiques, y compris les solveurs PDE, les pipelines de donn\u00e9es, la formation ML et l&#039;\u00e9tat distribu\u00e9.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:31:40+00:00\" \/>\n<meta name=\"author\" content=\"Elena Markovska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elena Markovska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/\"},\"author\":{\"name\":\"Elena Markovska\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"headline\":\"Mod\u00e8les de calculs parall\u00e8les distribu\u00e9s pour Python scientifique : MPI, DASK et RAY\",\"datePublished\":\"2026-08-21T14:31:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/\"},\"wordCount\":3113,\"commentCount\":0,\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/\",\"name\":\"MPI vs Dask vs Ray pour Python scientifique\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:31:40+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"description\":\"Comparez MPI, DASK et Ray pour les charges de travail Python scientifiques, y compris les solveurs PDE, les pipelines de donn\u00e9es, la formation ML et l'\u00e9tat distribu\u00e9.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/distributed-parallel-computing-patterns-python-mpi-dask-ray\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mod\u00e8les de calculs parall\u00e8les distribu\u00e9s pour Python scientifique : MPI, DASK et RAY\"}]},{\"@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\\\/980162bb5de46742daece973661d93da\",\"name\":\"Elena Markovska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"caption\":\"Elena Markovska\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/elena-markovska\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MPI vs Dask vs Ray pour Python scientifique","description":"Comparez MPI, DASK et Ray pour les charges de travail Python scientifiques, y compris les solveurs PDE, les pipelines de donn\u00e9es, la formation ML et l'\u00e9tat distribu\u00e9.","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\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/","og_locale":"fr_FR","og_type":"article","og_title":"MPI vs Dask vs Ray pour Python scientifique","og_description":"Comparez MPI, DASK et Ray pour les charges de travail Python scientifiques, y compris les solveurs PDE, les pipelines de donn\u00e9es, la formation ML et l'\u00e9tat distribu\u00e9.","og_url":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:31:40+00:00","author":"Elena Markovska","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Elena Markovska","Dur\u00e9e de lecture estim\u00e9e":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/"},"author":{"name":"Elena Markovska","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"headline":"Mod\u00e8les de calculs parall\u00e8les distribu\u00e9s pour Python scientifique : MPI, DASK et RAY","datePublished":"2026-08-21T14:31:40+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/"},"wordCount":3113,"commentCount":0,"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/","url":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/","name":"MPI vs Dask vs Ray pour Python scientifique","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:31:40+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"description":"Comparez MPI, DASK et Ray pour les charges de travail Python scientifiques, y compris les solveurs PDE, les pipelines de donn\u00e9es, la formation ML et l'\u00e9tat distribu\u00e9.","breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/distributed-parallel-computing-patterns-python-mpi-dask-ray\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Mod\u00e8les de calculs parall\u00e8les distribu\u00e9s pour Python scientifique : MPI, DASK et RAY"}]},{"@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\/980162bb5de46742daece973661d93da","name":"Elena Markovska","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","caption":"Elena Markovska"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/elena-markovska\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1260","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1260"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1260\/revisions"}],"predecessor-version":[{"id":1430,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1260\/revisions\/1430"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}