向通信域内所有通信卡发送数据(数据量可以定制),并从所有通信卡接收数据。
模型传输一个int8的量化输入tensor数据X,首先使用AlltoAll进行通信发送到各个节点上(这里使用int8进行通信,提升了通信速度)
然后使用reduce的sum操作对x进行求和,将int8数据反量化为float16, 最后使用AllGather进行通信将计算结果传输到各个节点上。
向通信域内所有通信卡发送数据(数据量可以通过参数定制),并从所有通信卡接收数据(数据量可以通过参数定制)。
golden_result = [] for j in range(rankSize): tensor_list = intensors[j].reshape(-1).tolist() # intensors[j]代表第j张卡上的intesor golden_result += tensor_list[sdispls[rank]:sdispls[rank]+sendCounts[rank]] size = sum(recvCounts) golden_out_tensor = torch.tensor(golden_result).reshape(1,size)
用于将数据发送到各个节点上,多对多。对All-Gather的扩展,但不同的节点向某一节点收集到的数据是不同的。
应用于模型并行;模型并行里的矩阵转置;数据并行到模型并行的矩阵转置。
struct AllToAllVParam { int rank = 0; int rankSize = 0; int rankRoot = 0; std::vector<int64_t> sendCounts; std::vector<int64_t> sdispls; std::vector<int64_t> recvCounts; std::vector<int64_t> rdispls; std::string backend = "hccl"; HcclComm hcclComm = nullptr; CommMode commMode = COMM_MULTI_PROCESS; std::string rankTableFile; std::string commDomain; };
成员名称 |
类型 |
默认值 |
描述 |
---|---|---|---|
rank |
int |
0 |
当前卡所属通信编号。 |
rankSize |
int |
0 |
通信的卡的数量。 |
rankRoot |
int |
0 |
主通信编号 |
sendCounts |
std::vector< int64_t > |
[] |
表示发送数据量的数组。 例如:若发送的数据类型为float32,sendCounts[i] = n 表示本rank发给rank i n个float32数据。 |
sdispls |
std::vector< int64_t > |
[] |
表示发送偏移量的数组。 sdispls[i] = n表示本rank从相对于输入起始位置的的偏移量为n的位置开始发送数据给rank i。 |
recvCounts |
std::vector< int64_t > |
[] |
表示接收数据量的数组。 例如:若发送的数据类型为float32,recvCounts[i] = n 表示本rank从rank i收到n个float32数据。 |
rdispls |
std::vector< int64_t > |
[] |
表示接收偏移量的数组。 rdispls[i] = n表示本rank从相对于输出起始位置的的偏移量为n的位置开始接收rank i的数据。 |
backend |
std::string |
"hccl" |
通信计算类型,仅支持"hccl"。 |
hcclComm |
HcclComm |
nullptr |
HCCL通信域指针。 默认为空,加速库为用户创建;若用户想要自己管理通信域,则需要传入该通信域指针,加速库使用传入的通信域指针来执行通信算子。 |
commMode |
CommMode |
COMM_MULTI_PROCESS |
通信模式,CommMode类型枚举值。hccl多线程只支持外部传入通信域方式。 |
rankTableFile |
std::string |
- |
集群信息的配置文件路径,适用单机以及多机通信场景,当前仅支持hccl后端场景。 若单机配置了ranktable,则以ranktable来初始化通信域。 配置请参见《TensorFlow 1.15模型迁移指南》的“准备ranktable资源配置文件”。 |
commDomain |
std::string |
- |
通信device组用通信域名标识,多通信域时使用,当前仅支持“hccl”。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
x |
[dim_0,dim_1,... ,dim_n] |
"hccl":float16/float/int8/int16/int32/int64/bf16 |
ND |
输入tensor。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
output |
[1,sum(recvCounts)] recvCountsSum为参数recvCounts的所有元素之和 |
"hccl": float16/float/int8/int16/int32/int64/bf16 数据类型和输入相同 |
ND |
输出tensor,最后一维的shape为参数recvCounts的所有元素之和。 |
rm -rf /dev/shm/sem.lccl* rm -rf /dev/shm/sem.hccl* ipcrm -a