通信域管理
通信域是集合通信算子执行的上下文,管理对应的通信对象(例如一个NPU就是一个通信对象)和通信所需的资源。通信域中的每个通信对象称为一个rank,每个rank都会分配一个介于0~n-1(n为NPU的数量)的唯一标识。
- 多机集合通信场景
- 如果有完整的描述集群信息的ranktable文件,可通过HcclCommInitClusterInfo接口创建通信域,或者通过HcclCommInitClusterInfoConfig接口创建具有特定配置的通信域。
- 如果无完整的ranktable,可通过HcclGetRootInfo接口与HcclCommInitRootInfo/HcclCommInitRootInfoConfig接口配合使用,基于root节点信息创建通信域。
- 单机集合通信场景,可通过HcclCommInitAll接口在单机内批量创建通信域。
- 基于已有的通信域,可通过HcclCreateSubCommConfig接口切分具有特定配置的子通信域。

- 针对同一个rank,通信算子需要one by one保序调用,不支持并发下发。
- 针对整个通信域,通信算子的调用在不同rank间要保证同一下发顺序。
- 同一个通信域内不支持图模式通信和单算子通信混合执行。
- 针对
Atlas A3 训练系列产品/Atlas A3 推理系列产品 ,通信域初始化时,如果组网中存在多个超节点,请将属于同一超节点内的AI Server信息配置在一起。假设有两个超节点,标识分别为“0”和“1”,请先配置“0”中的AI Server信息,再配置“1”中的AI Server信息,不支持“0”中的AI Server信息与“1”中的AI Server信息交叉配置。
基于ranktable创建通信域
- 构造ranktable文件(ranktable文件的配置可参见ranktable文件配置资源信息)。
- 每张卡分别调用HcclCommInitClusterInfo接口创建通信域,或者调用HcclCommInitClusterInfoConfig接口创建具有特定配置的通信域。
1 2 3 4 5 6 7 8 9 10 11 12 |
int devId = 0; // 配置ranktable文件路径 char* rankTableFile = "/home/ranktable.json"; // 定义通信域句柄 HcclComm hcclComm; // 初始化HCCL通信域 HcclCommInitClusterInfo(rankTableFile, devId, &hcclComm); /* 集合通信操作 */ // 销毁HCCL通信域 HcclCommDestroy(hcclComm); |
完整的代码示例可参见HcclCommInitClusterInfo初始化方式或HcclCommInitClusterInfoConfig初始化方式。
基于root节点信息创建通信域
- 每个Device对应一个业务进程的场景,实现流程如下所示:
- 指定HCCL初始化时Host节点使用的通信IP地址或通信网卡(可选)。
- 方式一:在每个Host节点通过环境变量HCCL_IF_IP配置通信IP地址,该IP地址用于与root节点通信,可以是IPv4或IPv6格式,仅支持配置一个IP地址。配置示例如下:
1
export HCCL_IF_IP=10.10.10.1
- 方式二:在每个Host节点通过环境变量HCCL_SOCKET_IFNAME配置通信网卡名,通过HCCL_SOCKET_FAMILY配置网卡使用的通信协议,HCCL将通过该网卡名获取Host IP,与root节点通信。配置示例如下:
1 2 3 4 5 6 7 8 9 10 11
# 配置HCCL初始化时通信网卡使用的IP协议版本,AF_INET:IPv4;AF_INET6:IPv6 export HCCL_SOCKET_FAMILY=AF_INET # 支持以下格式的网卡名配置(4种规格自行选择1种即可,环境变量中可配置多个网卡,多个网卡间使用英文逗号分隔,取最先匹配到的网卡作为通信网卡) # 精确匹配网卡 export HCCL_SOCKET_IFNAME==eth0,enp0 # 使用指定的eth0或enp0网卡 export HCCL_SOCKET_IFNAME=^=eth0,enp0 # 不使用eth0与enp0网卡 # 模糊匹配网卡 export HCCL_SOCKET_IFNAME=eth,enp # 使用所有以eth或enp为前缀的网卡 export HCCL_SOCKET_IFNAME=^eth,enp # 不使用任何以eth或enp为前缀的网卡
如果不配置HCCL_IF_IP或HCCL_SOCKET_IFNAME,系统将按照如下优先级自动选择网卡。若当前节点选择的网卡与root节点选择的网卡链路不通,将导致HCCL建链失败。
docker/lo以外网卡(网卡名字典序升序) > docker 网卡 > lo网卡
- 方式一:在每个Host节点通过环境变量HCCL_IF_IP配置通信IP地址,该IP地址用于与root节点通信,可以是IPv4或IPv6格式,仅支持配置一个IP地址。配置示例如下:
- 在root节点调用HcclGetRootInfo接口,生成root节点rank标识信息“rootInfo”,包括device ip、device id等信息。
- 将root节点的rank信息广播至通信域中的所有rank。
- 在通信域中所有节点调用HcclCommInitRootInfo或者HcclCommInitRootInfoConfig接口(创建具有特定配置的通信域),基于接收到的“rootInfo”,以及本rank的rank id等信息,进行通信域初始化。
调用HcclCommInitRootInfo接口进行通信域初始化的完整代码示例可参见Device与业务进程一对一场景。
调用HcclCommInitRootInfoConfig接口进行通信域初始化的完整代码示例可参见Device与业务进程一对一场景。
- 指定HCCL初始化时Host节点使用的通信IP地址或通信网卡(可选)。
- 每个AI Server对应一个业务进程,每个线程对应一个Device,通过多线程的方式创建多个卡平面通信域的场景,实现流程如下所示:
- 参见“每个Device对应一个业务进程”场景的步骤1,指定HCCL初始化时Host节点使用的通信IP地址或通信网卡(可选)。
- 在主进程中循环执行“指定不同的Device + 调用HcclGetRootInfo接口”,获取多个“rootInfo”信息。
- 每个Device匹配一个线程,分别根据不同的“rootInfo”信息,并发调用HcclCommInitRootInfo或者HcclCommInitRootInfoConfig接口,进行通信域初始化。
调用HcclCommInitRootInfo接口进行通信域初始化的完整代码示例可参见AI Server与业务进程一对一场景。
调用HcclCommInitRootInfoConfig接口进行通信域初始化的完整代码示例可参见AI Server与业务进程一对一场景。
单机内批量创建通信域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
uint32_t ndev = 8; // 构造Device的逻辑ID列表 int32_t devices[8] = {0, 1, 2, 3, 4, 5, 6, 7}; // 定义通信域句柄 HcclComm comms[ndev]; // 初始化HCCL通信域 HcclCommInitAll(ndev, devices, comms); // 启动线程执行集合通信操作 std::vector<std::unique_ptr<std::thread> > threads(ndev); struct ThreadContext args[ndev]; for (uint32_t i = 0; i < ndev; i++) { args[i].device = i; args[i].comm = comms[i]; /* 集合通信操作 */ } // 销毁HCCL通信域 for (uint32_t i = 0; i < ndev; i++) { HcclCommDestroy(comms[i]); } |
需要注意,多线程调用集合通信操作API时(例如HcclAllReduce),需要确保不同线程中调用集合通信操作API的前后时间差不超过集合通信的建链超时等待时间(可通过环境变量HCCL_CONNECT_TIMEOUT设置,默认120s),避免建链超时。
完整的代码示例可参见HcclCommInitAll初始化方式。
基于已有通信域切分子通信域
HCCL提供了HcclCreateSubCommConfig接口,实现基于已有通信域切分具有特性配置子通信域的功能。该子通信域创建方式无需进行socket建链与rank信息交换,可应用于业务故障下的快速通信域创建。
使用HcclCreateSubCommConfig接口切分子通信域的代码示例可参见HcclCreateSubCommConfig方式创建子通信域。

该接口仅支持从全局通信域切分子通信域,不支持通信域的嵌套切分。