Skip to content

Conv2D(废弃)

产品支持情况

  • Ascend 950PR/Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:支持

功能说明

该接口废弃,并将在后续版本移除,请不要使用该接口。

计算给定输入张量和权重张量的2-D卷积,输出结果张量。Conv2D卷积层多用于图像识别,使用过滤器提取图像中的特征。

函数原型

C++
template <typename T, typename U>
__aicore__ inline void Conv2D(const LocalTensor<T>& dst, const LocalTensor<U>& featureMap, const LocalTensor<U>& weight, Conv2dParams& conv2dParams, Conv2dTilling& tilling)

入参中的tiling结构需要通过如下切分方案计算接口来获取:

C++
template <typename T>
__aicore__ inline Conv2dTilling GetConv2dTiling(Conv2dParams& conv2dParams)

参数说明

表1 接口参数说明

参数名称类型说明
dst输出目的操作数。

Atlas 训练系列产品,支持的TPosition为:CO1,CO2

Atlas 推理系列产品AI Core,支持的TPosition为:CO1,CO2


结果中有效张量格式为[Cout/16, Ho, Wo, 16],大小为Cout * Ho * Wo,Ho与Wo可以根据其他数据计算得出。
Ho = floor((H + pad_top + pad_bottom - dilation_h * (Kh - 1) - 1) / stride_h + 1)
Wo = floor((W + pad_left + pad_right - dilation_w * (Kw - 1) - 1) / stride_w + 1)
由于硬件要求Ho*Wo需为16倍数,在申请dst Tensor时,shape应向上16对齐,实际申请shape大小应为Cout * round_howo。
round_howo = ceil(Ho * Wo /16) * 16。
featureMap输入输入张量,Tensor的TPosition为A1。

输入张量"feature_map"的形状,格式是[C1, H, W, C0]。
C1*C0为输入的channel数,要求如下:
•当feature_map的数据类型为half时,C0=16。
•当feature_map的数据类型为int8_t时,C0=32。
• C1取值范围:[1,4],输入的channel的范围:[16,32,64,128]。

H为高,取值范围:[1,40]。
W为宽,取值范围:[1,40]。
weight输入卷积核(权重)张量,Tensor的TPosition为B1。

卷积核张量"weight"的形状,格式是[C1, Kh, Kw, Cout, C0]。
C1*C0为输入的channel数,对于C0要求如下:
•当feature_map的数据类型为half时,C0=16。
•当feature_map的数据类型为int8_t时,C0=32。
• C1取值范围:[1,4]。
• kernel_shape输入的channel数需与fm_shape输入的channel数保持一致。

Cout为卷积核数目,取值范围:[16,32,64,128],Cout必须为16的倍数。
Kh为卷积核高;值的范围:[1,5]。
Kw表示卷积核宽;值的范围:[1,5]。
conv2dParams输入输入矩阵形状等状态参数,类型为Conv2dParams。结构体具体定义为:


struct Conv2dParams {
uint32_t imgShape[CONV2D_IMG_SIZE]; // [H, W]
uint32_t kernelShapeIn[CONV2D_KERNEL_SIZE]; // [Kh, Kw]
uint32_t stride[CONV2D_STRIDE]; // [stride_h, stride_w]
uint32_t cin; // cin = C0 * C1;
uint32_t cout;
uint32_t padList[CONV2D_PAD]; // [pad_left, pad_right, pad_top, pad_bottom]
uint32_t dilation[CONV2D_DILATION]; // [dilation_h, dilation_w]
uint32_t initY;
uint32_t partialSum;
};
tilling输入分形控制参数,类型为Conv2dTilling。结构体具体定义为:

struct Conv2dTilling {
const uint32_t blockSize = 16; // # M block size is always 16
LoopMode loopMode = LoopMode::MODE_NM;

uint32_t c0Size = 32;
uint32_t dTypeSize = 1;

uint32_t strideH = 0;
uint32_t strideW = 0;
uint32_t dilationH = 0;
uint32_t dilationW = 0;
uint32_t hi = 0;
uint32_t wi = 0;
uint32_t ho = 0;
uint32_t wo = 0;

uint32_t height = 0;
uint32_t width = 0;

uint32_t howo = 0;

uint32_t mNum = 0;
uint32_t nNum = 0;
uint32_t kNum = 0;

uint32_t mBlockNum = 0;
uint32_t kBlockNum = 0;
uint32_t nBlockNum = 0;

uint32_t roundM = 0;
uint32_t roundN = 0;
uint32_t roundK = 0;

uint32_t mTileBlock = 0;
uint32_t nTileBlock = 0;
uint32_t kTileBlock = 0;

uint32_t mIterNum = 0;
uint32_t nIterNum = 0;
uint32_t kIterNum = 0;

uint32_t mTileNums = 0;

bool mHasTail = false;
bool nHasTail = false;
bool kHasTail = false;

uint32_t kTailBlock = 0;
uint32_t mTailBlock = 0;
uint32_t nTailBlock = 0;

uint32_t mTailNums = 0;
};

表2 Conv2DParams结构体内参数说明:

