<?xml version="1.0" encoding="utf-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.8 (Ruby 3.0.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc docmapping="yes"?>
<?rfc comments="no"?>

<rfc ipr="trust200902" docName="draft-aft-ai-traffic-01" category="std" consensus="true" submissionType="IETF" tocDepth="2" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="AI traffic">Handling inter-DC/Edge AI-related network traffic: Problem statement</title>

    <author initials="A." surname="Fressancourt" fullname="Antoine Fressancourt">
      <organization abbrev="Huawei">Huawei Technologies France S.A.S.U.</organization>
      <address>
        <postal>
          <street>18, Quai du Point du Jour</street>
          <city>Boulogne-Billancourt</city>
          <code>92100</code>
          <country>France</country>
        </postal>
        <email>antoine.fressancourt@huawei.com</email>
      </address>
    </author>
    <author initials="L." surname="Iannone" fullname="Luigi Iannone">
      <organization abbrev="Huawei">Huawei Technologies France S.A.S.U.</organization>
      <address>
        <postal>
          <street>18, Quai du Point du Jour</street>
          <city>Boulogne-Billancourt</city>
          <code>92100</code>
          <country>France</country>
        </postal>
        <email>luigi.iannone@huawei.com</email>
      </address>
    </author>
    <author initials="D." surname="Lou" fullname="David Lou">
      <organization abbrev="Huawei">Huawei Technologies Duesseldorf GmbH</organization>
      <address>
        <postal>
          <street>Riesstrasse 25</street>
          <city>Munich</city>
          <code>80992</code>
          <country>Germany</country>
        </postal>
        <email>zhe.lou@huawei.com</email>
      </address>
    </author>
    <author initials="D." surname="Trossen" fullname="Dirk Trossen">
      <organization abbrev="Huawei">Huawei Technologies Duesseldorf GmbH</organization>
      <address>
        <postal>
          <street>Riesstrasse 25</street>
          <city>Munich</city>
          <code>80992</code>
          <country>Germany</country>
        </postal>
        <email>dirk.trossen@huawei.com</email>
      </address>
    </author>

    <date />

    
    <workgroup>Working Group name</workgroup>
    <keyword>inter-datacenter</keyword> <keyword>AI inference</keyword> <keyword>AI training</keyword> <keyword>Federated Learning</keyword>

    <abstract>


<?line 141?>

<t>The growth in terms of number of parameters of LLM models as well as the need to use or train those models with private or protected data will require service providers operating LLM-based services to cooperate to train, specialize or serve LLM-based services accross datacenters. 
Given their structure, the number of parameters they incorporate and the collective communication librairies they are built with, LLM training and inference (or serving) network traffic has specific characteristics.</t>

<t>In that regard, understanding the specificities of AI-related workloads is critical to determine how to operate AI-based services in a federated setting across datacenters.</t>



    </abstract>



  </front>

  <middle>


<?line 148?>

<section anchor="SEC:Introduction"><name>Introduction</name>

<t>AI has attracted a far bit of attention in the networking community, including the IETF, in regards to not just applications but also needed protocols and technologies for the realization of those applications.</t>

<t>While AI is a large area, this document focuses on the method of (training and inferencing over) Large Language Models (LLM). The starting point being the distributed nature of implementing LLMs, both for training and inferencing. 
For this, a network of so-called 'workers' is being realized, that over time will train a model, over which in turn inferencing can be performed.
This distributed nature involves a number of communication patterns to exchange suitable information, those patterns needing realization in suitable protocols. 
Differences in those protocols emerge from the deployment choices for AI platforms and the challenges that arise from those deployments.</t>

<t>The training of LLMs in ever growing large-scale data centres (DCs) is a current method to push the boundaries of key performance indicators, most notably the number of parameters included in the training model <xref target="LLMSize"/>. Observations in recent works <xref target="AIBackbone"/>, however, point to the fact that distribution across more than one DC will quickly be necessary to continue the growth of LLM training.</t>

<t>LLMs may also start inherently distributed in deployment itself, not because of their size, but because of their use case. 
An example here is content moderation in fediverse environments <xref target="FEDI"/>, where decentralized data governance and computation drives the equally decentralized realization of the workers developing a shared model over time. 
Other examples of such decentralized use case stems from health (e.g., where independent health trust may train a shared model over strictly locally governed patient data), IoT (where AI-derived features may be derived from localized sensor data), or also network management (where operator data for training may not be possible or legally permitted to be disclosed to a centralized training entity). 
Realizations of platforms for those use cases often refer to 'federated learning' <xref target="FLOWER"/> to capture the equal basis of participation, both at the data and processing level, of the participating entities of the platform.</t>

<t>The intention of this document is to highlight the possible challenges in the spectrum of realizations for the distributed LLM training and inferencing. 
For this, we provide more details and examples for use cases in <xref target="SEC:AIApplicability"/>, followed by a primer of key AI/LLM techniques in  <xref target="SEC:MLSystems"/>. Then, a number of challenges to, e.g., resource management, latency, and security, are identified in <xref target="SEC:AINetChallenges"/> as a starting point for a focussed discussion in the IETF community on challenges AI may pose for networks, networks protocols and technologies.</t>

<t>As the spectrum of realization ranges from centralized intra-DC to highly distributed, federated AI platforms, there is a strong relevance of solving the identified challenges within the IETF, leading to the formulation of a problem statement in <xref target="SEC:PBStatement"/> along those lines and proposing next steps in <xref target="SEC:NextSteps"/> for the IETF community to pursue.</t>

</section>
<section anchor="SEC:AIApplicability"><name>Applicability of AI</name>

<t>This section introduces the applicability of AI/LLMs across a spectrum of decentralization for realising machine learning training and inferencing tasks.
These two tasks are the most intensive in AI workflows, and they are inherently distributed compute problems given the amount of memory and processing power they require
<xref target="SEC:MLSystems"/> will introduce the prominent techniques relevant to implementing those tasks in deployed systems.</t>

<t>It can be observed upfront that the realization of AI/LLM use cases is driven by two main aspects, namely the decentralization of data and that of compute; during the training phase, the inference phase or both. 
The proposed examples are introduced with regards to those two aspects, for reasons that are detailed in the text.</t>

<section anchor="SEC:AIApplicability:CT-xI"><name>xGPT-like Services: an example centralized training use case</name>

<t>Various GPT-like services have gained much attention recently, advocating the training of ultra-large language models, providing chat-like inferencing services to users for, <em>e.g.</em>, text generation, generative AI-based image creation, and many others.</t>

<t>The key success factor of those services is the ingestion of vast amounts of data into a centralized training entity. 
This data may come from public sources, search input, through license arrangements with, <em>e.g.</em>, video providers like YouTube, and many others.</t>

<t>In this use case, centralization pertains to the ownership of the training resources under a single entity. 
Until now, the prevalent deployment of such centralized training is within a single, large-scale DC with a growing number of GPUs to execute the necessary model training operations over a sustained period of time. 
However, the growing need for more compute, together with physical and energy limitations in existing DCs, make a growing scale-out of those services beyond the reach of a single DC a likely needed path in the future.</t>

</section>
<section anchor="SEC:AIApplicability:DT-CI"><name>Decentralized training with centralized inference use cases</name>

<t>In some cases, it is impossible to gather the amount of data necessary to properly train a machine learning model, either for security, privacy or regulatory reasons. 
The necessity to tackle those cases triggered the development of Federated learning <xref target="FederatedLearning"/>, in which several entities can collaborate in a decentralized way to the training of a single large model.</t>

<t>Health is a traditional area for reasoning-based systems. 
Its richness in data, both historical as well as current (<em>e.g.</em>, from patients), lends itself for training LLMs over which inferencing can take place for, <em>e.g.</em>, diagnosis, drug development, developing treatment plans and many others.</t>

<t>Individual health organizations are often well equipped in terms of compute resources, albeit not at the scale that suffices to perform centralized LLM training on their own. 
Thus, federating compute resources is useful for scale and incentivized through the sharing of the resulting LLM in the clinical pathway.</t>

<t>Furthermore, data is also localized, since patients sign up to local health organizations, practises, or health trusts, which in turn manage their data. 
In many countries, data sharing is performed, also for transferability (<em>e.g.</em>, when patients change location and thus local health contacts) but also treatment across health organization. 
Overall, data governance needs to be strictly adhered to for any application of the data, with a possible development of a LLM being just one such application.</t>

<t>Network management is another use case for federated learning, where the federation is driven by the common goal to develop an increasingly refined model for, <em>e.g.</em>, intrusion detection, network failure detection, and others, but where suitable training data is only shared in a limited manner or not at all for confidentiality reasons.</t>

<t>In those use cases, the decentralization of the training stems from the constraints limiting the exchaneg of data between entities for technical feasibility, privacy, confidentiality or regulatory reasons. 
Once trained, the models including the common knowledge gathered in the training phase can be used by each single entity without necessarily requiring collaboration during the inference phase.</t>

</section>
<section anchor="SEC:AIApplicability:DT-DI"><name>Federated building management: a decentralized inference use case</name>

<t>Building management, where smart buildings are often equipped with micro-DC capabilities, can be federated to improve energy management in a larger geographic area, utilizing local yet private data to train a suitable (possibly locally limited) LLM. 
Works like <xref target="AIConst"/> expand this use case into other areas like construction management, architectural design, material design, and others.</t>

<t>Similar to the previous use case, the deployment across shared infrastructures (as well as the sharing of compute resources itself) is a key aspect, utilizing Internet technologies for realizing the necessary exchange within the training and inferencing scenario at hand.
Here, the decentralization of the inference task is a necessity given that the goal is to reach a global optimum (<em>e.g.</em>, energy savings accross an aea or region) by clustering the capabilities of buildings while keeping the data used for training and inferencing local for security and privacy reasons.</t>

</section>
<section anchor="SEC:AIApplicability:KeyTakeaways"><name>Key Takeaways</name>

<t>The following key takeaways can be derived from the proposed applicability examples:</t>

<t><list style="symbols">
  <t><em>LLM AI is inherently distributed</em>: This is due to its scale in required training nodes and model size. 
 Although the distribution may be handled entirely within a central, single data centre, the execution of tasks across, often many thousands, of workers still remains a key aspect in LLM AI.</t>
  <t><em>Centralized LLM AI training does not need to touch the Internet</em>: This is because it may be performed entirely within the limits of a single DC, or at least among a few DCs interconnected by private lines under the control of a single entity.</t>
  <t><em>Centralization of compute implies centralization of data</em>: This is a consequence of the model creation, based on the data, which is centralized and thus requires suitable data transfer towards the compute nodes.</t>
  <t><em>Federation allows for decentralization of data</em>: This is possible with worker nodes that may individually train on data, while contributing to the global model. 
 However, centralization of the federation again leads to the observation in the second item, <em>i.e.</em>, data is centralized, too.</t>
  <t><em>Inferencing inherently touches the Internet</em>: This is especially true in any applicability scenario involving end users residing on the Internet. 
 The impact may the creation of very large amounts of traffic to (<em>e.g.</em>, centralized) nodes that hold the suitable model information for performing the desired inferencing.</t>
</list></t>

<t>The next section outlines the system aspects of LLM AI, in light of the above takeaways, <em>e.g.</em>, on centralization, while <xref target="SEC:AINetChallenges"/> more directly takes these takeaways into account when formulating key challenges for networking, stemming from the insights in this section.</t>

</section>
</section>
<section anchor="SEC:MLSystems"><name>How ML systems are built</name>

<section anchor="SEC:LLMLifecycle"><name>Lifecycle of a typical large language model</name>

<t>In the last few years, the impressive AI boom has been associated with the development of Large Language Models (LLMs). LLMs are models, or representations of systems that are observed or measured with data. 
Models have an underlying structure, consisting in a parametrized graph linking together small operators performing operations on <strong>tensors</strong>, or small arrays of finite dimensions. 
Models are built, or <strong>trained</strong>, using a reference data set (or training set), consisting in data labelled with its underlying structure or meaning.</t>

<t>Before its use for training, the data is collected and pre-processed to structure it and chunk it into <strong>tokens</strong>, the basic data units used as input and outputs of models. After the training data set has been prepared, the model is trained. 
During this training phase, the model is parametrized, i.e., the parameters ruling the strength of the relationships between the tensor operators constituting the model are modified so the model is able to abstract the behaviour of the system from the dataset representing it.</t>

<t>After the training phase, the model can be used during an <strong>inference</strong> phase to derive information or make predictions from new data presented in the form of a sequence of tokens. 
Inference operations are not necessarily done by the same nodes that have trained the model.
Models can be transferred to other worker nodes to perfom inference tasks, sometimes placed close to the users making requests.
Besides, those transferred models can be re-trained or fine-tuned in order to better serve requests in the context they are done. 
This can be done for instance with private or locally relevant data.</t>

</section>
<section anchor="SEC:MLDistNat"><name>The distributed nature of Machine Learning systems</name>

<t>To improve the accuracy of LLMs, those models incorporate an increasing amount of parameters, and are trained using ever larger datasets. 
Modern LLMs use 125 million up to 405 billion parameters, where each parameters can be encoded with 4 bits to 4 bytes depending on the required precision.
This increase in models' sizes has important consequences on the power consumption and on the memory footprint of the systems used to train those models.</t>

<t>From a power consumption perspective, the increase in computing power needed to accomplish the training tasks of large models requires the deployment of more powerful Tensor Processing Units (TPUs) of Graphics Processing Units (GPUs) with higher power and cooling demands. 
It is becoming physically unsustainable to bring the power required to datacenters hosting those machine learning worker nodes.
A possible way to address this challenge is to distribute machine learning workloads beyond the realm of a single datacenter, possibly between two or a few interconnected datacenters separated by long to mid range private interconnections.</t>

<t>From a memory perspective, this means that storing a model and its parameters will cost from 62,5 MB (for a model using 125 million parameters with 4-bits parameters) to 1620 GB (for a model using 405 billion parameters with 4 bytes parameters).
The memory footprint of modern large language models makes those models difficult to manipulate on a single node.
Besides, as mentionned in <xref target="SchedulingSharding"/>, the pre-training of Llama3 with 405 billion parameters required from 8192 to 16384 GPUs, which were obviously hosted on multiple, connected nodes.</t>

<t>To cope with the memory and computing needs of workloads associated with LLM operations, the data preparation, training and inference tasks mentionned in <xref target="SEC:LLMLifecycle"/> can be distributed among nodes with specific functionnal roles (task execution, result aggregation, orchestration...). 
The detailed description of those functional roles is given in <xref target="SEC:A-MLRoles"/>.</t>

<t>From a networking perspective, some elements are important to mention:</t>

<t><list style="symbols">
  <t>Some roles (aggregator or orchestrator) tend to concentrate network traffic, thus creating some issues in properly managing the incast traffic.</t>
  <t>The parallel execution of training and inference tasks by worker nodes is following specific parallelism modes presented in <xref target="FIG:PM1"/> and detailed in <xref target="SEC:A-parallelisationModes"/>. Those modes have various requirements in terms of volume of data exchanged and latency (see <xref target="SchedulingSharding"/> for instance).  <vspace blankLines='1'/>
a. <strong>Data parallelism</strong>, in which data is split into chunks to be used by different worker nodes to train the model. This parallelism mode can cope with rather large latencies (several 100s of ms) but requires exchanging a large volume of data.  <vspace blankLines='1'/>
b. <strong>Pipeline model-parallelism</strong>, in which a model is separated into stages consisting in a few consecutive layers of the entire model. Each stage is allocated to a separate worker node, and intermediate states are exchanged between successive worker nodes. This parallelism mode can cope with large latencies (10s of ms) and requires exchanging less data than data parallelism.  <vspace blankLines='1'/>
c. <strong>Tensor model-parallelism</strong>, in which model layers are split into chunks that can be operated by different nodes. This parallelism mode needs to operate in low latency networks (10s of us) and requires exchanging a lot of data.  <vspace blankLines='1'/>
d. <strong>Mixture of Expert parallelism</strong>, in which nodes are holding smaller but specialized models trained over a smaller amount of data and holding fewer parameters. This parallelism mode can cope with latencies in the ms range.</t>
  <t>Machine learning applications rely most of the time on collective communication libraries <xref target="xCCL"/> that use patterns presented in details in <xref target="SEC:A-collectiveCommunicationMethods"/> such as All-to-All or All-reduce. 
  <xref target="I-D.yao-tsvwg-cco-problem-statement-and-usecases"/> has already introduced some networking challenges associated with the use of collective communication in machine learning systems.
  From a networking perspective, those communication patterns translate in "on-off" communication patterns, with a few large flows starting simultaneously to allow nodes involved in a collective to exchange data and parameters.
  The volume, synchronism and imbalance of the traffic generated by those communication pattern is a burden to the distribution of machine learning workloads, and a challenge to be addressed by the networking community.</t>
</list></t>

<figure title="Parallelism models used in machine learning systems" anchor="FIG:PM1"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="592" width="592" viewBox="0 0 592 592" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,32 L 8,144" fill="none" stroke="black"/>
<path d="M 8,176 L 8,296" fill="none" stroke="black"/>
<path d="M 8,400 L 8,512" fill="none" stroke="black"/>
<path d="M 24,384 L 24,400" fill="none" stroke="black"/>
<path d="M 48,32 L 48,144" fill="none" stroke="black"/>
<path d="M 48,176 L 48,288" fill="none" stroke="black"/>
<path d="M 48,400 L 48,512" fill="none" stroke="black"/>
<path d="M 64,384 L 64,496" fill="none" stroke="black"/>
<path d="M 96,32 L 96,128" fill="none" stroke="black"/>
<path d="M 96,176 L 96,272" fill="none" stroke="black"/>
<path d="M 112,32 L 112,128" fill="none" stroke="black"/>
<path d="M 112,176 L 112,272" fill="none" stroke="black"/>
<path d="M 112,336 L 112,432" fill="none" stroke="black"/>
<path d="M 112,464 L 112,560" fill="none" stroke="black"/>
<path d="M 120,440 L 120,456" fill="none" stroke="black"/>
<path d="M 128,32 L 128,128" fill="none" stroke="black"/>
<path d="M 128,176 L 128,272" fill="none" stroke="black"/>
<path d="M 128,336 L 128,432" fill="none" stroke="black"/>
<path d="M 128,464 L 128,560" fill="none" stroke="black"/>
<path d="M 144,32 L 144,128" fill="none" stroke="black"/>
<path d="M 144,176 L 144,272" fill="none" stroke="black"/>
<path d="M 144,336 L 144,432" fill="none" stroke="black"/>
<path d="M 144,464 L 144,560" fill="none" stroke="black"/>
<path d="M 152,440 L 152,456" fill="none" stroke="black"/>
<path d="M 160,336 L 160,432" fill="none" stroke="black"/>
<path d="M 160,464 L 160,560" fill="none" stroke="black"/>
<path d="M 192,48 L 192,112" fill="none" stroke="black"/>
<path d="M 192,192 L 192,256" fill="none" stroke="black"/>
<path d="M 208,48 L 208,112" fill="none" stroke="black"/>
<path d="M 208,192 L 208,256" fill="none" stroke="black"/>
<path d="M 208,352 L 208,416" fill="none" stroke="black"/>
<path d="M 208,480 L 208,544" fill="none" stroke="black"/>
<path d="M 224,352 L 224,416" fill="none" stroke="black"/>
<path d="M 224,480 L 224,544" fill="none" stroke="black"/>
<path d="M 240,416 L 240,480" fill="none" stroke="black"/>
<path d="M 256,416 L 256,480" fill="none" stroke="black"/>
<path d="M 288,112 L 288,224" fill="none" stroke="black"/>
<path d="M 288,400 L 288,512" fill="none" stroke="black"/>
<path d="M 304,96 L 304,112" fill="none" stroke="black"/>
<path d="M 304,384 L 304,400" fill="none" stroke="black"/>
<path d="M 328,112 L 328,224" fill="none" stroke="black"/>
<path d="M 328,400 L 328,512" fill="none" stroke="black"/>
<path d="M 344,96 L 344,208" fill="none" stroke="black"/>
<path d="M 344,384 L 344,496" fill="none" stroke="black"/>
<path d="M 376,432 L 376,464" fill="none" stroke="black"/>
<path d="M 392,112 L 392,208" fill="none" stroke="black"/>
<path d="M 392,432 L 392,464" fill="none" stroke="black"/>
<path d="M 408,112 L 408,208" fill="none" stroke="black"/>
<path d="M 424,128 L 424,192" fill="none" stroke="black"/>
<path d="M 424,336 L 424,432" fill="none" stroke="black"/>
<path d="M 424,464 L 424,560" fill="none" stroke="black"/>
<path d="M 440,128 L 440,192" fill="none" stroke="black"/>
<path d="M 440,336 L 440,432" fill="none" stroke="black"/>
<path d="M 440,464 L 440,560" fill="none" stroke="black"/>
<path d="M 456,112 L 456,208" fill="none" stroke="black"/>
<path d="M 456,336 L 456,432" fill="none" stroke="black"/>
<path d="M 456,464 L 456,560" fill="none" stroke="black"/>
<path d="M 472,112 L 472,208" fill="none" stroke="black"/>
<path d="M 472,336 L 472,432" fill="none" stroke="black"/>
<path d="M 472,464 L 472,560" fill="none" stroke="black"/>
<path d="M 520,128 L 520,192" fill="none" stroke="black"/>
<path d="M 520,416 L 520,480" fill="none" stroke="black"/>
<path d="M 536,128 L 536,192" fill="none" stroke="black"/>
<path d="M 536,416 L 536,480" fill="none" stroke="black"/>
<path d="M 8,32 L 48,32" fill="none" stroke="black"/>
<path d="M 96,32 L 112,32" fill="none" stroke="black"/>
<path d="M 128,32 L 144,32" fill="none" stroke="black"/>
<path d="M 192,48 L 208,48" fill="none" stroke="black"/>
<path d="M 64,78 L 80,78" fill="none" stroke="black"/><path d="M 64,82 L 80,82" fill="none" stroke="black"/>
<path d="M 160,78 L 176,78" fill="none" stroke="black"/><path d="M 160,82 L 176,82" fill="none" stroke="black"/>
<path d="M 304,96 L 344,96" fill="none" stroke="black"/>
<path d="M 192,112 L 208,112" fill="none" stroke="black"/>
<path d="M 288,112 L 328,112" fill="none" stroke="black"/>
<path d="M 392,112 L 408,112" fill="none" stroke="black"/>
<path d="M 456,112 L 472,112" fill="none" stroke="black"/>
<path d="M 96,128 L 112,128" fill="none" stroke="black"/>
<path d="M 128,128 L 144,128" fill="none" stroke="black"/>
<path d="M 424,128 L 440,128" fill="none" stroke="black"/>
<path d="M 520,128 L 536,128" fill="none" stroke="black"/>
<path d="M 8,144 L 48,144" fill="none" stroke="black"/>
<path d="M 360,158 L 376,158" fill="none" stroke="black"/><path d="M 360,162 L 376,162" fill="none" stroke="black"/>
<path d="M 488,158 L 504,158" fill="none" stroke="black"/><path d="M 488,162 L 504,162" fill="none" stroke="black"/>
<path d="M 8,176 L 48,176" fill="none" stroke="black"/>
<path d="M 96,176 L 112,176" fill="none" stroke="black"/>
<path d="M 128,176 L 144,176" fill="none" stroke="black"/>
<path d="M 192,192 L 208,192" fill="none" stroke="black"/>
<path d="M 424,192 L 440,192" fill="none" stroke="black"/>
<path d="M 520,192 L 536,192" fill="none" stroke="black"/>
<path d="M 328,208 L 344,208" fill="none" stroke="black"/>
<path d="M 392,208 L 408,208" fill="none" stroke="black"/>
<path d="M 456,208 L 472,208" fill="none" stroke="black"/>
<path d="M 64,222 L 80,222" fill="none" stroke="black"/><path d="M 64,226 L 80,226" fill="none" stroke="black"/>
<path d="M 160,222 L 176,222" fill="none" stroke="black"/><path d="M 160,226 L 176,226" fill="none" stroke="black"/>
<path d="M 288,224 L 328,224" fill="none" stroke="black"/>
<path d="M 192,256 L 208,256" fill="none" stroke="black"/>
<path d="M 96,272 L 112,272" fill="none" stroke="black"/>
<path d="M 128,272 L 144,272" fill="none" stroke="black"/>
<path d="M 8,288 L 48,288" fill="none" stroke="black"/>
<path d="M 112,336 L 128,336" fill="none" stroke="black"/>
<path d="M 144,336 L 160,336" fill="none" stroke="black"/>
<path d="M 424,336 L 440,336" fill="none" stroke="black"/>
<path d="M 456,336 L 472,336" fill="none" stroke="black"/>
<path d="M 208,352 L 224,352" fill="none" stroke="black"/>
<path d="M 24,384 L 64,384" fill="none" stroke="black"/>
<path d="M 176,382 L 192,382" fill="none" stroke="black"/><path d="M 176,386 L 192,386" fill="none" stroke="black"/>
<path d="M 304,384 L 344,384" fill="none" stroke="black"/>
<path d="M 8,400 L 48,400" fill="none" stroke="black"/>
<path d="M 288,400 L 328,400" fill="none" stroke="black"/>
<path d="M 208,416 L 224,416" fill="none" stroke="black"/>
<path d="M 240,416 L 256,416" fill="none" stroke="black"/>
<path d="M 520,416 L 536,416" fill="none" stroke="black"/>
<path d="M 112,432 L 128,432" fill="none" stroke="black"/>
<path d="M 144,432 L 160,432" fill="none" stroke="black"/>
<path d="M 376,432 L 392,432" fill="none" stroke="black"/>
<path d="M 424,432 L 440,432" fill="none" stroke="black"/>
<path d="M 456,432 L 472,432" fill="none" stroke="black"/>
<path d="M 352,446 L 368,446" fill="none" stroke="black"/><path d="M 352,450 L 368,450" fill="none" stroke="black"/>
<path d="M 416,448 L 488,448" fill="none" stroke="black"/>
<path d="M 112,464 L 128,464" fill="none" stroke="black"/>
<path d="M 144,464 L 160,464" fill="none" stroke="black"/>
<path d="M 376,464 L 392,464" fill="none" stroke="black"/>
<path d="M 424,464 L 440,464" fill="none" stroke="black"/>
<path d="M 456,464 L 472,464" fill="none" stroke="black"/>
<path d="M 208,480 L 224,480" fill="none" stroke="black"/>
<path d="M 240,480 L 256,480" fill="none" stroke="black"/>
<path d="M 520,480 L 536,480" fill="none" stroke="black"/>
<path d="M 48,496 L 64,496" fill="none" stroke="black"/>
<path d="M 328,496 L 344,496" fill="none" stroke="black"/>
<path d="M 8,512 L 48,512" fill="none" stroke="black"/>
<path d="M 176,510 L 192,510" fill="none" stroke="black"/><path d="M 176,514 L 192,514" fill="none" stroke="black"/>
<path d="M 288,512 L 328,512" fill="none" stroke="black"/>
<path d="M 208,544 L 224,544" fill="none" stroke="black"/>
<path d="M 112,560 L 128,560" fill="none" stroke="black"/>
<path d="M 144,560 L 160,560" fill="none" stroke="black"/>
<path d="M 424,560 L 440,560" fill="none" stroke="black"/>
<path d="M 456,560 L 472,560" fill="none" stroke="black"/>
<path d="M 80,464 L 96,496" fill="none" stroke="black"/>
<path d="M 472,368 L 496,416" fill="none" stroke="black"/>
<path d="M 80,432 L 96,400" fill="none" stroke="black"/>
<path d="M 388,424 L 408,384" fill="none" stroke="black"/>
<polygon class="arrowhead" points="512,160 500,154.4 500,165.6" fill="black" transform="rotate(0,504,160)"/>
<polygon class="arrowhead" points="504,416 492,410.4 492,421.6" fill="black" transform="rotate(63.43494882292201,496,416)"/>
<polygon class="arrowhead" points="416,384 404,378.4 404,389.6" fill="black" transform="rotate(296.565051177078,408,384)"/>
<polygon class="arrowhead" points="384,160 372,154.4 372,165.6" fill="black" transform="rotate(0,376,160)"/>
<polygon class="arrowhead" points="376,448 364,442.4 364,453.6" fill="black" transform="rotate(0,368,448)"/>
<polygon class="arrowhead" points="200,512 188,506.4 188,517.6" fill="black" transform="rotate(0,192,512)"/>
<polygon class="arrowhead" points="200,384 188,378.4 188,389.6" fill="black" transform="rotate(0,192,384)"/>
<polygon class="arrowhead" points="184,224 172,218.4 172,229.6" fill="black" transform="rotate(0,176,224)"/>
<polygon class="arrowhead" points="184,80 172,74.4 172,85.6" fill="black" transform="rotate(0,176,80)"/>
<polygon class="arrowhead" points="104,496 92,490.4 92,501.6" fill="black" transform="rotate(63.43494882292201,96,496)"/>
<polygon class="arrowhead" points="104,400 92,394.4 92,405.6" fill="black" transform="rotate(296.565051177078,96,400)"/>
<polygon class="arrowhead" points="88,224 76,218.4 76,229.6" fill="black" transform="rotate(0,80,224)"/>
<polygon class="arrowhead" points="88,80 76,74.4 76,85.6" fill="black" transform="rotate(0,80,80)"/>
<g class="text">
<text x="104" y="52">P</text>
<text x="136" y="52">P</text>
<text x="104" y="68">.</text>
<text x="136" y="68">.</text>
<text x="200" y="68">O</text>
<text x="28" y="84">Data</text>
<text x="104" y="84">1</text>
<text x="120" y="84">X</text>
<text x="136" y="84">2</text>
<text x="200" y="84">u</text>
<text x="28" y="100">1.</text>
<text x="104" y="100">-</text>
<text x="136" y="100">-</text>
<text x="200" y="100">t</text>
<text x="400" y="132">P</text>
<text x="464" y="132">P</text>
<text x="400" y="148">.</text>
<text x="432" y="148">I</text>
<text x="464" y="148">.</text>
<text x="528" y="148">O</text>
<text x="308" y="164">Data</text>
<text x="400" y="164">1</text>
<text x="416" y="164">X</text>
<text x="432" y="164">n</text>
<text x="448" y="164">X</text>
<text x="464" y="164">2</text>
<text x="528" y="164">u</text>
<text x="400" y="180">-</text>
<text x="432" y="180">t</text>
<text x="464" y="180">-</text>
<text x="528" y="180">t</text>
<text x="104" y="196">P</text>
<text x="136" y="196">P</text>
<text x="104" y="212">.</text>
<text x="136" y="212">.</text>
<text x="200" y="212">O</text>
<text x="28" y="228">Data</text>
<text x="104" y="228">1</text>
<text x="120" y="228">X</text>
<text x="136" y="228">2</text>
<text x="200" y="228">u</text>
<text x="28" y="244">2.</text>
<text x="104" y="244">-</text>
<text x="136" y="244">-</text>
<text x="200" y="244">t</text>
<text x="16" y="308">(a)</text>
<text x="52" y="308">Data</text>
<text x="120" y="308">parallelism</text>
<text x="296" y="308">(b)</text>
<text x="348" y="308">Pipeline</text>
<text x="456" y="308">model-parallelism</text>
<text x="120" y="356">P</text>
<text x="152" y="356">P</text>
<text x="432" y="356">P</text>
<text x="464" y="356">P</text>
<text x="120" y="372">.</text>
<text x="152" y="372">.</text>
<text x="216" y="372">O</text>
<text x="432" y="372">.</text>
<text x="464" y="372">.</text>
<text x="120" y="388">1</text>
<text x="136" y="388">X</text>
<text x="152" y="388">2</text>
<text x="216" y="388">-</text>
<text x="432" y="388">1</text>
<text x="448" y="388">X</text>
<text x="464" y="388">2</text>
<text x="120" y="404">-</text>
<text x="152" y="404">-</text>
<text x="216" y="404">1</text>
<text x="432" y="404">-</text>
<text x="464" y="404">-</text>
<text x="120" y="420">1</text>
<text x="152" y="420">1</text>
<text x="432" y="420">1</text>
<text x="464" y="420">1</text>
<text x="224" y="436">\</text>
<text x="248" y="436">O</text>
<text x="528" y="436">O</text>
<text x="28" y="452">Data</text>
<text x="248" y="452">u</text>
<text x="308" y="452">Data</text>
<text x="384" y="452">R</text>
<text x="528" y="452">u</text>
<text x="224" y="468">/</text>
<text x="248" y="468">t</text>
<text x="528" y="468">t</text>
<text x="120" y="484">P</text>
<text x="152" y="484">P</text>
<text x="432" y="484">P</text>
<text x="464" y="484">P</text>
<text x="120" y="500">.</text>
<text x="152" y="500">.</text>
<text x="216" y="500">O</text>
<text x="432" y="500">.</text>
<text x="464" y="500">.</text>
<text x="120" y="516">1</text>
<text x="136" y="516">X</text>
<text x="152" y="516">2</text>
<text x="216" y="516">-</text>
<text x="432" y="516">1</text>
<text x="448" y="516">X</text>
<text x="464" y="516">2</text>
<text x="120" y="532">-</text>
<text x="152" y="532">-</text>
<text x="216" y="532">2</text>
<text x="432" y="532">-</text>
<text x="464" y="532">-</text>
<text x="120" y="548">2</text>
<text x="152" y="548">2</text>
<text x="432" y="548">2</text>
<text x="464" y="548">2</text>
<text x="16" y="580">(c)</text>
<text x="60" y="580">Tensor</text>
<text x="160" y="580">model-parallelism</text>
<text x="296" y="580">(d)</text>
<text x="344" y="580">Mixture</text>
<text x="388" y="580">of</text>
<text x="428" y="580">Expert</text>
<text x="504" y="580">parallelism</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
+----+     +-+ +-+                
|    |     |P| |P|     +-+        
|    |     |.| |.|     |O|        
|Data| ==> |1|X|2| ==> |u|                                          
| 1. |     |-| |-|     |t|           +----+                          
|    |     | | | |     +-+         +-+--+ |     +-+     +-+          
|    |     +-+ +-+                 |    | |     |P| +-+ |P|     +-+  
+----+                             |    | |     |.| |I| |.|     |O|  
                                   |Data| | ==> |1|X|n|X|2| ==> |u|
