下载
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
昇腾小AI

conv2d

功能说明

给定一个输入的张量和一个权重张量执行卷积2-D操作,输出结果张量。

支持的输入和输出数据类型请参见:表2

函数原型

conv2d(dst, feature_map, weight, fm_shape, kernel_shape, stride, pad, dilation, pad_value=0, init_l1out=True, bias=None)

参数说明

表1 参数说明

参数名称

输入/输出

含义

dst

输出

卷积结果操作数的起始element, 支持的数据类型参考表2,Tensor的scope为L1OUT。

结果中有效张量格式为[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。

因对齐引入的无效数据,会在后续fixpipe操作过程中去除。

feature_map

输入

输入张量,支持的数据类型参考表2, Tensor的scope为L1。

weight

输入

卷积核(权重)张量,支持的数据类型参考表2,Tensor的scope为L1。

fm_shape

输入

输入张量“feature_map”的形状,格式是[C1, H, W, C0]。

C1*C0为输入的channel数,C1取值范围:[1,256],要求如下:

  • 当feature_map的数据类型为float16时,C0=16;数据类型为立即数(int)。输入的channel的范围:[16,2048];数据类型为立即数。
  • 当feature_map的数据类型为int8时,C0=32,数据类型为立即数(int)。输入的channel的范围:[32,2048];数据类型为立即数。
  • 对于网络中的首层卷积,输入为float16和int8时,conv2d的fm_shape可以支持C0=4、C1=1的特定场景。

H为高,取值范围:[1,4096];数据类型为立即数(int)。

W为宽,取值范围:[1,4096];数据类型为立即数(int)。

kernel_shape

输入

卷积核张量“weight”的形状,格式是[C1, Kh, Kw, Cout, C0]。

C1*C0为输入的channel数,要求与fm_shape中C1、C0的要求一致,另外要求:

  • kernel_shape输入的channel数需与fm_shape输入的channel数保持一致。

Cout为卷积核数目,取值范围:[16, 4096], Cout必须为16的倍数。数据类型为立即数(int)。

Kh为卷积核高;值的范围:[1,255]; 数据类型为立即数(int)。

Kw表示卷积核宽;值的范围:[1,255];数据类型为立即数(int)

stride

输入

卷积步长,格式是[stride_h, stride_w],。

stride_h:表示步长高; 值的范围:[1,63]。 数据类型为立即数(int)

stride_w:表示步长宽; 值的范围:[1,63]。 数据类型为立即数(int)

pad

输入

padding行数/列数,格式是[pad_left, pad_right, pad_top, pad_bottom];

pad_left: feature_map左侧pad列数。范围[0,255]。 数据类型为立即数(int)。

pad_right: feature_map右侧pad列数。范围[0,255]。 数据类型为立即数(int)。

pad_top: feature_map顶部pad行数。范围[0,255]。 数据类型为立即数(int)。

pad_bottom: feature_map底部pad行数。范围[0,255]。 数据类型为立即数(int)。

dilation

输入

空洞卷积参数,格式[dilation_h, dilation_w];

dilation_h: 空洞高,范围:[1,255], 数据类型为立即数(int)。

dilation_w: 空洞宽,范围:[1,255], 数据类型为立即数(int)。

膨胀后卷积核宽为dilation_w * (Kw - 1) + 1,高为dilation_h * (Kh - 1) + 1

pad_value

输入

padding填充值的数值,支持的数据类型为:立即数(int/float)。默认值为0。

  • 当feature_map数据类型为int8时,取值范围:pad_value∈[-128, 127],且pad_value必须为立即数(int)。
  • 当feature_map数据类型为float16时,取值范围: pad_value∈[-65504, 65504],且pad_value必须为立即数(float,int)。

init_l1out

输入

表示dst是否需要初始化。支持的数据类型为:bool类型。默认值为True。

  • True:dst初始矩阵中数据无意义,计算结果直接覆盖dst中的数据。
  • False:dst初始矩阵保存有之前结果,新计算结果会累加前一次conv2d 计算结果。

bias

输入

卷积偏置,默认值为None,表示不添加偏置。

若使能偏置,输入bias为偏置操作数的起始 element,支持的数据类型为 Tensor(int32, float32),需与dst的数据类型保持一致,shape形状为[Cout,],Cout 为卷积核个数;Tensor 的scope为L1。

注意:

  • bias支持的AI处理器型号为:

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

    Atlas 200/500 A2推理产品

  • 当有bias时,init_l1out必须为True;当init_1out为False时,bias必须为None。
表2 feature_map、weight和dst的数据类型组合

feature_map.dtype

weight.dtype

dst.dtype

int8

int8

int32

float16

float16

float32

支持的型号

Atlas 200/300/500 推理产品

Atlas 训练系列产品

Atlas推理系列产品AI Core

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

Atlas 200/500 A2推理产品

注意事项

  • 单步调试时间比较长,不建议使用。
  • 该接口不支持与vector相关指令一起使用。
  • 该指令应与fixpipe指令配合使用。
  • 该接口当前不支持W=Kw并且H>Kh的场景,其将产生不可预期的结果。
  • 操作数地址偏移对齐要求请见通用约束

返回值

调用示例

  • 示例:feature_map:weight:dst的数据类型为int8:int8:int32
    from tbe import tik
    tik_instance = tik.Tik()
    # 定义tensor
    feature_map_gm = tik_instance.Tensor("int8", [1, 4, 4, 32], name='feature_map_gm', scope=tik.scope_gm)
    weight_gm = tik_instance.Tensor("int8", [1, 2, 2, 32, 32], name='weight_gm', scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("int32", [2, 9, 16], name='dst_gm', scope=tik.scope_gm)
    feature_map = tik_instance.Tensor("int8", [1, 4, 4, 32], name='feature_map', scope=tik.scope_cbuf)
    weight = tik_instance.Tensor("int8", [1, 2, 2, 32, 32], name='weight', scope=tik.scope_cbuf)
    # dst的shape应申请为[2, 16, 16],其中cout=32,cout_blocks=2, ho=3, wo=3, howo=9, 将howo向上16对齐,因此round_howo=16
    dst = tik_instance.Tensor("int32", [2, 16, 16], name='dst', scope=tik.scope_cbuf_out)
    # 将数据从gm搬入源操作数tensor
    tik_instance.data_move(feature_map, feature_map_gm, 0, 1, 16, 0, 0)
    tik_instance.data_move(weight, weight_gm, 0, 1, 128, 0, 0)
    # 进行卷积操作
    tik_instance.conv2d(dst, feature_map, weight, [1, 4, 4, 32], [1, 2, 2, 32, 32], [1, 1], [0, 0, 0, 0], [1, 1], 0)
    # 与fixpipe配合使用,将dst从L1OUT搬至gm
    # 由于cout_blocks=2, cburst_num=2, burst_len=howo*16*src_dtype_size/32=9*16*4/32=18
    tik_instance.fixpipe(dst_gm, dst, 2, 18, 0, 0, extend_params=None)
    tik_instance.BuildCCE(kernel_name="conv2d", inputs=[feature_map_gm, weight_gm], outputs=[dst_gm])

    结果示例:

    输入数据:
    feature_map_gm:
    [[[[2, 4, 2, 3, 2, ..., 3, 3, 0]]]]
    weight_gm:
    [[[[[-3, -5, -4, ..., -2, -4, -2]]]]]
    输出数据:
    dst_gm:
    [[[-230,  -11,  -83, -103, -123, ..., -174, -255]]]
  • 示例:feature_map:weight:dst的数据类型为float16:float16:float32
    from tbe import tik
    tik_instance = tik.Tik()
    # 定义tensor
    feature_map_gm = tik_instance.Tensor("float16", [2, 4, 4, 16], name='feature_map_gm', scope=tik.scope_gm)
    weight_gm = tik_instance.Tensor("float16", [2, 2, 2, 16, 16], name='weight_gm', scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("float32", [1, 4, 16], name='dst_gm', scope=tik.scope_gm)
    feature_map = tik_instance.Tensor("float16", [2, 4, 4, 16], name='feature_map', scope=tik.scope_cbuf)
    weight = tik_instance.Tensor("float16", [2, 2, 2, 16, 16], name='weight', scope=tik.scope_cbuf)
    # dst的shape应申请为[1, 16, 16],其中cout=16,cout_blocks=1, ho=2, wo=2, howo=4, 将howo向上16对齐,因此round_howo=16
    dst = tik_instance.Tensor("float32", [1, 16, 16], name='dst', scope=tik.scope_cbuf_out)
    # 将数据从gm搬入源操作数tensor
    tik_instance.data_move(feature_map, feature_map_gm, 0, 1, 32, 0, 0)
    tik_instance.data_move(weight, weight_gm, 0, 1, 128, 0, 0)
    # 进行卷积操作
    tik_instance.conv2d(dst, feature_map, weight, [2, 4, 4, 16], [2, 2, 2, 16, 16], [1, 1], [0, 0, 0, 0], [2, 2], 0)
    # 与fixpipe配合使用,将dst从L1OUT搬至gm
    # 由于cout_blocks=1, cburst_num=1, burst_len=howo*16*src_dtype_size/32=4*16*4/32=8
    tik_instance.fixpipe(dst_gm, dst, 1, 8, 0, 0, extend_params=None)
    tik_instance.BuildCCE(kernel_name="conv2d", inputs=[feature_map_gm, weight_gm], outputs=[dst_gm])

    结果示例:

    输入数据:
    feature_map_gm:
    [[[[0.0, 0.01, 0.02, 0.03, 0.04, ..., 5.09, 5.1, 5.11]]]]
    weight_gm:
    [[[[[0.0, 0.01, 0.02, 0.03, 0.04, ..., 20.46, 20.47]]]]]
    
    输出数据:
    dst_gm:
    [[[3568.7373, 3612.8433, 3657.0618, 3701.162 , 3745.287 ,
       3789.4834, 3833.6282, 3877.876 , 3921.9812, 3966.0745,
       4010.311 , 4054.4119, 4098.5713, 4142.702 , 4186.8457,
       4231.0312],
      [3753.9888, 3801.3733, 3848.8735, 3896.2534, 3943.6558,
       3991.1353, 4038.5586, 4086.0913, 4133.4736, 4180.8457,
       4228.3643, 4275.745 , 4323.1826, 4370.5947, 4418.016 ,
       4465.4844],
      [4309.196 , 4366.4077, 4423.745 , 4480.9565, 4538.1816,
       4595.5054, 4652.755 , 4710.135 , 4767.34  , 4824.5405,
       4881.897 , 4939.1104, 4996.374 , 5053.6226, 5110.871 ,
       5168.179 ],
      [4494.4526, 4554.944 , 4615.564 , 4676.0557, 4736.5586,
       4797.166 , 4857.695 , 4918.3604, 4978.8433, 5039.323 ,
       5099.9624, 5160.456 , 5220.999 , 5281.5293, 5342.0566,
       5402.6475]]]
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词