参数名称类型说明
imgShapevector<int>输入张量"feature_map"的形状,格式是[H, W]。
• H为高,取值范围:[1,40]。
• W为宽,取值范围:[1,40]。
kernelShapevector<int>卷积核张量"weight"的形状,格式是[Kh, Kw]。
• Kh为高,取值范围:[1,5]。
• Kw为宽,取值范围:[1,5]。
stridevector<int>卷积步长,格式是[stride_h, stride_w]。
• stride_h表示步长高,值的范围:[1,4]。
• stride_w表示步长宽,值的范围:[1,4]。
cinint分形排布参数,Cin = C1 * C0,Cin为输入的channel数,C1取值范围:[1,4]。
•当feature_map的数据类型为float时,C0=8。输入的channel的范围:[8,16,24,32]。
•当feature_map的数据类型为half时,C0=16。输入的channel的范围:[16,32,48,64]。
•当feature_map的数据类型为int8_t时,C0=32。输入的channel的范围:[32,64,96,128]。
coutintCout为卷积核数目,取值范围:[16,32,64,128],Cout必须为16的倍数。
padListvector<int>padding行数/列数,格式是[pad_left, pad_right, pad_top, pad_bottom]。
• pad_left为feature_map左侧pad列数,范围[0,4]。pad_right为feature_map右侧pad列数,范围[0,4]。
• pad_top为feature_map顶部pad行数,范围[0,4]。
• pad_bottom为feature_map底部pad行数,范围[0,4]。
dilationvector<int>空洞卷积参数,格式[dilation_h, dilation_w]。
• dilation_h为空洞高,范围:[1,4]。
• dilation_w为空洞宽,范围:[1,4]。

膨胀后卷积核宽为dilation_w * (Kw - 1) + 1,高为dilation_h * (Kh - 1) + 1。
initYuint32_t表示dst是否需要初始化。
•取值0:不使用bias,L0C Buffer需要初始化,dst初始矩阵保存有之前结果,新计算结果会累加前一次Conv2D计算结果。
•取值1:不使用bias,L0C Buffer不需要初始化,dst初始矩阵中数据无意义,计算结果直接覆盖dst中的数据。
partialSumuint32_t当dst参数所在的TPosition为CO2时,通过该参数控制计算结果是否搬出。
•取值0:搬出计算结果
•取值1:不搬出计算结果,可以进行后续计算

表3 Conv2dTilling结构体内参数说明

参数名称类型说明
blockSizeuint32_t固定值,恒为16,一个维度内存放的元素个数。
loopModeLoopMode遍历模式,结构体具体定义为:

enum class LoopMode {
MODE_NM = 0,
MODE_MN = 1,
MODE_KM = 2,
MODE_KN = 3
};
c0Sizeuint32_t一个block的字节长度,范围[16或者32]。
dtypeSizeuint32_t传入的数据类型的字节长度,范围[1, 2]。
strideHuint32_t卷积步长-高,范围:[1,4]。
strideWuint32_t卷积步长-宽,范围:[1,4]。
dilationHuint32_t空洞卷积参数-高,范围:[1,4]。
dilationWuint32_t空洞卷积参数-宽,范围:[1,4]。
hiuint32_tfeature_map形状-高,范围:[1,40]。
wiuint32_tfeature_map形状-宽,范围:[1,40]。
houint32_tfeature_map形状-高,范围:[1,40]。
wouint32_tfeature_map形状-宽,范围:[1,40]。
heightuint32_tweight形状-高,[1,5]。
widthuint32_tweight形状-宽,[1,5]。
howouint32_tfeature_map形状大小,为ho * wo。
mNumuint32_tM轴等效数据长度参数值,范围:[1,4096]。
nNumuint32_tN轴等效数据长度参数值,范围:[1,4096]。
kNumuint32_tK轴等效数据长度参数值,范围:[1,4096]。
roundMuint32_tM轴等效数据长度参数值且以blockSize为倍数向上取整,范围:[1,4096]。
roundNuint32_tN轴等效数据长度参数值且以blockSize为倍数向上取整,范围:[1,4096]。
roundKuint32_tK轴等效数据长度参数值且以c0Size为倍数向上取整,范围:[1,4096]。
mBlockNumuint32_tM轴Block个数,mBlockNum = mNum / blockSize,范围:[1,4096]。
nBlockNumuint32_tN轴Block个数,nBlockNum = nNum / blockSize,范围:[1,4096]。
kBlockNumuint32_tK轴Block个数,kBlockNum = kNum / blockSize,范围:[1,4096]。
mIterNumuint32_t遍历M轴维度数量,范围:[1,4096]。
nIterNumuint32_t遍历N轴维度数量,范围:[1,4096]。
kIterNumuint32_t遍历K轴维度数量,范围:[1,4096]。
mTileBlockuint32_tM轴切分块个数,范围:[1,4096]。
nTileBlockuint32_tN轴切分块个数,范围:[1,4096]。
kTileBlockuint32_tK轴切分块个数,范围:[1,4096]。
kTailBlockuint32_tK轴尾块个数,范围:[1,4096]。
mTailBlockuint32_tM轴尾块个数,范围:[1,4096]。
nTailBlockuint32_tN轴尾块个数,范围:[1,4096]。
kHasTailboolK轴是否存在尾块。
mHasTailboolM轴是否存在尾块。
nHasTailboolN轴是否存在尾块。
mTileNumsuint32_tM轴切分块个数的长度,范围:[1,4096]。
mTailNumsuint32_tM轴尾块个数的长度,范围:[1,4096]。

数据类型

表4 feature_map、weight和dst的数据类型组合

feature_map.dtypeweight.dtypedst.dtype
int8_tint8_tint32_t
halfhalffloat
halfhalfhalf

返回值说明

约束说明

  • 该接口当前不支持W=Kw并且H>Kh的场景,其将产生不可预期的结果。
  • 操作数地址对齐要求请参见通用地址对齐约束

调用示例

该接口已废弃,请使用Mmad接口替代。

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区