+----+     +-+ +-+                 |    | |     |-| |t| |-|     |t|  
|    |     |P| |P|     +-+         |    | |     | | +-+ | |     +-+  
|    |     |.| |.|     |O|         |    +-+     +-+     +-+          
|Data| ==> |1|X|2| ==> |u|         +----+                            
| 2. |     |-| |-|     |t|              
|    |     | | | |     +-+        
|    |     +-+ +-+                
+----+                            
(a) Data parallelism               (b) Pipeline model-parallelism        
                                  
             +-+ +-+                                +-+ +-+          
             |P| |P|     +-+                        |P| |P|          
             |.| |.|     |O|                        |.| |.|          
  +----+     |1|X|2| ==> |-|         +----+       ^ |1|X|2|\         
+-+--+ |   ^ |-| |-|     |1|       +-+--+ |      /  |-| |-| \        
|    | |  /  |1| |1|     +-+ +-+   |    | |     /   |1| |1|  v  +-+  
|    | | /   +-+ +-+       \ |O|   |    | |   +-+   +-+ +-+     |O|  
|Data| |      |   |          |u|   |Data| |==>|R|  ----------   |u|  
|    | | \   +-+ +-+       / |t|   |    | |   +-+   +-+ +-+     |t|  
|    | |  \  |P| |P|     +-+ +-+   |    | |         |P| |P|     +-+  
|    +-+   v |.| |.|     |O|       |    +-+         |.| |.|          
+----+       |1|X|2| ==> |-|       +----+           |1|X|2|          
             |-| |-|     |2|                        |-| |-|          
             |2| |2|     +-+                        |2| |2|          
             +-+ +-+                                +-+ +-+          
(c) Tensor model-parallelism       (d) Mixture of Expert parallelism 
]]></artwork></artset></figure>

</section>
<section anchor="SEC:MLTopo"><name>The topology of distributed machine learning systems</name>

<t>To boost the workload distribution efficiency, nodes participating in the common execution of machine learning workloads are interconnected following specific topologies.
Depending on the number of nodes involved, the nodes' capacities to connect directly with other nodes and the control of the machine learning application administrator over the physical connectivity substrate, difefrent topologies can be used. 
Those topologies can inherit from the work done either in the high performance computing community if the nodes are homogeneous, high capacity computers under the control of a single administrator or in the peer-to-peer or swarm computing community if the nodes are more diverse and numerous.</t>

<t>Topologies inspired from the HPC networking community are typically found in distributed systems in which all the nodes are located in the same datacenter. 
In specific cases, those topologies can be extended beyond a single datacenter. 
Then, the distribution of the workloads is done so as to avoid frequent and latency-bound communications over those links, and congestion control mechanisms are tuned to avoid deadlocks and bloats in network equipments manging the inter-datacenter link.
Among those HPC-inspired topologies, we can find the n-dimension torus, the Dragonfly topology,the fat tree topology and the hypercube topology.</t>

<t>On the other end of the spectrum, topologies inspired from swarm computing and peer-to-peer networks have emerged as solutions connecting heteorgeneous nodes involved in distributed machine learning tasks outside datacenters, at the edge of the networks or among clusters of nodes hosted on public cloud platforms. 
Those topologies can be built either from dynamic wireless connections, which can be rearranged easily, or as overlay links on top of an immutable physical connectivity substrate. 
Among those swarm-inspired topologies presented in <xref target="FIG:DTopo"/>, we can find the full mesh, the star topology, the Peer-to-Peer topology which presents a limited diameter without too many connections, the random topology and the clustered topology.
Note that in the case of the clustered topology, nodes can be gathered based on their proximity to a proxy or an aggregator, or based on their interest or capabilities. 
Besides, the clustered topology can be structured according to a hierarchy.</t>

<figure title="Decentralized topologies" anchor="FIG:DTopo"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="568" viewBox="0 0 568 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 320,112 L 320,128" fill="none" stroke="black"/>
<path d="M 344,32 L 344,64" fill="none" stroke="black"/>
<path d="M 416,80 L 416,96" fill="none" stroke="black"/>
<path d="M 40,32 L 72,32" fill="none" stroke="black"/>
<path d="M 232,32 L 264,32" fill="none" stroke="black"/>
<path d="M 352,64 L 368,64" fill="none" stroke="black"/>
<path d="M 16,80 L 96,80" fill="none" stroke="black"/>
<path d="M 136,80 L 144,80" fill="none" stroke="black"/>
<path d="M 160,80 L 168,80" fill="none" stroke="black"/>
<path d="M 208,80 L 216,80" fill="none" stroke="black"/>
<path d="M 280,80 L 288,80" fill="none" stroke="black"/>
<path d="M 368,96 L 384,96" fill="none" stroke="black"/>
<path d="M 400,96 L 416,96" fill="none" stroke="black"/>
<path d="M 40,128 L 72,128" fill="none" stroke="black"/>
<path d="M 232,128 L 264,128" fill="none" stroke="black"/>
<path d="M 320,128 L 336,128" fill="none" stroke="black"/>
<path d="M 8,80 L 32,128" fill="none" stroke="black"/>
<path d="M 32,32 L 80,128" fill="none" stroke="black"/>
<path d="M 80,32 L 104,80" fill="none" stroke="black"/>
<path d="M 128,32 L 176,128" fill="none" stroke="black"/>
<path d="M 200,80 L 224,128" fill="none" stroke="black"/>
<path d="M 272,32 L 296,80" fill="none" stroke="black"/>
<path d="M 344,64 L 360,96" fill="none" stroke="black"/>
<path d="M 376,64 L 392,96" fill="none" stroke="black"/>
<path d="M 470,44 L 490,84" fill="none" stroke="black"/>
<path d="M 502,76 L 522,116" fill="none" stroke="black"/>
<path d="M 8,80 L 32,32" fill="none" stroke="black"/>
<path d="M 32,128 L 80,32" fill="none" stroke="black"/>
<path d="M 80,128 L 104,80" fill="none" stroke="black"/>
<path d="M 128,128 L 176,32" fill="none" stroke="black"/>
<path d="M 200,80 L 224,32" fill="none" stroke="black"/>
<path d="M 216,80 L 228,56" fill="none" stroke="black"/>
<path d="M 224,128 L 236,104" fill="none" stroke="black"/>
<path d="M 260,56 L 272,32" fill="none" stroke="black"/>
<path d="M 268,104 L 280,80" fill="none" stroke="black"/>
<path d="M 272,128 L 296,80" fill="none" stroke="black"/>
<path d="M 344,128 L 360,96" fill="none" stroke="black"/>
<path d="M 376,64 L 392,32" fill="none" stroke="black"/>
<path d="M 470,116 L 512,32" fill="none" stroke="black"/>
<path d="M 228,56 L 260,56" fill="none" stroke="black"/>
<path d="M 236,104 L 268,104" fill="none" stroke="black"/>
<circle cx="8" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="32" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="32" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="80" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="80" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="104" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="128" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="128" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="128" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="152" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="176" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="176" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="176" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="200" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="224" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="224" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="272" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="272" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="296" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="320" cy="112" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="344" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="344" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="344" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="360" cy="96" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="376" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="392" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="392" cy="96" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="416" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="440" cy="112" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="448" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="448" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="456" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="456" cy="112" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="464" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="464" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="464" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="472" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="472" cy="112" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="480" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="488" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="496" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="496" cy="96" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="504" cy="80" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="512" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="520" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="520" cy="112" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="528" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="528" cy="96" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="528" cy="128" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="536" cy="48" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="536" cy="112" r="6" class="opendot" fill="white" stroke="black"/>
<circle cx="544" cy="32" r="6" class="opendot" fill="white" stroke="black"/>
<g class="text">
<text x="20" y="164">Full</text>
<text x="60" y="164">mesh</text>
<text x="140" y="164">Star</text>
<text x="244" y="164">Peer-to-Peer</text>
<text x="340" y="164">Random</text>
<text x="472" y="164">Clustered</text>
<text x="36" y="180">topology</text>
<text x="156" y="180">topology</text>
<text x="228" y="180">topology</text>
<text x="348" y="180">topology</text>
<text x="468" y="180">topology</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
   o-----o     o     o     o-----o        o     o      o o o   o o o
  / \   / \     \   /     / ____/ \       |    /        o o   / o o 
 /   \ /   \     \ /     / /       \      o---o          o \ o      
o-----+-----o  o--o--o  o-+       +-o      \   \   o        o o     
 \   / \   /     / \     \   ____/ /        o---o--+       / o \ o  
  \ /   \ /     /   \     \ /     /    o   /          o o o     o o 
   o-----o     o     o     o-----o     +--o            o o       o  
                                                                      
Full mesh      Star     Peer-to-Peer   Random         Clustered
topology       topology topology       topology       topology
]]></artwork></artset></figure>

<t>The topology connecting the nodes together is not anecdotical. 
If it is under the control of the machine learning system administrator, the construction of a proper topology able to efficiently support the communication patterns generated by the parallelization model and the collective communication method used is a key performance factor. 
If the topology is inherited from the environment, machine learning system administrators will need to adapt the communication patterns they use to the characteirstics of the topology.</t>

</section>
<section anchor="SEC:DeploymentAI"><name>Deployment considerations for AI systems</name>

<t>Given the computing and memory requirements of machine learning workloads, modern machine learning systems are fundamentally distributed.
By combining functionnal roles together, distributing them using a combination of parallelization modes, and communicating following patterns, a variety of systems with different shades of decentralization can be built.
Indeed, distributing workloads across several workers does not necessarily means that the control and orchestration of those workloads is distributed. 
In case a parameter server is used, the orchestrator role is played by a single node.</t>

<t>Yet, following the Federated learning <xref target="FederatedLearning"/> approach, machine learning systems can be decentralized as shown in <xref target="FIG:CNTRmodels"/>.</t>

<figure title="Different centralization models in federated learning" anchor="FIG:CNTRmodels"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="512" width="560" viewBox="0 0 560 512" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,352 L 8,384" fill="none" stroke="black"/>
<path d="M 32,416 L 32,448" fill="none" stroke="black"/>
<path d="M 80,32 L 80,64" fill="none" stroke="black"/>
<path d="M 80,192 L 80,224" fill="none" stroke="black"/>
<path d="M 88,288 L 88,320" fill="none" stroke="black"/>
<path d="M 104,96 L 104,160" fill="none" stroke="black"/>
<path d="M 104,352 L 104,384" fill="none" stroke="black"/>
<path d="M 120,32 L 120,64" fill="none" stroke="black"/>
<path d="M 120,192 L 120,224" fill="none" stroke="black"/>
<path d="M 128,416 L 128,448" fill="none" stroke="black"/>
<path d="M 136,320 L 136,368" fill="none" stroke="black"/>
<path d="M 144,416 L 144,448" fill="none" stroke="black"/>
<path d="M 152,32 L 152,64" fill="none" stroke="black"/>
<path d="M 152,192 L 152,224" fill="none" stroke="black"/>
<path d="M 168,96 L 168,160" fill="none" stroke="black"/>
<path d="M 168,352 L 168,384" fill="none" stroke="black"/>
<path d="M 184,288 L 184,320" fill="none" stroke="black"/>
<path d="M 192,32 L 192,64" fill="none" stroke="black"/>
<path d="M 192,192 L 192,224" fill="none" stroke="black"/>
<path d="M 240,416 L 240,448" fill="none" stroke="black"/>
<path d="M 264,352 L 264,384" fill="none" stroke="black"/>
<path d="M 296,352 L 296,384" fill="none" stroke="black"/>
<path d="M 320,416 L 320,448" fill="none" stroke="black"/>
<path d="M 368,32 L 368,64" fill="none" stroke="black"/>
<path d="M 368,192 L 368,224" fill="none" stroke="black"/>
<path d="M 368,376 L 368,384" fill="none" stroke="black"/>
<path d="M 376,288 L 376,320" fill="none" stroke="black"/>
<path d="M 392,96 L 392,160" fill="none" stroke="black"/>
<path d="M 392,352 L 392,384" fill="none" stroke="black"/>
<path d="M 408,32 L 408,64" fill="none" stroke="black"/>
<path d="M 408,192 L 408,224" fill="none" stroke="black"/>
<path d="M 416,416 L 416,448" fill="none" stroke="black"/>
<path d="M 424,320 L 424,368" fill="none" stroke="black"/>
<path d="M 432,416 L 432,448" fill="none" stroke="black"/>
<path d="M 440,32 L 440,64" fill="none" stroke="black"/>
<path d="M 440,192 L 440,224" fill="none" stroke="black"/>
<path d="M 456,96 L 456,160" fill="none" stroke="black"/>
<path d="M 456,352 L 456,384" fill="none" stroke="black"/>
<path d="M 472,288 L 472,320" fill="none" stroke="black"/>
<path d="M 480,32 L 480,64" fill="none" stroke="black"/>
<path d="M 480,192 L 480,224" fill="none" stroke="black"/>
<path d="M 528,416 L 528,448" fill="none" stroke="black"/>
<path d="M 552,352 L 552,384" fill="none" stroke="black"/>
<path d="M 80,32 L 120,32" fill="none" stroke="black"/>
<path d="M 152,32 L 192,32" fill="none" stroke="black"/>
<path d="M 368,32 L 408,32" fill="none" stroke="black"/>
<path d="M 440,32 L 480,32" fill="none" stroke="black"/>
<path d="M 80,64 L 120,64" fill="none" stroke="black"/>
<path d="M 152,64 L 192,64" fill="none" stroke="black"/>
<path d="M 368,64 L 408,64" fill="none" stroke="black"/>
<path d="M 440,64 L 480,64" fill="none" stroke="black"/>
<path d="M 104,96 L 168,96" fill="none" stroke="black"/>
<path d="M 392,96 L 456,96" fill="none" stroke="black"/>
<path d="M 104,160 L 168,160" fill="none" stroke="black"/>
<path d="M 392,160 L 456,160" fill="none" stroke="black"/>
<path d="M 80,192 L 120,192" fill="none" stroke="black"/>
<path d="M 152,192 L 192,192" fill="none" stroke="black"/>
<path d="M 368,192 L 408,192" fill="none" stroke="black"/>
<path d="M 440,192 L 480,192" fill="none" stroke="black"/>
<path d="M 80,224 L 120,224" fill="none" stroke="black"/>
<path d="M 152,224 L 192,224" fill="none" stroke="black"/>
<path d="M 368,224 L 408,224" fill="none" stroke="black"/>
<path d="M 440,224 L 480,224" fill="none" stroke="black"/>
<path d="M 88,288 L 184,288" fill="none" stroke="black"/>
<path d="M 376,288 L 472,288" fill="none" stroke="black"/>
<path d="M 88,320 L 184,320" fill="none" stroke="black"/>
<path d="M 376,320 L 472,320" fill="none" stroke="black"/>
<path d="M 8,352 L 104,352" fill="none" stroke="black"/>
<path d="M 168,352 L 264,352" fill="none" stroke="black"/>
<path d="M 296,352 L 392,352" fill="none" stroke="black"/>
<path d="M 456,352 L 552,352" fill="none" stroke="black"/>
<path d="M 104,368 L 128,368" fill="none" stroke="black"/>
<path d="M 144,368 L 168,368" fill="none" stroke="black"/>
<path d="M 392,368 L 416,368" fill="none" stroke="black"/>
<path d="M 432,368 L 456,368" fill="none" stroke="black"/>
<path d="M 8,384 L 104,384" fill="none" stroke="black"/>
<path d="M 168,384 L 264,384" fill="none" stroke="black"/>
<path d="M 296,384 L 392,384" fill="none" stroke="black"/>
<path d="M 456,384 L 552,384" fill="none" stroke="black"/>
<path d="M 32,416 L 128,416" fill="none" stroke="black"/>
<path d="M 144,416 L 240,416" fill="none" stroke="black"/>
<path d="M 320,416 L 416,416" fill="none" stroke="black"/>
<path d="M 432,416 L 528,416" fill="none" stroke="black"/>
<path d="M 128,432 L 144,432" fill="none" stroke="black"/>
<path d="M 416,432 L 432,432" fill="none" stroke="black"/>
<path d="M 32,448 L 128,448" fill="none" stroke="black"/>
<path d="M 144,448 L 240,448" fill="none" stroke="black"/>
<path d="M 320,448 L 416,448" fill="none" stroke="black"/>
<path d="M 432,448 L 528,448" fill="none" stroke="black"/>
<path d="M 80,384 L 96,416" fill="none" stroke="black"/>
<path d="M 136,368 L 160,416" fill="none" stroke="black"/>
<path d="M 168,320 L 184,352" fill="none" stroke="black"/>
<path d="M 104,64 L 120,96" fill="none" stroke="black"/>
<path d="M 152,160 L 168,192" fill="none" stroke="black"/>
<path d="M 368,384 L 384,416" fill="none" stroke="black"/>
<path d="M 424,368 L 448,416" fill="none" stroke="black"/>
<path d="M 456,320 L 472,352" fill="none" stroke="black"/>
<path d="M 392,64 L 408,96" fill="none" stroke="black"/>
<path d="M 440,160 L 456,192" fill="none" stroke="black"/>
<path d="M 104,192 L 120,160" fill="none" stroke="black"/>
<path d="M 152,96 L 168,64" fill="none" stroke="black"/>
<path d="M 88,352 L 104,320" fill="none" stroke="black"/>
<path d="M 112,416 L 136,368" fill="none" stroke="black"/>
<path d="M 176,416 L 192,384" fill="none" stroke="black"/>
<path d="M 392,192 L 408,160" fill="none" stroke="black"/>
<path d="M 440,96 L 456,64" fill="none" stroke="black"/>
<path d="M 376,352 L 392,320" fill="none" stroke="black"/>
<path d="M 400,416 L 424,368" fill="none" stroke="black"/>
<path d="M 464,416 L 480,384" fill="none" stroke="black"/>
<circle cx="136" cy="368" r="6" class="closeddot" fill="black"/>
<circle cx="424" cy="368" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="96" y="52">D</text>
<text x="176" y="52">D</text>
<text x="388" y="52">DM</text>
<text x="460" y="52">DM</text>
<text x="136" y="116">Central</text>
<text x="424" y="116">Central</text>
<text x="136" y="132">Inst.</text>
<text x="424" y="132">serv.</text>
<text x="124" y="148">DM</text>
<text x="152" y="148">(Σ)</text>
<text x="416" y="148">M</text>
<text x="440" y="148">(Σ)</text>
<text x="96" y="212">D</text>
<text x="176" y="212">D</text>
<text x="388" y="212">DM</text>
<text x="460" y="212">DM</text>
<text x="104" y="260">Centralized</text>
<text x="188" y="260">learning</text>
<text x="344" y="260">Centralized</text>
<text x="432" y="260">federated</text>
<text x="508" y="260">learning</text>
<text x="124" y="308">DM</text>
<text x="152" y="308">(Σ)</text>
<text x="412" y="308">DM</text>
<text x="440" y="308">(Σ)</text>
<text x="60" y="372">DM</text>
<text x="220" y="372">DM</text>
<text x="332" y="372">DM</text>
<text x="360" y="372">(Σ)</text>
<text x="492" y="372">DM</text>
<text x="520" y="372">(Σ)</text>
<text x="84" y="436">DM</text>
<text x="196" y="436">DM</text>
<text x="356" y="436">DM</text>
<text x="384" y="436">(Σ)</text>
<text x="468" y="436">DM</text>
<text x="496" y="436">(Σ)</text>
<text x="140" y="484">Semi-decentralized</text>
<text x="360" y="484">Fully</text>
<text x="440" y="484">decentralized</text>
<text x="104" y="500">federated</text>
<text x="180" y="500">learning</text>
<text x="376" y="500">federated</text>
<text x="452" y="500">learning</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
         +----+   +----+                     +----+   +----+
         | D  |   |  D |                     | DM |   | DM |
         +--+-+   +-+--+                     +--+-+   +-+--+
             \     /                             \     /    
            +-+---+-+                           +-+---+-+   
            |Central|                           |Central|   
            | Inst. |                           | serv. |   
            | DM (Σ)|                           |  M (Σ)|   
            +-+---+-+                           +-+---+-+   
             /     \                             /     \    
         +--+-+   +-+--+                     +--+-+   +-+--+
         | D  |   |  D |                     | DM |   | DM |
         +----+   +----+                     +----+   +----+
                                   
       Centralized learning          Centralized federated learning
                                  
          +-----------+                       +-----------+
          |   DM (Σ)  |                       |   DM (Σ)  | 
          +-+---+---+-+                       +-+---+---+-+
           /    |    \                         /    |    \ 
