fixpipe
功能说明
矩阵计算完成后,对结果进行处理,例如对计算结果进行加偏置和对数据进行量化、并把数据从L1OUT 搬迁到GM Memory 中。
函数原型
fixpipe(dst, src, cburst_num, burst_len, dst_stride, src_stride, extend_params=None)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
dst |
输出 |
目的操作数的起始 element,支持的数据类型为 Tensor(float16,float32,int32),具体参考表2,tensor的scope为GM或UB。 经过fixpipe处理,在加偏置、量化等操作以外,会将矩阵计算中多申请的数据删除。 该接口用于处理conv2d数据时dst格式为[cout_blocks, howo, 16] 该接口用于处理matmul数据时dst格式为[N1, m, N0] 注:cout_blocks及howo含义请参考conv2d参数说明参数说明 N1, m, N0含义请参考matmul参数说明参数说明 |
src |
输入 |
源操作数的起始 element,支持的数据类型为 Tensor(float32,int32),具体参考表2。tensor 的scope为L1OUT。 源操作数是矩阵计算后的结果, 该接口用于处理conv2d数据时格式为[cout_blocks, round_howo, 16]。 该接口用于处理matmul数据时格式为[N1, M, N0]。 注:cout_blocks及round_howo含义请参考conv2d参数说明参数说明 N1, M, N0含义请参考matmul参数说明参数说明 |
cburst_num |
输入 |
传输数据片段数目,取值范围:cburst_num∈[1, 4095],支持的数据类型为:立即数(int)。 该接口用于处理conv2d数据时矩阵计算后的结果格式为[cout_blocks,round_howo,16],cburst_num设为cout_blocks即可。 该接口用于处理matmul数据时矩阵计算后的结果格式为[N1, M, N0],cburst_num设为N1即可。 注:cout_blocks及round_howo含义请参考conv2d参数说明参数说明 N1, M, N0含义请参考matmul参数说明参数说明 |
burst_len |
输入 |
连续传输数据片段长度,取值范围:burst_len∈[1, 65535],单位:32B。 支持的数据类型为:立即数(int)。 对于src,每个burst有效的数据片段长度为:
|
dst_stride |
输入 |
目的tensor相邻连续数据片段间隔(前burst尾与后burst头),取值范围:dst_stride∈[0, 65535], 单位:32B。支持的数据类型为:立即数(int)。 |
src_stride |
输入 |
源tensor相邻连续数据片段间隔(前burst尾与后burst头),取值范围:src_stride∈[0, 65535], 单位:256 elements。支持的数据类型为:立即数(int)。 保留接口,为了计算数据准确性,填0即可。 |
extend_params (针对Atlas 200/300/500 推理产品、 Atlas 训练系列产品、 Atlas推理系列产品(Ascend 310P处理器)AI Core) |
输入 |
扩展参数,数据类型为字典。默认值为None。 当前支持三个key,分别为"bias","quantize_params"和"relu"。具体内容如下: 1、key: "bias" value:默认值为None,即不使能添加偏置功能。 若使能,value为偏置操作数的起始 element,支持的数据类型为 Tensor(int32, float32),需与src的数据类型保持一致,shape形状为[Cout,] Cout :若src为conv2d输出,为卷积核个数;若src为matmul输出,为N方向长度。 tensor 的scope为L1 2、key : "quantize_params" value: 默认值为None,即不使能量化功能。 使能时value为字典,字典中包含两个key,分别为"mode"和"mode_param" "mode"对应value支持数据类型为字符串,支持如下几种量化模式:
"mode_param"对应value为如下三种:
3、key:"relu": value:默认值为False,支持的类型为bool类型。False:不使能relu功能;True:使能relu功能 注意事项:
|
extend_params 该参数说明适用于以下型号: Atlas A2训练系列产品/Atlas 800I A2推理产品 |
输入 |
扩展参数,数据类型为字典。默认值为None。 当前支持两个key,分别为"quantize_params"和"relu"。具体内容如下: 1、key : "quantize_params" value: 默认值为None,即不使能量化功能。 使能时value为字典,字典中包含两个key,分别为"mode"和"mode_param" "mode"对应value支持数据类型为字符串,支持如下几种量化模式:
"mode_param"对应value为如下三种:
2、key:"relu": value:默认值为False,支持的类型为bool类型。False:不使能relu功能;True:使能relu功能。 注:量化功能和relu功能可以同时使能。 |
支持的型号
Atlas 200/300/500 推理产品
Atlas 训练系列产品
Atlas推理系列产品(Ascend 310P处理器)AI Core
Atlas A2训练系列产品/Atlas 800I A2推理产品
Atlas 200/500 A2推理产品
注意事项
- 当src和dst的数据类型一致时,extend_params参数的key:quantize_params不生效。
- 单步调试时间比较长,不建议使用。
- 当extend_params中同时使能多个功能时,执行顺序如下所示,不使能的功能请忽略:bias->quantize->relu。
- 该接口不支持与vector相关指令一起使用。
- 操作数地址偏移对齐要求请见通用约束。
- 对于量化输入的单scale或Tensor float32数据类型说明如下:
(1)标准的IEEE 754 float32格式为:1bit符号位,8bits指数位,23bits尾数位;当前float32格式为:1bit符号位,8bits指数位,10bits尾数位;
(2)如果用户提供的是标准的IEEE 754 float32输入,API内部会处理成芯片支持的float32格式进行计算,此时如果golden数据生成过程中使用的是标准的IEEE 754 float32数据,则可能引入精度不匹配问题,需要修正golden数据的生成,将量化参数的23bits尾数位的低13bits数据位清零再参与量化计算。
返回值
无
调用示例
- 示例:src和dst的数据类型分别为int32和float16,无bias,量化mode_param为tensor
from tbe import tik tik_instance = tik.Tik() dtype_size = { "int8": 1, "uint8": 1, "int16": 2, "uint16": 2, "float16": 2, "int32": 4, "uint32": 4, "float32": 4, "int64": 8, } fm_dtype = "int8" ker_dtype = "int8" deq_dtype="float16" dst_dtype = "int32" fm_shape = [1, 4, 4, 32] kernel_shape = [1, 2, 2, 32, 32] dst_shape = [2, 16, 16] dst_l1_shape = [2, 16, 16] deq_shape = [16] # 卷积步长, [stride_h, stride_w] stride = [1, 1] # padding行数/列数,格式是[pad_left, pad_right, pad_top, pad_bottom] pad = [0, 0, 0, 0] # 空洞卷积参数,格式[dilation_h, dilation_w]; dilation = [1, 1] # padding填充值的数值 pad_value = 0 # 定义tensor feature_map_gm = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map_gm', scope=tik.scope_gm) weight_gm = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight_gm', scope=tik.scope_gm) deqscale_gm = tik_instance.Tensor(deq_dtype, deq_shape, name='deqscale_gm', scope=tik.scope_gm) dst_gm = tik_instance.Tensor(deq_dtype, dst_shape, name='dst_gm', scope=tik.scope_gm) feature_map = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map', scope=tik.scope_cbuf) weight = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight', scope=tik.scope_cbuf) deqscale = tik_instance.Tensor(deq_dtype, deq_shape, name='deqscale', scope=tik.scope_cbuf) dst_l1out = tik_instance.Tensor(dst_dtype, dst_l1_shape, name='dst_l1out', 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.data_move(deqscale, deqscale_gm, 0, 1, 1, 0, 0) # 进行卷积操作 tik_instance.conv2d(dst_l1out, feature_map, weight, fm_shape, kernel_shape, stride, pad, dilation, pad_value) # fixpipe实现量化 # 传输数据片段数目, 处理conv2d数据时矩阵计算后的结果cburst_num设为cout_blocks, 处理matmul数据时矩阵计算后的结果cburst_num设为N1 cburst_num = dst_l1_shape[0] # 连续传输数据片段长度,处理conv2d数据时应为howo*16*src_dtype_size/32, 处理matmul数据时应为m*N0*src_dtype_size/32 burst_len = dst_l1_shape[1] *16 * dtype_size[dst_dtype] // 32 # dst_stride/src_stride tensor相邻连续数据片段间隔,前burst尾与后burst头,此处暂为连续计算,以0 为例 dst_stride, src_stride = 0, 0 tik_instance.fixpipe(dst_gm, dst_l1out, cburst_num, burst_len, dst_stride, src_stride, extend_params={"bias": None, "quantize_params": {"mode": "int322fp16", "mode_param": deqscale}}) tik_instance.BuildCCE(kernel_name="fixpipe", inputs=[feature_map_gm, weight_gm, deqscale_gm], outputs=[dst_gm])
结果示例:
输入数据: feature_map_gm: [[[[3, 2, 4, 2, ..., 4, 3]]]] weight_gm: [[[[[0, -5, -3, ..., -4, -2]]]]] deqscale_gm: [ 0.1214, -0.2238, ..., 0.4883, 0.2788] 输出数据: dst_gm: [[[-13.48, 39.38, -114.8, 30.38, ..., 9.766, -24.81]]]
- 示例:src和dst的数据类型分别为int32和float16,无bias,量化mode_param为scalar
from tbe import tik tik_instance = tik.Tik() dtype_size = { "int8": 1, "uint8": 1, "int16": 2, "uint16": 2, "float16": 2, "int32": 4, "uint32": 4, "float32": 4, "int64": 8, } fm_dtype = "int8" ker_dtype = "int8" deq_dtype="float16" dst_dtype = "int32" fm_shape = [1, 4, 4, 32] kernel_shape = [1, 2, 2, 32, 32] dst_shape = [2, 16, 16] dst_l1_shape = [2, 16, 16] # 卷积步长, [stride_h, stride_w] stride = [1, 1] # padding行数/列数,格式是[pad_left, pad_right, pad_top, pad_bottom] pad = [0, 0, 0, 0] # 空洞卷积参数,格式[dilation_h, dilation_w]; dilation = [1, 1] # padding填充值的数值 pad_value = 0 # 定义tensor feature_map_gm = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map_gm', scope=tik.scope_gm) weight_gm = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight_gm', scope=tik.scope_gm) dst_gm = tik_instance.Tensor(deq_dtype, dst_shape, name='dst_gm', scope=tik.scope_gm) feature_map = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map', scope=tik.scope_cbuf) weight = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight', scope=tik.scope_cbuf) dst_l1out = tik_instance.Tensor(dst_dtype, dst_l1_shape, name='dst_l1out', 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) scalar = tik_instance.Scalar(dtype="float32", init_value=2) # 进行卷积操作 tik_instance.conv2d(dst_l1out, feature_map, weight, fm_shape, kernel_shape, stride, pad, dilation, pad_value) # fixpipe实现量化 # 传输数据片段数目, 处理conv2d数据时矩阵计算后的结果cburst_num设为cout_blocks, 处理matmul数据时矩阵计算后的结果cburst_num设为N1 cburst_num = dst_l1_shape[0] # 连续传输数据片段长度,处理conv2d数据时应为howo*16*src_dtype_size/32, 处理matmul数据时应为m*N0*src_dtype_size/32 burst_len = dst_l1_shape[1] *16 * dtype_size[dst_dtype] // 32 # dst_stride/src_stride tensor相邻连续数据片段间隔,前burst尾与后burst头,此处暂为连续计算,以0 为例 dst_stride, src_stride = 0, 0 tik_instance.fixpipe(dst_gm, dst_l1out, cburst_num, burst_len, dst_stride, src_stride, extend_params={"quantize_params": {"mode": "int322fp16", "mode_param": scalar}}) tik_instance.BuildCCE(kernel_name="fixpipe", inputs=[feature_map_gm, weight_gm], outputs=[dst_gm])
结果示例:
输入数据: feature_map_gm: [[[[-3, 4, -3, -1, ...,4, -1]]]] weight_gm: [[[[[ 1, 4, -3,...,-1, -4, -2]]]]] 输出数据: dst_gm: [[[ -78. 120. -76. 144. -114. ...0. 0. 0.]]]
- 示例:src和dst的数据类型分别为float32和float16,有bias,量化mode_param为None
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) bias_gm = tik_instance.Tensor("float32", (16,), name='bias_gm', scope=tik.scope_gm) dst_gm = tik_instance.Tensor("float16", [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) bias = tik_instance.Tensor("float32", (16,), name='bias', scope=tik.scope_cbuf) dst_l1out = tik_instance.Tensor("float32", [1, 16, 16], name='dst_l1out', 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.data_move(bias, bias_gm, 0, 1, 2, 0, 0) # 进行卷积操作 tik_instance.conv2d(dst_l1out, feature_map, weight, [2, 4, 4, 16], [2, 2, 2, 16, 16], [1, 1], [0, 0, 0, 0], [2, 2], 0) # fixpipe实现bias功能和量化功能 tik_instance.fixpipe(dst_gm, dst_l1out, 1, 8, 0, 0, extend_params={"bias": bias, "quantize_params": {"mode": "fp322fp16", "mode_param": None}}) tik_instance.BuildCCE(kernel_name="conv2d", inputs=[feature_map_gm, weight_gm, bias_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]]]]] bias_gm: [0.0, 1.0, 2.0, 3.0, ..., 14.0, 15.0] 输出数据 dst_gm: [[[3568., 3614., 3660., 3704., 3750., 3794., 3840., 3884., 3930., 3976., 4020., 4066., 4110., 4156., 4200., 4250.], [3754., 3802., 3850., 3900., 3948., 3996., 4044., 4094., 4140., 4188., 4240., 4290., 4336., 4384., 4430., 4480.], [4308., 4370., 4424., 4484., 4544., 4600., 4660., 4716., 4776., 4830., 4892., 4950., 5010., 5068., 5124., 5184.], [4496., 4556., 4616., 4680., 4740., 4804., 4864., 4924., 4988., 5050., 5108., 5172., 5230., 5296., 5356., 5416.]]]
- 示例:src和dst的数据类型分别为float32和float16,有bias,量化mode_param为None
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) bias_gm = tik_instance.Tensor("float32", (16,), name='bias_gm', scope=tik.scope_gm) dst_gm = tik_instance.Tensor("float16", [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) bias = tik_instance.Tensor("float32", (16,), name='bias', scope=tik.scope_cbuf) dst_l1out = tik_instance.Tensor("float32", [1, 16, 16], name='dst_l1out', 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.data_move(bias, bias_gm, 0, 1, 2, 0, 0) # 进行卷积操作 tik_instance.conv2d(dst_l1out, feature_map, weight, [2, 4, 4, 16], [2, 2, 2, 16, 16], [1, 1], [0, 0, 0, 0], [2, 2], 0, bias=bias) # fixpipe实现bias功能和量化功能 tik_instance.fixpipe(dst_gm, dst_l1out, 1, 8, 0, 0, extend_params={"quantize_params": {"mode": "fp322fp16", "mode_param": None}}) tik_instance.BuildCCE(kernel_name="conv2d", inputs=[feature_map_gm, weight_gm, bias_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]]]]] bias_gm: [0.0, 1.0, 2.0, 3.0, ..., 14.0, 15.0] 输出数据 dst_gm: [[[3568., 3614., 3660., 3704., 3750., 3794., 3840., 3884., 3930., 3976., 4020., 4066., 4110., 4156., 4200., 4250.], [3754., 3802., 3850., 3900., 3948., 3996., 4044., 4094., 4140., 4188., 4240., 4290., 4336., 4384., 4430., 4480.], [4308., 4370., 4424., 4484., 4544., 4600., 4660., 4716., 4776., 4830., 4892., 4950., 5010., 5068., 5124., 5184.], [4496., 4556., 4616., 4680., 4740., 4804., 4864., 4924., 4988., 5050., 5108., 5172., 5230., 5296., 5356., 5416.]]]