AllToAllOperation
功能
向通信域内所有通信卡发送相同数据量(输入切分成ranksize份)的数据,并从所有通信卡接收相同数据量的数据。
定义
struct AllToAllParam { int rank = 0; int rankSize = 0; int rankRoot = 0; std::string backend = "hccl"; HcclComm hcclComm = nullptr; CommMode commMode = COMM_MULTI_PROCESS; std::string rankTableFile; std::string commDomain; };
算子上下文

模型传输一个int8的量化输入tensor数据X,首先使用AlltoAll进行通信发送到各个节点上(这里使用int8进行通信,提升了通信速度)
然后使用reduce的sum操作对x进行求和,将int8数据反量化为float16, 最后使用AllGather进行通信将计算结果传输到各个节点上。(需求图中AllGather前后的量化,有可能会有精度损失,当前未实现。)
算子功能实现描述
向通信域内所有通信卡发送相同数据量(输入切分成ranksize份)的数据,并从所有通信卡接收相同数据量的数据。如下图所示,对于ranksize=4的情况,各个通信卡将自身的数据均匀分成ranksize份,发送给其他的通信卡。

计算过程示意(Python):
goldenTensors = [] for i in range(rankSize): golden_out = [] for j in range(rankSize): golden_out_list = intensors[j].reshape(-1).tolist() # intensors[j]代表第j张卡上的intesor,计算时视为一维向量 split = golden_out_list[i*len(golden_out_list) // rankSize:(i+1)*len(golden_out_list) // rankSize] golden_out += split golden_out_tensor = torch.tensor(golden_out).reshape(shape) # golden_out_tensor是第i张卡上的outtensor,输出时shape和intensor一致 goldenTensors.append(golden_out_tensor) return [goldenTensors[rank].cpu()]
使用场景
用于将数据发送到各个节点上,多对多。AllToAll是对Allgather的扩展,相比于Allgather,AllToAll不同的节点从某一节点收集到的数据是不同的。

应用于模型并行;模型并行里的矩阵转置;数据并行到模型并行的矩阵转置。
参数列表
成员名称 |
类型 |
默认值 |
描述 |
---|---|---|---|
rank |
int |
0 |
当前卡所属通信编号。 |
rankSize |
int |
0 |
通信的卡的数量。 |
rankRoot |
int |
0 |
主通信编号 |
backend |
std::string |
"hccl" |
通信计算类型,仅支持"hccl"。 |
hcclComm |
HcclComm |
nullptr |
HCCL通信域指针。 默认为空,加速库为用户创建;若用户想要自己管理通信域,则需要传入该通信域指针,加速库使用传入的通信域指针来执行通信算子。 |
commMode |
CommMode |
COMM_MULTI_PROCESS |
通信模式,CommMode类型枚举值。hccl多线程只支持外部传入通信域方式。 |
rankTableFile |
std::string |
- |
集群信息的配置文件路径,适用单机以及多机通信场景,当前仅支持hccl后端场景。 若单机配置了ranktable,则以ranktable来初始化通信域。 |
commDomain |
std::string |
- |
通信device组用通信域名标识,多通信域时使用,当前仅支持hccl。 |
输入
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
x |
[dim_0,dim_1,... ,dim_n] |
"hccl":float16/float/int8/int16/int32/int64/bf16 |
ND |
输入tensor。 |
输出
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
output |
[dim_0,dim_1,... ,dim_n] |
"hccl":float16/float/int8/int16/int32/int64/bf16 数据类型和输入相同 |
ND |
输出tensor,与输入维度相同。 |
规格约束
- 当前只支持
Atlas 800I A2 推理产品 /Atlas A2 训练系列产品 。 - 各个通信卡的inTensor维度相等。
- 进行AllToAll计算时会将输入tensor视为一维向量计算,输出的shape则会和输入tensor一致。
- rank、rankSize、rankRoot需满足以下条件。
- 0 ≤ rank < rankSize
- 0 ≤ rankRoot < rankSize