+---------+-+   |   +-+---------+   +---------+-+   |   +-+---------+
|     DM    +---*---+     DM    |   |   DM (Σ)  +---*---+   DM (Σ)  |
+--------+--+  / \  +--+--------+   +--------+--+  / \  +--+--------+
          \   /   \   /                       \   /   \   /   
   +-------+-+-+ +-+-+-------+         +-------+-+-+ +-+-+-------+
   |     DM    +-+     DM    |         |   DM (Σ)  +-+   DM (Σ)  |
   +-----------+ +-----------+         +-----------+ +-----------+
                                    
        Semi-decentralized                Fully decentralized 
        federated learning                federated learning
]]></artwork></artset></figure>

<t>In federated learning, the coordination role of the orchestrator or the aggregation of parameters done by the aggregator can be done by a subset or all the worker nodes deployed in the system, using a distributed protocol to exchange information, synchronize parameters and agree on a reference.
Of course, this comes at a communication cost, but decentralization also has benefits.</t>

<t>One of the first reason for decentralizing machine learning systems is to allow users to retain ownership of their data, and to control how their data is transferred or used. 
In a centralized setting, users need to trust the central entity managing the system for respecting the data management agreed upon with the user.
In a decentralized setting, users can either infer from a copy of a generic model sent by a central entity (centralized federated learning), fine-tune the model and infer from it (semi-decentralized setting) or even cooperate with others to train together a model and use it afterwards (in a fully decentralized setting).</t>

<t>Besides, in a decentralized machine learning system, users and worker nodes can be co-located, or workers can be placed close to the user in order to reduce the overall communication latency. 
In such a decentralization scheme, if it is considered that edge nodes can benefit from less memory or computing power, a balance has to be found between the time spent in communicating between the user and worker nodes and the processing time to reach an optimal response time for user requests.
Worker nodes located at the edge of the network may also collaborate with other, more capable nodes located in other locations. The tail latency of the flows associated with those tasks should be bounded to avoid degrading the user's experience.</t>

</section>
</section>
<section anchor="SEC:AINetChallenges"><name>Challenges (in Networking for AI)</name>

<section anchor="SEC:AINetMgt"><name>Network resource management at regional scale</name>

<t>In (large) model-based machine learning, training, fine-tuning and infering from the model are workloads that involve the transfer of a very large volume of data. In <xref target="AITrainingTraffic"/>, the authors estimate that the first iteration for training a GPT-3B model among 32 GPU nodes generate roughly 85 GB of tensor-parallel data traffic, 1 GB of pipeline-parallel data traffic and 741 MB of data-parallel data traffic.
The tensor-parallel and pipeline-parallel data traffic consist in 125 MB messages that are periodically exchanged during communication phases, while very little traffic is exchanged during computing phases.</t>

<t>This traffic pattern is a good example of the characteristics of network traffic flows associated with machine learning workloads. 
Indeed, the network traffic generated by distributed machine learning systems consists in a relatively little number of large (elephant) flows, starting and stopping roughly simultaneously. 
Such synchronous traffic patterns are coming from the use of collective communication libraries such as NCCL and associated collective communication primitive such as All-Reduce or All-Gather, as mentionned in <xref target="Burstiness"/>. 
Dealing with this synchronized traffic in a stochastic network is challenging, because it generates periodic traffic bursts that bloat network equipment buffers. 
Besides, the network's capacity needs to meet peak requirements at the cost of an unefficient average utilization of the installed capacity. 
Even if the network's capacity is sufficient in theory to accomodate the peak requirements of machine learning systems, the transport mechanisms used on the links between the nodes make it difficult to immediately use the full deployed capacity, resulting in inefficiencies at the network level <xref target="NetworkBottleneck"/>
At last, in such a synchronous communication pattern, the failure of a link, delaying data transmission between two nodes in the system might delay the whole system after a few iterations.</t>

<t>Mitigating the resource management challenges raised by machine learning traffic patterns is currently an open research area. 
At the application level, machine learning system designers work to develop hybrid parallellization schemes combining the patterns presented in <xref target="SEC:MLDistNat"/> (detailed in <xref target="SEC:A-parallelisationModes"/>) and orchestration methods aiming at better utilizing the deployed network capacity and at avoiding "on-off" behaviors.</t>

<t>At the network level, the main challenge that the research community is trying to address is the proper balancing of the flows generated by machine learning workloads in the network. 
Indeed, to address the need for bandwidth and avoid bottlenecks, machine learning system designers are often deploying their system on top of networks whose topology presents a large number of equal cost links between two nodes.
Yet, as mentionned earlier, machine learning traffic is constituted with a rather small number of large flows that have a very small entropy. 
This makes applying classic load balancing techniques challenging.
To address this load balancing issue, most collective communication libraries use packet spraying strategies, which require specific tuning due to mentioned lack of entropy. 
Yet, some researchers are questionning the relevance of this approach <xref target="ChallengingSpraying"/>.</t>

</section>
<section anchor="latency-sensitivity-of-llm-training-and-inference"><name>Latency sensitivity of LLM training and inference</name>

<t>Training a (large) model in a distributed setting does not necessarily require data transfer to be operated at a controlled low latency, but large tail latencies related to packet losses or head of line blocking can delay the training of models considerably.
Indeed, problems arising from packet losses, link failures or excessive buffering can have cascading consequences since in most parallellization methods, data and model parameters are exchanged following synchronized patterns (see <xref target="SEC:AINetMgt"/>).</t>

<t>The extend of the amplification of the latency effects of a soft failure on a connection between two nodes depends on the topology of the network connecting the nodes. 
Besides, routing inefficiencies or failures to properly balance the load on some heavily-used links can also generate additional latencies. 
Thus, the topology of the network supporting machine learning workloads needs specific care.</t>

<t>In a large scale and decentralized AI context, heterogeneous links can be used between nodes participating in a decentralized machine learning system. 
The specificities of the links need to be taken into account when orchestrating or distributing AI-related tasks. 
As latency is affected by congestion, addressing the mismatch between links' bandwidth-delay products for efficient congestion management is an open challenge.
In the research community, some projects have proposed to introduce proxies to investigate new control loops taking into account link segments characteristics <xref target="SiteToSite"/>. 
In the IETF, CSIG draft (now expired) presented a model to expose a rich congestion signal <xref target="I-D.ravi-ippm-csig"/>.</t>

</section>
<section anchor="aligning-communications-patterns-to-the-internets-constraints"><name>Aligning communications patterns to the Internet's constraints</name>

<t>In the development and deployment of distributed machine learning systems within the real of an administrator's responsibility, it is feasible, and advised, to design the system to adapt the network's topology to the paralellization method used and to the collective communication patterns required to perform the training or inference task efficiently.
As we have seen in <xref target="SEC:MLSystems"/>, several network topologies can be adopted, depending on the model's architecture and on the design choice made while designing the training system.</t>

<t>In a decentralized or federated setting, such a co-design offers lmess freedom, as some adverserial choices can be made by people willing to cooperate on specific machine learning tasks. 
Besides, when the nodes involved are deployed at the edge of the network, in a majority of the cases, the topology is following the access network's specificities rather than adapting to the requirements of machine learning tasks.</t>

<t>As machine learning-related traffic is growing on the Internet, some challenges associated with the delivery of network flows related to the realization of decentralized training or inference tasks are appearing: 
How to inform a machine learning application about the topology of the network interconnecting involved nodes? 
How to adapt the parallelization model or collective communication pattern to maximize efficiency?
In the IETF, the ALTO working group <xref target="ALTO"/> has investigated similar challenges related to the operation of peer-to-peer traffic. 
As machine learning workloads have a different set of requiremenst, it may be time to revisit this work.</t>

</section>
<section anchor="managing-incast-traffic-related-to-ai-inference"><name>Managing incast traffic related to AI inference</name>

<t>In a machine learning system, some specific nodes, such as the orchestrator of the aggregator, play a central role, and thus concentrate communications. 
This concentration might be reinforced by the use of specific collective communication primitives, and by the synchronicity of traffic patterns.
The network traffic management challenges we previously mentionned (Packet losses, delays, congestion) can be amplified by this concentration on a few hotspots in the network.</t>

<t>Decentralized systems tend to mitigate this functionnal centrality by distributing the responsibility for fullfilling those roles accross several nodes.
Yet, even in decentralized systems, it is difficult to completely avoid incast problems given the specificities of machine learning workloads. 
For instance, due to the characteristics of model inference, first prompt requests addressed to a given node are bound to generate a large incast traffic related to the personalization and fine tuning of the model instance run by the node, which can represent a large amount of data.</t>

<t>The research and operational communities dealing with scaling out machine learning systems are working on some solutions to address incast traffic management issues.
For instance, in the same way as media codecs structured as layers of increasing resolution, models used in training and inference can be layered, with coarse grained models using less parameters than finer grained ones.
Coarse grain models can be distributed more quickly, drafting a first answer to a request while finer grain models are retrieved and then used to build a more precise answer to a request. 
Besides, as inference requests towards large models are often done in the form of a converstaion or contextualized exchange between a user and the node running inference tasks addressing its requests, the use of service routing to consistently route requests to the same instance can be used.<br />
In that extend, the work done in the CATS working group in the IETF is of particular relevance (<xref target="CATSWG"/>).
Specific work on the proper metrics to be applied to CATS in the context of large scale decentralized AI will need to be done, taking into consideration the large body of work on load balancing for machien learning workloads done in the research community.
In particular, one problem of importance in the selection of the instance serving a specific inference request is the trade-off to find between the need to serve the requests with a bounded latency, requiring to use a node that is located as close to the requesting user as possible, the necessity to bootstrap this node with the user's contextual model parameters and the uncertainty about the length of the session between the user and the instance, which puts a stress on the memory needed to keep the session's context at hand.</t>

</section>
<section anchor="SEC:MLSecAndPriv"><name>Securing and attesting AI-related traffic</name>

<t>The distribution of machine learning workloads at a regional scale beyond the limits of a single datacenter and the decentralization of the control and management of those operations raises important security and privacy challenges.
Indeed, when those workloads are operated in a single tenant datacenter, data can be secured by means of perimeter security measures, or adopting encryption at least for data stored in the datacenter's realm.
In the same way, it is acceptable to exchange data between nodes in an unencrypted manner provided the network on which data is exchanged is isolated from the outside environment.</t>

<t>When data, models and their associated parameters are exchanged on the Internet, or on public connections, data managers need to make sure that the data is exchanged securely, and following policies complying both with users preferences and local regulations.
As previously mentionned, data exchanges done during model training phases or directly before performing an inference task need to be done as quickly as possible, avoiding tail latencies as much as possible. 
Even if encryption of large data flow has improved considerably in the last years, it is adding a latency overhead, considering that the computational overhead related to cryptographic operations is handled beyond the chip (often a GPU or a tensor processor) performing the machine learning tasks. 
It would be interesting and benefitial to contribute to the efforts done in the IRTF and IETF to develop low latency, lightweight encryption schemes in order to reduce this overhead as much as possible.</t>

<t>Furthermore, as private data is involved in data exchanges related to training and inference, specific care must be taken to respect regulations steering the way those data can be processed and transfered. 
In particular, some data need to be processed in the same region or country they have been generated in. 
To make sure those regulations are respected, attestation mechanisms need to be put in place.
By using those attestation mechanisms, data owners or managers can prove to local authorities that the data they are managing is being exchanged according to the policy they specified.
In the IETF, the RATS working group <xref target="RATSWG"/>, and the NASR initiative <xref target="NASR"/> are developping attestation mechanisms that could be adapted to address machine learning requirements, even if their work is still at the beginning.</t>

</section>
</section>
<section anchor="SEC:PBStatement"><name>Problem statement</name>

<t>In today's LLM-based machine learning landscape, we observe a strong concentration of training abilities in the hands of a few hyperscalers, while several companies tend to propose innovative approaches to improve inference by making it faster, and done by machines located closer to the users. 
Yet, there is a need to distribute both the training and inference workloads of AI.</t>

<t>In the same way as the Internet, there is, and will be several incentives to decentralize some or all aspects of AI's lifecycle to address scalability, resilience, personalization or privacy concerns. 
This decentralization trend is exemplified by Federated Learning <xref target="FederatedLearning"/>, with different decentralization models, as presented in <xref target="SEC:DeploymentAI"/>.</t>

<t>Given the challenges highlighted in <xref target="SEC:AINetChallenges"/>, and the fact that multiple stakeholders are involved in properly adressing those challenges, AI-related network traffic will no longer be operated only on private infrastructure, but also on an <strong><em>open interconnected network</em></strong>. 
Thus, it is desirable that the IETF community discuss networking challenges related to large scale decentralized AI to avoid the deployment of proprietary solutions, or of solutions putting the stability of the Internet at risk due to unfair resource mangement or competition between AI-related network traffic and other traffic in the Internet.</t>

</section>
<section anchor="SEC:NextSteps"><name>Next Steps</name>

<t>While some work addressing the challenges highligted in this document is done in working groups related to congestion management, deterministic networking or service routing, there might be interest in the IETF community at large to aggregate a group of contributors interested in elaborating specific requirements and corresponding solutions to the challenges listed in <xref target="SEC:AINetChallenges"/>. 
In particular, the goal of such an initiative would be to:</t>

<t><list style="symbols">
  <t>Formalize AI-related requirements for service routing:
  Indeed, it is needed to define the metrics to take into account for load balancing AI-related workloads, given the need for instance stickiness or the importance of latency aspects while addressing the specificities of AI-related traffic, consisting in elephant flows with little entropy.</t>
  <t>Formalize low latency / limited latency requirements associated with AI network traffic:
  As presented in this document, during the different phases of the AI lifecycle, it will be needed to enforce a different set of requirements in terms of latency, tolerance to jitter or packet loss for sustaining network traffic.</t>
  <t>Formalize congestion control aspects related to the operation of AI traffic at regional scale:
  The machine learning community is already engaged in improvements of the congestion aspects of AI workloads by working on application-level solutions taking for granted the underlying behavior of the network. 
  It would be interesting to determine what are the possible improvements that the network could benefit from in order to better solve the congestion and incast management issues related to the way AI network traffic is managed.</t>
  <t>Formalize coordination aspects of AI distributed systems:
  This topic is very important to the realization of decentralized, large scale AI systems, and to the emergence of an inter-AI network of entities collaborating in the execution of end to end AI workloads for end users.</t>
</list></t>

</section>
<section anchor="Security"><name>Security Considerations</name>

<t><xref target="SEC:MLSecAndPriv"/> highlights privacy related challenges that AI operations at regional scale will have to address. 
Beyond this section, no additional security concern is raised by the elements presented in the document.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>



    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="PipelineParallelism">
  <front>
    <title>PipeDream: generalized pipeline parallelism for DNN training</title>
    <author fullname="Deepak Narayanan" initials="D." surname="Narayanan">
      <organization>Microsoft Research and Stanford University</organization>
    </author>
    <author fullname="Aaron Harlap" initials="A." surname="Harlap">
      <organization>Microsoft Research and Carnegie Mellon University</organization>
    </author>
    <author fullname="Amar Phanishayee" initials="A." surname="Phanishayee">
      <organization>Microsoft Research</organization>
    </author>
    <author fullname="Vivek Seshadri" initials="V." surname="Seshadri">
      <organization>Microsoft Research</organization>
    </author>
    <author fullname="Nikhil R. Devanur" initials="N." surname="Devanur">
      <organization>Microsoft Research</organization>
    </author>
    <author fullname="Gregory R. Ganger" initials="G." surname="Ganger">
      <organization>Carnegie Mellon University</organization>
    </author>
    <author fullname="Phillip B. Gibbons" initials="P." surname="Gibbons">
      <organization>Carnegie Mellon University</organization>
    </author>
    <author fullname="Matei Zaharia" initials="M." surname="Zaharia">
      <organization>Stanford University</organization>
    </author>
    <date month="October" year="2019"/>
  </front>
  <seriesInfo name="Proceedings of the 27th ACM Symposium on Operating Systems Principles" value="pp. 1-15"/>
  <seriesInfo name="DOI" value="10.1145/3341301.3359646"/>
<refcontent>ACM</refcontent></reference>

<reference anchor="TensorParallelism">
  <front>
    <title>TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems</title>
    <author fullname="Martín Abadi" initials="M." surname="Abadi">
      <organization/>
    </author>
    <author fullname="Ashish Agarwal" initials="A." surname="Agarwal">
      <organization/>
    </author>
    <author fullname="Paul Barham" initials="P." surname="Barham">
      <organization/>
    </author>
    <author fullname="Eugene Brevdo" initials="E." surname="Brevdo">
      <organization/>
    </author>
    <author fullname="Zhifeng Chen" initials="Z." surname="Chen">
      <organization/>
    </author>
    <author fullname="Craig Citro" initials="C." surname="Citro">
      <organization/>
    </author>
    <author fullname="Greg S. Corrado" initials="G." surname="Corrado">
      <organization/>
    </author>
    <author fullname="Andy Davis" initials="A." surname="Davis">
      <organization/>
    </author>
    <author fullname="Jeffrey Dean" initials="J." surname="Dean">
      <organization/>
    </author>
    <author fullname="Matthieu Devin" initials="M." surname="Devin">
      <organization/>
    </author>
    <author fullname="Sanjay Ghemawat" initials="S." surname="Ghemawat">
      <organization/>
    </author>
    <author fullname="Ian Goodfellow" initials="I." surname="Goodfellow">
      <organization/>
    </author>
    <author fullname="Andrew Harp" initials="A." surname="Harp">
      <organization/>
    </author>
    <author fullname="Geoffrey Irving" initials="G." surname="Irving">
      <organization/>
    </author>
    <author fullname="Michael Isard" initials="M." surname="Isard">
      <organization/>
    </author>
    <author fullname="Yangqing Jia" initials="Y." surname="Jia">
      <organization/>
    </author>
    <author fullname="Rafal Jozefowicz" initials="R." surname="Jozefowicz">
      <organization/>
    </author>
    <author fullname="Lukasz Kaiser" initials="L." surname="Kaiser">
      <organization/>
    </author>
    <author fullname="Manjunath Kudlur" initials="M." surname="Kudlur">
      <organization/>
    </author>
    <author fullname="Josh Levenberg" initials="J." surname="Levenberg">
      <organization/>
    </author>
    <author fullname="Dan Mane" initials="D." surname="Mane">
      <organization/>
    </author>
    <author fullname="Rajat Monga" initials="R." surname="Monga">
      <organization/>
    </author>
    <author fullname="Sherry Moore" initials="S." surname="Moore">
      <organization/>
    </author>
    <author fullname="Derek Murray" initials="D." surname="Murray">
      <organization/>
    </author>
    <author fullname="Chris Olah" initials="C." surname="Olah">
      <organization/>
    </author>
    <author fullname="Mike Schuster" initials="M." surname="Schuster">
      <organization/>
    </author>
    <author fullname="Jonathon Shlens" initials="J." surname="Shlens">
      <organization/>
    </author>
    <author fullname="Benoit Steiner" initials="B." surname="Steiner">
      <organization/>
    </author>
    <author fullname="Ilya Sutskever" initials="I." surname="Sutskever">
      <organization/>
    </author>
    <author fullname="Kunal Talwar" initials="K." surname="Talwar">
      <organization/>
    </author>
    <author fullname="Paul Tucker" initials="P." surname="Tucker">
      <organization/>
    </author>
    <author fullname="Vincent Vanhoucke" initials="V." surname="Vanhoucke">
      <organization/>
    </author>
    <author fullname="Vijay Vasudevan" initials="V." surname="Vasudevan">
      <organization/>
    </author>
    <author fullname="Fernanda Viegas" initials="F." surname="Viegas">
      <organization/>
    </author>
    <author fullname="Oriol Vinyals" initials="O." surname="Vinyals">
      <organization/>
    </author>
    <author fullname="Pete Warden" initials="P." surname="Warden">
      <organization/>
    </author>
    <author fullname="Martin Wattenberg" initials="M." surname="Wattenberg">
      <organization/>
    </author>
    <author fullname="Martin Wicke" initials="M." surname="Wicke">
      <organization/>
    </author>
    <author fullname="Yuan Yu" initials="Y." surname="Yu">
      <organization/>
    </author>
    <author fullname="Xiaoqiang Zheng" initials="X." surname="Zheng">
      <organization/>
    </author>
    <date year="2016"/>
  </front>
  <seriesInfo name="DOI" value="10.48550/ARXIV.1603.04467"/>
<refcontent>arXiv</refcontent></reference>

<reference anchor="DataParallelism">
  <front>
    <title>A bridging model for parallel computation</title>
    <author fullname="Leslie G. Valiant" initials="L." surname="Valiant">
      <organization>Harvard Univ., Cambridge, MA</organization>
    </author>
    <date month="August" year="1990"/>
  </front>
  <seriesInfo name="Communications of the ACM" value="vol. 33, no. 8, pp. 103-111"/>
  <seriesInfo name="DOI" value="10.1145/79173.79181"/>
<refcontent>Association for Computing Machinery (ACM)</refcontent></reference>

<reference anchor="MoEParallelism1">
  <front>
    <title>Adaptive Mixtures of Local Experts</title>
    <author fullname="Robert A. Jacobs" initials="R." surname="Jacobs">
      <organization>Department of Brain and Cognitive Sciences, Massachusetts Institute of Technology, Cambridge, MA 02139 USA</organization>
    </author>
    <author fullname="Michael I. Jordan" initials="M." surname="Jordan">
      <organization>Department of Brain and Cognitive Sciences, Massachusetts Institute of Technology, Cambridge, MA 02139 USA</organization>
    </author>
    <author fullname="Steven J. Nowlan" initials="S." surname="Nowlan">
      <organization>Department of Computer Science, University of Toronto, Toronto, Canada M5S 1A4</organization>
    </author>
    <author fullname="Geoffrey E. Hinton" initials="G." surname="Hinton">
      <organization>Department of Computer Science, University of Toronto, Toronto, Canada M5S 1A4</organization>
    </author>
    <date month="February" year="1991"/>
  </front>
  <seriesInfo name="Neural Computation" value="vol. 3, no. 1, pp. 79-87"/>
  <seriesInfo name="DOI" value="10.1162/neco.1991.3.1.79"/>
<refcontent>MIT Press - Journals</refcontent></reference>

<reference anchor="MoEParallelism2">
  <front>
    <title>Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer</title>
    <author fullname="Noam Shazeer" initials="N." surname="Shazeer">
      <organization/>
    </author>
    <author fullname="Azalia Mirhoseini" initials="A." surname="Mirhoseini">
      <organization/>
    </author>
    <author fullname="Krzysztof Maziarz" initials="K." surname="Maziarz">
      <organization/>
    </author>
    <author fullname="Andy Davis" initials="A." surname="Davis">
      <organization/>
    </author>
    <author fullname="Quoc Le" initials="Q." surname="Le">
      <organization/>
    </author>
    <author fullname="Geoffrey Hinton" initials="G." surname="Hinton">
      <organization/>
    </author>
    <author fullname="Jeff Dean" initials="J." surname="Dean">
      <organization/>
    </author>
    <date year="2017"/>
  </front>
  <seriesInfo name="DOI" value="10.48550/ARXIV.1701.06538"/>
<refcontent>arXiv</refcontent></reference>

<reference anchor="Burstiness">
  <front>
    <title>On the Burstiness of Distributed Machine Learning Traffic</title>
    <author fullname="Natchanon Luangsomboon" initials="N." surname="Luangsomboon">
      <organization/>
    </author>
    <author fullname="Fahimeh Fazel" initials="F." surname="Fazel">
      <organization/>
    </author>
    <author fullname="Jörg Liebeherr" initials="J." surname="Liebeherr">
      <organization/>
    </author>
    <author fullname="Ashkan Sobhani" initials="A." surname="Sobhani">
      <organization/>
    </author>
    <author fullname="Shichao Guan" initials="S." surname="Guan">
      <organization/>
    </author>
    <author fullname="Xingjun Chu" initials="X." surname="Chu">
      <organization/>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="DOI" value="10.48550/ARXIV.2401.00329"/>
<refcontent>arXiv</refcontent></reference>

<reference anchor="AITrainingTraffic">
  <front>
    <title>Understanding Communication Characteristics of Distributed Training</title>
    <author fullname="Wenxue Li" initials="W." surname="Li">
      <organization>Hong Kong University of Science and Technology, China</organization>
    </author>
    <author fullname="Xiangzhou Liu" initials="X." surname="Liu">
      <organization>Hong Kong University of Science and Technology, China</organization>
    </author>
    <author fullname="Yuxuan Li" initials="Y." surname="Li">
      <organization>Hong Kong University of Science and Technology, China</organization>
    </author>
    <author fullname="Yilun Jin" initials="Y." surname="Jin">
      <organization>Hong Kong University of Science and Technology, China</organization>
    </author>
    <author fullname="Han Tian" initials="H." surname="Tian">
      <organization>USTC, China</organization>
    </author>
    <author fullname="Zhizhen Zhong" initials="Z." surname="Zhong">
      <organization>Massachusetts Institute of Technology, America</organization>
    </author>
    <author fullname="Guyue Liu" initials="G." surname="Liu">
      <organization>Peking University, China</organization>
    </author>
    <author fullname="Ying Zhang" initials="Y." surname="Zhang">
      <organization>Meta, America</organization>
    </author>
    <author fullname="Kai Chen" initials="K." surname="Chen">
      <organization>Hong Kong University of Science and Technology, China</organization>
    </author>
    <date month="August" year="2024"/>
  </front>
  <seriesInfo name="Proceedings of the 8th Asia-Pacific Workshop on Networking" value="pp. 1-8"/>
  <seriesInfo name="DOI" value="10.1145/3663408.3663409"/>
<refcontent>ACM</refcontent></reference>


<reference anchor="I-D.ravi-ippm-csig">
   <front>
      <title>Congestion Signaling (CSIG)</title>
      <author fullname="Abhiram Ravi" initials="A." surname="Ravi">
         <organization>Google LLC</organization>
      </author>
      <author fullname="Nandita Dukkipati" initials="N." surname="Dukkipati">
         <organization>Google LLC</organization>
      </author>
      <author fullname="Naoshad Mehta" initials="N." surname="Mehta">
         <organization>Google LLC</organization>
      </author>
      <author fullname="Jai Kumar" initials="J." surname="Kumar">
         <organization>Broadcom Inc.</organization>
      </author>
      <date day="2" month="February" year="2024"/>
      <abstract>
	 <t>   This document presents Congestion Signaling (CSIG), an in-band
   network telemetry protocol that allows end-hosts to obtain visibility
   into fine-grained network signals for congestion control, traffic
   management, and network debuggability in the network.  CSIG provides
   a simple, low-overhead, and extensible packet header mechanism to
   obtain fixed-length summaries from bottleneck devices along a packet
   path.  This summarized information is collected over L2 CSIG-tags in
   a compare-and-replace manner across network devices along the path.
   Receivers can reflect this information back to senders via L4+ CSIG
   reflection headers.

   CSIG builds upon the successful aspects of prior work such as switch
   in-band network telemetry (INT) that incorporates multibit signals in
   live data packets.  At the same time, CSIG&#x27;s end-to-end mechanism for
   carrying the signals via fixed size header is simple, practical and
   deployable akin to Explicit Congestion Notification (ECN).

   In addition to a detailed description of the end-to-end protocol,
   this document also motivates the use cases for CSIG and the rationale
   for design choices made in CSIG.  It describes a set of signals of
   interest to applications (minimum available bandwidth, maximum link
   utilization, and maximum hop delay), methods to compute these signals
   in network devices, and how these signals can be leveraged in
   applications.  Additionally, it describes how attributes about the
   bottleneck&#x27;s location can be carried and made useful to applications.
   It also provides the framework to incorporate future signals.
   Finally, this document addresses incremental deployment, backward
   compatibility and nuances of CSIG&#x27;s applicability in a range of
   scenarios.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ravi-ippm-csig-01"/>
   
