AllReduceOperation

功能

将多个通信卡上的数据进行计算,支持相加、取最大、最小、相乘四种计算,然后发送到每张卡上。

该算子涉及多卡相关操作,可根据实际需求配置HCCL相关环境变量,具体请参见《CANN 环境变量参考》中的“集合通信”章节

使用场景

多对多。在所有节点上都执行相同的Reduce操作(相加、取最大、最小、相乘),将所有节点的数据规约运算得到的结果发送到所有的节点上(broadcast)。

图1 AllReduce算子工作原理

应用场景:

使用示例:

定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
struct AllReduceParam {
    enum QuantType : int {
        QUANT_TYPE_UNDEFINED = 0,
        QUANT_TYPE_PER_TENSOR = 1,
        QUANT_TYPE_PER_CHANNEL = 2,
        QUANT_TYPE_MAX = 3,  
    };
    int rank = 0;
    int rankSize = 0;
    int rankRoot = 0;
    std::string allReduceType = "sum";
    std::string backend = "hccl";
    HcclComm hcclComm = nullptr;
    CommMode commMode = COMM_MULTI_PROCESS;
    std::string rankTableFile;
    std::string commDomain;
    QuantType quantType = QUANT_TYPE_UNDEFINED;
    aclDataType outDataType = ACL_DT_UNDEFINED;
    uint8_t rsv[64] = {0};
};

参数列表

成员名称

类型

默认值

描述

rank

int

0

当前卡所属通信编号。

rankSize

int

0

通信的卡的数量。

rankRoot

int

0

主通信编号。

allReduceType

string

"sum"

通信计算类型。

支持“sum”(相加),“prod”(相乘),“max”(取最大)和“min”(取最小)。

backend

string

"hccl"

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

Atlas 推理系列产品 仅支持backend为"hccl"。

  • “backend”“hccl”
    • 支持"sum","prod","max"和"min"。
    • “allReduceType”为"prod"时,不支持数据类型为int16和bf16。
    • Atlas 推理系列产品 不支持int64、bf16,int16只有“allReduceType”为"sum"时支持。
  • “backend”“lccl”
    • 支持"sum","max"和"min"。
    • 不支持数据类型int64。
    • “backend”“lccl”且机器为 Atlas A2 训练系列产品 里的Atlas 200T A2 Box16 异构子框时支持单机16卡(16卡全量拓扑通信或单节点内任意卡通信)。

hcclComm

HcclComm

nullptr

HCCL通信域指针。

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

commMode

CommMode

COMM_MULTI_PROCESS

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

rankTableFile

string

-

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

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

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

commDomain

string

-

通信Device组用通信域名标识,多通信域时使用。 当前LCCL支持单进程多线程多通信域并行,使用该功能的时候,“commMode”需要设置为COMM_MULTI_THREAD。LCCL的多通信域并行新增环境变量"LCCL_PARALLEL"需要设置为true,该功能仅支持普通AllReduce,不支持确定性计算和量化场景,"LCCL_DETERMINISTIC"需要为0或者false。

多通信域并行功能使用结束后,LCCL_PARALLEL需要设置回false,否则会导致基础场景性能下降。

quantType

QuantType

QUANT_TYPE_UNDEFINED

量化类型。

QUANT_TYPE_UNDEFINED:默认值。

QUANT_TYPE_PER_TENSOR:对整个张量进行量化。

QUANT_TYPE_PER_CHANNEL:对张量中每个channel分别进行量化。

QUANT_TYPE_MAX:枚举类型最大值。

outDataType

aclDataType

ACL_DT_UNDEFINED

  • 若为浮点AllReduce,参数outDataType配置为ACL_DT_UNDEFINED,表示输出tensor的数据类型与输入tensor一致。
  • 若为量化AllReduce,输出tensor的数据类型与输入tensor不一致,则参数outDataType配置为用户预期输出tensor的数据类型。量化只支持配置ACL_FLOAT16。

rsv[64]

uint8_t

{0}

预留参数。

注:LCCL多通信域并行时,最大通信数据量不超过100MB,1MB以上性能下降。并发通信时,带宽共享,性能下降。LCCL多通信域并行功能和确定性计算功能不兼容,开启确定性计算后该功能失效。

函数输入输出描述

参数

维度

数据类型

格式

描述

x

[dim_0,dim_1,... ,dim_n]

  • "hccl": float16/float/int8/int16/int32/int64/bf16
  • "lccl":float16/float/int8/int16/int32/bf16

ND

输入tensor。

output

[dim_0,dim_1,... ,dim_n]

  • "hccl":float16/float/int8/int16/int32/int64/bf16
  • "lccl":float16/float/int8/int16/int32/bf16

ND

输出tensor。

quantType为QUANT_PER_Tensor的输入输出描述

参数

维度

数据类型

格式

描述

x

[dim_0,dim_1,... ,dim_n]

int8

ND

输入tensor,最后一维dim_n的大小是16的整数倍。

scale

[1]

float16

ND

输入。scale中元素要求为标量。

offset

[1]

float16

ND

输入。offset中元素要求为标量。

y

[dim_0,dim_1,... ,dim_n]

float16

ND

量化输出结果。

quantType为QUANT_PER_Cannel的输入输出描述

参数

维度

数据类型

格式

描述

x

[dim_0,dim_1,... ,dim_n]

int8

ND

输入tensor,最后一维dim_n的大小是16的整数倍。

scale

[1, n] 或 [n]

float16

ND

输入。scale中元素要求不为0。最后一维n的大小是16的整数倍。

offset

[1]

float16

ND

输入。offset中元素要求为标量。

y

[dim_0,dim_1,... ,dim_n]

float16

ND

量化输出结果。

规格约束

rank、rankSize、rankRoot需满足以下条件。

  • 多用户使用时需要使用ATB_SHARE_MEMORY_NAME_SUFFIX环境变量(请参见Transformer加速库环境变量说明)进行共享内存的区分,以进行初始化信息同步。
  • 当使用加速库的通信算子异常退出时,需要清空残留数据,避免影响之后的使用,命令参考如下:
    rm -rf /dev/shm/sem.lccl*
    rm -rf /dev/shm/sem.hccl*
    ipcrm -a
  • 当前不支持单device上跑多个HCCP进程实例,不能单卡同时跑多个通信算子。比如运行通信算子场景下,不支持同一张卡上跑多个模型。