<?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-00" 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" value="Principles"/>
  <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="vol. 23, 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>Challenging the Need for Packet Spraying 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>
    <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" value="Systems"/>
  <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" value="2023"/>
  <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+19aXPcRpbgd0XoPyDsDyKpquIhygdnPLs0Zbs5q2tF9Xgm
wuEJVBWKRKsKqAFQpNim5s/s/9nftO/OlziK1Lh7o2d32G2xiAISmS9fvvsY
j8ePH83KeV5cniSbZjH+5vGj65Pk2eNHjx81ebPMTpIv/pAW8yXckORFk1Xj
F2f7P8wvs+T0fFxly7TJ5kmRNTdl9SFpqnSxyGcnyduqnC6zVVI38P0qK5ov
Hj9Kp9Mqg7G/OD3XG+HqDG64LKvbE7h3jm+dl7MiXcF753BPM6b/8rE8MD44
ePwIX3VZlZv1SfIzfMSZ/YR/Jvjc40d1U2Xp6iQ5/+H9j48ffchu4f75yeNH
yVgWME+bdJbhR7oI08mLRVZlxSzTC/C6vICB6e8fs3lW0TpfZmnFlx8/ytfV
Cdy3qZujg4NvD45g5nDPSfLbi9P3P3zCaQDY/jVdlgVcvM3qx4/WOc4iacqZ
/p5n6+bqJDnCP+uygokvavquvl3ZZwDIKl2vcYfwz1m5QoDWJ0lR4jzSTXNV
VvDVOMGv8wK+OZ0kP1ZZXafFrNxUDV5nmJ4WTZkXWefbsoLt/8Mmvcny5H02
uyrKZXmZZzXcCHdlycXkdHIx+eME79V95NtptjDxrDlJDr8ZJf9zk+bJfJO8
hfc0+OEf4R0077yBTf6+3MDIRTb+Pl8u3QTgQ9EgFvAL+dIcZvzk26PDg4Mn
eCFbpfnyJEl5DZOFW8N/v6LJTAA4AAiDw8tJcp4WBWxBAMHLTX6Z+8v/mda+
xMlPcp78wKJfTJKX5SYs+EV6nc/10uBiX2wAmtlyXlaL5KfV9A/bV/sOHoHP
KTySHD0PS3y1KfLZVbSon7JqlRa3blXfHHz77ZFf1Z+vssmy3Ayv531VwpsK
t6YcqI27+je5rDlMctLwJKO1PX5UlPB0k19nJ0RKioX7O0ne5usMCG72Nq3S
5RI+1kDOXrw5nxweTA4Pj5/vP3t2fPjs4HDy7Nnzb786/gqfeZ8VQEH6njj+
5vnzg/20+uf8enL41cGzycHx8Vdf4zMvgBAOvuPrbw+/fjaBf785xHtflT+4
Ww/dvV8d7RfZrJwcfvstzGhyCM90Hzjqn87XsIiDr54/+waf+H5T1Q0su657
bz46xpsPnh3R8Kfn74VGv1emE0Hoq6+eHR98M+Hf9MT5+MWkgrMwztfr1XhW
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
G/8uw/X/AQfFBJsOMQEA

-->

</rfc>