</reference>


<reference anchor="I-D.yao-tsvwg-cco-problem-statement-and-usecases">
   <front>
      <title>Collective Communication Optimization: Problem Statement and Use cases</title>
      <author fullname="Kehan Yao" initials="K." surname="Yao">
         <organization>China Mobile</organization>
      </author>
      <author fullname="Xu Shiping" initials="X." surname="Shiping">
         <organization>China Mobile</organization>
      </author>
      <author fullname="Yizhou Li" initials="Y." surname="Li">
         <organization>Huawei Technologies</organization>
      </author>
      <author fullname="Hongyi Huang" initials="H." surname="Huang">
         <organization>Huawei Technologies</organization>
      </author>
      <author fullname="Dirk KUTSCHER" initials="D." surname="KUTSCHER">
         <organization>HKUST (Guangzhou)</organization>
      </author>
      <date day="23" month="October" year="2023"/>
      <abstract>
	 <t>   Collective communication is the basic logical communication model for
   distributed applications.  When distributed systems scales, the
   communication overhead becomes the bottleneck of the entire system,
   impeding system performance to increase.  This draft describes the
   performance challenges when the collective communication is employed
   in a network with more nodes or processes participating in or a
   larger number of such communication rounds required to complete a
   single job.  And the document presents several use cases where
   different aspects of collective communication optimization are
   needed.


	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-yao-tsvwg-cco-problem-statement-and-usecases-00"/>
   
</reference>

<reference anchor="xCCL">
  <front>
    <title>xCCL: A Survey of Industry-Led Collective Communication Libraries for Deep Learning</title>
    <author fullname="Adam Weingram" initials="A." surname="Weingram">
      <organization/>
    </author>
    <author fullname="Yuke Li" initials="Y." surname="Li">
      <organization/>
    </author>
    <author fullname="Hao Qi" initials="H." surname="Qi">
      <organization/>
    </author>
    <author fullname="Darren Ng" initials="D." surname="Ng">
      <organization/>
    </author>
    <author fullname="Liuyao Dai" initials="L." surname="Dai">
      <organization/>
    </author>
    <author fullname="Xiaoyi Lu" initials="X." surname="Lu">
      <organization/>
    </author>
    <date month="February" year="2023"/>
  </front>
  <seriesInfo name="Journal of Computer Science and Technology" value="vol. 38, no. 1, pp. 166-195"/>
  <seriesInfo name="DOI" value="10.1007/s11390-023-2894-6"/>
<refcontent>Springer Science and Business Media LLC</refcontent></reference>

<reference anchor="ChallengingSpraying">
  <front>
    <title>Ethereal: Divide and Conquer Network Load Balancing in Large-Scale Distributed Training</title>
    <author fullname="Vamsi Addanki" initials="V." surname="Addanki">
      <organization/>
    </author>
    <author fullname="Prateesh Goyal" initials="P." surname="Goyal">
      <organization/>
    </author>
    <author fullname="Ilias Marinos" initials="I." surname="Marinos">
      <organization/>
    </author>
    <author fullname="Stefan Schmid" initials="S." surname="Schmid">
      <organization/>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="DOI" value="10.48550/ARXIV.2407.00550"/>
<refcontent>arXiv</refcontent></reference>

<reference anchor="FederatedLearning">
  <front>
    <title>Communication-Efficient Learning of Deep Networks from Decentralized Data</title>
    <author fullname="H. Brendan McMahan" initials="H." surname="McMahan">
      <organization/>
    </author>
    <author fullname="Eider Moore" initials="E." surname="Moore">
      <organization/>
    </author>
    <author fullname="Daniel Ramage" initials="D." surname="Ramage">
      <organization/>
    </author>
    <author fullname="Seth Hampson" initials="S." surname="Hampson">
      <organization/>
    </author>
    <author fullname="Blaise Agüera y Arcas" initials="B." surname="Arcas">
      <organization/>
    </author>
    <date year="2016"/>
  </front>
  <seriesInfo name="" value="arXiv"/>
  <seriesInfo name="DOI" value="10.48550/ARXIV.1602.05629"/>
<refcontent>arXiv</refcontent></reference>

<reference anchor="SiteToSite">
  <front>
    <title>Site-to-site internet traffic control</title>
    <author fullname="Frank Cangialosi" initials="F." surname="Cangialosi">
      <organization>MIT CSAIL</organization>
    </author>
    <author fullname="Akshay Narayan" initials="A." surname="Narayan">
      <organization>MIT CSAIL</organization>
    </author>
    <author fullname="Prateesh Goyal" initials="P." surname="Goyal">
      <organization>MIT CSAIL</organization>
    </author>
    <author fullname="Radhika Mittal" initials="R." surname="Mittal">
      <organization>UIUC</organization>
    </author>
    <author fullname="Mohammad Alizadeh" initials="M." surname="Alizadeh">
      <organization>MIT CSAIL</organization>
    </author>
    <author fullname="Hari Balakrishnan" initials="H." surname="Balakrishnan">
      <organization>MIT CSAIL</organization>
    </author>
    <date month="April" year="2021"/>
  </front>
  <seriesInfo name="Proceedings of the Sixteenth European Conference on Computer Systems" value="pp. 574-589"/>
  <seriesInfo name="DOI" value="10.1145/3447786.3456260"/>
<refcontent>ACM</refcontent></reference>

<reference anchor="FEDI">
  <front>
    <title>Will Admins Cope? Decentralized Moderation in the Fediverse</title>
    <author fullname="Ishaku Hassan Anaobi" initials="I." surname="Anaobi">
      <organization>School of Electronic Engineering and Computer Science, Queen Mary University, United Kingdom</organization>
    </author>
    <author fullname="Aravindh Raman" initials="A." surname="Raman">
      <organization>Telefonica, Spain</organization>
    </author>
    <author fullname="Ignacio Castro" initials="I." surname="Castro">
      <organization>School of Electronic Engineering and Computer Science, Queen Mary University, United Kingdom</organization>
    </author>
    <author fullname="Haris Bin Zia" initials="H." surname="Zia">
      <organization>School of Electronic Engineering and Computer Science, Queen Mary University, United Kingdom</organization>
    </author>
    <author fullname="Damilola Ibosiola" initials="D." surname="Ibosiola">
      <organization>School of Electronic Engineering and Computer Science, Queen Mary University, United Kingdom</organization>
    </author>
    <author fullname="Gareth Tyson" initials="G." surname="Tyson">
      <organization>Hong Kong University of Science and Technology, China</organization>
    </author>
    <date month="April" year="2023"/>
  </front>
  <seriesInfo name="Proceedings of the ACM Web Conference 2023" value="pp. 3109-3120"/>
  <seriesInfo name="DOI" value="10.1145/3543507.3583487"/>
<refcontent>ACM</refcontent></reference>


<reference anchor="FLOWER" target="https://flower.ai/">
  <front>
    <title>Flower - A Friendly Federated Learning Framework</title>
    <author >
      <organization>Flower Labs GmbH</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


<reference anchor="AIConst">
  <front>
    <title>Artificial intelligence and smart vision for building and construction 4.0: Machine and deep learning methods and applications</title>
    <author fullname="Shanaka Kristombu Baduge" initials="S." surname="Baduge">
      <organization/>
    </author>
    <author fullname="Sadeep Thilakarathna" initials="S." surname="Thilakarathna">
      <organization/>
    </author>
    <author fullname="Jude Shalitha Perera" initials="J." surname="Perera">
      <organization/>
    </author>
    <author fullname="Mehrdad Arashpour" initials="M." surname="Arashpour">
      <organization/>
    </author>
    <author fullname="Pejman Sharafi" initials="P." surname="Sharafi">
      <organization/>
    </author>
    <author fullname="Bertrand Teodosio" initials="B." surname="Teodosio">
      <organization/>
    </author>
    <author fullname="Ankit Shringi" initials="A." surname="Shringi">
      <organization/>
    </author>
    <author fullname="Priyan Mendis" initials="P." surname="Mendis">
      <organization/>
    </author>
    <date month="September" year="2022"/>
  </front>
  <seriesInfo name="Automation in Construction" value="vol. 141, pp. 104440"/>
  <seriesInfo name="DOI" value="10.1016/j.autcon.2022.104440"/>
<refcontent>Elsevier BV</refcontent></reference>

<reference anchor="LLMSize">
  <front>
    <title>When Scaling Meets LLM Finetuning: The Effect of Data, Model and Finetuning Method</title>
    <author fullname="Biao Zhang" initials="B." surname="Zhang">
      <organization/>
    </author>
    <author fullname="Zhongtao Liu" initials="Z." surname="Liu">
      <organization/>
    </author>
    <author fullname="Colin Cherry" initials="C." surname="Cherry">
      <organization/>
    </author>
    <author fullname="Orhan Firat" initials="O." surname="Firat">
      <organization/>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="DOI" value="10.48550/ARXIV.2402.17193"/>
<refcontent>arXiv</refcontent></reference>


<reference anchor="AIBackbone" target="https://atscaleconference.com/videos/ai-impact-on-backbone/">
  <front>
    <title>AI impact on backbone</title>
    <author initials="J." surname="Sundaresan" fullname="Jyotsna Sundaresan">
      <organization></organization>
    </author>
    <author initials="A." surname="Gopalan" fullname="Abishek Gopalan">
      <organization></organization>
    </author>
    <author >
      <organization>Meta</organization>
    </author>
    <date />
  </front>
</reference>
<reference anchor="SchedulingSharding" target="https://atscaleconference.com/videos/scheduler-and-sharding-considerations-for-network-efficiency/">
  <front>
    <title>Scheduler and Sharding Considerations for Network Efficiency</title>
    <author initials="W." surname="Chu" fullname="Weiwei Chu">
      <organization></organization>
    </author>
    <author initials="A." surname="Choudhury" fullname="Arnab Choudhury">
      <organization></organization>
    </author>
    <author >
      <organization>Meta</organization>
    </author>
    <date />
  </front>
</reference>
<reference anchor="NCCL" target="https://developer.nvidia.com/nccl">
  <front>
    <title>NVIDIA Collective Communications Library (NCCL)</title>
    <author >
      <organization>Nvidia</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="RCCL" target="https://github.com/ROCm/ROCm">
  <front>
    <title>AMD ROCm Software</title>
    <author >
      <organization>AMD</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CATSWG" target="https://datatracker.ietf.org/group/cats/about/">
  <front>
    <title>Computing-Aware Traffic Steering (cats) Working Group</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="RATSWG" target="https://datatracker.ietf.org/wg/rats/about/">
  <front>
    <title>Remote ATtestation ProcedureS (rats) Working Group</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="NASR" target="https://datatracker.ietf.org/doc/bofreq-liu-nasr/">
  <front>
    <title>Network Attestation for Secure Routing (NASR)</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="ALTO" target="https://datatracker.ietf.org/wg/alto/about/">
  <front>
    <title>Application-Layer Traffic Optimization (alto)</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


<reference anchor="NetworkBottleneck">
  <front>
    <title>Is Network the Bottleneck of Distributed Training?</title>
    <author fullname="Zhen Zhang" initials="Z." surname="Zhang">
      <organization>Johns Hopkins University</organization>
    </author>
    <author fullname="Chaokun Chang" initials="C." surname="Chang">
      <organization>Amazon Web Services</organization>
    </author>
    <author fullname="Haibin Lin" initials="H." surname="Lin">
      <organization>Amazon Web Services</organization>
    </author>
    <author fullname="Yida Wang" initials="Y." surname="Wang">
      <organization>Amazon Web Services</organization>
    </author>
    <author fullname="Raman Arora" initials="R." surname="Arora">
      <organization>Johns Hopkins University</organization>
    </author>
    <author fullname="Xin Jin" initials="X." surname="Jin">
      <organization>Johns Hopkins University</organization>
    </author>
    <date month="August" year="2020"/>
  </front>
  <seriesInfo name="Proceedings of the Workshop on Network Meets AI &amp;" value="ML"/>
  <seriesInfo name="DOI" value="10.1145/3405671.3405810"/>
<refcontent>ACM</refcontent></reference>




    </references>


<?line 547?>

<section anchor="a-primer-on-machine-learning-extended-version-of-secmlsystems"><name>A primer on Machine learning (extended version of <xref target="SEC:MLSystems"/>)</name>

<t>Along its development, Machine Learning (ML) involves the use of an increasing amount of computing and storage resources in the operations of algorithms taking decisions or deriving insights from data. In recent generative AI algorithms, or in large language models, the amount of data used to train models of increasing size in terms of parameters has grown exponentially. 
Besides, the size of large models translates in an increasing memory and computing footprint. Given this evolution, ML algorithms can not be executed or trained on a single machine, and thus ML systems are "distributed" by nature, regardless of the architecture they adopt.</t>

<t>This appendix section introduces the lifecycle of ML systems (<xref target="SEC:A-MLLifecycle"/>), then explains how ML systems can be split between entities fulfilling different roles (<xref target="SEC:A-MLRoles"/>) and introduces the methods designed to parallelize ML jobs (<xref target="SEC:A-parallelisationModes"/>) and the communication methods used between instances to communicate data and parameters (<xref target="SEC:A-collectiveCommunicationMethods"/>). It is an extended version of <xref target="SEC:MLSystems"/> which focuses on the consequences on network traffic patterns and challenges of the elements presented here.</t>

<section anchor="SEC:A-MLLifecycle"><name>Machine learning model lifecycle</name>

<t>In machine learning, two approaches can be adopted to algorithmically derive insights from a dataset: supervised learning and unsupervised learning. 
In unsupervised learning, algorithms are developped and used to find patterns, clusters or relationships among data without previous knowledge or reference. 
In supervised learning, algorithms use a reference data set (or training set), consisting in data labelled with answers or hints to the solution of the question being asked, to build (or train) a model to which data is compared later during the inference (or serving) phase.</t>

<t>The model is the cornerstone of supervised machine learning.
It is a representation of a system that is observed and measured with data. 
When the model is trained, the model is parametrized or modified so it is able to model the behaviour of the system from the dataset used in the training phase.
Then, during the inference phase, data is presented to the trained model in order to derive information or make predictions about the system.</t>

<figure title="Supervised machine learning lifecycle" anchor="figureA-MLLC01"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="560" viewBox="0 0 560 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,32 L 8,96" fill="none" stroke="black"/>
<path d="M 96,32 L 96,96" fill="none" stroke="black"/>
<path d="M 136,32 L 136,96" fill="none" stroke="black"/>
<path d="M 224,32 L 224,96" fill="none" stroke="black"/>
<path d="M 264,32 L 264,96" fill="none" stroke="black"/>
<path d="M 336,32 L 336,96" fill="none" stroke="black"/>
<path d="M 376,32 L 376,96" fill="none" stroke="black"/>
<path d="M 432,32 L 432,96" fill="none" stroke="black"/>
<path d="M 472,32 L 472,96" fill="none" stroke="black"/>
<path d="M 552,32 L 552,96" fill="none" stroke="black"/>
<path d="M 8,32 L 96,32" fill="none" stroke="black"/>
<path d="M 136,32 L 224,32" fill="none" stroke="black"/>
<path d="M 264,32 L 336,32" fill="none" stroke="black"/>
<path d="M 376,32 L 432,32" fill="none" stroke="black"/>
<path d="M 472,32 L 552,32" fill="none" stroke="black"/>
<path d="M 8,96 L 96,96" fill="none" stroke="black"/>
<path d="M 136,96 L 224,96" fill="none" stroke="black"/>
<path d="M 264,96 L 336,96" fill="none" stroke="black"/>
<path d="M 376,96 L 432,96" fill="none" stroke="black"/>
<path d="M 472,96 L 552,96" fill="none" stroke="black"/>
<g class="text">
<text x="52" y="52">Data</text>
<text x="180" y="52">Data</text>
<text x="304" y="52">Model</text>
<text x="408" y="52">Model</text>
<text x="512" y="52">Inference</text>
<text x="116" y="68">=&gt;</text>
<text x="180" y="68">Pre-</text>
<text x="244" y="68">=&gt;</text>
<text x="356" y="68">=&gt;</text>
<text x="408" y="68">Fine-</text>
<text x="452" y="68">=&gt;</text>
<text x="512" y="68">/</text>
<text x="52" y="84">Collection</text>
<text x="180" y="84">Processing</text>
<text x="300" y="84">Training</text>
<text x="404" y="84">Tuning</text>
<text x="512" y="84">Serving</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
+----------+    +----------+    +--------+    +------+    +---------+
|   Data   |    |   Data   |    |  Model |    | Model|    |Inference|
|          | => |   Pre-   | => |        | => | Fine-| => |    /    |
|Collection|    |Processing|    |Training|    |Tuning|    | Serving |
+----------+    +----------+    +--------+    +------+    +---------+
]]></artwork></artset></figure>

<t>In the renewed interest in deep neural networks, and the strong development of generative AI, a supervised learning approach has been favoured, using reference models. 
Supervised machine learning follows a cycle presented in <xref target="figureA-MLLC01"/>.</t>

<t>To obtain a reference model, first, data is collected from a variety of sources.
This data is then gathered and pre-processed, in order to clean it (align formatting, erase obvious measurement errors, <em>etc.</em>) and potentially to label it.
In particular, large data sets are divided into chunks, or tokens, which are the basic data units used as input or outputs of models. 
For instance, if the data set consists in a corpus of texts, tokens are words, subwords or short sequences of words.</t>

<t>The pre-processed data is used to train the reference model, <em>i.e.</em> convert the knowledge to extract from the pre-processed data into a set of parameters including weights ruling how the model will answer future requests.
Parameters are variables adjusting the structure underlying the model that are set during the training phase. 
Weights are a subste of the parameters, and determine how strong the ties are between some other parameters in the model.</t>

<t>Once the model has been trained, it can be used to infer from a request, or, in other words, to serve an insight from a request's data.
Inference operations are not necessarily done by the same nodes that have trained the model.
Models can be transferred to other worker nodes to perfom inference tasks, sometimes placed close to the users making requests.
Besides, those transferred models can be re-trained or fine-tuned in order to better serve requests in the context they are done. 
This can be done for instance with private or locally relevant data.</t>

</section>
<section anchor="SEC:A-MLRoles"><name>System model</name>

<t>The machine learning systems built to meet the requirements of use cases presented in <xref target="SEC:AIApplicability"/> are fundamentally distributed in order to meet scaling and time to answer requirements. 
Indeed, if we consider modern lareg language models, they use from 125 million to 175 billion parameters, where each parameters can be encoded with 4 bytes to 4 bits depending on the precision required in the answer provided by the model.
From a memory perspective, this means that storing a model and its parameters will cost from 62,5 MB (for a model using 125 million parameters with 4-bits parameters) to 700 GB (for a model using 175 billion parameters with 4 bytes parameters).
The memory footprint of modern large language models makes those models both difficult to manipulate on single nodes and to exchange data between nodes participating in a distributed task.</t>

<t>In machine learning systems' distribution, nodes can play specific roles, depending on their (hardware) capabilities or their location in the network.</t>

<t>Those roles, presented in <xref target="figureA-1"/> are:</t>

<t><list style="symbols">
  <t><strong>Data producer / Owner:</strong>  <vspace blankLines='1'/>
This entity is producing data from which users are willing to retrieve insights. 
It can be a sensor in a network, a server producing logs and interacting with a set of users, etc.</t>
  <t><strong>Data manager:</strong>  <vspace blankLines='1'/>
This entity is in charge of managing the data produced by the data producer. 
In that extend, it can pre-process, filter, add context (or metadata), store or transfer data to other entities in the system.
In its data management operations, the data manager has to take specific care of security and privacy aspects of data management. 
In particular, it must make sure that data is stored securely, transferred to authorized entities and that user's consent and privacy preferences are respected. 
To do so, it may use specialized encryption methods and protocols, meeting challenges presented in <xref target="SEC:MLSecAndPriv"/>.</t>
  <t><strong>Worker:</strong>  <vspace blankLines='1'/>
This entity is in charge of processing data retrieved from the data manager in order to gain insights from it. 
To do so, it can training a (potentially large) model during the model training phase; and personalize this model to better serve specific needs or requests from users during the inference phase.
In some specific cases, for instance, if the model from which the  inference is done is small, the worker might be alone, but given the operational requirements of new approaches in machine learning, workers need to collaborate with other workers to complete a task together.</t>
  <t><strong>(Model) Aggregator:</strong>  <vspace blankLines='1'/>
In case the training, personalization or fine tuning of a model is done by several collaborating entities, the aggregator is responsible for gathering the results of the individual tasks performed by the workers and synthetize them in a general model. 
This model can be sent back to the workers for subsequent processing.</t>
  <t><strong>Inference engine / Server:</strong>  <vspace blankLines='1'/>
This entity is in charge of producing inferences, <em>i.e.</em> deriving insights from a request done against a trained model. 
Those requests might be contextualized from a conversation, <em>i.e.</em> a sequence of requests and their answers.</t>
  <t><strong>Coordinator / Orchestrator:</strong>  <vspace blankLines='1'/>
This entity is in charge of orchestrating the execution of distributed tasks among the workers in charge. 
This coordination role might be done by means of a centralized node (<em>e.g.</em> a parameter server), a federation of locally responsible nodes or in a coordinated fashion using a consensus protocol.</t>
</list></t>

