conv2d
函数原型
conv2d(dst, feature_map, weight, fm_shape, kernel_shape, stride, pad, dilation, pad_value=0, init_l1out=True, bias=None)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
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],要求如下:
H为高,取值范围:[1,4096];数据类型为立即数(int)。 W为宽,取值范围:[1,4096];数据类型为立即数(int)。 |
kernel_shape |
输入 |
卷积核张量“weight”的形状,格式是[C1, Kh, Kw, Cout, C0]。 C1*C0为输入的channel数,要求与fm_shape中C1、C0的要求一致,另外要求:
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。
|
init_l1out |
输入 |
表示dst是否需要初始化。支持的数据类型为:bool类型。默认值为True。
|
bias |
输入 |
卷积偏置,默认值为None,表示不添加偏置。 若使能偏置,输入bias为偏置操作数的起始 element,支持的数据类型为 Tensor(int32, float32),需与dst的数据类型保持一致,shape形状为[Cout,],Cout 为卷积核个数;Tensor 的scope为L1。 注意: |
支持的型号
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]]]