随路量化激活搬运

产品支持情况

产品

是否支持

Ascend 950PR/Ascend 950DT

√

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

√

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

√

Atlas 200I/500 A2 推理产品

√

Atlas 推理系列产品AI Core

x

Atlas 推理系列产品Vector Core

x

Atlas 训练系列产品

x

功能说明

支持在数据搬运过程中进行量化和Relu激活等操作,同时支持Local Memory到Global Memory通路NZ到ND格式的转换。

函数原型

各原型支持的具体数据通路和数据类型,请参考支持的通路和数据类型。

参数说明

表1 模板参数说明

参数名

描述

T

目的操作数的数据类型。支持的数据类型请参考支持的通路和数据类型。

U

源操作数的数据类型。支持的数据类型请参考支持的通路和数据类型。

表2 参数说明

参数名称

输入/输出

含义

dst

输出

目的操作数,类型为LocalTensor或GlobalTensor。

src

输入

源操作数,类型为LocalTensor。

intriParams

输入

搬运参数,类型为DataCopyCO12DstParams。

具体定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_data_copy.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。

表3 DataCopyCO12DstParams结构体参数定义(C0取值:一般情况下,C0 = 16;使能channelSplit(channel切分)时,C0 = 8)

参数名称

含义

nSize

src横向方向的size大小。

  • 不使能NZ2ND功能,必须为C0的倍数,此时连续传输数据块的个数为nSize / C0。
  • 使能NZ2ND功能,不受限制。

mSize

src纵向方向的size大小。

  • 不使能NZ2ND功能,连续传输数据块的大小为mSize * C0个元素的长度。
  • 使能NZ2ND功能,NZ/ND矩阵的大小为mSize * nSize。

dstStride

  • 不使能NZ2ND功能

    dst相邻连续数据片段间隔(前面一个数据块的头与后面数据块的头的间隔),取值不为0。单位为DataBlock(32字节)。

  • 使能NZ2ND功能

    dst同一ND矩阵的相邻行的偏移(头与头),取值不为0, 单位为元素。

srcStride

  • 不使能NZ2ND功能

    src相邻连续数据片段间隔(前面一个数据块的头与后面数据块的头的间隔),必须为16的倍数。取值范围:srcStride∈[0, 65535], 单位:C0_Size(C0 * sizeof(U),U为src的数据类型)。

  • 使能NZ2ND功能

    src同一NZ矩阵的相邻Z排布的偏移(头与头),必须为16的倍数,取值范围:srcStride∈[0, 65535],单位C0_size。

quantPre

用于控制量化模式,QuantMode_t类型,具体定义如下。默认值为QuantMode_t::NoQuant,即不使能量化功能。

配置为scalar量化时,需要调用SetFixpipePreQuantFlag接口来设置scalar量化参数;配置为tensor量化时,需要调用SetFixPipeConfig来设置tensor量化参数。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
enum QuantMode_t
{
    NoQuant,      // 不使能量化功能
    F322F16,      // float cast成half,cast mode为CAST_RINT模式
    F322BF16,     // float cast成bfloat16_t,cast mode为CAST_RINT模式
    DEQF16,       // int32_t量化成half, scalar量化
    VDEQF16,      // int32_t量化成half,tensor量化
    QF322B8_PRE,  // float量化成int8_t/uint8_t,scalar量化
    VQF322B8_PRE, // float量化成int8_t/uint8_t,tensor量化
    REQ8,         // int32_t量化成int8_t/uint8_t,scalar量化
    VREQ8,        // int32_t量化成int8_t/uint8_t,tensor量化
};

reluPre

用于配置relu操作的模式,类型为uint8_t,取值如下:

  • 0:不使能relu
  • 1:Normal relu

channelSplit

类型为bool,配置是否使能channel切分,对于float类型的dst生效。

  • false:不使能
  • true:使能

nz2ndEn

类型为bool,配置是否使能NZ2ND的格式转换,仅在CO1 -> GM通路生效。

如果要使能NZ2ND的功能需要同步调用SetFixpipeNz2ndFlag来设置格式转换的相关配置信息。

  • false:不使能
  • true:使能

clipReluPre

用于配置是否使能ClipRelu操作,参数类型为uint8_t,取值如下:0,不使能ClipRelu;1,使能ClipRelu,此时需要调用SetFixPipeClipRelu来设置clipRelu的最大值。

  • 该操作在随路量化后进行,quantPre配置后才能使用,当前支持的量化模式有F322F16/DEQF16/VDEQF16/QF322B8_PRE/VQF322B8_PRE/REQ8/VREQ8。
  • 该参数仅在Atlas 200I/500 A2 推理产品支持。

eltWiseOp

用于配置是否使能Elementwise操作及操作模式。Elementwise操作是指进行随路量化后,可以逐个元素加/减一个LocalTensor,大小为mSize * nSize,具体LocalTensor地址相关参数需要调用SetFixPipeAddr来设置。

eltWiseOp参数类型为uint8_t,取值如下:

  • 0:不使能Elementwise
  • 1:Elementwise Addition
  • 2:Elementwise Subtraction

该参数仅在Atlas 200I/500 A2 推理产品支持。

sid

预留参数,为后续的功能做保留,开发者暂时无需关注。

返回值说明

无

约束说明

无

支持的通路和数据类型

下文的数据通路均通过逻辑位置TPosition来表达,并注明了对应的物理通路。TPosition与物理内存的映射关系见表1。

表4 Local Memory -> Global Memory具体通路和支持的数据类型

支持型号

数据通路

源操作数的数据类型

目的操作数的数据类型

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

CO1 -> GM(L0C Buffer -> GM)

float

uint8_t、int8_t、half、bfloat16_t、float

int32_t

uint8_t、int8_t、half、int16_t、int32_t

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

CO1 -> GM(L0C Buffer -> GM)

float

uint8_t、int8_t、half、bfloat16_t、float

int32_t

uint8_t、int8_t、half、int16_t、int32_t

Atlas 200I/500 A2 推理产品

CO1 -> GM(L0C Buffer -> GM)

float

uint8_t、int8_t、half、bfloat16_t、float

int32_t

uint8_t、int8_t、half、int16_t、int32_t

Ascend 950PR/Ascend 950DT

CO1 -> GM(L0C Buffer -> GM)

float

uint8_t、int8_t、half、bfloat16_t、float

int32_t

uint8_t、int8_t、half、int16_t、int32_t

表5 Local Memory -> Local Memory具体通路和支持的数据类型

支持型号

数据通路

源操作数的数据类型

目的操作数的数据类型

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

CO1 -> A1(L0C Buffer -> L1 Buffer)

float

uint8_t、int8_t、half、bfloat16_t

int32_t

uint8_t、int8_t、half、int16_t

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

CO1 -> A1(L0C Buffer -> L1 Buffer)

float

uint8_t、int8_t、half、bfloat16_t

int32_t

uint8_t、int8_t、half、int16_t

Ascend 950PR/Ascend 950DT

CO1 -> A1(L0C Buffer -> L1 Buffer)

float

uint8_t、int8_t、half、bfloat16_t、float

int32_t

uint8_t、int8_t、half、int16_t、int32_t

调用示例