<figure title="Machine Learning syste model" anchor="figureA-1"><artset><artwork  type="svg" align="center" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="544" viewBox="0 0 544 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,96 L 8,144" fill="none" stroke="black"/>
<path d="M 8,176 L 8,224" fill="none" stroke="black"/>
<path d="M 8,256 L 8,304" fill="none" stroke="black"/>
<path d="M 80,96 L 80,144" fill="none" stroke="black"/>
<path d="M 80,176 L 80,224" fill="none" stroke="black"/>
<path d="M 80,256 L 80,304" fill="none" stroke="black"/>
<path d="M 120,32 L 120,96" fill="none" stroke="black"/>
<path d="M 120,160 L 120,240" fill="none" stroke="black"/>
<path d="M 152,104 L 152,152" fill="none" stroke="black"/>
<path d="M 184,160 L 184,240" fill="none" stroke="black"/>
<path d="M 224,176 L 224,208" fill="none" stroke="black"/>
<path d="M 232,104 L 232,128" fill="none" stroke="black"/>
<path d="M 240,104 L 240,144" fill="none" stroke="black"/>
<path d="M 240,208 L 240,224" fill="none" stroke="black"/>
<path d="M 248,104 L 248,168" fill="none" stroke="black"/>
<path d="M 256,224 L 256,240" fill="none" stroke="black"/>
<path d="M 280,176 L 280,208" fill="none" stroke="black"/>
<path d="M 296,64 L 296,96" fill="none" stroke="black"/>
<path d="M 296,192 L 296,224" fill="none" stroke="black"/>
<path d="M 312,208 L 312,240" fill="none" stroke="black"/>
<path d="M 376,208 L 376,240" fill="none" stroke="black"/>
<path d="M 392,192 L 392,224" fill="none" stroke="black"/>
<path d="M 400,32 L 400,96" fill="none" stroke="black"/>
<path d="M 408,176 L 408,208" fill="none" stroke="black"/>
<path d="M 424,64 L 424,96" fill="none" stroke="black"/>
<path d="M 440,104 L 440,168" fill="none" stroke="black"/>
<path d="M 448,104 L 448,144" fill="none" stroke="black"/>
<path d="M 456,104 L 456,128" fill="none" stroke="black"/>
<path d="M 456,224 L 456,240" fill="none" stroke="black"/>
<path d="M 472,208 L 472,224" fill="none" stroke="black"/>
<path d="M 480,64 L 480,96" fill="none" stroke="black"/>
<path d="M 488,176 L 488,208" fill="none" stroke="black"/>
<path d="M 120,32 L 400,32" fill="none" stroke="black"/>
<path d="M 296,64 L 400,64" fill="none" stroke="black"/>
<path d="M 424,64 L 480,64" fill="none" stroke="black"/>
<path d="M 496,80 L 528,80" fill="none" stroke="black"/>
<path d="M 8,96 L 80,96" fill="none" stroke="black"/>
<path d="M 120,96 L 400,96" fill="none" stroke="black"/>
<path d="M 424,96 L 480,96" fill="none" stroke="black"/>
<path d="M 8,144 L 80,144" fill="none" stroke="black"/>
<path d="M 120,160 L 184,160" fill="none" stroke="black"/>
<path d="M 8,176 L 80,176" fill="none" stroke="black"/>
<path d="M 224,176 L 280,176" fill="none" stroke="black"/>
<path d="M 408,176 L 488,176" fill="none" stroke="black"/>
<path d="M 192,192 L 208,192" fill="none" stroke="black"/>
<path d="M 280,192 L 296,192" fill="none" stroke="black"/>
<path d="M 392,192 L 408,192" fill="none" stroke="black"/>
<path d="M 88,208 L 104,208" fill="none" stroke="black"/>
<path d="M 192,208 L 208,208" fill="none" stroke="black"/>
<path d="M 224,208 L 280,208" fill="none" stroke="black"/>
<path d="M 296,208 L 312,208" fill="none" stroke="black"/>
<path d="M 376,208 L 392,208" fill="none" stroke="black"/>
<path d="M 408,208 L 488,208" fill="none" stroke="black"/>
<path d="M 8,224 L 80,224" fill="none" stroke="black"/>
<path d="M 192,224 L 208,224" fill="none" stroke="black"/>
<path d="M 240,224 L 296,224" fill="none" stroke="black"/>
<path d="M 392,224 L 472,224" fill="none" stroke="black"/>
<path d="M 120,240 L 184,240" fill="none" stroke="black"/>
<path d="M 256,240 L 312,240" fill="none" stroke="black"/>
<path d="M 376,240 L 456,240" fill="none" stroke="black"/>
<path d="M 8,256 L 80,256" fill="none" stroke="black"/>
<path d="M 216,288 L 232,288" fill="none" stroke="black"/>
<path d="M 304,288 L 320,288" fill="none" stroke="black"/>
<path d="M 352,288 L 376,288" fill="none" stroke="black"/>
<path d="M 480,288 L 504,288" fill="none" stroke="black"/>
<path d="M 8,304 L 80,304" fill="none" stroke="black"/>
<path d="M 96,144 L 104,160" fill="none" stroke="black"/>
<path d="M 360,144 L 388,200" fill="none" stroke="black"/>
<path d="M 364,104 L 404,184" fill="none" stroke="black"/>
<path d="M 388,104 L 420,168" fill="none" stroke="black"/>
<path d="M 96,256 L 104,240" fill="none" stroke="black"/>
<path d="M 264,176 L 300,104" fill="none" stroke="black"/>
<path d="M 280,192 L 324,104" fill="none" stroke="black"/>
<path d="M 296,208 L 348,104" fill="none" stroke="black"/>
<polygon class="arrowhead" points="512,288 500,282.4 500,293.6" fill="black" transform="rotate(0,504,288)"/>
<polygon class="arrowhead" points="504,80 492,74.4 492,85.6" fill="black" transform="rotate(180,496,80)"/>
<polygon class="arrowhead" points="464,128 452,122.4 452,133.6" fill="black" transform="rotate(90,456,128)"/>
<polygon class="arrowhead" points="456,144 444,138.4 444,149.6" fill="black" transform="rotate(90,448,144)"/>
<polygon class="arrowhead" points="448,168 436,162.4 436,173.6" fill="black" transform="rotate(90,440,168)"/>
<polygon class="arrowhead" points="428,168 416,162.4 416,173.6" fill="black" transform="rotate(63.43494882292201,420,168)"/>
<polygon class="arrowhead" points="412,184 400,178.4 400,189.6" fill="black" transform="rotate(63.43494882292201,404,184)"/>
<polygon class="arrowhead" points="396,200 384,194.4 384,205.6" fill="black" transform="rotate(63.43494882292201,388,200)"/>
<polygon class="arrowhead" points="360,288 348,282.4 348,293.6" fill="black" transform="rotate(180,352,288)"/>
<polygon class="arrowhead" points="356,104 344,98.4 344,109.6" fill="black" transform="rotate(296.565051177078,348,104)"/>
<polygon class="arrowhead" points="328,288 316,282.4 316,293.6" fill="black" transform="rotate(0,320,288)"/>
<polygon class="arrowhead" points="332,104 320,98.4 320,109.6" fill="black" transform="rotate(296.565051177078,324,104)"/>
<polygon class="arrowhead" points="308,104 296,98.4 296,109.6" fill="black" transform="rotate(296.565051177078,300,104)"/>
<polygon class="arrowhead" points="256,168 244,162.4 244,173.6" fill="black" transform="rotate(90,248,168)"/>
<polygon class="arrowhead" points="248,144 236,138.4 236,149.6" fill="black" transform="rotate(90,240,144)"/>
<polygon class="arrowhead" points="240,128 228,122.4 228,133.6" fill="black" transform="rotate(90,232,128)"/>
<polygon class="arrowhead" points="224,288 212,282.4 212,293.6" fill="black" transform="rotate(180,216,288)"/>
<polygon class="arrowhead" points="216,224 204,218.4 204,229.6" fill="black" transform="rotate(0,208,224)"/>
<polygon class="arrowhead" points="216,208 204,202.4 204,213.6" fill="black" transform="rotate(0,208,208)"/>
<polygon class="arrowhead" points="216,192 204,186.4 204,197.6" fill="black" transform="rotate(0,208,192)"/>
<polygon class="arrowhead" points="160,152 148,146.4 148,157.6" fill="black" transform="rotate(90,152,152)"/>
<polygon class="arrowhead" points="112,240 100,234.4 100,245.6" fill="black" transform="rotate(296.565051177078,104,240)"/>
<polygon class="arrowhead" points="112,208 100,202.4 100,213.6" fill="black" transform="rotate(0,104,208)"/>
<polygon class="arrowhead" points="112,160 100,154.4 100,165.6" fill="black" transform="rotate(63.43494882292201,104,160)"/>
<g class="text">
<text x="260" y="52">Orchestrator</text>
<text x="524" y="68">User</text>
<text x="348" y="84">Aggregator</text>
<text x="452" y="84">Server</text>
<text x="524" y="100">Req.</text>
<text x="44" y="116">Data</text>
<text x="44" y="132">Producer</text>
<text x="32" y="164">...</text>
<text x="44" y="196">Data</text>
<text x="148" y="196">Data</text>
<text x="252" y="196">Worker</text>
<text x="452" y="196">Worker</text>
<text x="44" y="212">Producer</text>
<text x="152" y="212">Manager</text>
<text x="40" y="244">...</text>
<text x="200" y="260">:</text>
<text x="336" y="260">:</text>
<text x="36" y="276">Data</text>
<text x="200" y="276">:</text>
<text x="336" y="276">:</text>
<text x="44" y="292">Producer</text>
<text x="200" y="292">:</text>
<text x="268" y="292">Training</text>
<text x="336" y="292">:</text>
<text x="432" y="292">Inference</text>
<text x="200" y="308">:</text>
<text x="336" y="308">:</text>
<text x="376" y="308">(with</text>
<text x="420" y="308">fine</text>
<text x="472" y="308">tuning)</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="center" name="syntax"><![CDATA[
              +----------------------------------+
              |           Orchestrator           |
              |                     +------------+  +------+   User
              |                     | Aggregator |  |Server| <----
+--------+    +---------------------+------------+  +------+   Req.
|  Data  |        |         |||     ^  ^  ^  \  \     ||| 
|Producer|        |         v||    /  /  /    \  \    ||v 
+--------+ \      v          v|   /  /  /   \  \  \   |v 
  ...       v +-------+       v  /  /  /     \  \  v  v  
+--------+    |       |    +----+-+/  /       \  v+-+-------+
|  Data  |    | Data  |--> |Worker+-+/         v+-+  Worker |
|Producer|--> |Manager|--> +-+----+ +-+       +-+ +-------+-+
+--------+    |       |-->   +-+----+ |       | +-------+-+
   ...      ^ +-------+        +------+       +---------+  
+--------+ /            :                :
| Data   |              :                :
|Producer|              : <--Training--> : <---  Inference --->
+--------+              :                :  (with fine tuning)
]]></artwork></artset></figure>

<t>Those functional roles can be arranged, managed and executed in many different way in a ML system. 
This arrangement determines how centralized and / or distributed a ML system is.</t>

</section>
<section anchor="SEC:A-parallelisationModes"><name>Parallelization modes</name>

<t>In model-based machine learning, training and inference phases follow a pipeline similar to the pipeline presented in <xref target="figureA-P1"/>. 
As mentionned in previous sections, given the size of currently used models and the amount of data required to either train or infer from a model, machine learning workloads need to be distributed. 
This distribution can follow different patterns (or a mix of those patterns): data parallelism, tensor parallelism, pipeline parallelism or mixture-of-expert parallelism.
Those patterns are presented in the following subsections.</t>

<figure title="Model-based AI pipeline" anchor="figureA-P1"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="504" viewBox="0 0 504 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,80 L 8,192" fill="none" stroke="black"/>
<path d="M 24,64 L 24,80" fill="none" stroke="black"/>
<path d="M 40,48 L 40,64" fill="none" stroke="black"/>
<path d="M 56,32 L 56,48" fill="none" stroke="black"/>
<path d="M 64,80 L 64,192" fill="none" stroke="black"/>
<path d="M 80,64 L 80,176" fill="none" stroke="black"/>
<path d="M 96,48 L 96,160" fill="none" stroke="black"/>
<path d="M 112,32 L 112,144" fill="none" stroke="black"/>
<path d="M 184,48 L 184,176" fill="none" stroke="black"/>
<path d="M 200,48 L 200,176" fill="none" stroke="black"/>
<path d="M 232,48 L 232,176" fill="none" stroke="black"/>
<path d="M 248,48 L 248,176" fill="none" stroke="black"/>
<path d="M 312,48 L 312,176" fill="none" stroke="black"/>
<path d="M 344,48 L 344,176" fill="none" stroke="black"/>
<path d="M 56,32 L 112,32" fill="none" stroke="black"/>
<path d="M 40,48 L 96,48" fill="none" stroke="black"/>
<path d="M 184,48 L 200,48" fill="none" stroke="black"/>
<path d="M 232,48 L 248,48" fill="none" stroke="black"/>
<path d="M 312,48 L 344,48" fill="none" stroke="black"/>
<path d="M 24,64 L 80,64" fill="none" stroke="black"/>
<path d="M 8,80 L 64,80" fill="none" stroke="black"/>
<path d="M 128,110 L 144,110" fill="none" stroke="black"/><path d="M 128,114 L 144,114" fill="none" stroke="black"/>
<path d="M 280,110 L 296,110" fill="none" stroke="black"/><path d="M 280,114 L 296,114" fill="none" stroke="black"/>
<path d="M 96,144 L 112,144" fill="none" stroke="black"/>
<path d="M 80,160 L 96,160" fill="none" stroke="black"/>
<path d="M 64,176 L 80,176" fill="none" stroke="black"/>
<path d="M 184,176 L 200,176" fill="none" stroke="black"/>
<path d="M 232,176 L 248,176" fill="none" stroke="black"/>
<path d="M 312,176 L 344,176" fill="none" stroke="black"/>
<path d="M 8,192 L 64,192" fill="none" stroke="black"/>
<path d="M 160,112 L 180,152" fill="none" stroke="black"/>
<path d="M 200,80 L 232,144" fill="none" stroke="black"/>
<path d="M 248,80 L 264,112" fill="none" stroke="black"/>
<path d="M 160,112 L 180,72" fill="none" stroke="black"/>
<path d="M 200,144 L 232,80" fill="none" stroke="black"/>
<path d="M 248,144 L 264,112" fill="none" stroke="black"/>
<polygon class="arrowhead" points="304,112 292,106.4 292,117.6" fill="black" transform="rotate(0,296,112)"/>
<polygon class="arrowhead" points="188,152 176,146.4 176,157.6" fill="black" transform="rotate(63.43494882292201,180,152)"/>
<polygon class="arrowhead" points="188,72 176,66.4 176,77.6" fill="black" transform="rotate(296.565051177078,180,72)"/>
<polygon class="arrowhead" points="152,112 140,106.4 140,117.6" fill="black" transform="rotate(0,144,112)"/>
<circle cx="160" cy="112" r="6" class="closeddot" fill="black"/>
<circle cx="216" cy="112" r="6" class="closeddot" fill="black"/>
<circle cx="264" cy="112" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="192" y="68">p</text>
<text x="240" y="68">p</text>
<text x="328" y="68">o</text>
<text x="192" y="84">a</text>
<text x="240" y="84">a</text>
<text x="328" y="84">u</text>
<text x="192" y="100">r</text>
<text x="240" y="100">r</text>
<text x="328" y="100">t</text>
<text x="192" y="116">a</text>
<text x="240" y="116">a</text>
<text x="328" y="116">p</text>
<text x="36" y="132">Data</text>
<text x="192" y="132">m</text>
<text x="240" y="132">m</text>
<text x="328" y="132">u</text>
<text x="192" y="148">s</text>
<text x="240" y="148">s</text>
<text x="328" y="148">t</text>
<text x="192" y="164">.</text>
<text x="240" y="164">.</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
      +------+                   
    +-+----+ |        +-+   +-+       +---+                   
  +-+----+ | |        |p|   |p|       | o |
+-+----+ | | |       ^|a+   +a+       | u |
|      | | | |      / |r|\ /|r|\      | t |
|      | | | | ==> *  |a| * |a| * ==> | p |
| Data | | | |      \ |m|/ \|m|/      | u |
|      | | +-+       v|s+   +s+       | t |
|      | +-+          |.|   |.|       |   |
|      +-+            +-+   +-+       +---+
+------+      
]]></artwork></artset></figure>

<section anchor="SEC:A-dataParallelism"><name>Data parallelism</name>

<t>Data parallelism is the oldest among the parallelization patterns we highlighted. 
It has been introduced in <xref target="DataParallelism"/>. 
As presented in <xref target="figureA-P2"/>, data parallelism consists in the partitioning of the data used in a given machine learning task in a set of batches that are used to train or tune the model. 
In data parallelism, a node manipulates a complete model and change its parameters using the data partition it has been allocated. 
The result of the tasks performed in parallel by the workers are aggregated by an aggregator node at the end of the pipeline. 
The model parameters resulting from this aggregation are transmitted back to the workers for future use of the model in order that each worker benefits from the work done by others in parallel.</t>

<figure title="Data-parallel AI pipeline" anchor="figureA-P2"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="528" viewBox="0 0 528 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,144 L 8,256" fill="none" stroke="black"/>
<path d="M 24,128 L 24,144" fill="none" stroke="black"/>
<path d="M 40,112 L 40,128" fill="none" stroke="black"/>
<path d="M 56,96 L 56,112" fill="none" stroke="black"/>
<path d="M 64,144 L 64,256" fill="none" stroke="black"/>
<path d="M 80,128 L 80,240" fill="none" stroke="black"/>
<path d="M 96,112 L 96,224" fill="none" stroke="black"/>
<path d="M 112,96 L 112,208" fill="none" stroke="black"/>
<path d="M 152,48 L 152,160" fill="none" stroke="black"/>
<path d="M 152,208 L 152,320" fill="none" stroke="black"/>
<path d="M 208,48 L 208,160" fill="none" stroke="black"/>
<path d="M 208,208 L 208,320" fill="none" stroke="black"/>
<path d="M 280,32 L 280,160" fill="none" stroke="black"/>
<path d="M 280,192 L 280,320" fill="none" stroke="black"/>
<path d="M 296,32 L 296,160" fill="none" stroke="black"/>
<path d="M 296,192 L 296,320" fill="none" stroke="black"/>
<path d="M 328,32 L 328,160" fill="none" stroke="black"/>
<path d="M 328,192 L 328,320" fill="none" stroke="black"/>
<path d="M 344,32 L 344,160" fill="none" stroke="black"/>
<path d="M 344,192 L 344,320" fill="none" stroke="black"/>
<path d="M 408,32 L 408,160" fill="none" stroke="black"/>
<path d="M 408,192 L 408,320" fill="none" stroke="black"/>
<path d="M 440,32 L 440,160" fill="none" stroke="black"/>
<path d="M 440,192 L 440,320" fill="none" stroke="black"/>
<path d="M 480,112 L 480,240" fill="none" stroke="black"/>
<path d="M 512,112 L 512,240" fill="none" stroke="black"/>
<path d="M 280,32 L 296,32" fill="none" stroke="black"/>
<path d="M 328,32 L 344,32" fill="none" stroke="black"/>
<path d="M 408,32 L 440,32" fill="none" stroke="black"/>
<path d="M 152,48 L 208,48" fill="none" stroke="black"/>
<path d="M 56,96 L 112,96" fill="none" stroke="black"/>
<path d="M 224,94 L 240,94" fill="none" stroke="black"/><path d="M 224,98 L 240,98" fill="none" stroke="black"/>
<path d="M 376,94 L 392,94" fill="none" stroke="black"/><path d="M 376,98 L 392,98" fill="none" stroke="black"/>
<path d="M 40,112 L 96,112" fill="none" stroke="black"/>
<path d="M 480,112 L 512,112" fill="none" stroke="black"/>
<path d="M 24,128 L 80,128" fill="none" stroke="black"/>
<path d="M 8,144 L 64,144" fill="none" stroke="black"/>
<path d="M 152,160 L 208,160" fill="none" stroke="black"/>
<path d="M 280,160 L 296,160" fill="none" stroke="black"/>
<path d="M 328,160 L 344,160" fill="none" stroke="black"/>
<path d="M 408,160 L 440,160" fill="none" stroke="black"/>
<path d="M 280,192 L 296,192" fill="none" stroke="black"/>
<path d="M 328,192 L 344,192" fill="none" stroke="black"/>
<path d="M 408,192 L 440,192" fill="none" stroke="black"/>
<path d="M 96,208 L 112,208" fill="none" stroke="black"/>
<path d="M 152,208 L 208,208" fill="none" stroke="black"/>
<path d="M 80,224 L 96,224" fill="none" stroke="black"/>
<path d="M 64,240 L 80,240" fill="none" stroke="black"/>
<path d="M 480,240 L 512,240" fill="none" stroke="black"/>
<path d="M 8,256 L 64,256" fill="none" stroke="black"/>
<path d="M 224,254 L 240,254" fill="none" stroke="black"/><path d="M 224,258 L 240,258" fill="none" stroke="black"/>
<path d="M 376,254 L 392,254" fill="none" stroke="black"/><path d="M 376,258 L 392,258" fill="none" stroke="black"/>
<path d="M 152,320 L 208,320" fill="none" stroke="black"/>
<path d="M 280,320 L 296,320" fill="none" stroke="black"/>
<path d="M 328,320 L 344,320" fill="none" stroke="black"/>
<path d="M 408,320 L 440,320" fill="none" stroke="black"/>
<path d="M 128,208 L 136,224" fill="none" stroke="black"/>
<path d="M 256,256 L 276,296" fill="none" stroke="black"/>
<path d="M 296,224 L 328,288" fill="none" stroke="black"/>
<path d="M 256,96 L 276,136" fill="none" stroke="black"/>
<path d="M 344,224 L 360,256" fill="none" stroke="black"/>
<path d="M 296,64 L 328,128" fill="none" stroke="black"/>
<path d="M 344,64 L 360,96" fill="none" stroke="black"/>
<path d="M 456,128 L 464,144" fill="none" stroke="black"/>
<path d="M 128,144 L 136,128" fill="none" stroke="black"/>
<path d="M 256,96 L 276,56" fill="none" stroke="black"/>
<path d="M 296,128 L 328,64" fill="none" stroke="black"/>
<path d="M 256,256 L 276,216" fill="none" stroke="black"/>
<path d="M 344,128 L 360,96" fill="none" stroke="black"/>
<path d="M 296,288 L 328,224" fill="none" stroke="black"/>
<path d="M 344,288 L 360,256" fill="none" stroke="black"/>
<path d="M 456,224 L 464,208" fill="none" stroke="black"/>
<polygon class="arrowhead" points="472,208 460,202.4 460,213.6" fill="black" transform="rotate(296.565051177078,464,208)"/>
<polygon class="arrowhead" points="472,144 460,138.4 460,149.6" fill="black" transform="rotate(63.43494882292201,464,144)"/>
<polygon class="arrowhead" points="400,256 388,250.4 388,261.6" fill="black" transform="rotate(0,392,256)"/>
<polygon class="arrowhead" points="400,96 388,90.4 388,101.6" fill="black" transform="rotate(0,392,96)"/>
<polygon class="arrowhead" points="284,296 272,290.4 272,301.6" fill="black" transform="rotate(63.43494882292201,276,296)"/>
<polygon class="arrowhead" points="284,216 272,210.4 272,221.6" fill="black" transform="rotate(296.565051177078,276,216)"/>
<polygon class="arrowhead" points="284,136 272,130.4 272,141.6" fill="black" transform="rotate(63.43494882292201,276,136)"/>
<polygon class="arrowhead" points="284,56 272,50.4 272,61.6" fill="black" transform="rotate(296.565051177078,276,56)"/>
<polygon class="arrowhead" points="248,256 236,250.4 236,261.6" fill="black" transform="rotate(0,240,256)"/>
<polygon class="arrowhead" points="248,96 236,90.4 236,101.6" fill="black" transform="rotate(0,240,96)"/>
<polygon class="arrowhead" points="144,224 132,218.4 132,229.6" fill="black" transform="rotate(63.43494882292201,136,224)"/>
<polygon class="arrowhead" points="144,128 132,122.4 132,133.6" fill="black" transform="rotate(296.565051177078,136,128)"/>
<circle cx="256" cy="96" r="6" class="closeddot" fill="black"/>
<circle cx="256" cy="256" r="6" class="closeddot" fill="black"/>
<circle cx="312" cy="96" r="6" class="closeddot" fill="black"/>
<circle cx="312" cy="256" r="6" class="closeddot" fill="black"/>
<circle cx="360" cy="96" r="6" class="closeddot" fill="black"/>
<circle cx="360" cy="256" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="288" y="52">p</text>
<text x="336" y="52">p</text>
<text x="416" y="52">i</text>
<text x="432" y="52">o</text>
<text x="288" y="68">a</text>
<text x="336" y="68">a</text>
<text x="416" y="68">n</text>
<text x="432" y="68">u</text>
<text x="288" y="84">r</text>
<text x="336" y="84">r</text>
<text x="416" y="84">t</text>
<text x="432" y="84">t</text>
<text x="180" y="100">Data</text>
<text x="288" y="100">a</text>
<text x="336" y="100">a</text>
<text x="416" y="100">e</text>
<text x="432" y="100">p</text>
<text x="180" y="116">01</text>
<text x="288" y="116">m</text>
<text x="336" y="116">m</text>
<text x="416" y="116">r</text>
<text x="432" y="116">u</text>
<text x="288" y="132">s</text>
<text x="336" y="132">s</text>
<text x="416" y="132">i</text>
<text x="432" y="132">t</text>
<text x="496" y="132">o</text>
<text x="288" y="148">.</text>
<text x="336" y="148">.</text>
<text x="416" y="148">m</text>
<text x="496" y="148">u</text>
<text x="496" y="164">t</text>
<text x="496" y="180">p</text>
<text x="36" y="196">Data</text>
<text x="496" y="196">u</text>
<text x="288" y="212">p</text>
<text x="336" y="212">p</text>
<text x="416" y="212">i</text>
<text x="432" y="212">o</text>
<text x="496" y="212">t</text>
<text x="288" y="228">a</text>
<text x="336" y="228">a</text>
<text x="416" y="228">n</text>
<text x="432" y="228">u</text>
<text x="288" y="244">r</text>
<text x="336" y="244">r</text>
<text x="416" y="244">t</text>
<text x="432" y="244">t</text>
<text x="180" y="260">Data</text>
<text x="288" y="260">a</text>
<text x="336" y="260">a</text>
<text x="416" y="260">e</text>
<text x="432" y="260">p</text>
<text x="180" y="276">02</text>
<text x="288" y="276">m</text>
<text x="336" y="276">m</text>
<text x="416" y="276">r</text>
<text x="432" y="276">u</text>
<text x="288" y="292">s</text>
<text x="336" y="292">s</text>
<text x="416" y="292">i</text>
<text x="432" y="292">t</text>
<text x="288" y="308">.</text>
<text x="336" y="308">.</text>
<text x="416" y="308">m</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                                  +-+   +-+       +---+ 
                  +-+----+        |p|   |p|       |i o| 
                  |      |       ^|a+   +a+       |n u|
                  |      |      / |r|\ /|r|\      |t t| 
      +------+    | Data | ==> *  |a| * |a| * ==> |e p| 
    +-+----+ |    |  01  |      \ |m|/ \|m|/      |r u|    +---+ 
  +-+----+ | |  ^ |      |       v|s+   +s+       |i t| \  | o | 
+-+----+ | | | /  |      +        |.|   |.|       |m  |  v | u | 
|      | | | |    +------+        +-+   +-+       +---+    | t |
|      | | | |                                             | p |
| Data | | | |                    +-+   +-+       +---+    | u |
|      | | +-+ \  +-+----+        |p|   |p|       |i o|  ^ | t |
|      | +-+    v |      |       ^|a+   +a+       |n u| /  |   |
|      +-+        |      |      / |r|\ /|r|\      |t t|    +---+
+------+          | Data | ==> *  |a| * |a| * ==> |e p|
                  |  02  |      \ |m|/ \|m|/      |r u|
                  |      |       v|s+   +s+       |i t|
                  |      +        |.|   |.|       |m  |
                  +------+        +-+   +-+       +---+
]]></artwork></artset></figure>

<t>In this pattern, the workers are only weakly synchronized, once the model has been aggregated and its parameters sent back. 
In that extend, data parallelism can sustain up to seconds latency in the synchronization traffic.
Yet, as parameters are sent back by the aggregator to all the ndes for the entire model, the volume of data exchanged between training iterations of inference tasks can be quite large.
Besides, the aggregator is a focal point in the traffic between nodes, which can raise traffic management challenges.</t>

</section>
<section anchor="SEC:A-modelParallelism"><name>Model parallelism</name>

<t>For the last few years, models involved in machine learning tasks have increased in size, making their use by single nodes complex. 
To allow the training and inference of larger models, some parallelization patterns have been designed to spilt models among several worker nodes: <strong>pipeline parallelism</strong> and <strong>tensor parallelism</strong>.</t>

<section anchor="SEC:A-pipelineMp"><name>Pipeline parallelism</name>

<t>Pipeline parallelism, described in <xref target="PipelineParallelism"/>, takes advantage of the fact that models used in deep neural networks are structured in layers. 
In pipeline parallelism, as shown in <xref target="figureA-P4"/>, a model is separated into stages consisting in a few consecutive layers of the entire model. 
Each stage is allocated to a separate worker node. 
Each stage is executed using the intermediate results from the previous stage, and after each iteration, the parameters from adjacent stages are used to refine the model's stage held by the worker node.</t>

