<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>HCCL on zzudongxiang</title><link>https://www.zzudongxiang.com/tags/hccl/</link><description>Recent content in HCCL on zzudongxiang</description><generator>Hugo</generator><language>zh-cn</language><copyright>2026 zzudongxiang.com · 豫ICP备2022012018号-1 · 豫公网安备41160202000614号</copyright><lastBuildDate>Sun, 28 Apr 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://www.zzudongxiang.com/tags/hccl/index.xml" rel="self" type="application/rss+xml"/><item><title>集合通信-通信原语</title><link>https://www.zzudongxiang.com/posts/collective-communication-primitives/</link><pubDate>Sun, 28 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.zzudongxiang.com/posts/collective-communication-primitives/</guid><description>&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-size: 16px; color: rgb(51, 51, 51)"&gt;参考来源: &lt;/span&gt;&lt;a href="https://zhuanlan.zhihu.com/p/493092647"&gt;&lt;span fontsize="" color=""&gt;分布式训练常用的集合通信及其通信原语&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 16px; color: rgb(51, 51, 51)"&gt;, &lt;/span&gt;&lt;a href="https://zhuanlan.zhihu.com/p/496105041"&gt;&lt;span fontsize="" color=""&gt;分布式训练常用的网络结构及集合通信拓扑算法&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src="images/image-eimu.png" style="display: inline-block;width:50.0%" /&gt;
&lt;p&gt;&lt;span style="font-size: 16px; color: rgb(51, 51, 51)"&gt;图片来源：&lt;/span&gt;&lt;a href="https://images.nvidia.com/content/volta-architecture/pdf/volta-architecture-whitepaper.pdf"&gt;volta-architecture-whitepaper&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="1-broadcast"&gt;&lt;span fontsize="" color=""&gt;1 Broadcast&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Broadcast属于&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;1对多&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;的通信原语，一个数据发送者，多个数据接收者，可以在集群内把一个节点自身的数据广播到其他节点上。如下图所示，圈圈表示集群中的训练加速卡节点，相同的颜色的小方块则代表相同的数据。当主节点 0 执行Broadcast时，数据即从主节点0被广播至其他节点。&lt;/span&gt;&lt;/p&gt;
&lt;img src="images/image-mgng.png" style="display: inline-block;width:50.0%" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Broadcast是数据的1对多的同步，它将一张XPU卡上的数据同步到其他所有的XPU卡上，其应用场景有：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数据并行的参数初始化，确保每张卡上的初始参数是一致的；&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;allReduce里的 broadcast + reduce组合里的broadcast操作；&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;分布式训练parameter server 参数服务器结构里的 master节点 broadcast 数据到worker节点，再从worker节点reduce数据回master节点里的broadcast操作；&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-scatter"&gt;&lt;span fontsize="" color=""&gt;2 Scatter&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;同Broadcast一样，Scatter也是一个1对多的通信原语，也是一个数据发送者，多个数据接收者，可以在集群内把一个节点自身的数据发散到其他节点上。与Broadcast不同的是Broadcast把主节点0的数据发送给所有节点，而Scatter则是将数据的进行切片再分发给集群内所有的节点，如下图所示，不相同的颜色的小方块代表不相同的数据，主节点 0 将数据分为四份分发到了节点0-3。&lt;/span&gt;&lt;/p&gt;
&lt;img src="images/image-jcjv.png" style="display: inline-block;width:50.0%" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Scatter是数据的1对多的分发，它将一张XPU卡上的数据进行分片再分发到其他所有的XPU卡上，他的反向操作对应Gather，其应用场景有：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;ReduceScatter组合里的 Scatter操作；&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;模型并行里初始化时将模型scatter到不同的XPU上；&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-gather"&gt;&lt;span fontsize="" color=""&gt;3 Gather&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Gather操作属于&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;多对1&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;的通信原语，具有多个数据发送者，一个数据接收者，可以在集群内把多个节点的数据收集到一个节点上，如下图所示，不相同的颜色的小方块代表不相同的数据。&lt;/span&gt;&lt;/p&gt;
&lt;img src="images/image-clhx.png" style="display: inline-block;width:50.0%" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Gather是数据的多对1的收集，它将多张XPU卡上的数据收集到1张XPU卡上，它的反向操作对应Scatter，其应用场景有：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span fontsize="" color=""&gt;ReduceScatter组合里的 Scatter操作；&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-reduce"&gt;&lt;span fontsize="" color=""&gt;4 Reduce&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Reduce属于&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;多对1&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;的通信原语，具有多个数据发送者，一个数据接收者，可以在集群内把多个节点的数据&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;规约运算&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;到一个主节点上，常用的规约操作符有：求累加和SUM、求累乘积PROD、求最大值MAX、求最小值MIN、逻辑与 LAND、按位与BAND、逻辑或LOR、按位或BOR、逻辑异或LXOR、按位异或BOXR、求最大值和最小大的位置MAXLOC、求最小值和最小值的位置MINLOC等，这些规约运算也需要加速卡支持对应的算子才能生效。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Reuduce操作从集群内每个节点上获取一个输入数据，通过规约运算操作后，得到精简数据，如下图的SUM求累加和：节点0数值 5、节点1数值6、节点2数值7、节点3数值8，经过SUM运算后 累积和为 26，即得到更为精简的数值，在reduce原语里回会去调用 reduce SUM算子来完成这个求和累加。&lt;/span&gt;&lt;/p&gt;
&lt;img src="images/image-mxqm.png" style="display: inline-block;width:50.0%" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Reduce是数据的多对1的规约运算，它将所有张XPU卡上的数据规约（比如SUM求和）到1张XPU卡上，其应用场景有：&lt;/span&gt;&lt;/p&gt;</description></item><item><title>HCCL集合通信测试环境设置</title><link>https://www.zzudongxiang.com/posts/hccl-test-environment/</link><pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.zzudongxiang.com/posts/hccl-test-environment/</guid><description>&lt;div&gt;
&lt;h2 id="1-快速使用"&gt;&lt;span fontsize="" color=""&gt;1. 快速使用&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;HCCL（Huawei Collective Communication Library）是基于昇腾AI处理器的高性能集合通信库，其主要功能与作用与Nvidia的NCCL库相似，主要用于集合通信，CANN库种自带一套测试工具用以分析集合通信性能。&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="11-编译环境配置"&gt;&lt;span fontsize="" color=""&gt;1.1 编译环境配置&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;前置环境配置阶段请参考&lt;/span&gt;&lt;a href="https://git.zzudongxiang.com/pcl.cloudbrain.project/mindspore.llama2/src/branch/main/README.md"&gt;&lt;span fontsize="" color=""&gt;Llama2部署记录&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;，后续的所有流程均需要在具备HCCL硬件的平台上实现，需要注意的是，建议使用的Ubuntu版本大于等于20.04LTS，否则可能会遇到VSCode不支持的情况。&lt;/span&gt;&lt;/p&gt;
&lt;h4 id="a-cann"&gt;&lt;span fontsize="" color=""&gt;A. CANN&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;CANN的配置过程参考&lt;/span&gt;&lt;a href="https://git.zzudongxiang.com/pcl.cloudbrain.project/mindspore.llama2/src/branch/main/README.md"&gt;&lt;span fontsize="" color=""&gt;Llama2部署记录&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;文档的&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;4. 安装CANN&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;章节，并记录安装位置，以备后续使用&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;完成CANN后，建议在&lt;/span&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;&lt;span fontsize="" color=""&gt;文件中添加对应的环境变量，例如：&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # 使用nano打开~/.bashrc文件
 nano ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在文件的最后添加&lt;/span&gt;&lt;code&gt;export ASCEND_HOME=/usr/local/Ascend/ascend-toolkit/latest&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="b-openmpi"&gt;&lt;span fontsize="" color=""&gt;B. OpenMPI&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在&lt;/span&gt;&lt;a href="https://www.mpich.org/"&gt;&lt;span fontsize="" color=""&gt;OpenMPI官网&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;找到对应版本的安装包下载，然后解压缩安装包，以&lt;/span&gt;&lt;code&gt;mpich-4.2.0&lt;/code&gt;&lt;span fontsize="" color=""&gt;版本为例：&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # mpich下载链接参考：https://www.mpich.org/static/downloads
 wget https://www.mpich.org/static/downloads/4.2.0/mpich-4.2.0.tar.gz
 # 解压缩mpich压缩包
 tar -zxvf mpich-4.2.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;配置mpi的安装路径，以&lt;/span&gt;&lt;code&gt;/root/mpich&lt;/code&gt;&lt;span fontsize="" color=""&gt;路径为例：&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # 新建文件夹
 mkdir ~/mpich
 # 进入解压缩后的mpich文件夹
 cd mpich-4.2.0
 # 配置安装路径
 ./configure -prefix=/root/mpich --disable-fortran
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;使用&lt;/span&gt;&lt;code&gt;make&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令构建mpich的可执行文件，该过程可能耗时比较长&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; make
 make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;完后后将mpich添加到环境变量种，并添加对应的链接库和帮助文件&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # 修改~/.bashrc文件
 nano ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在最后一行添加以下内容：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;export MPI_HOME=/root/mpich&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;export PATH=&lt;/code&gt;$MPI_HOME/bin:$&lt;code&gt;PATH&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>