昇腾社区首页
中文
注册

AllToAllOperation

产品支持情况

硬件型号

是否支持

Atlas A3 推理系列产品 / Atlas A3 训练系列产品

Atlas A2 训练系列产品 / Atlas 800I A2 推理产品

Atlas 训练系列产品

x

Atlas 推理系列产品

x

Atlas 200I/500 A2 推理产品

x

功能说明

向通信域内所有通信卡发送相同数据量(输入切分成rankSize份)的数据,并从所有通信卡接收相同数据量的数据。如下图所示,对于rankSize=4的情况,各个通信卡将自身的数据均匀分成rankSize份,发送给其他的通信卡。

图1 AllToAll算子功能示意图

计算过程示意(Python):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
goldenTensors = []
for i in range(rankSize):
    golden_out = []
    for j in range(rankSize):
        golden_out_list = intensors[j].reshape(-1).tolist() # intensors[j]代表第j张卡上的intensor,计算时视为一维向量
        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张卡上的输出tensor,输出时shape和输入tensor一致
    goldenTensors.append(golden_out_tensor)
return [goldenTensors[rank].cpu()]

算子上下文

图2 通信INT8量化中AllToAll的位置

模型传输一个int8的量化输入tensor数据X,首先使用AlltoAll进行通信发送到各个节点上(这里使用int8进行通信,提升了通信速度)。

然后使用reduce的sum操作对x进行求和,将int8数据反量化为float16,最后使用AllGather进行通信将计算结果传输到各个节点上。(需求图中AllGather前后的量化,有可能会有精度损失,当前未实现。)

使用场景

用于将数据发送到各个节点上,多对多。AllToAll是对Allgather的扩展,相比于AllGather,AllToAll不同的节点从某一节点收集到的数据是不同的。

图3 AllToAll和AllGather使用对比

应用于模型并行;模型并行里的矩阵转置;数据并行到模型并行的矩阵转置。

定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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;
    bool transpose = false;
    uint8_t rsv[62] = {0};
};

参数列表

成员名称

类型

默认值

描述

rank

int

0

当前卡所属通信编号。

rankSize

int

0

通信的卡的数量。

rankRoot

int

0

主通信编号

backend

std::string

"hccl"

通信计算类型,支持hccl和lccl。

当backend为lccl时:

  • Atlas 200T A2 Box16 异构子框场景下,通信域仅支持前8卡或后8卡内部建立,不支持同时包含前8卡和后8卡的通信域。

hcclComm

HcclComm

nullptr

HCCL通信域指针。

默认为空,加速库为用户创建;若用户想要自己管理通信域,则需要传入该通信域指针,加速库使用传入的通信域指针来执行通信算子。

commMode

CommMode

COMM_MULTI_PROCESS

通信模式,CommMode类型枚举值。hccl多线程只支持外部传入通信域方式。

rankTableFile

std::string

-

集群信息的配置文件路径,适用单机以及多机通信场景,当前仅支持hccl后端场景。

若单机配置了rankTable,则以rankTable来初始化通信域。

ranktable配置请参考《TensorFlow 1.15模型迁移指南》的“模型训练>执行分布式训练>准备ranktable资源配置文件”章节。

commDomain

std::string

-

通信Device组用通信域名标识,多通信域时使用。当backend为"lccl"时,commMode为多进程时,commDomain需要设置为0-65535的数字。commMode为多线程时,不支持确定性计算,"LCCL_DETERMINISTIC"需要为0或者false。

LCCL在多进程/多线程多通信域并发场景下,"LCCL_PARALLEL"需要设置为1或者true。多通信域并行功能使用结束后,"LCCL_PARALLEL"需要设置为0或者false,否则会导致基础场景性能下降。

支持设置通信域的内存大小,用于性能优化,配置方式通信域:通信域大小(MB),如“0:400”,当同一个通信域中多个算子配置冲突时,以第一个执行到的该通信域算子配置为准。

限制:默认值为200,当前配置大小不支持小于200。

transpose

bool

false

通信结果对输入进行转置,当前仅支持lccl。

rsv[62]

uint8_t

{0}

预留参数。

基础场景输入输出

transpose置为false

参数

维度

数据类型

格式

描述

x

[dim_0, dim_1, ..., dim_n]

float16/float/int8/int16/int32/int64/bf16

ND

输入tensor。

output

[dim_0, dim_1, ..., dim_n]

float16/float/int8/int16/int32/int64/bf16

数据类型和输入相同

ND

输出tensor,与输入维度相同。

转置场景输入输出

transpose置为true

参数

维度

数据类型

格式

描述

x

[b, w]

float16/bf16/int8

ND

输入tensor。

output

[b*rankSize, w/rankSize]

float16/bf16/int8

ND

输出tensor。

约束说明

  • backend为lccl时不支持多机通信和多通信域,且只支持偶数的rankSize。
  • 各个通信卡的输入tensor维度相等。
  • 参数维度相乘要能整除rankSize。
  • 进行AllToAll计算时会将输入tensor视为一维向量计算,输出的shape则会和输入tensor一致。
  • 转置场景下有如下约束:
    • w需要被rankSize整除。
    • w/rankSize的值不能超过90KB。
    • 整个x tensor的大小不能超过190MB。
    • rankSize只能为2、4、8。
  • rank、rankSize、rankRoot需满足以下条件。
    • 0 ≤ rank < rankSize
    • 0 ≤ rankRoot < rankSize
  • 多用户使用时需要使用ATB_SHARE_MEMORY_NAME_SUFFIX环境变量(请参见Transformer加速库环境变量说明)进行共享内存的区分,以进行初始化信息同步。
  • 当使用加速库的通信算子异常退出时,需要清空残留数据,避免影响之后的使用,命令参考如下:
    rm -rf /dev/shm/sem.lccl*
    rm -rf /dev/shm/sem.hccl*
    ipcrm -a