<figure title="Pipeline model-parallel AI pipeline" anchor="figureA-P4"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="632" viewBox="0 0 632 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,80 L 8,192" fill="none" stroke="black"/>
<path d="M 24,64 L 24,80" fill="none" stroke="black"/>
<path d="M 40,48 L 40,64" fill="none" stroke="black"/>
<path d="M 56,32 L 56,48" fill="none" stroke="black"/>
<path d="M 64,80 L 64,192" fill="none" stroke="black"/>
<path d="M 80,64 L 80,176" fill="none" stroke="black"/>
<path d="M 96,48 L 96,160" fill="none" stroke="black"/>
<path d="M 112,32 L 112,144" fill="none" stroke="black"/>
<path d="M 184,48 L 184,176" fill="none" stroke="black"/>
<path d="M 200,48 L 200,176" fill="none" stroke="black"/>
<path d="M 264,48 L 264,176" fill="none" stroke="black"/>
<path d="M 296,48 L 296,176" fill="none" stroke="black"/>
<path d="M 360,48 L 360,176" fill="none" stroke="black"/>
<path d="M 376,48 L 376,176" fill="none" stroke="black"/>
<path d="M 440,48 L 440,176" fill="none" stroke="black"/>
<path d="M 472,48 L 472,176" fill="none" stroke="black"/>
<path d="M 56,32 L 112,32" fill="none" stroke="black"/>
<path d="M 40,48 L 96,48" fill="none" stroke="black"/>
<path d="M 184,48 L 200,48" fill="none" stroke="black"/>
<path d="M 264,48 L 296,48" fill="none" stroke="black"/>
<path d="M 360,48 L 376,48" fill="none" stroke="black"/>
<path d="M 440,48 L 472,48" fill="none" stroke="black"/>
<path d="M 24,64 L 80,64" fill="none" stroke="black"/>
<path d="M 8,80 L 64,80" fill="none" stroke="black"/>
<path d="M 128,110 L 144,110" fill="none" stroke="black"/><path d="M 128,114 L 144,114" fill="none" stroke="black"/>
<path d="M 232,110 L 248,110" fill="none" stroke="black"/><path d="M 232,114 L 248,114" fill="none" stroke="black"/>
<path d="M 312,110 L 328,110" fill="none" stroke="black"/><path d="M 312,114 L 328,114" fill="none" stroke="black"/>
<path d="M 408,110 L 424,110" fill="none" stroke="black"/><path d="M 408,114 L 424,114" fill="none" stroke="black"/>
<path d="M 96,144 L 112,144" fill="none" stroke="black"/>
<path d="M 80,160 L 96,160" fill="none" stroke="black"/>
<path d="M 64,176 L 80,176" fill="none" stroke="black"/>
<path d="M 184,176 L 200,176" fill="none" stroke="black"/>
<path d="M 264,176 L 296,176" fill="none" stroke="black"/>
<path d="M 360,176 L 376,176" fill="none" stroke="black"/>
<path d="M 440,176 L 472,176" fill="none" stroke="black"/>
<path d="M 8,192 L 64,192" fill="none" stroke="black"/>
<path d="M 160,112 L 180,152" fill="none" stroke="black"/>
<path d="M 200,80 L 216,112" fill="none" stroke="black"/>
<path d="M 344,112 L 360,144" fill="none" stroke="black"/>
<path d="M 376,80 L 392,112" fill="none" stroke="black"/>
<path d="M 160,112 L 180,72" fill="none" stroke="black"/>
<path d="M 200,144 L 216,112" fill="none" stroke="black"/>
<path d="M 344,112 L 360,80" fill="none" stroke="black"/>
<path d="M 376,144 L 392,112" fill="none" stroke="black"/>
<polygon class="arrowhead" points="432,112 420,106.4 420,117.6" fill="black" transform="rotate(0,424,112)"/>
<polygon class="arrowhead" points="336,112 324,106.4 324,117.6" fill="black" transform="rotate(0,328,112)"/>
<polygon class="arrowhead" points="256,112 244,106.4 244,117.6" fill="black" transform="rotate(0,248,112)"/>
<polygon class="arrowhead" points="188,152 176,146.4 176,157.6" fill="black" transform="rotate(63.43494882292201,180,152)"/>
<polygon class="arrowhead" points="188,72 176,66.4 176,77.6" fill="black" transform="rotate(296.565051177078,180,72)"/>
<polygon class="arrowhead" points="152,112 140,106.4 140,117.6" fill="black" transform="rotate(0,144,112)"/>
<circle cx="160" cy="112" r="6" class="closeddot" fill="black"/>
<circle cx="216" cy="112" r="6" class="closeddot" fill="black"/>
<circle cx="344" cy="112" r="6" class="closeddot" fill="black"/>
<circle cx="392" cy="112" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="192" y="68">p</text>
<text x="272" y="68">i</text>
<text x="288" y="68">o</text>
<text x="368" y="68">p</text>
<text x="456" y="68">o</text>
<text x="192" y="84">a</text>
<text x="272" y="84">n</text>
<text x="288" y="84">u</text>
<text x="368" y="84">a</text>
<text x="456" y="84">u</text>
<text x="192" y="100">r</text>
<text x="272" y="100">t</text>
<text x="288" y="100">t</text>
<text x="368" y="100">r</text>
<text x="456" y="100">t</text>
<text x="192" y="116">a</text>
<text x="272" y="116">e</text>
<text x="288" y="116">p</text>
<text x="368" y="116">a</text>
<text x="456" y="116">p</text>
<text x="36" y="132">Data</text>
<text x="192" y="132">m</text>
<text x="272" y="132">r</text>
<text x="288" y="132">u</text>
<text x="368" y="132">m</text>
<text x="456" y="132">u</text>
<text x="192" y="148">s</text>
<text x="272" y="148">i</text>
<text x="288" y="148">t</text>
<text x="368" y="148">s</text>
<text x="456" y="148">t</text>
<text x="144" y="164">:</text>
<text x="192" y="164">.</text>
<text x="224" y="164">:</text>
<text x="272" y="164">m</text>
<text x="336" y="164">:</text>
<text x="368" y="164">.</text>
<text x="416" y="164">:</text>
<text x="144" y="180">:</text>
<text x="224" y="180">:</text>
<text x="336" y="180">:</text>
<text x="416" y="180">:</text>
<text x="144" y="196">:</text>
<text x="224" y="196">:</text>
<text x="336" y="196">:</text>
<text x="416" y="196">:</text>
<text x="144" y="212">:</text>
<text x="176" y="212">Stage</text>
<text x="208" y="212">1</text>
<text x="224" y="212">:</text>
<text x="336" y="212">:</text>
<text x="368" y="212">Stage</text>
<text x="400" y="212">2</text>
<text x="416" y="212">:</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
      +------+                   
    +-+----+ |        +-+       +---+       +-+       +---+                   
  +-+----+ | |        |p|       |i o|       |p|       | o |
+-+----+ | | |       ^|a+       |n u|       +a+       | u |
|      | | | |      / |r|\      |t t|      /|r|\      | t |
|      | | | | ==> *  |a| * ==> |e p| ==> * |a| * ==> | p |
| Data | | | |      \ |m|/      |r u|      \|m|/      | u |
|      | | +-+       v|s+       |i t|       +s+       | t |
|      | +-+     :    |.|  :    |m  |    :  |.|    :  |   |
|      +-+       :    +-+  :    +---+    :  +-+    :  +---+
+------+         :         :             :         :
                 : Stage 1 :             : Stage 2 :
]]></artwork></artset></figure>

<t>In this pattern, the communication volume between node can be less important than in data parallellism, as each node only communicates with nodes holding adjacent layers.
Yet, as stage iteration can be faster to execute, communications can be more frequent.</t>

</section>
<section anchor="SEC:A-tensorMp"><name>Tensor parallelism</name>

<t>Tensor parallelism, stemming from the work presented in <xref target="TensorParallelism"/>, is taking advantage of the fact that training and inference operations in model-based machine learning are using operations on matrixes that can be split according to several dimensions. 
In comparison with pipeline parallellism, tensor parallelism is a pattern in which layers are split into chunks that can be operated by different nodes, as shown on <xref target="figureA-P3"/>.
Tensor paralellism can be naively presented as a split in the model parameter space rather than along the layer / stage dimension.</t>

<figure title="Tensor model-parallel AI pipeline" anchor="figureA-P3"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="592" viewBox="0 0 592 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,128 L 8,240" fill="none" stroke="black"/>
<path d="M 24,112 L 24,128" fill="none" stroke="black"/>
<path d="M 40,96 L 40,112" fill="none" stroke="black"/>
<path d="M 56,80 L 56,96" fill="none" stroke="black"/>
<path d="M 64,128 L 64,240" fill="none" stroke="black"/>
<path d="M 80,112 L 80,224" fill="none" stroke="black"/>
<path d="M 96,96 L 96,208" fill="none" stroke="black"/>
<path d="M 112,80 L 112,192" fill="none" stroke="black"/>
<path d="M 152,32 L 152,128" fill="none" stroke="black"/>
<path d="M 152,192 L 152,288" fill="none" stroke="black"/>
<path d="M 168,136 L 168,184" fill="none" stroke="black"/>
<path d="M 184,32 L 184,128" fill="none" stroke="black"/>
<path d="M 184,192 L 184,288" fill="none" stroke="black"/>
<path d="M 216,32 L 216,128" fill="none" stroke="black"/>
<path d="M 216,192 L 216,288" fill="none" stroke="black"/>
<path d="M 232,136 L 232,184" fill="none" stroke="black"/>
<path d="M 248,32 L 248,128" fill="none" stroke="black"/>
<path d="M 248,192 L 248,288" fill="none" stroke="black"/>
<path d="M 312,32 L 312,128" fill="none" stroke="black"/>
<path d="M 312,192 L 312,288" fill="none" stroke="black"/>
<path d="M 344,32 L 344,128" fill="none" stroke="black"/>
<path d="M 344,192 L 344,288" fill="none" stroke="black"/>
<path d="M 384,96 L 384,224" fill="none" stroke="black"/>
<path d="M 416,96 L 416,224" fill="none" stroke="black"/>
<path d="M 152,32 L 184,32" fill="none" stroke="black"/>
<path d="M 216,32 L 248,32" fill="none" stroke="black"/>
<path d="M 312,32 L 344,32" fill="none" stroke="black"/>
<path d="M 56,80 L 112,80" fill="none" stroke="black"/>
<path d="M 280,78 L 296,78" fill="none" stroke="black"/><path d="M 280,82 L 296,82" fill="none" stroke="black"/>
<path d="M 40,96 L 96,96" fill="none" stroke="black"/>
<path d="M 384,96 L 416,96" fill="none" stroke="black"/>
<path d="M 24,112 L 80,112" fill="none" stroke="black"/>
<path d="M 8,128 L 64,128" fill="none" stroke="black"/>
<path d="M 152,128 L 184,128" fill="none" stroke="black"/>
<path d="M 216,128 L 248,128" fill="none" stroke="black"/>
<path d="M 312,128 L 344,128" fill="none" stroke="black"/>
<path d="M 96,192 L 112,192" fill="none" stroke="black"/>
<path d="M 152,192 L 184,192" fill="none" stroke="black"/>
<path d="M 216,192 L 248,192" fill="none" stroke="black"/>
<path d="M 312,192 L 344,192" fill="none" stroke="black"/>
<path d="M 80,208 L 96,208" fill="none" stroke="black"/>
<path d="M 64,224 L 80,224" fill="none" stroke="black"/>
<path d="M 384,224 L 416,224" fill="none" stroke="black"/>
<path d="M 8,240 L 64,240" fill="none" stroke="black"/>
<path d="M 280,238 L 296,238" fill="none" stroke="black"/><path d="M 280,242 L 296,242" fill="none" stroke="black"/>
<path d="M 152,288 L 184,288" fill="none" stroke="black"/>
<path d="M 216,288 L 248,288" fill="none" stroke="black"/>
<path d="M 312,288 L 344,288" fill="none" stroke="black"/>
<path d="M 128,192 L 136,208" fill="none" stroke="black"/>
<path d="M 184,208 L 216,272" fill="none" stroke="black"/>
<path d="M 248,208 L 264,240" fill="none" stroke="black"/>
<path d="M 184,48 L 216,112" fill="none" stroke="black"/>
<path d="M 248,48 L 264,80" fill="none" stroke="black"/>
<path d="M 360,112 L 368,128" fill="none" stroke="black"/>
<path d="M 128,128 L 136,112" fill="none" stroke="black"/>
<path d="M 184,112 L 216,48" fill="none" stroke="black"/>
<path d="M 248,112 L 264,80" fill="none" stroke="black"/>
<path d="M 184,272 L 216,208" fill="none" stroke="black"/>
<path d="M 248,272 L 264,240" fill="none" stroke="black"/>
<path d="M 360,208 L 368,192" fill="none" stroke="black"/>
<polygon class="arrowhead" points="376,192 364,186.4 364,197.6" fill="black" transform="rotate(296.565051177078,368,192)"/>
<polygon class="arrowhead" points="376,128 364,122.4 364,133.6" fill="black" transform="rotate(63.43494882292201,368,128)"/>
<polygon class="arrowhead" points="304,240 292,234.4 292,245.6" fill="black" transform="rotate(0,296,240)"/>
<polygon class="arrowhead" points="304,80 292,74.4 292,85.6" fill="black" transform="rotate(0,296,80)"/>
<polygon class="arrowhead" points="240,184 228,178.4 228,189.6" fill="black" transform="rotate(90,232,184)"/>
<polygon class="arrowhead" points="240,136 228,130.4 228,141.6" fill="black" transform="rotate(270,232,136)"/>
<polygon class="arrowhead" points="176,184 164,178.4 164,189.6" fill="black" transform="rotate(90,168,184)"/>
<polygon class="arrowhead" points="176,136 164,130.4 164,141.6" fill="black" transform="rotate(270,168,136)"/>
<polygon class="arrowhead" points="144,208 132,202.4 132,213.6" fill="black" transform="rotate(63.43494882292201,136,208)"/>
<polygon class="arrowhead" points="144,112 132,106.4 132,117.6" fill="black" transform="rotate(296.565051177078,136,112)"/>
<circle cx="200" cy="80" r="6" class="closeddot" fill="black"/>
<circle cx="200" cy="240" r="6" class="closeddot" fill="black"/>
<circle cx="264" cy="80" r="6" class="closeddot" fill="black"/>
<circle cx="264" cy="240" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="160" y="52">p</text>
<text x="176" y="52">p</text>
<text x="224" y="52">p</text>
<text x="240" y="52">p</text>
<text x="320" y="52">i</text>
<text x="336" y="52">o</text>
<text x="160" y="68">a</text>
<text x="176" y="68">a</text>
<text x="224" y="68">a</text>
<text x="240" y="68">a</text>
<text x="320" y="68">n</text>
<text x="336" y="68">u</text>
<text x="160" y="84">r</text>
<text x="176" y="84">r</text>
<text x="224" y="84">r</text>
<text x="240" y="84">r</text>
<text x="320" y="84">t</text>
<text x="336" y="84">t</text>
<text x="160" y="100">a</text>
<text x="176" y="100">t</text>
<text x="224" y="100">a</text>
<text x="240" y="100">t</text>
<text x="320" y="100">e</text>
<text x="336" y="100">p</text>
<text x="160" y="116">m</text>
<text x="176" y="116">1</text>
<text x="224" y="116">m</text>
<text x="240" y="116">1</text>
<text x="320" y="116">r</text>
<text x="336" y="116">.</text>
<text x="400" y="116">o</text>
<text x="400" y="132">u</text>
<text x="400" y="148">t</text>
<text x="400" y="164">p</text>
<text x="36" y="180">Data</text>
<text x="400" y="180">u</text>
<text x="400" y="196">t</text>
<text x="160" y="212">p</text>
<text x="176" y="212">p</text>
<text x="224" y="212">p</text>
<text x="240" y="212">p</text>
<text x="320" y="212">i</text>
<text x="336" y="212">o</text>
<text x="160" y="228">a</text>
<text x="176" y="228">a</text>
<text x="224" y="228">a</text>
<text x="240" y="228">a</text>
<text x="320" y="228">n</text>
<text x="336" y="228">u</text>
<text x="160" y="244">r</text>
<text x="176" y="244">r</text>
<text x="224" y="244">r</text>
<text x="240" y="244">r</text>
<text x="320" y="244">t</text>
<text x="336" y="244">t</text>
<text x="160" y="260">a</text>
<text x="176" y="260">t</text>
<text x="224" y="260">a</text>
<text x="240" y="260">t</text>
<text x="320" y="260">e</text>
<text x="336" y="260">p</text>
<text x="160" y="276">m</text>
<text x="176" y="276">2</text>
<text x="224" y="276">m</text>
<text x="240" y="276">2</text>
<text x="320" y="276">r</text>
<text x="336" y="276">.</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                  +---+   +---+       +---+
                  |p p+   +p p+       |i o|
                  |a a|\ /|a a|\      |n u|
      +------+    |r r| * |r r| * ==> |t t|
    +-+----+ |    |a t|/ \|a t|/      |e p|    +---+
  +-+----+ | |  ^ |m 1+   +m 1+       |r .| \  | o |
+-+----+ | | | /  +---+   +---+       +---+  v | u |
|      | | | |      ^       ^                  | t |
|      | | | |      |       |                  | p |      
| Data | | | |      v       v                  | u |  
|      | | +-+ \  +---+   +---+       +---+  ^ | t |  
|      | +-+    v |p p+   +p p+       |i o| /  |   | 
|      +-+        |a a|\ /|a a|\      |n u|    +---+
+------+          |r r| * |r r| * ==> |t t|    
                  |a t|/ \|a t|/      |e p|
                  |m 2+   +m 2+       |r .|        
                  +---+   +---+       +---+                              
]]></artwork></artset></figure>

<t>In tensor parallellism, nodes holding chunks of the same model (or of the same stage) need to communicate during the execution of a model (or stage) iteration. 
This involves even tighter latency requirements compared with pipeline parallelism for inter-node communications.</t>

</section>
</section>
<section anchor="SEC:A-moeParallelism"><name>Mixture of Expert parallelism</name>

<t>Mixture of experts (MoE) parallelism stems from an idea introduced in <xref target="MoEParallelism1"/> and adapted to deep neural networks in <xref target="MoEParallelism2"/>.
In MoE parallellism, nodes are holding smaller but specialized models trained over a smaller amount of data and holding fewer parameters. 
When a request or specific token is submitted to a MoE model, a gateway node, the router, takes a decision about which model instance to use against the specific token or request that has been submitted. 
After the selected worker executed the task against the token or request, the result is given, and considered as the result given by the whole model.</t>

<figure title="Mixture of Expert parallel AI pipeline" anchor="figureA-P5"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="472" viewBox="0 0 472 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,112 L 8,224" fill="none" stroke="black"/>
<path d="M 24,96 L 24,112" fill="none" stroke="black"/>
<path d="M 40,80 L 40,96" fill="none" stroke="black"/>
<path d="M 56,64 L 56,80" fill="none" stroke="black"/>
<path d="M 64,112 L 64,224" fill="none" stroke="black"/>
<path d="M 80,96 L 80,208" fill="none" stroke="black"/>
<path d="M 96,80 L 96,192" fill="none" stroke="black"/>
<path d="M 112,64 L 112,176" fill="none" stroke="black"/>
<path d="M 160,128 L 160,160" fill="none" stroke="black"/>
<path d="M 216,128 L 216,160" fill="none" stroke="black"/>
<path d="M 240,32 L 240,128" fill="none" stroke="black"/>
<path d="M 240,160 L 240,256" fill="none" stroke="black"/>
<path d="M 272,32 L 272,128" fill="none" stroke="black"/>
<path d="M 272,160 L 272,256" fill="none" stroke="black"/>
<path d="M 304,32 L 304,128" fill="none" stroke="black"/>
<path d="M 304,160 L 304,256" fill="none" stroke="black"/>
<path d="M 336,32 L 336,128" fill="none" stroke="black"/>
<path d="M 336,160 L 336,256" fill="none" stroke="black"/>
<path d="M 384,80 L 384,208" fill="none" stroke="black"/>
<path d="M 416,80 L 416,208" fill="none" stroke="black"/>
<path d="M 240,32 L 272,32" fill="none" stroke="black"/>
<path d="M 304,32 L 336,32" fill="none" stroke="black"/>
<path d="M 56,64 L 112,64" fill="none" stroke="black"/>
<path d="M 40,80 L 96,80" fill="none" stroke="black"/>
<path d="M 384,80 L 416,80" fill="none" stroke="black"/>
<path d="M 24,96 L 80,96" fill="none" stroke="black"/>
<path d="M 8,112 L 64,112" fill="none" stroke="black"/>
<path d="M 160,128 L 216,128" fill="none" stroke="black"/>
<path d="M 240,128 L 272,128" fill="none" stroke="black"/>
<path d="M 304,128 L 336,128" fill="none" stroke="black"/>
<path d="M 128,142 L 144,142" fill="none" stroke="black"/><path d="M 128,146 L 144,146" fill="none" stroke="black"/>
<path d="M 232,144 L 344,144" fill="none" stroke="black"/>
<path d="M 160,160 L 216,160" fill="none" stroke="black"/>
<path d="M 240,160 L 272,160" fill="none" stroke="black"/>
<path d="M 304,160 L 336,160" fill="none" stroke="black"/>
<path d="M 96,176 L 112,176" fill="none" stroke="black"/>
<path d="M 80,192 L 96,192" fill="none" stroke="black"/>
<path d="M 64,208 L 80,208" fill="none" stroke="black"/>
<path d="M 384,208 L 416,208" fill="none" stroke="black"/>
<path d="M 8,224 L 64,224" fill="none" stroke="black"/>
<path d="M 240,256 L 272,256" fill="none" stroke="black"/>
<path d="M 304,256 L 336,256" fill="none" stroke="black"/>
<path d="M 272,176 L 304,240" fill="none" stroke="black"/>
<path d="M 272,48 L 304,112" fill="none" stroke="black"/>
<path d="M 336,48 L 368,112" fill="none" stroke="black"/>
<path d="M 212,120 L 224,96" fill="none" stroke="black"/>
<path d="M 272,112 L 304,48" fill="none" stroke="black"/>
<path d="M 272,240 L 304,176" fill="none" stroke="black"/>
<path d="M 336,112 L 352,80" fill="none" stroke="black"/>
<polygon class="arrowhead" points="376,112 364,106.4 364,117.6" fill="black" transform="rotate(63.43494882292201,368,112)"/>
<polygon class="arrowhead" points="232,96 220,90.4 220,101.6" fill="black" transform="rotate(296.565051177078,224,96)"/>
<polygon class="arrowhead" points="152,144 140,138.4 140,149.6" fill="black" transform="rotate(0,144,144)"/>
<circle cx="288" cy="80" r="6" class="closeddot" fill="black"/>
<circle cx="288" cy="208" r="6" class="closeddot" fill="black"/>
<circle cx="352" cy="80" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="248" y="52">p</text>
<text x="264" y="52">s</text>
<text x="312" y="52">p</text>
<text x="328" y="52">s</text>
<text x="248" y="68">a</text>
<text x="264" y="68">e</text>
<text x="312" y="68">a</text>
<text x="328" y="68">e</text>
<text x="248" y="84">r</text>
<text x="264" y="84">t</text>
<text x="312" y="84">r</text>
<text x="328" y="84">t</text>
<text x="248" y="100">a</text>
<text x="264" y="100">.</text>
<text x="312" y="100">a</text>
<text x="328" y="100">.</text>
<text x="400" y="100">o</text>
<text x="248" y="116">m</text>
<text x="264" y="116">1</text>
<text x="312" y="116">m</text>
<text x="328" y="116">1</text>
<text x="400" y="116">u</text>
<text x="400" y="132">t</text>
<text x="188" y="148">Router</text>
<text x="400" y="148">p</text>
<text x="36" y="164">Data</text>
<text x="400" y="164">u</text>
<text x="248" y="180">p</text>
<text x="264" y="180">s</text>
<text x="312" y="180">p</text>
<text x="328" y="180">s</text>
<text x="400" y="180">t</text>
<text x="248" y="196">a</text>
<text x="264" y="196">e</text>
<text x="312" y="196">a</text>
<text x="328" y="196">e</text>
<text x="248" y="212">r</text>
<text x="264" y="212">t</text>
<text x="312" y="212">r</text>
<text x="328" y="212">t</text>
<text x="248" y="228">a</text>
<text x="264" y="228">.</text>
<text x="312" y="228">a</text>
<text x="328" y="228">.</text>
<text x="248" y="244">m</text>
<text x="264" y="244">2</text>
<text x="312" y="244">m</text>
<text x="328" y="244">2</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                             +---+   +---+  
                             |p s+   +p s+  
      +------+               |a e|\ /|a e|\ 
    +-+----+ |               |r t| * |r t| *   +---+
  +-+----+ | |             ^ |a .|/ \|a .|/ \  | o |
+-+----+ | | |            /  |m 1+   +m 1+   v | u |
|      | | | |     +------+  +---+   +---+     | t |
|      | | | | ==> |Router| ---------------    | p |      
| Data | | | |     +------+  +---+   +---+     | u |  
|      | | +-+               |p s+   +p s|     | t |  
|      | +-+                 |a e|\ /|a e|     |   | 
|      +-+                   |r t| * |r t|     +---+
+------+                     |a .|/ \|a .|
                             |m 2+   +m 2|
                             +---+   +---+            
]]></artwork></artset></figure>

<t>In MoE parallellism, the router plays a major role, and is a communication focal point.</t>

</section>
</section>
<section anchor="SEC:A-collectiveCommunicationMethods"><name>Collective communication methods</name>

<t>In their development, distributed machine learning systems benefit from collective communication libraries such as NCCL (<xref target="NCCL"/>) or RCCL (<xref target="RCCL"/>) to abstract the setup and management of the connections used to exchange data between worker nodes involved in distributed training or inference tasks.
As presented in <xref target="xCCL"/> or in <xref target="I-D.yao-tsvwg-cco-problem-statement-and-usecases"/>, those libraries introduce collective communication methodss, used in accordance with parallelization modes presented in <xref target="SEC:A-parallelisationModes"/>.</t>

<t>To better explain what are the main collective communication methods, we consider a collective consisting in four nodes. 
Those nodes exchange pieces of data in the frame of the execution of a distributed machine learning task.
The topology underlying the connections between those nodes is not detailed at this stage.
The major collective communication methods are:</t>

<section anchor="broadcast"><name>Broadcast</name>

<t>This collective communication method is very intuitive to understand for networking people, as its behaviour is the same as when a host broadcasts a packet in an IP-based network. In the broadcast collective communication, method, a node (N.1) is sending the same information to all the nodes participating in the collective. No data transformation is performed during this operation.</t>

<figure title="Broadcast method" anchor="figureA-LCC1"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="552" viewBox="0 0 552 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,176 L 8,208" fill="none" stroke="black"/>
<path d="M 56,176 L 56,208" fill="none" stroke="black"/>
<path d="M 72,176 L 72,208" fill="none" stroke="black"/>
<path d="M 120,176 L 120,208" fill="none" stroke="black"/>
<path d="M 136,176 L 136,208" fill="none" stroke="black"/>
<path d="M 184,176 L 184,208" fill="none" stroke="black"/>
<path d="M 200,176 L 200,208" fill="none" stroke="black"/>
<path d="M 208,96 L 208,128" fill="none" stroke="black"/>
<path d="M 240,96 L 240,128" fill="none" stroke="black"/>
<path d="M 248,176 L 248,208" fill="none" stroke="black"/>
<path d="M 256,32 L 256,64" fill="none" stroke="black"/>
<path d="M 256,112 L 256,144" fill="none" stroke="black"/>
<path d="M 272,72 L 272,104" fill="none" stroke="black"/>
<path d="M 288,32 L 288,64" fill="none" stroke="black"/>
<path d="M 288,112 L 288,144" fill="none" stroke="black"/>
<path d="M 296,176 L 296,208" fill="none" stroke="black"/>
<path d="M 304,96 L 304,128" fill="none" stroke="black"/>
<path d="M 336,96 L 336,128" fill="none" stroke="black"/>
<path d="M 344,176 L 344,208" fill="none" stroke="black"/>
<path d="M 360,176 L 360,208" fill="none" stroke="black"/>
<path d="M 408,176 L 408,208" fill="none" stroke="black"/>
<path d="M 424,176 L 424,208" fill="none" stroke="black"/>
<path d="M 472,176 L 472,208" fill="none" stroke="black"/>
<path d="M 488,176 L 488,208" fill="none" stroke="black"/>
<path d="M 536,176 L 536,208" fill="none" stroke="black"/>
<path d="M 256,32 L 288,32" fill="none" stroke="black"/>
<path d="M 256,64 L 288,64" fill="none" stroke="black"/>
<path d="M 208,96 L 240,96" fill="none" stroke="black"/>
<path d="M 304,96 L 336,96" fill="none" stroke="black"/>
<path d="M 256,112 L 288,112" fill="none" stroke="black"/>
<path d="M 208,128 L 240,128" fill="none" stroke="black"/>
<path d="M 304,128 L 336,128" fill="none" stroke="black"/>
<path d="M 256,144 L 288,144" fill="none" stroke="black"/>
<path d="M 8,176 L 56,176" fill="none" stroke="black"/>
<path d="M 72,176 L 120,176" fill="none" stroke="black"/>
<path d="M 136,176 L 184,176" fill="none" stroke="black"/>
<path d="M 200,176 L 248,176" fill="none" stroke="black"/>
<path d="M 296,176 L 344,176" fill="none" stroke="black"/>
<path d="M 360,176 L 408,176" fill="none" stroke="black"/>
<path d="M 424,176 L 472,176" fill="none" stroke="black"/>
<path d="M 488,176 L 536,176" fill="none" stroke="black"/>
<path d="M 88,192 L 104,192" fill="none" stroke="black"/>
<path d="M 152,192 L 168,192" fill="none" stroke="black"/>
<path d="M 216,192 L 232,192" fill="none" stroke="black"/>
<path d="M 264,190 L 280,190" fill="none" stroke="black"/><path d="M 264,194 L 280,194" fill="none" stroke="black"/>
<path d="M 8,208 L 56,208" fill="none" stroke="black"/>
<path d="M 72,208 L 120,208" fill="none" stroke="black"/>
<path d="M 136,208 L 184,208" fill="none" stroke="black"/>
<path d="M 200,208 L 248,208" fill="none" stroke="black"/>
<path d="M 296,208 L 344,208" fill="none" stroke="black"/>
<path d="M 360,208 L 408,208" fill="none" stroke="black"/>
<path d="M 424,208 L 472,208" fill="none" stroke="black"/>
<path d="M 488,208 L 536,208" fill="none" stroke="black"/>
<path d="M 288,48 L 308,88" fill="none" stroke="black"/>
<path d="M 236,88 L 256,48" fill="none" stroke="black"/>
<polygon class="arrowhead" points="316,88 304,82.4 304,93.6" fill="black" transform="rotate(63.43494882292201,308,88)"/>
<polygon class="arrowhead" points="288,192 276,186.4 276,197.6" fill="black" transform="rotate(0,280,192)"/>
<polygon class="arrowhead" points="280,104 268,98.4 268,109.6" fill="black" transform="rotate(90,272,104)"/>
<polygon class="arrowhead" points="244,88 232,82.4 232,93.6" fill="black" transform="rotate(116.56505117707799,236,88)"/>
<g class="text">
<text x="272" y="52">N.1</text>
<text x="224" y="116">N.2</text>
<text x="320" y="116">N.3</text>
<text x="272" y="132">N.4</text>
<text x="32" y="164">N.1</text>
<text x="96" y="164">N.2</text>
<text x="160" y="164">N.3</text>
<text x="224" y="164">N.4</text>
<text x="320" y="164">N.1</text>
<text x="384" y="164">N.2</text>
<text x="448" y="164">N.3</text>
<text x="512" y="164">N.4</text>
<text x="32" y="196">D.1</text>
<text x="320" y="196">D.1</text>
<text x="384" y="196">D.1</text>
<text x="448" y="196">D.1</text>
<text x="512" y="196">D.1</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                               +---+
                               +N.1+
                              /+---+\
                             v   |   v
                         +---+   v   +---+
                         |N.2| +---+ |N.3|
                         +---+ |N.4| +---+
                               +---+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| D.1 | | --- | | --- | | --- | ==> | D.1 | | D.1 | | D.1 | | D.1 |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
<section anchor="reduce"><name>Reduce</name>

<t>In this collective communication method, the data exchange is combined with an operation on the received data to produce an output. 
During a Reduce operation, the nodes involved in the collective send their data to an aggregator processing the received inputs <em>I.1</em> ... <em>I.4</em> using an operator <em>f</em> to obtain <em>Out</em>. 
<em>Out</em> is then provided to one of the nodes in the collective (N.1). 
Note that most of the time, the aggregation is done by one node in the collective, carrying the aggregator function.</t>

<figure title="Reduce method" anchor="figureA-LCC2"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="552" viewBox="0 0 552 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,208 L 8,240" fill="none" stroke="black"/>
<path d="M 56,208 L 56,240" fill="none" stroke="black"/>
<path d="M 72,208 L 72,240" fill="none" stroke="black"/>
<path d="M 120,208 L 120,240" fill="none" stroke="black"/>
<path d="M 136,208 L 136,240" fill="none" stroke="black"/>
<path d="M 168,128 L 168,176" fill="none" stroke="black"/>
<path d="M 184,32 L 184,64" fill="none" stroke="black"/>
<path d="M 184,208 L 184,240" fill="none" stroke="black"/>
<path d="M 192,72 L 192,120" fill="none" stroke="black"/>
<path d="M 200,208 L 200,240" fill="none" stroke="black"/>
<path d="M 208,72 L 208,120" fill="none" stroke="black"/>
<path d="M 216,32 L 216,64" fill="none" stroke="black"/>
<path d="M 232,32 L 232,64" fill="none" stroke="black"/>
<path d="M 240,72 L 240,120" fill="none" stroke="black"/>
<path d="M 248,208 L 248,240" fill="none" stroke="black"/>
<path d="M 264,32 L 264,64" fill="none" stroke="black"/>
<path d="M 280,32 L 280,64" fill="none" stroke="black"/>
<path d="M 288,72 L 288,120" fill="none" stroke="black"/>
<path d="M 296,208 L 296,240" fill="none" stroke="black"/>
<path d="M 312,32 L 312,64" fill="none" stroke="black"/>
<path d="M 328,32 L 328,64" fill="none" stroke="black"/>
<path d="M 336,72 L 336,120" fill="none" stroke="black"/>
<path d="M 344,208 L 344,240" fill="none" stroke="black"/>
<path d="M 360,32 L 360,64" fill="none" stroke="black"/>
<path d="M 360,208 L 360,240" fill="none" stroke="black"/>
<path d="M 376,128 L 376,176" fill="none" stroke="black"/>
<path d="M 408,208 L 408,240" fill="none" stroke="black"/>
<path d="M 424,208 L 424,240" fill="none" stroke="black"/>
<path d="M 472,208 L 472,240" fill="none" stroke="black"/>
<path d="M 488,208 L 488,240" fill="none" stroke="black"/>
<path d="M 536,208 L 536,240" fill="none" stroke="black"/>
<path d="M 184,32 L 216,32" fill="none" stroke="black"/>
<path d="M 232,32 L 264,32" fill="none" stroke="black"/>
<path d="M 280,32 L 312,32" fill="none" stroke="black"/>
<path d="M 328,32 L 360,32" fill="none" stroke="black"/>
<path d="M 184,64 L 216,64" fill="none" stroke="black"/>
<path d="M 232,64 L 264,64" fill="none" stroke="black"/>
<path d="M 280,64 L 312,64" fill="none" stroke="black"/>
<path d="M 328,64 L 360,64" fill="none" stroke="black"/>
<path d="M 168,128 L 376,128" fill="none" stroke="black"/>
<path d="M 168,176 L 376,176" fill="none" stroke="black"/>
<path d="M 8,208 L 56,208" fill="none" stroke="black"/>
<path d="M 72,208 L 120,208" fill="none" stroke="black"/>
<path d="M 136,208 L 184,208" fill="none" stroke="black"/>
<path d="M 200,208 L 248,208" fill="none" stroke="black"/>
<path d="M 296,208 L 344,208" fill="none" stroke="black"/>
<path d="M 360,208 L 408,208" fill="none" stroke="black"/>
<path d="M 424,208 L 472,208" fill="none" stroke="black"/>
<path d="M 488,208 L 536,208" fill="none" stroke="black"/>
<path d="M 264,222 L 280,222" fill="none" stroke="black"/><path d="M 264,226 L 280,226" fill="none" stroke="black"/>
<path d="M 376,224 L 392,224" fill="none" stroke="black"/>
<path d="M 440,224 L 456,224" fill="none" stroke="black"/>
<path d="M 504,224 L 520,224" fill="none" stroke="black"/>
<path d="M 8,240 L 56,240" fill="none" stroke="black"/>
<path d="M 72,240 L 120,240" fill="none" stroke="black"/>
<path d="M 136,240 L 184,240" fill="none" stroke="black"/>
<path d="M 200,240 L 248,240" fill="none" stroke="black"/>
<path d="M 296,240 L 344,240" fill="none" stroke="black"/>
<path d="M 360,240 L 408,240" fill="none" stroke="black"/>
<path d="M 424,240 L 472,240" fill="none" stroke="black"/>
<path d="M 488,240 L 536,240" fill="none" stroke="black"/>
<polygon class="arrowhead" points="344,120 332,114.4 332,125.6" fill="black" transform="rotate(90,336,120)"/>
<polygon class="arrowhead" points="296,120 284,114.4 284,125.6" fill="black" transform="rotate(90,288,120)"/>
<polygon class="arrowhead" points="288,224 276,218.4 276,229.6" fill="black" transform="rotate(0,280,224)"/>
<polygon class="arrowhead" points="248,120 236,114.4 236,125.6" fill="black" transform="rotate(90,240,120)"/>
<polygon class="arrowhead" points="216,72 204,66.4 204,77.6" fill="black" transform="rotate(270,208,72)"/>
<polygon class="arrowhead" points="200,120 188,114.4 188,125.6" fill="black" transform="rotate(90,192,120)"/>
<g class="text">
<text x="200" y="52">N.1</text>
<text x="248" y="52">N.2</text>
<text x="296" y="52">N.3</text>
<text x="344" y="52">N.4</text>
<text x="276" y="148">Aggregator</text>
<text x="268" y="164">f(I.1,I.2,I.4,I.4)=Out</text>
<text x="32" y="196">N.1</text>
<text x="96" y="196">N.2</text>
<text x="160" y="196">N.3</text>
<text x="224" y="196">N.4</text>
<text x="320" y="196">N.1</text>
<text x="384" y="196">N.2</text>
<text x="448" y="196">N.3</text>
<text x="512" y="196">N.4</text>
<text x="32" y="228">I.1</text>
<text x="96" y="228">I.2</text>
<text x="160" y="228">I.3</text>
<text x="224" y="228">I.4</text>
<text x="320" y="228">Out</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                      +---+ +---+ +---+ +---+
                      |N.1| |N.2| |N.3| |N.4|
                      +---+ +---+ +---+ +---+  
                       | ^   |     |     |    
                       | |   |     |     |    
                       v |   v     v     v    
                    +-------------------------+
                    |        Aggregator       |
                    | f(I.1,I.2,I.4,I.4)=Out  |
                    +-------------------------+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| I.1 | | I.2 | | I.3 | | I.4 | ==> | Out | | --- | | --- | | --- |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
<section anchor="scatter"><name>Scatter</name>

<t>In this collective communication method, a node in the collective splits the data it has into equal size chunks, and distribute a different chunk to every single other node in the collective, in order to distribute the data evenly.</t>

<figure title="Scatter method" anchor="figureA-LCC3"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="552" viewBox="0 0 552 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,176 L 8,256" fill="none" stroke="black"/>
<path d="M 56,176 L 56,256" fill="none" stroke="black"/>
<path d="M 72,176 L 72,256" fill="none" stroke="black"/>
<path d="M 120,176 L 120,256" fill="none" stroke="black"/>
<path d="M 136,176 L 136,256" fill="none" stroke="black"/>
<path d="M 184,176 L 184,256" fill="none" stroke="black"/>
<path d="M 200,176 L 200,256" fill="none" stroke="black"/>
<path d="M 208,96 L 208,128" fill="none" stroke="black"/>
<path d="M 240,96 L 240,128" fill="none" stroke="black"/>
<path d="M 248,176 L 248,256" fill="none" stroke="black"/>
<path d="M 256,32 L 256,64" fill="none" stroke="black"/>
<path d="M 256,112 L 256,144" fill="none" stroke="black"/>
<path d="M 272,72 L 272,104" fill="none" stroke="black"/>
<path d="M 288,32 L 288,64" fill="none" stroke="black"/>
<path d="M 288,112 L 288,144" fill="none" stroke="black"/>
<path d="M 296,176 L 296,256" fill="none" stroke="black"/>
<path d="M 304,96 L 304,128" fill="none" stroke="black"/>
<path d="M 336,96 L 336,128" fill="none" stroke="black"/>
<path d="M 344,176 L 344,256" fill="none" stroke="black"/>
<path d="M 360,176 L 360,256" fill="none" stroke="black"/>
<path d="M 408,176 L 408,256" fill="none" stroke="black"/>
<path d="M 424,176 L 424,256" fill="none" stroke="black"/>
<path d="M 472,176 L 472,256" fill="none" stroke="black"/>
<path d="M 488,176 L 488,256" fill="none" stroke="black"/>
<path d="M 536,176 L 536,256" fill="none" stroke="black"/>
<path d="M 256,32 L 288,32" fill="none" stroke="black"/>
<path d="M 256,64 L 288,64" fill="none" stroke="black"/>
<path d="M 208,96 L 240,96" fill="none" stroke="black"/>
<path d="M 304,96 L 336,96" fill="none" stroke="black"/>
<path d="M 256,112 L 288,112" fill="none" stroke="black"/>
<path d="M 208,128 L 240,128" fill="none" stroke="black"/>
<path d="M 304,128 L 336,128" fill="none" stroke="black"/>
<path d="M 256,144 L 288,144" fill="none" stroke="black"/>
<path d="M 8,176 L 56,176" fill="none" stroke="black"/>
<path d="M 72,176 L 120,176" fill="none" stroke="black"/>
<path d="M 136,176 L 184,176" fill="none" stroke="black"/>
<path d="M 200,176 L 248,176" fill="none" stroke="black"/>
<path d="M 296,176 L 344,176" fill="none" stroke="black"/>
<path d="M 360,176 L 408,176" fill="none" stroke="black"/>
<path d="M 424,176 L 472,176" fill="none" stroke="black"/>
<path d="M 488,176 L 536,176" fill="none" stroke="black"/>
<path d="M 88,192 L 104,192" fill="none" stroke="black"/>
<path d="M 152,192 L 168,192" fill="none" stroke="black"/>
<path d="M 216,192 L 232,192" fill="none" stroke="black"/>
<path d="M 376,192 L 392,192" fill="none" stroke="black"/>
<path d="M 440,192 L 456,192" fill="none" stroke="black"/>
<path d="M 504,192 L 520,192" fill="none" stroke="black"/>
<path d="M 88,208 L 104,208" fill="none" stroke="black"/>
<path d="M 152,208 L 168,208" fill="none" stroke="black"/>
<path d="M 216,208 L 232,208" fill="none" stroke="black"/>
<path d="M 264,206 L 280,206" fill="none" stroke="black"/><path d="M 264,210 L 280,210" fill="none" stroke="black"/>
<path d="M 312,208 L 328,208" fill="none" stroke="black"/>
<path d="M 440,208 L 456,208" fill="none" stroke="black"/>
<path d="M 504,208 L 520,208" fill="none" stroke="black"/>
<path d="M 88,224 L 104,224" fill="none" stroke="black"/>
<path d="M 152,224 L 168,224" fill="none" stroke="black"/>
<path d="M 216,224 L 232,224" fill="none" stroke="black"/>
<path d="M 312,224 L 328,224" fill="none" stroke="black"/>
<path d="M 376,224 L 392,224" fill="none" stroke="black"/>
<path d="M 504,224 L 520,224" fill="none" stroke="black"/>
<path d="M 88,240 L 104,240" fill="none" stroke="black"/>
<path d="M 152,240 L 168,240" fill="none" stroke="black"/>
<path d="M 216,240 L 232,240" fill="none" stroke="black"/>
<path d="M 312,240 L 328,240" fill="none" stroke="black"/>
<path d="M 376,240 L 392,240" fill="none" stroke="black"/>
<path d="M 440,240 L 456,240" fill="none" stroke="black"/>
<path d="M 8,256 L 56,256" fill="none" stroke="black"/>
<path d="M 72,256 L 120,256" fill="none" stroke="black"/>
<path d="M 136,256 L 184,256" fill="none" stroke="black"/>
<path d="M 200,256 L 248,256" fill="none" stroke="black"/>
<path d="M 296,256 L 344,256" fill="none" stroke="black"/>
<path d="M 360,256 L 408,256" fill="none" stroke="black"/>
<path d="M 424,256 L 472,256" fill="none" stroke="black"/>
<path d="M 488,256 L 536,256" fill="none" stroke="black"/>
<path d="M 288,48 L 308,88" fill="none" stroke="black"/>
<path d="M 236,88 L 256,48" fill="none" stroke="black"/>
<polygon class="arrowhead" points="316,88 304,82.4 304,93.6" fill="black" transform="rotate(63.43494882292201,308,88)"/>
<polygon class="arrowhead" points="288,208 276,202.4 276,213.6" fill="black" transform="rotate(0,280,208)"/>
<polygon class="arrowhead" points="280,104 268,98.4 268,109.6" fill="black" transform="rotate(90,272,104)"/>
<polygon class="arrowhead" points="244,88 232,82.4 232,93.6" fill="black" transform="rotate(116.56505117707799,236,88)"/>
<g class="text">
<text x="272" y="52">N.1</text>
<text x="224" y="116">N.2</text>
<text x="320" y="116">N.3</text>
<text x="272" y="132">N.4</text>
<text x="32" y="164">N.1</text>
<text x="96" y="164">N.2</text>
<text x="160" y="164">N.3</text>
<text x="224" y="164">N.4</text>
<text x="320" y="164">N.1</text>
<text x="384" y="164">N.2</text>
<text x="448" y="164">N.3</text>
<text x="512" y="164">N.4</text>
<text x="32" y="196">D.1</text>
<text x="320" y="196">D.1</text>
<text x="32" y="212">D.2</text>
<text x="384" y="212">D.2</text>
<text x="32" y="228">D.3</text>
<text x="448" y="228">D.3</text>
<text x="32" y="244">D.4</text>
<text x="512" y="244">D.4</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                               +---+
                               +N.1+
                              /+---+\
                             v   |   v
                         +---+   v   +---+
                         |N.2| +---+ |N.3|
                         +---+ |N.4| +---+
                               +---+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| D.1 | | --- | | --- | | --- |     | D.1 | | --- | | --- | | --- |
| D.2 | | --- | | --- | | --- | ==> | --- | | D.2 | | --- | | --- |
| D.3 | | --- | | --- | | --- |     | --- | | --- | | D.3 | | --- |
| D.4 | | --- | | --- | | --- |     | --- | | --- | | --- | | D.4 |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
<section anchor="all-gather"><name>All-Gather</name>

<t>This collective communication method can be seen as a simultaneous broadcast done by every node in the collective. 
Indeed, in an All-gather operation, every node sends the data it has to every other nodes in the collective, so that in the end, every node has a copy of every piece of data held by the nodes in the collective before the operation.</t>

<figure title="All-gather method" anchor="figureA-LCC4"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="552" viewBox="0 0 552 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,224 L 8,304" fill="none" stroke="black"/>
<path d="M 56,224 L 56,304" fill="none" stroke="black"/>
<path d="M 72,224 L 72,304" fill="none" stroke="black"/>
<path d="M 120,224 L 120,304" fill="none" stroke="black"/>
<path d="M 136,224 L 136,304" fill="none" stroke="black"/>
<path d="M 184,224 L 184,304" fill="none" stroke="black"/>
<path d="M 200,96 L 200,128" fill="none" stroke="black"/>
<path d="M 200,224 L 200,304" fill="none" stroke="black"/>
<path d="M 232,96 L 232,128" fill="none" stroke="black"/>
<path d="M 248,224 L 248,304" fill="none" stroke="black"/>
<path d="M 256,32 L 256,64" fill="none" stroke="black"/>
<path d="M 256,160 L 256,192" fill="none" stroke="black"/>
<path d="M 272,96 L 272,128" fill="none" stroke="black"/>
<path d="M 288,32 L 288,64" fill="none" stroke="black"/>
<path d="M 288,160 L 288,192" fill="none" stroke="black"/>
<path d="M 296,224 L 296,304" fill="none" stroke="black"/>
<path d="M 312,96 L 312,128" fill="none" stroke="black"/>
<path d="M 344,96 L 344,128" fill="none" stroke="black"/>
<path d="M 344,224 L 344,304" fill="none" stroke="black"/>
<path d="M 360,224 L 360,304" fill="none" stroke="black"/>
<path d="M 408,224 L 408,304" fill="none" stroke="black"/>
<path d="M 424,224 L 424,304" fill="none" stroke="black"/>
<path d="M 472,224 L 472,304" fill="none" stroke="black"/>
<path d="M 488,224 L 488,304" fill="none" stroke="black"/>
<path d="M 536,224 L 536,304" fill="none" stroke="black"/>
<path d="M 256,32 L 288,32" fill="none" stroke="black"/>
<path d="M 256,64 L 288,64" fill="none" stroke="black"/>
<path d="M 200,96 L 232,96" fill="none" stroke="black"/>
<path d="M 312,96 L 344,96" fill="none" stroke="black"/>
<path d="M 248,112 L 264,112" fill="none" stroke="black"/>
<path d="M 280,112 L 296,112" fill="none" stroke="black"/>
<path d="M 200,128 L 232,128" fill="none" stroke="black"/>
<path d="M 312,128 L 344,128" fill="none" stroke="black"/>
<path d="M 256,160 L 288,160" fill="none" stroke="black"/>
<path d="M 256,192 L 288,192" fill="none" stroke="black"/>
<path d="M 8,224 L 56,224" fill="none" stroke="black"/>
<path d="M 72,224 L 120,224" fill="none" stroke="black"/>
<path d="M 136,224 L 184,224" fill="none" stroke="black"/>
<path d="M 200,224 L 248,224" fill="none" stroke="black"/>
<path d="M 296,224 L 344,224" fill="none" stroke="black"/>
<path d="M 360,224 L 408,224" fill="none" stroke="black"/>
<path d="M 424,224 L 472,224" fill="none" stroke="black"/>
<path d="M 488,224 L 536,224" fill="none" stroke="black"/>
<path d="M 88,240 L 104,240" fill="none" stroke="black"/>
<path d="M 152,240 L 168,240" fill="none" stroke="black"/>
<path d="M 216,240 L 232,240" fill="none" stroke="black"/>
<path d="M 24,256 L 40,256" fill="none" stroke="black"/>
<path d="M 152,256 L 168,256" fill="none" stroke="black"/>
<path d="M 216,256 L 232,256" fill="none" stroke="black"/>
<path d="M 264,254 L 280,254" fill="none" stroke="black"/><path d="M 264,258 L 280,258" fill="none" stroke="black"/>
<path d="M 24,272 L 40,272" fill="none" stroke="black"/>
<path d="M 88,272 L 104,272" fill="none" stroke="black"/>
<path d="M 216,272 L 232,272" fill="none" stroke="black"/>
<path d="M 24,288 L 40,288" fill="none" stroke="black"/>
<path d="M 88,288 L 104,288" fill="none" stroke="black"/>
<path d="M 152,288 L 168,288" fill="none" stroke="black"/>
<path d="M 8,304 L 56,304" fill="none" stroke="black"/>
<path d="M 72,304 L 120,304" fill="none" stroke="black"/>
<path d="M 136,304 L 184,304" fill="none" stroke="black"/>
<path d="M 200,304 L 248,304" fill="none" stroke="black"/>
<path d="M 296,304 L 344,304" fill="none" stroke="black"/>
<path d="M 360,304 L 408,304" fill="none" stroke="black"/>
<path d="M 424,304 L 472,304" fill="none" stroke="black"/>
<path d="M 488,304 L 536,304" fill="none" stroke="black"/>
<path d="M 220,136 L 240,176" fill="none" stroke="black"/>
<path d="M 304,48 L 324,88" fill="none" stroke="black"/>
<path d="M 220,88 L 240,48" fill="none" stroke="black"/>
<path d="M 304,176 L 324,136" fill="none" stroke="black"/>
<polygon class="arrowhead" points="332,136 320,130.4 320,141.6" fill="black" transform="rotate(296.565051177078,324,136)"/>
<polygon class="arrowhead" points="332,88 320,82.4 320,93.6" fill="black" transform="rotate(63.43494882292201,324,88)"/>
<polygon class="arrowhead" points="312,176 300,170.4 300,181.6" fill="black" transform="rotate(116.56505117707799,304,176)"/>
<polygon class="arrowhead" points="312,48 300,42.4 300,53.6" fill="black" transform="rotate(243.43494882292202,304,48)"/>
<polygon class="arrowhead" points="304,112 292,106.4 292,117.6" fill="black" transform="rotate(0,296,112)"/>
<polygon class="arrowhead" points="288,256 276,250.4 276,261.6" fill="black" transform="rotate(0,280,256)"/>
<polygon class="arrowhead" points="280,128 268,122.4 268,133.6" fill="black" transform="rotate(90,272,128)"/>
<polygon class="arrowhead" points="280,96 268,90.4 268,101.6" fill="black" transform="rotate(270,272,96)"/>
<polygon class="arrowhead" points="256,112 244,106.4 244,117.6" fill="black" transform="rotate(180,248,112)"/>
<polygon class="arrowhead" points="248,176 236,170.4 236,181.6" fill="black" transform="rotate(63.43494882292201,240,176)"/>
<polygon class="arrowhead" points="248,48 236,42.4 236,53.6" fill="black" transform="rotate(296.565051177078,240,48)"/>
<polygon class="arrowhead" points="228,136 216,130.4 216,141.6" fill="black" transform="rotate(243.43494882292202,220,136)"/>
<polygon class="arrowhead" points="228,88 216,82.4 216,93.6" fill="black" transform="rotate(116.56505117707799,220,88)"/>
<g class="text">
<text x="272" y="52">N.1</text>
<text x="216" y="116">N.2</text>
<text x="328" y="116">N.3</text>
<text x="272" y="180">N.4</text>
<text x="32" y="212">N.1</text>
<text x="96" y="212">N.2</text>
<text x="160" y="212">N.3</text>
<text x="224" y="212">N.4</text>
<text x="320" y="212">N.1</text>
<text x="384" y="212">N.2</text>
<text x="448" y="212">N.3</text>
<text x="512" y="212">N.4</text>
<text x="32" y="244">D.1</text>
<text x="320" y="244">D.1</text>
<text x="384" y="244">D.1</text>
<text x="448" y="244">D.1</text>
<text x="512" y="244">D.1</text>
<text x="96" y="260">D.2</text>
<text x="320" y="260">D.2</text>
<text x="384" y="260">D.2</text>
<text x="448" y="260">D.2</text>
<text x="512" y="260">D.2</text>
<text x="160" y="276">D.3</text>
<text x="320" y="276">D.3</text>
<text x="384" y="276">D.3</text>
<text x="448" y="276">D.3</text>
<text x="512" y="276">D.3</text>
<text x="224" y="292">D.4</text>
<text x="320" y="292">D.4</text>
<text x="384" y="292">D.4</text>
<text x="448" y="292">D.4</text>
<text x="512" y="292">D.4</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                               +---+
                             ^ |N.1| ^
                            /  +---+  \
                           v           v
                        +---+    ^    +---+
                        |N.2| <--|--> |N.3|
                        +---+    v    +---+
                           ^           ^
                            \  +---+  /
                             v |N.4| v
                               +---+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| D.1 | | --- | | --- | | --- |     | D.1 | | D.1 | | D.1 | | D.1 |
| --- | | D.2 | | --- | | --- | ==> | D.2 | | D.2 | | D.2 | | D.2 |
| --- | | --- | | D.3 | | --- |     | D.3 | | D.3 | | D.3 | | D.3 |
| --- | | --- | | --- | | D.4 |     | D.4 | | D.4 | | D.4 | | D.4 |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
<section anchor="all-to-all"><name>All-to-All</name>

<t>This collective communication method can be seen as a simultaneous scatter operation done by every node in the collective. 
Indeed, in an All-to-All operation, every node splits the data it holds in equal size chunks, and sends one chunk to every other node in the collective. 
As a result, the data held by each node after the All-to-All operation is different, but every node holds roughly the same amount of data, even if the data volume was not balanced before the operation.</t>

<figure title="All-to-All method" anchor="figureA-LCC5"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="552" viewBox="0 0 552 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,224 L 8,304" fill="none" stroke="black"/>
<path d="M 56,224 L 56,304" fill="none" stroke="black"/>
<path d="M 72,224 L 72,304" fill="none" stroke="black"/>
<path d="M 120,224 L 120,304" fill="none" stroke="black"/>
<path d="M 136,224 L 136,304" fill="none" stroke="black"/>
<path d="M 184,224 L 184,304" fill="none" stroke="black"/>
<path d="M 200,96 L 200,128" fill="none" stroke="black"/>
<path d="M 200,224 L 200,304" fill="none" stroke="black"/>
<path d="M 232,96 L 232,128" fill="none" stroke="black"/>
<path d="M 248,224 L 248,304" fill="none" stroke="black"/>
<path d="M 256,32 L 256,64" fill="none" stroke="black"/>
<path d="M 256,160 L 256,192" fill="none" stroke="black"/>
<path d="M 272,96 L 272,128" fill="none" stroke="black"/>
<path d="M 288,32 L 288,64" fill="none" stroke="black"/>
<path d="M 288,160 L 288,192" fill="none" stroke="black"/>
<path d="M 296,224 L 296,304" fill="none" stroke="black"/>
<path d="M 312,96 L 312,128" fill="none" stroke="black"/>
<path d="M 344,96 L 344,128" fill="none" stroke="black"/>
<path d="M 344,224 L 344,304" fill="none" stroke="black"/>
<path d="M 360,224 L 360,304" fill="none" stroke="black"/>
<path d="M 408,224 L 408,304" fill="none" stroke="black"/>
<path d="M 424,224 L 424,304" fill="none" stroke="black"/>
<path d="M 472,224 L 472,304" fill="none" stroke="black"/>
<path d="M 488,224 L 488,304" fill="none" stroke="black"/>
<path d="M 536,224 L 536,304" fill="none" stroke="black"/>
<path d="M 256,32 L 288,32" fill="none" stroke="black"/>
<path d="M 256,64 L 288,64" fill="none" stroke="black"/>
<path d="M 200,96 L 232,96" fill="none" stroke="black"/>
<path d="M 312,96 L 344,96" fill="none" stroke="black"/>
<path d="M 248,112 L 264,112" fill="none" stroke="black"/>
<path d="M 280,112 L 296,112" fill="none" stroke="black"/>
<path d="M 200,128 L 232,128" fill="none" stroke="black"/>
<path d="M 312,128 L 344,128" fill="none" stroke="black"/>
<path d="M 256,160 L 288,160" fill="none" stroke="black"/>
<path d="M 256,192 L 288,192" fill="none" stroke="black"/>
<path d="M 8,224 L 56,224" fill="none" stroke="black"/>
<path d="M 72,224 L 120,224" fill="none" stroke="black"/>
<path d="M 136,224 L 184,224" fill="none" stroke="black"/>
<path d="M 200,224 L 248,224" fill="none" stroke="black"/>
<path d="M 296,224 L 344,224" fill="none" stroke="black"/>
<path d="M 360,224 L 408,224" fill="none" stroke="black"/>
<path d="M 424,224 L 472,224" fill="none" stroke="black"/>
<path d="M 488,224 L 536,224" fill="none" stroke="black"/>
<path d="M 264,254 L 280,254" fill="none" stroke="black"/><path d="M 264,258 L 280,258" fill="none" stroke="black"/>
<path d="M 8,304 L 56,304" fill="none" stroke="black"/>
<path d="M 72,304 L 120,304" fill="none" stroke="black"/>
<path d="M 136,304 L 184,304" fill="none" stroke="black"/>
<path d="M 200,304 L 248,304" fill="none" stroke="black"/>
<path d="M 296,304 L 344,304" fill="none" stroke="black"/>
<path d="M 360,304 L 408,304" fill="none" stroke="black"/>
<path d="M 424,304 L 472,304" fill="none" stroke="black"/>
<path d="M 488,304 L 536,304" fill="none" stroke="black"/>
<path d="M 220,136 L 240,176" fill="none" stroke="black"/>
<path d="M 304,48 L 324,88" fill="none" stroke="black"/>
<path d="M 220,88 L 240,48" fill="none" stroke="black"/>
<path d="M 304,176 L 324,136" fill="none" stroke="black"/>
<polygon class="arrowhead" points="332,136 320,130.4 320,141.6" fill="black" transform="rotate(296.565051177078,324,136)"/>
<polygon class="arrowhead" points="332,88 320,82.4 320,93.6" fill="black" transform="rotate(63.43494882292201,324,88)"/>
<polygon class="arrowhead" points="312,176 300,170.4 300,181.6" fill="black" transform="rotate(116.56505117707799,304,176)"/>
<polygon class="arrowhead" points="312,48 300,42.4 300,53.6" fill="black" transform="rotate(243.43494882292202,304,48)"/>
<polygon class="arrowhead" points="304,112 292,106.4 292,117.6" fill="black" transform="rotate(0,296,112)"/>
<polygon class="arrowhead" points="288,256 276,250.4 276,261.6" fill="black" transform="rotate(0,280,256)"/>
<polygon class="arrowhead" points="280,128 268,122.4 268,133.6" fill="black" transform="rotate(90,272,128)"/>
<polygon class="arrowhead" points="280,96 268,90.4 268,101.6" fill="black" transform="rotate(270,272,96)"/>
<polygon class="arrowhead" points="256,112 244,106.4 244,117.6" fill="black" transform="rotate(180,248,112)"/>
<polygon class="arrowhead" points="248,176 236,170.4 236,181.6" fill="black" transform="rotate(63.43494882292201,240,176)"/>
<polygon class="arrowhead" points="248,48 236,42.4 236,53.6" fill="black" transform="rotate(296.565051177078,240,48)"/>
<polygon class="arrowhead" points="228,136 216,130.4 216,141.6" fill="black" transform="rotate(243.43494882292202,220,136)"/>
<polygon class="arrowhead" points="228,88 216,82.4 216,93.6" fill="black" transform="rotate(116.56505117707799,220,88)"/>
<g class="text">
<text x="272" y="52">N.1</text>
<text x="216" y="116">N.2</text>
<text x="328" y="116">N.3</text>
<text x="272" y="180">N.4</text>
<text x="32" y="212">N.1</text>
<text x="96" y="212">N.2</text>
<text x="160" y="212">N.3</text>
<text x="224" y="212">N.4</text>
<text x="320" y="212">N.1</text>
<text x="384" y="212">N.2</text>
<text x="448" y="212">N.3</text>
<text x="512" y="212">N.4</text>
<text x="32" y="244">A.1</text>
<text x="96" y="244">B.1</text>
<text x="160" y="244">C.1</text>
<text x="224" y="244">D.1</text>
<text x="320" y="244">A.1</text>
<text x="384" y="244">A.2</text>
<text x="448" y="244">A.3</text>
<text x="512" y="244">A.4</text>
<text x="32" y="260">A.2</text>
<text x="96" y="260">B.2</text>
<text x="160" y="260">C.2</text>
<text x="224" y="260">D.2</text>
<text x="320" y="260">B.1</text>
<text x="384" y="260">B.2</text>
<text x="448" y="260">B.3</text>
<text x="512" y="260">B.4</text>
<text x="32" y="276">A.3</text>
<text x="96" y="276">B.3</text>
<text x="160" y="276">C.3</text>
<text x="224" y="276">D.3</text>
<text x="320" y="276">C.1</text>
<text x="384" y="276">C.2</text>
<text x="448" y="276">C.3</text>
<text x="512" y="276">C.4</text>
<text x="32" y="292">A.4</text>
<text x="96" y="292">B.4</text>
<text x="160" y="292">C.4</text>
<text x="224" y="292">D.4</text>
<text x="320" y="292">D.1</text>
<text x="384" y="292">D.2</text>
<text x="448" y="292">D.3</text>
<text x="512" y="292">D.4</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                               +---+
                             ^ |N.1| ^
                            /  +---+  \
                           v           v
                        +---+    ^    +---+
                        |N.2| <--|--> |N.3|
                        +---+    v    +---+
                           ^           ^
                            \  +---+  /
                             v |N.4| v
                               +---+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| A.1 | | B.1 | | C.1 | | D.1 |     | A.1 | | A.2 | | A.3 | | A.4 |
| A.2 | | B.2 | | C.2 | | D.2 | ==> | B.1 | | B.2 | | B.3 | | B.4 |
| A.3 | | B.3 | | C.3 | | D.3 |     | C.1 | | C.2 | | C.3 | | C.4 |
| A.4 | | B.4 | | C.4 | | D.4 |     | D.1 | | D.2 | | D.3 | | D.4 |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
<section anchor="all-reduce"><name>All-Reduce</name>

<t>This collective communication method is very similar to the Reduce method. 
During an All-Reduce operation, the nodes involved in the collective send their data to an aggregator processing the received inputs <em>I.1</em> ... <em>I.4</em> using an operator <em>f</em> to obtain <em>Out</em>. 
To the difference of the Reduce operation, <em>Out</em> is sent back to every node in the collective. 
In the implementation of this method, the aggregator function can be done by one node in the collective, or every single node applies the operator <em>f</em> on the inputs received after an All-to-All operation.</t>

<figure title="All-Reduce method" anchor="figureA-LCC6"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="552" viewBox="0 0 552 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,208 L 8,240" fill="none" stroke="black"/>
<path d="M 56,208 L 56,240" fill="none" stroke="black"/>
<path d="M 72,208 L 72,240" fill="none" stroke="black"/>
<path d="M 120,208 L 120,240" fill="none" stroke="black"/>
<path d="M 136,208 L 136,240" fill="none" stroke="black"/>
<path d="M 168,128 L 168,176" fill="none" stroke="black"/>
<path d="M 184,32 L 184,64" fill="none" stroke="black"/>
<path d="M 184,208 L 184,240" fill="none" stroke="black"/>
<path d="M 192,72 L 192,120" fill="none" stroke="black"/>
<path d="M 200,208 L 200,240" fill="none" stroke="black"/>
<path d="M 208,72 L 208,120" fill="none" stroke="black"/>
<path d="M 216,32 L 216,64" fill="none" stroke="black"/>
<path d="M 232,32 L 232,64" fill="none" stroke="black"/>
<path d="M 240,72 L 240,120" fill="none" stroke="black"/>
<path d="M 248,208 L 248,240" fill="none" stroke="black"/>
<path d="M 256,72 L 256,120" fill="none" stroke="black"/>
<path d="M 264,32 L 264,64" fill="none" stroke="black"/>
<path d="M 280,32 L 280,64" fill="none" stroke="black"/>
<path d="M 288,72 L 288,120" fill="none" stroke="black"/>
<path d="M 296,208 L 296,240" fill="none" stroke="black"/>
<path d="M 304,72 L 304,120" fill="none" stroke="black"/>
<path d="M 312,32 L 312,64" fill="none" stroke="black"/>
<path d="M 328,32 L 328,64" fill="none" stroke="black"/>
<path d="M 336,72 L 336,120" fill="none" stroke="black"/>
<path d="M 344,208 L 344,240" fill="none" stroke="black"/>
<path d="M 352,72 L 352,120" fill="none" stroke="black"/>
<path d="M 360,32 L 360,64" fill="none" stroke="black"/>
<path d="M 360,208 L 360,240" fill="none" stroke="black"/>
<path d="M 376,128 L 376,176" fill="none" stroke="black"/>
<path d="M 408,208 L 408,240" fill="none" stroke="black"/>
<path d="M 424,208 L 424,240" fill="none" stroke="black"/>
<path d="M 472,208 L 472,240" fill="none" stroke="black"/>
<path d="M 488,208 L 488,240" fill="none" stroke="black"/>
<path d="M 536,208 L 536,240" fill="none" stroke="black"/>
<path d="M 184,32 L 216,32" fill="none" stroke="black"/>
<path d="M 232,32 L 264,32" fill="none" stroke="black"/>
<path d="M 280,32 L 312,32" fill="none" stroke="black"/>
<path d="M 328,32 L 360,32" fill="none" stroke="black"/>
<path d="M 184,64 L 216,64" fill="none" stroke="black"/>
<path d="M 232,64 L 264,64" fill="none" stroke="black"/>
<path d="M 280,64 L 312,64" fill="none" stroke="black"/>
<path d="M 328,64 L 360,64" fill="none" stroke="black"/>
<path d="M 168,128 L 376,128" fill="none" stroke="black"/>
<path d="M 168,176 L 376,176" fill="none" stroke="black"/>
<path d="M 8,208 L 56,208" fill="none" stroke="black"/>
<path d="M 72,208 L 120,208" fill="none" stroke="black"/>
<path d="M 136,208 L 184,208" fill="none" stroke="black"/>
<path d="M 200,208 L 248,208" fill="none" stroke="black"/>
<path d="M 296,208 L 344,208" fill="none" stroke="black"/>
<path d="M 360,208 L 408,208" fill="none" stroke="black"/>
<path d="M 424,208 L 472,208" fill="none" stroke="black"/>
<path d="M 488,208 L 536,208" fill="none" stroke="black"/>
<path d="M 264,222 L 280,222" fill="none" stroke="black"/><path d="M 264,226 L 280,226" fill="none" stroke="black"/>
<path d="M 8,240 L 56,240" fill="none" stroke="black"/>
<path d="M 72,240 L 120,240" fill="none" stroke="black"/>
<path d="M 136,240 L 184,240" fill="none" stroke="black"/>
<path d="M 200,240 L 248,240" fill="none" stroke="black"/>
<path d="M 296,240 L 344,240" fill="none" stroke="black"/>
<path d="M 360,240 L 408,240" fill="none" stroke="black"/>
<path d="M 424,240 L 472,240" fill="none" stroke="black"/>
<path d="M 488,240 L 536,240" fill="none" stroke="black"/>
<polygon class="arrowhead" points="360,72 348,66.4 348,77.6" fill="black" transform="rotate(270,352,72)"/>
<polygon class="arrowhead" points="344,120 332,114.4 332,125.6" fill="black" transform="rotate(90,336,120)"/>
<polygon class="arrowhead" points="312,72 300,66.4 300,77.6" fill="black" transform="rotate(270,304,72)"/>
<polygon class="arrowhead" points="296,120 284,114.4 284,125.6" fill="black" transform="rotate(90,288,120)"/>
<polygon class="arrowhead" points="288,224 276,218.4 276,229.6" fill="black" transform="rotate(0,280,224)"/>
<polygon class="arrowhead" points="264,72 252,66.4 252,77.6" fill="black" transform="rotate(270,256,72)"/>
<polygon class="arrowhead" points="248,120 236,114.4 236,125.6" fill="black" transform="rotate(90,240,120)"/>
<polygon class="arrowhead" points="216,72 204,66.4 204,77.6" fill="black" transform="rotate(270,208,72)"/>
<polygon class="arrowhead" points="200,120 188,114.4 188,125.6" fill="black" transform="rotate(90,192,120)"/>
<g class="text">
<text x="200" y="52">N.1</text>
<text x="248" y="52">N.2</text>
<text x="296" y="52">N.3</text>
<text x="344" y="52">N.4</text>
<text x="276" y="148">Aggregator</text>
<text x="268" y="164">f(I.1,I.2,I.3,I.4)=Out</text>
<text x="32" y="196">N.1</text>
<text x="96" y="196">N.2</text>
<text x="160" y="196">N.3</text>
<text x="224" y="196">N.4</text>
<text x="320" y="196">N.1</text>
<text x="384" y="196">N.2</text>
<text x="448" y="196">N.3</text>
<text x="512" y="196">N.4</text>
<text x="32" y="228">I.1</text>
<text x="96" y="228">I.2</text>
<text x="160" y="228">I.3</text>
<text x="224" y="228">I.4</text>
<text x="320" y="228">Out</text>
<text x="384" y="228">Out</text>
<text x="448" y="228">Out</text>
<text x="512" y="228">Out</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                      +---+ +---+ +---+ +---+
                      |N.1| |N.2| |N.3| |N.4|
                      +---+ +---+ +---+ +---+  
                       | ^   | ^   | ^   | ^
                       | |   | |   | |   | | 
                       v |   v |   v |   v |   
                    +-------------------------+
                    |        Aggregator       |
                    | f(I.1,I.2,I.3,I.4)=Out  |
                    +-------------------------+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| I.1 | | I.2 | | I.3 | | I.4 | ==> | Out | | Out | | Out | | Out |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
<section anchor="reduce-scatter"><name>Reduce-Scatter</name>

<t>This collective communication method is a combination of the All-Reduce method with the Scatter method. 
During a Reduce-Scatter operation, the nodes involved in the collective send their data to an aggregator processing the received inputs <em>I.1</em> ... <em>I.4</em> using an operator <em>f</em> to obtain <em>Out</em>. 
To the difference of the All-Reduce operation, <em>Out</em> is split into equal size chunks <em>O.1</em> ... <em>O.4</em>, and each chunk is sent to a different node in the collective.</t>

<figure title="Reduce-Scatter method" anchor="figureA-LCC7"><artset><artwork  type="svg" align="left" name="syntax"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="552" viewBox="0 0 552 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,208 L 8,240" fill="none" stroke="black"/>
<path d="M 56,208 L 56,240" fill="none" stroke="black"/>
<path d="M 72,208 L 72,240" fill="none" stroke="black"/>
<path d="M 120,128 L 120,176" fill="none" stroke="black"/>
<path d="M 120,208 L 120,240" fill="none" stroke="black"/>
<path d="M 136,208 L 136,240" fill="none" stroke="black"/>
<path d="M 184,32 L 184,64" fill="none" stroke="black"/>
<path d="M 184,208 L 184,240" fill="none" stroke="black"/>
<path d="M 192,72 L 192,120" fill="none" stroke="black"/>
<path d="M 200,208 L 200,240" fill="none" stroke="black"/>
<path d="M 208,72 L 208,120" fill="none" stroke="black"/>
<path d="M 216,32 L 216,64" fill="none" stroke="black"/>
<path d="M 232,32 L 232,64" fill="none" stroke="black"/>
<path d="M 240,72 L 240,120" fill="none" stroke="black"/>
<path d="M 248,208 L 248,240" fill="none" stroke="black"/>
<path d="M 256,72 L 256,120" fill="none" stroke="black"/>
<path d="M 264,32 L 264,64" fill="none" stroke="black"/>
<path d="M 280,32 L 280,64" fill="none" stroke="black"/>
<path d="M 288,72 L 288,120" fill="none" stroke="black"/>
<path d="M 296,208 L 296,240" fill="none" stroke="black"/>
<path d="M 304,72 L 304,120" fill="none" stroke="black"/>
<path d="M 312,32 L 312,64" fill="none" stroke="black"/>
<path d="M 328,32 L 328,64" fill="none" stroke="black"/>
<path d="M 336,72 L 336,120" fill="none" stroke="black"/>
<path d="M 344,208 L 344,240" fill="none" stroke="black"/>
<path d="M 352,72 L 352,120" fill="none" stroke="black"/>
<path d="M 360,32 L 360,64" fill="none" stroke="black"/>
<path d="M 360,208 L 360,240" fill="none" stroke="black"/>
<path d="M 408,208 L 408,240" fill="none" stroke="black"/>
<path d="M 424,208 L 424,240" fill="none" stroke="black"/>
<path d="M 440,128 L 440,176" fill="none" stroke="black"/>
<path d="M 472,208 L 472,240" fill="none" stroke="black"/>
<path d="M 488,208 L 488,240" fill="none" stroke="black"/>
<path d="M 536,208 L 536,240" fill="none" stroke="black"/>
<path d="M 184,32 L 216,32" fill="none" stroke="black"/>
<path d="M 232,32 L 264,32" fill="none" stroke="black"/>
<path d="M 280,32 L 312,32" fill="none" stroke="black"/>
<path d="M 328,32 L 360,32" fill="none" stroke="black"/>
<path d="M 184,64 L 216,64" fill="none" stroke="black"/>
<path d="M 232,64 L 264,64" fill="none" stroke="black"/>
<path d="M 280,64 L 312,64" fill="none" stroke="black"/>
<path d="M 328,64 L 360,64" fill="none" stroke="black"/>
<path d="M 120,128 L 440,128" fill="none" stroke="black"/>
<path d="M 272,158 L 288,158" fill="none" stroke="black"/><path d="M 272,162 L 288,162" fill="none" stroke="black"/>
<path d="M 120,176 L 440,176" fill="none" stroke="black"/>
<path d="M 8,208 L 56,208" fill="none" stroke="black"/>
<path d="M 72,208 L 120,208" fill="none" stroke="black"/>
<path d="M 136,208 L 184,208" fill="none" stroke="black"/>
<path d="M 200,208 L 248,208" fill="none" stroke="black"/>
<path d="M 296,208 L 344,208" fill="none" stroke="black"/>
<path d="M 360,208 L 408,208" fill="none" stroke="black"/>
<path d="M 424,208 L 472,208" fill="none" stroke="black"/>
<path d="M 488,208 L 536,208" fill="none" stroke="black"/>
<path d="M 264,222 L 280,222" fill="none" stroke="black"/><path d="M 264,226 L 280,226" fill="none" stroke="black"/>
<path d="M 8,240 L 56,240" fill="none" stroke="black"/>
<path d="M 72,240 L 120,240" fill="none" stroke="black"/>
<path d="M 136,240 L 184,240" fill="none" stroke="black"/>
<path d="M 200,240 L 248,240" fill="none" stroke="black"/>
<path d="M 296,240 L 344,240" fill="none" stroke="black"/>
<path d="M 360,240 L 408,240" fill="none" stroke="black"/>
<path d="M 424,240 L 472,240" fill="none" stroke="black"/>
<path d="M 488,240 L 536,240" fill="none" stroke="black"/>
<polygon class="arrowhead" points="360,72 348,66.4 348,77.6" fill="black" transform="rotate(270,352,72)"/>
<polygon class="arrowhead" points="344,120 332,114.4 332,125.6" fill="black" transform="rotate(90,336,120)"/>
<polygon class="arrowhead" points="312,72 300,66.4 300,77.6" fill="black" transform="rotate(270,304,72)"/>
<polygon class="arrowhead" points="296,120 284,114.4 284,125.6" fill="black" transform="rotate(90,288,120)"/>
<polygon class="arrowhead" points="288,224 276,218.4 276,229.6" fill="black" transform="rotate(0,280,224)"/>
<polygon class="arrowhead" points="264,72 252,66.4 252,77.6" fill="black" transform="rotate(270,256,72)"/>
<polygon class="arrowhead" points="248,120 236,114.4 236,125.6" fill="black" transform="rotate(90,240,120)"/>
<polygon class="arrowhead" points="216,72 204,66.4 204,77.6" fill="black" transform="rotate(270,208,72)"/>
<polygon class="arrowhead" points="200,120 188,114.4 188,125.6" fill="black" transform="rotate(90,192,120)"/>
<g class="text">
<text x="200" y="52">N.1</text>
<text x="248" y="52">N.2</text>
<text x="296" y="52">N.3</text>
<text x="344" y="52">N.4</text>
<text x="276" y="148">Aggregator</text>
<text x="200" y="164">f(I.1,I.2,I.3,I.4</text>
<text x="356" y="164">O.1,O.2,O.3,O.4)</text>
<text x="32" y="196">N.1</text>
<text x="96" y="196">N.2</text>
<text x="160" y="196">N.3</text>
<text x="224" y="196">N.4</text>
<text x="320" y="196">N.1</text>
<text x="384" y="196">N.2</text>
<text x="448" y="196">N.3</text>
<text x="512" y="196">N.4</text>
<text x="32" y="228">I.1</text>
<text x="96" y="228">I.2</text>
<text x="160" y="228">I.3</text>
<text x="224" y="228">I.4</text>
<text x="320" y="228">O.1</text>
<text x="384" y="228">O.2</text>
<text x="448" y="228">O.3</text>
<text x="512" y="228">O.4</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="left" name="syntax"><![CDATA[
                      +---+ +---+ +---+ +---+
                      |N.1| |N.2| |N.3| |N.4|
                      +---+ +---+ +---+ +---+  
                       | ^   | ^   | ^   | ^
                       | |   | |   | |   | | 
                       v |   v |   v |   v |   
              +---------------------------------------+
              |              Aggregator               |
              | f(I.1,I.2,I.3,I.4)=(O.1,O.2,O.3,O.4)  |
              +---------------------------------------+
  N.1     N.2     N.3     N.4         N.1     N.2     N.3     N.4  
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
| I.1 | | I.2 | | I.3 | | I.4 | ==> | O.1 | | O.2 | | O.3 | | O.4 |
+-----+ +-----+ +-----+ +-----+     +-----+ +-----+ +-----+ +-----+ 
]]></artwork></artset></figure>

</section>
</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+19a3PbVpbgd1f5P6CSD5ZkkrJkOQ/NpGcVOUlr1q+13JOZ
qlSmQBKUEJMAGwAlqyPPn9n/s79pz/ueiwcld7q3unda3bEoELi499xzz/sx
Ho8fPpiV87y4OE42zWL81cMHV8fJ04cPHj5o8maZHSef/T4t5ku4IcmLJqvG
z0/3v5tfZMnJ2bjKlmmTzZMia67L6n3SVOlikc+OkzdVOV1mq6Ru4PtVVjSf
PXyQTqdVBmN/dnKmN8LVGdxwUVY3x3DvHN86L2dFuoL3zuGeZkz/5WN5YPzk
4OEDfNVFVW7Wx8mP8BFn9gP+meBzDx/UTZWlq+Pk7Lt33z988D67gfvnxw8f
JGNZwDxt0lmGH+kiTCcvFlmVFbNML8Dr8gIGpr+/z+ZZRet8kaUVX374IF9X
x3Dfpm4Onzz5+skhzBzuOU5+fX7y7ruPOA0A23+my7KAizdZ/fDBOsdZJE05
09/zbN1cHieH+GddVjDxRU3f1Tcr+wwAWaXrNe4Q/jkrVwjQ+jgpSpxHumku
ywq+Gif4dV7ANyeT5Psqq+u0mJWbqsHrDNOToinzIut8W1aw/b/fpNdZnrzL
ZpdFuSwv8qyGG+GuLDmfnEzOJ3+Y4L26j3w7zRYmnjXHycFXo+R/bdI8mW+S
N/CeBj/8K7yD5p03sMnflhsYucjG3+bLpZsAfCgaxAJ+IV+aw4wffX148OTJ
I7yQrdJ8eZykvIbJwq3hf1zSZCYAHACEweHFJDlLiwK2IIDgxSa/yP3lv6e1
L3Hyk5wnP7Do55PkRbkJC36eXuVzvTS42OcbgGa2nJfVIvlhNf399tW+hUfg
cwqPJIfPwhJfbop8dhkt6oesWqXFjVvVV0++/vrQr+pPl9lkWW6G1/OuKuFN
hVtTDtTGXf2bXNYcJjlpeJLR2h4+KEp4usmvsmMiJcXC/Z0kb/J1BgQ3e5NW
6XIJH2sgZ89fn00OnkwODo6e7T99enTw9MnB5OnTZ19/cfQFPvMuK4CC9D1x
9NWzZ0/20+rf86vJwRdPnk6eHB198SU+8xwI4eA7vvz64MunE/j3qwO892X5
nbv1wN37xeF+kc3KycHXX8OMJgfwTPeBw/7pfAmLePLFs6df4RPfbqq6gWXX
de/Nh0d485OnhzT8ydk7odHvlOlEEPrii6dHT76a8G964mz8fFLBWRjn6/Vq
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
Nv5Nhuv/C+tu+k4OMQEA

-->

</rfc>

